获取错误在lol.pl第13行的哈希元素中使用未初始化的值$ col2,< $ f2>第1行

时间:2016-12-21 17:33:50

标签: perl

我制作了一个程序,用于过滤掉包含文本文件中值的行...我收到此错误

  

在lol.pl第13行的哈希元素中使用未初始化的值$ col2,    第1行。

use strict;
use warnings;
my %keys;
open( my $f1, '<', 'jump.txt' ) or die("Cannot open jump.txt: $!");
while (<$f1>) {
    chomp;
    $keys{$_} = 1;
}
close($f1);
open( my $f2, '<', 'sym.txt' ) or die("Cannot open sym.txt: $!");
while (<$f2>) {
    my ( undef, $col2, undef ) = split( ' ', $_ );
    print if ( $keys{$col2} );
}
close($f2);

jump.txt:

a
b
c

sym.txt:

a   1
b   2
c   3
d   4
e   5

期望的输出:

a   1
b   2
c   3

1 个答案:

答案 0 :(得分:0)

当您使用warnings时(如您所愿),当您尝试使用未初始化的变量时,会收到警告:

perl -wE 'my $x; say $x'

输出:

Use of uninitialized value $x in say at -e line 1.

在列表赋值中,会忽略额外的值,如果变量太多,则额外值会得到值undef

perl -wE 'my ($x, $y) = (2); say $y'

输出:

Use of uninitialized value $y in say at -e line 1.

在您的情况下,问题可能出在这一行:

my(undef, $col2, undef) = split(' ', $_);

如果split仅返回单个项目(或零项目),则$col2将不确定。

另见perldata

“列表值构造函数”的文档

修改

要获得所需的输出(似乎您需要$col1而不是$col2):

my $col1  = (split(' ', $_))[0];
print if $keys{$col1};