我已经从文本文件中创建了一个哈希表,如下所示:
use strict;
use warnings;
my %h;
open my $fh, '<', 'tst' or die "failed open 'tst' $!";
while ( <$fh> ) {
push @{$h{keys}}, (split /\t/)[0];
}
close $fh;
use Data::Dumper;
print Dumper \%h;
现在我想在哈希表中的另一个文本文件中查找一个字段。 如果它存在,则当前行写入结果文件:
use strict;
use warnings;
my %h;
open my $fh, '<', 'tst' or die "failed open 'tst' $!";
while ( <$fh> ) {
push @{$h{keys}}, (split /\t/)[0];
}
close $fh;
use Data::Dumper;
print Dumper \%h;
open (my $fh1,"<", "exp") or die "Can't open the file: ";
while (my $line =<$fh1>){
chomp ($line);
my ($var)=split(">", $line);
if exists $h{$var};
print ($line);
}
我收到了这些错误:
syntax error at codeperl.pl line 26, near "if exists"
Global symbol "$line" requires explicit package name at codeperl.pl line 27.
syntax error at codeperl.pl line 29, near "}"
Execution of codeperl.pl aborted due to compilation errors.
请问好吗?
答案 0 :(得分:3)
有什么可说的? 语句 if exists $h{$var};
是语法错误。你可能想要:
print $line, "\n" if exists $h{$var};
或
if (exists $h{$var}) {
print $line, "\n";
}
一旦你解决了这个问题,其他错误就会消失。如果您遇到多个错误,请始终查看第一个错误(相对于行号)。以后的错误通常是前一个错误的结果。在这种情况下,语法错误搞砸了解析。
你的主要问题不是语法错误,而是你填充哈希的方式。在
push @{$h{keys}}, (split /\t/)[0];
将该行上的第一个字段推送到keys
条目中的arrayref。对我来说,似乎实际上想要将此字段用作键:
my ($key) = split /\t/;
$h{$key} = undef; # any value will do.
之后,您的Dumper \%h
会产生类似
$VAR1 = {
'@ ries bibliothèques électroniques à travers' => undef,
'a a pour les ressortissants des' => undef,
'a a priori aucune hiérarchie des' => undef,
};
并且您通过exists
查询应该有效。
答案 1 :(得分:0)
只需尝试这样的代码
首先,构建你的哈希
while(<$file1>){
# get your key from current line
$key = (split)[0];
# set the key into the hash
$hash{$key} = 1;
}
其次,判断
while(<$file2>){
# get the field you want you judge
$value = (split)[0];
# to see if $value exists
if( exists $hash{$value} ){
print "got $value";
}
}