搜索哈希表中的元素

时间:2013-06-18 09:53:26

标签: perl search hashtable

我已经从文本文件中创建了一个哈希表,如下所示:

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.

请问好吗?

2 个答案:

答案 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";
     }
}