gpt4 book ai didi

perl - 在 perl 中使用哈希替代 foreach 循环

转载 作者:行者123 更新时间:2023-12-04 04:19:27 26 4
gpt4 key购买 nike

我有两个文件,一个带有文本,另一个带有键/哈希值。我想用哈希值替换键的出现。以下代码执行此操作,我想知道是否有比我正在使用的 foreach 循环更好的方法。

谢谢大家

编辑:我知道使用它有点奇怪

s/\n//;
s/\r//;

而不是 chomp,但这适用于具有混合行尾字符的文件(在 Windows 和 linux 上都编辑过),而 chomp(我认为)则不然。

带有键/哈希值的文件 (hash.tsv):
strict  $tr|ct
warnings w@rn|ng5
here h3r3

带文本的文件 (doc.txt):
Do you like use warnings and strict?
I do not like use warnings and strict.
Do you like them here or there?
I do not like them here or there?
I do not like them anywhere.
I do not like use warnings and strict.
I will not obey your good coding practice edict.

perl 脚本:
#!/usr/bin/perl

use strict;
use warnings;
open (fh_hash, "<", "hash.tsv") or die "could not open file $!";
my %hash =();
while (<fh_hash>)
{
s/\n//;
s/\r//;
my @tmp_hash = split(/\t/);
$hash{ @tmp_hash[0] } = @tmp_hash[1];
}
close (fh_hash);
open (fh_in, "<", "doc.txt") or die "could not open file $!";
open (fh_out, ">", "doc.out") or die "could not open file $!";
while (<fh_in>)
{
foreach my $key ( keys %hash )
{
s/$key/$hash{$key}/g;
}
print fh_out;
}
close (fh_in);
close (fh_out);

最佳答案

一个问题

for my $key (keys %hash) {
s/$key/$hash{$key}/g;
}

是不是没有正确处理
foo => bar
bar => foo

而不是交换,你最终得到了所有的“foo”或所有的“bar”,你甚至无法控制哪个。
# Do once, not once per line
my $pat = join '|', map quotemeta, keys %hash;

s/($pat)/$hash{$1}/g;

您可能还想处理
foo  => bar
food => baz

通过使用最长的而不是可能以“吟游诗人”结尾。
# Do once, not once per line
my $pat =
join '|',
map quotemeta,
sort { length($b) <=> length($a) }
keys %hash;

s/($pat)/$hash{$1}/g;

关于perl - 在 perl 中使用哈希替代 foreach 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11567086/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com