for循环和切换后的Perl重复

时间:2014-08-15 08:35:30

标签: perl switch-statement string-comparison repeat

我有2个数组(array1,array2),我试着识别两者中的共同字符串并进行替换,然后打印出array1的内容。

array2中的元素替换了array1中的一些元素。特别是如果有:

array1 = 1.txt

array 2 = 1.txt 0.5

array1将是:

array1 = 1.txt 0.5

我试图建立这个代码,但它打印出所有元素两次。 有没有办法避免这个问题? 我知道perl中有一个名为“switch”的模块......也许这就是解决方案?我不知道它是如何运作的。

@array1 = qw(76
    38
    0.13213855661882
    0.264277113237639
    1.txt
    ####
    20
    10
    -0.01235
    -0.0247000000000001
    10.txt
    ####
    20
    10
    -0.01235
    -0.0247000000000001
    2.txt
    ####
    46
    14
    0.117232213438735
    0.385191558441558
    10003.txt
    ####);
    @array2 = ("1.txt 0.5", "2.txt 1");

for ($i = 0 ; $i < @array1; $i++){
for ($k =0; $k < @array2; $k++){
    if (grep /$array1[$i]/, $array2[$k]){
        $array1[$i] =~ s/$array1[$i]/$array2[$k]/;
        print $array1[$i]."\n";
    }
    else {print "RIS ".$array1[$i]."\n";}
}
}

结果:

RIS 76
RIS 76
RIS 38
RIS 38
RIS 0.13213855661882
RIS 0.13213855661882
RIS 0.264277113237639
RIS 0.264277113237639
**1.txt 0.5**
RIS 1.txt 0.5
RIS ####
RIS ####
RIS 20
RIS 20
RIS 10
RIS 10
RIS -0.01235
RIS -0.01235
RIS -0.0247000000000001
RIS -0.0247000000000001
RIS 10.txt
RIS 10.txt

预期结果:

RIS 76
    RIS 38
    RIS 0.13213855661882
    RIS 0.264277113237639
    **1.txt 0.5**
    RIS 1.txt 0.5
    RIS ####
    RIS 20
    RIS 10
    RIS -0.01235
    RIS -0.0247000000000001
    RIS 10.txt

2 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为您正在@ array2循环中进行打印。试试这个:

for ($i = 0 ; $i < @array1; $i++){
  for ($k =0; $k < @array2; $k++){
    if (grep /$array1[$i]/, $array2[$k]){
        $array1[$i] =~ s/$array1[$i]/$array2[$k]/;
    }
  }
  print $array1[$i]."\n";
}

如果您希望能够查看是否有更改,请尝试以下操作:

for ($i = 0 ; $i < @array1; $i++){
  for ($k =0; $k < @array2; $k++){
    if (grep /$array1[$i]/, $array2[$k]){
        $array1[$i] =~ s/$array1[$i]/$array2[$k]/;
        $value = $array1[$i];
    }
    else { $value = "RIS ".$array1[$i]."\n"; }
  }
  print "$value\n";
}

答案 1 :(得分:0)

您的元素会被打印两次,因为您正在使用for循环来测试是否包含在第二个数组中,而不是其他方法。

我建议将第二个数组转换为键值对的哈希值。然后,这是一个简单的哈希包含测试,以查看是否需要替换密钥。

以下内容适用于您。请注意use strict;use warnings;的使用情况。它们应该用在每个脚本中。

use strict;
use warnings;
use feature qw(say);

my @array1 = do {
    no warnings 'qw';
    qw(
        76 38 0.13213855661882  0.264277113237639   1.txt     ####
        20 10 -0.01235          -0.0247000000000001 10.txt    ####
        20 10 -0.01235          -0.0247000000000001 2.txt     ####
        46 14 0.117232213438735 0.385191558441558   10003.txt ####
    )
};

my @array2 = ( "1.txt 0.5", "2.txt 1" );
my %trans = map {my ($key) = split ' '; ($key => $_)} @array2;

for my $element (@array1) {
    say $trans{$element} // "RIS $element";
}

输出:

RIS 76
RIS 38
RIS 0.13213855661882
RIS 0.264277113237639
1.txt 0.5
RIS ####
RIS 20
RIS 10
RIS -0.01235
RIS -0.0247000000000001
RIS 10.txt
RIS ####
RIS 20
RIS 10
RIS -0.01235
RIS -0.0247000000000001
2.txt 1
RIS ####
RIS 46
RIS 14
RIS 0.117232213438735
RIS 0.385191558441558
RIS 10003.txt
RIS ####