【问题标题】:match elements in same position of 2 arrays in perl匹配perl中2个数组的相同位置的元素
【发布时间】:2011-12-28 04:05:40
【问题描述】:

我有 2 个数组

 @a = qw/ A B C D E /;
    @b = qw/ B B C A /;

我需要检查相同的元素是否出现在每个数组的相同位置

例如 $a[2] = "B"; $b[3] = "C";

如果是这样,请计算这种情况发生的次数 它需要忽略任何空白元素

例如 $a[6] = ; $b[6] = ;

cmets 非常感谢我喜欢理解脚本。

我尝试过 intersect eq == cmp 等,但我不太明白,也不太确定

提前致谢。

到目前为止,这是我的代码:

#!/usr/bin/perl -w

my @a = <FILE1>;
my @b = <FILE2>;

$occurs = 0; #Using eq
foreach my $letter (@a) {
    if (my $letter2 (@a) eq $letter) { #Syntax error here
        $count ++;
    }
} #syntax error here

【问题讨论】:

  • 请发布您尝试过的代码,并准确解释哪些代码不适用。
  • #!/usr/bin/perl -w my @a = ("A", "B", "C", "D", "E", " ", " ",);我的@b =(“B”,“B”,“C”,“”,“”,“A”); $发生 = 0; #Using eq foreach my $letter (@a){ if (my $letter2 (@a) eq $letter) { #语法错误 $count ++; } } #语法错误在这里
  • 不要在 cmets 中发布代码,它完全不可读。检查我所做的编辑,它可能与您所拥有的不完全相同。
  • 对不起,我是新来的。是的,不是。这是更广泛问题的一部分,我正在从文件中读取数组的内容。对于每个循环都会与此类似
  • @user1044326 :如果您需要比较文件,请说出来。像这样比较数组类似于在计算机时代发送电报。

标签: arrays perl compare equals match


【解决方案1】:

对于你所说的问题,我会使用这样的东西:

$happened += $a[$_] eq $b[$_] for 0 .. $#a;

要忽略空元素,您也可以检查 defined($a[$_])length($a[$_])

然而,

qw/ B B C       A /

qw/B B C A/ 相同,因此不引入空元素。此外,您的 same 元素示例在不同的位置显示了不同的元素。

【讨论】:

    【解决方案2】:

    这里blank的定义需要澄清一下。它是一个空字符串吗? undefined 值?空格?

    在下面的示例中,我假设任何没有非空白字符的元素为 blank,这显示了如何使用 each @array 构造来完成:

    use strict;
    use warnings;
    
    my @a = ( 'A', 'B', 'C', 'D', 'E', ' ', ' ' );  # Can't use qw/ / 'cos
    my @b = ( ' ', 'B', 'C', ' ', ' ', ' ', 'A' );  # it ignores whitespace
    
    my %count;                                      # Store results in a hash
    
    while ( my ( $index, $value ) = each @a ) { # Loop over index & value together
    
        my $otherValue = $b[$index];            # Get the other value in @b
    
        next unless $value =~ /\S/ and $otherValue =~ /\S/;  # Skip if 'blank'
    
        $count{$value}++ if $value eq $otherValue; # Increment counter for that value
    }
    
    print "$_ : $count{$_}\n" for keys %count;     # B : 1
                                                   # C : 1
    
    # Find out total
    
    use List::Util 'sum';                          # No need to reinvent wheel
    print "Sum : ", sum ( values %count ), "\n";   # Sum : 2
    

    【讨论】:

    • 如果keys @array 语法被标记为无效,那么您的 Perl 版本是 pre-5.12.0
    • @MonteCristo:我的错。将keys 替换为each
    • 非常感谢。你能解释一下为什么我需要遍历值和索引而不是值,即“foreach my $letter (@a)”吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    相关资源
    最近更新 更多