我有一个.txt文件列表和一个参考.csv文件。我的引用包含我的关键字,我想看看是否可以在我的foreach循环中找到的.txt文件名中找到特定的关键字。
#!/bin/perl
use strict;
use warnings;
my %keyword;
my @files = glob("*.txt");
my $i = 0;
foreach my $file (@files) {
my %data_hash;
open(INFILE, "$file") or die "Can't open file \n";
while (<INFILE>) {
my @data = split(/\t/, $_);
$data_hash{ $data[0] } = $data [0];
$keyword{$file} = $file;
}
close INFILE;
open(REFERENCE, "$ARGV[0]") or die "Can't open file \n";
while (<REFERENCE>) {
my @all = split(/\t/, $_);
if ($keyword{ "*$all[0]" }) { #$all[0] contains the keyword
print $data_hash{ $all[1] }; #print $data_hash when $all[1] eq $data[0]
}
}
close REFERENCE;
}
我的文件名看起来像Hello_there_keyword.txt
。我知道我的$ data_hash确实包含正确的值。当$ file包含关键字?
答案 0 :(得分:2)
“匿名哈希中的奇数元素数量”来自这一行:
$data_hash{ $data[0] } = { $data[0] };
{ ... }
是匿名哈希(或代码块)$data[0]
是单个元素,因此是奇数数字。因此{ $data[0] }
是匿名哈希中奇数个元素。
$data_hash{ $data[0] } = $data[0];
将消除此错误,但留下缺陷,如果您要将某些内容映射到自身,则可以使用数组和
print $data_hash{ $all[1] };
简单地对应
print $all[1];
此外,提示:list-assign比分配给数组和使用“幻数槽”更有意义。因此,
my ( $key, $data ) = split '\t'; # $_ is the default
if ( $keyword{ $key } ) {
print $data, "\n";
}