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 に答える