首页 文章

for循环和切换后的Perl重复

提问于
浏览
0

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

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

array1 = 1.txt

array 2 = 1.txt 0.5

array1将是:

array1 = 1.txt 0.5

我试图 Build 这个代码,但它打印出所有元素两次 . 有没有办法避免这个问题?我知道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

    发生这种情况是因为你在@ 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";
    }
    
  • 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 ####
    

相关问题