首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果匹配,则打印散列键和值。

如果匹配,则打印散列键和值。
EN

Stack Overflow用户
提问于 2015-02-23 16:49:21
回答 1查看 778关注 0票数 1

我正在尝试将散列与文件匹配。但是,由于标点符号和空格,我正在搜索的文件和文件并不完全匹配。例如,我的文件中可能有"JE工业,公司“和"JE工业公司”。这两个显然不匹配,因为",",逗号。

因此,我的解决方案是拥有一个散列和一个文件,并对每个文件执行修改(在文件和散列值中替换标点符号,所以“”将与“”匹配,以及其他一些规则)。一旦匹配满意,就转到散列中针对文件的下一项。如果该匹配不满意,转到下一个规则"elsif",并尝试匹配,如果它满意,转到下一个项目等。我也希望有一个未修改的散列和行的副本,以便每个的原始不被修改。因此,基本上一次只应用一条规则。

所以我一直在研究如何解决这个问题,但是我的结果并不是我想要的。

代码语言:javascript
运行
复制
 open(my $fh, "list.txt");

    while(<$fh>) {
     my($line) = $_;
     chomp($line);
    my %hash = (
        12345 => 'JE Industries, Incorporated',
        123355 => 'Josh Industries, Inc'
    );
    while( my( $key, $value ) = each %hash ) {
    if($value =~ s/[[:punct:]]//gi eq $line =~ s/[[:punct:]]//gi) {print $line,",",$key,"\n";} #replace punctuation on both $line and $value to make them match##
    elsif($value =~ s/[\s]//gi eq $line =~ s/[\s]//gi) {print $value,",",$key,"\n";} ## if punctuation does not do it replace space##

}
}

我的文件,list.txt

JE工业公司

乔什工业公司

吉姆鲍勃公司

我的输出

JE工业公司,123355

乔希工业公司,123355

期望输出

JE工业公司,"JE工业,公司“,12345

乔希工业公司,“乔希工业公司”,123355

original_Value_from_file,"original_Value_from_hash",与每个

它将我的项从散列匹配到文件,但是,它只是将散列中的最后一个键分配给每个值。另外,我不太确定如何打印每一行/散列的原始形式以及匹配结果。还请记住,对于修改,我希望从一开始就对每条规则进行修改。换句话说,在第二个规则发生"$value =~ s/ \s /gi eq $line =~ s/\s/gi“的情况下,我想在"JE工业,公司”中替换\s,而不是在"JE工业公司“中。

最后,我希望我的结果是来自散列值的匹配的原始形式,$line值的原始形式,以及它们对应的散列键。我还想执行更多的规则,而不仅仅是省略标点符号和空格,以使更接近的匹配。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-23 17:23:37

很多时候,提前准备数据就更容易了。使您的代码稍后变得更简单。

下面是我要做的,创建一个非标点符号名称的反向散列到id。

在循环文件时,我只需将非标点符号与id散列进行比较,才能找到匹配项。

下面的工作示例

代码语言:javascript
运行
复制
use strict;
use warnings;
my %id_to_name = (
    12345  => 'JE Industries, Incorporated',
    123355 => 'Josh Industries, Inc'
);
#Create a reverse map with out any punctuation
my %no_punc_name_to_id;
while (my ($key, $value) = each %id_to_name) {
    $value =~ s/[[:punct:]]//gi;
    $no_punc_name_to_id{$value} = $key;
}
my $filename = 'list.txt';
open my $fh , '<' , $filename or die "Cannot read '$filename': $!";

while(my $line = <$fh>)  {
    chomp($line);
    $line =~ s/[[:punct:]]//gi;
    if(exists $no_punc_name_to_id{$line}) {
        my $id = $no_punc_name_to_id{$line};
        print $line,",","\"$id_to_name{$id}\"",",",$id,"\n";
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28678875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档