我有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
答案 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 ####