【问题标题】:Perl replace text after searching with arrayPerl用数组搜索后替换文本
【发布时间】:2013-09-13 12:13:42
【问题描述】:

我正在寻找一个执行替换的 perl 程序,但我的循环每次都无法正常工作。例如概念是:

#!/usr/bin/perl
use warnings;
use strict;

my @array1 = qw(A quick brown fox jumps over the lazy dog);
my @array2 = qw(fox dog);
my @array3 = qw(rabbit cat);

我想让第二个数组和第一个数组比较,选出元素 fox 和 dog,用 rabbit 和 cat 替换。

所以这句话应该变成“一只敏捷的棕色兔子跳过懒猫”。

这是概念,但数据不同,第二个和第三个数组每个可能包含 50 个元素。任何帮助将不胜感激。

【问题讨论】:

  • 请显示您尝试过的代码并说明它在做什么或不做什么。
  • 你应该使用单个哈希而不是 @array2@array3my %map = ("fox" => "rabbit", "dog" => "cat", ...);

标签: arrays perl substitution


【解决方案1】:

我会这样做:

use strict;
use warnings;
use Data::Dump qw(dump);

my @array1 = qw(A quick brown fox jumps over the lazy dog);
my @array2 = qw(fox dog);
my @array3 = qw(rabbit cat);
my %corresp;
@corresp{@array2} = @array3;

foreach my $word(@array1) {
    $word = $corresp{$word} if exists $corresp{$word};
}
dump@array1;

输出:

(
  "A",
  "quick",
  "brown",
  "rabbit",
  "jumps",
  "over",
  "the",
  "lazy",
  "cat",
)

【讨论】:

  • @TLP @corresp{map fc, @array2} = @array3;
  • @mpapec 是的,不管怎样,使用哈希是唯一可行的选择。
【解决方案2】:
#!/usr/bin/perl
use warnings;
use strict;

my @array1 = qw(A quick brown fox jumps over the lazy dog);
my @array2 = qw(fox dog);
my @array3 = qw(rabbit cat);

my %h;
@h{@array2} = @array3;

@array1 = map { $h{$_} || $_ } @array1;

【讨论】:

  • 还有,$_ = $h{$_} || $_ for @array1;
【解决方案3】:

我不知道 perl,但我认为类似:(受javascript影响)

function replace (array, oldword, newword){
    var i = array.search(oldworld),
        a = array.substr(0, i),
        n = array.substr(oldword.length, array.length);
    return a + newword + b;
}

放入循环应该可以工作。

(输出示例:)

console.log(replace('A quick brown fox jumps over the lazy dog', 'fox', 'rabbit'));

A quick brown rabbit jumps over the lazy dog

【讨论】:

    【解决方案4】:

    我自己很新,但这是我想出的:

    use strict;
    use warnings;
    
    my @array1 = qw(A quick brown fox jumps over the lazy dog);
    my @array2 = qw(fox dog);
    my @array3 = qw(rabbit cat);
    
    my $index = 0;
    
    foreach (@array1) {
    $index++ if s/$array2[$index]/$array3[$index]/;
    }
    
    print join(' ',@array1), "\n";
    

    【讨论】:

    • 如果 array2 中的单词与它们在 array1 中出现的顺序不同,这将不起作用(即:尝试将 array1 更改为 qw(A quick brown dog jumps over the lazy fox);
    • 我明白你的意思。回到绘图板。
    猜你喜欢
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 2020-04-29
    • 2023-04-08
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多