【问题标题】:How can I match a keyword and a filename with hash in perl?如何在 perl 中将关键字和文件名与哈希匹配?
【发布时间】:2013-06-01 09:38:27
【问题描述】:

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

【问题讨论】:

  • 这段代码不能用use strict 编译,因为%data_hash 是未声明的。此外,您还有一个语法错误,您忘记了$。您不应发布无法编译的代码。错误“奇数个元素..”来自语句{data[0]},其中{} 表示匿名哈希,包含单个元素。
  • 请显示您遇到问题的代码,以及数据文件的示例。您只查看每行的第一个字段;对吗?
  • @TLP 我的代码中确实存在“my”和“$”。
  • @Borodin,我正在寻找 $all[0] 和 $file 的任何行之间的匹配项。
  • @Renaud 这只是让您发布此代码变得更加奇怪。

标签: perl hashtable keyword


【解决方案1】:

“匿名哈希中的奇数个元素”来自这一行:

$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";
    }
    

【讨论】:

  • @Renaud,当您收到不理解的警告时,最好将use diagnostics; 插入您的程序中。
猜你喜欢
  • 2011-07-08
  • 2018-04-02
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2014-12-30
  • 2021-11-28
  • 2013-01-04
  • 2014-01-30
相关资源
最近更新 更多