1

我从这样的文本文件创建了一个哈希表:

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.

请问有什么想法吗?

4

2 回答 2

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];

将行上的第一个字段推到条目中的 arrayref 上keys。对我来说,您似乎实际上想将此字段用作键:

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应该可以工作。

于 2013-06-18T09:58:35.947 回答
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";
     }
}
于 2013-06-18T10:54:26.097 回答