我有一个包含多行和多列数据的文件。我需要读取文件并在特定列与特定数字匹配时打印。
这就是我在下面的内容,目前我没有得到任何结果:
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;
}
}
答案 0 :(得分: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有一定的学习曲线,但它们会阻止你犯错误和拼写错误,并会减少你的调试时间。