如何在perl中将关键字和文件名与hash匹配?

时间:2013-06-05 15:39:15

标签: perl hashtable keyword

我有一个.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包含关键字?

时,我在$ data_hash {$ file}中查找关键字

1 个答案:

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