0

我有一个包含多行和多列数据的文件。当特定列与特定数字匹配时,我需要读取文件并打印。

这是我下面的内容,我目前没有得到任何结果:

my $old_flag = 'file1.txt';
my $new_flag = 'file2.txt';

open (IN, "<$old_flag");
open (OUT, "+>$new_flag");

my @data = <IN>;

for (@data) {
    my @old_flag;
    chomp;
    @old_flag = split /\t/, $_;
    push (@records, @old_flag);
}

foreach my $record (@records) {
    if($record[2] == 11125) {
        print OUT "$record[2]\n";
    } else {
        next;
    }
}
4

1 回答 1

4

您可能认为这样做是在创建一个二维数组

push (@records, @old_flag);

但实际上您只是将值推送到常规数组中。在这里,您认为您正在访问一个二维数组

foreach my $record(@records){
    if($record[2] == 11125) {

但实际上,您只是在每次循环迭代时检查相同的不存在的数组元素。您会看到$record$record[2]引用两个不同的变量。后者只是@record数组的第三个元素。你从来没有宣布过。如果你使用过use strict,你会得到错误:

Global symbol "@record" requires explicit package name at foo.pl line 12

您可能会采取以下措施来解决它:

push @records, \@old_flag;    # works because @old_flag is a lexical variable
...
foreach my $record (@records) {
    if($record->[2] == 11125) {

在这里,您将$record其视为数组引用,它就是。

您遇到这些问题是因为您没有使用

use strict;
use warnings;

这两个 pragma 有一定的学习曲线,但它们会防止你犯简单的错误和拼写错误,并且会减少你的调试时间。

于 2013-06-26T10:05:00.337 回答