Arrays 在数组perl中引用列

Arrays 在数组perl中引用列,arrays,perl,Arrays,Perl,我有一个包含多行和多列数据的文件。我需要读取文件并在特定列与特定数字匹配时打印 这是我在下面得到的,我目前没有得到任何结果: 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;

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

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

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;
    }
}
my$old_标志='file1.txt';
我的$new_标志='file2.txt';
打开(在“$new_flag”中);
我的@data=;
for(@data){
我的旧国旗;
咀嚼;
@旧标志=split/\t/,$;
推送(@records,@old_flag);
}
foreach my$record(@records){
如果($record[2]==11125){
打印出“$record[2]\n”;
}否则{
下一个
}
}

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

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有一定的学习曲线,但它们可以防止您犯简单的错误和打字错误,并减少调试时间。

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

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有一定的学习曲线,但它们可以防止您犯简单的错误和打字错误,并减少调试时间。

Add
use strict;使用警告添加到脚本中。添加
使用strict;使用警告到您的脚本。感谢@TLP的提示。真不敢相信我竟然忘了那些。当我尝试打印$record时,仍然存在问题。我得到的是数组(0xd23570)。知道这里出了什么问题吗?这是一个数组引用字符串化。如果要打印其值,必须取消对其的引用。例如,
print@$record
谢谢您在TLP上的提醒。真不敢相信我竟然忘了那些。当我尝试打印$record时,仍然存在问题。我得到的是数组(0xd23570)。知道这里出了什么问题吗?这是一个数组引用字符串化。如果要打印其值,必须取消对其的引用。例如,
print@$record