1

我有一个 .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} 中寻找关键字?

4

1 回答 1

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";
    }
    
于 2013-06-05T16:55:48.910 回答