1

2 つの配列 (@curNodes@oldNodes) があり、配列の要素が並んでいます。例:

Output of print @curNodes   Output of print @oldNodes  
US                          London
UK                          US

@curNodesここで、 の各要素をと比較したいと思い@oldNodesます。たとえば、最初に in をチェックし"US"@oldNodes他に何もない場合は他のアクションを実行します。

要素が並んでいるかどうか、この比較を行う方法を教えてください。

4

4 に答える 4

5

外部モジュールを必要としないアプローチの場合、最初の配列をハッシュにしてから 2 番目の配列を反復処理するのはどうですか? 下記参照。

use v5.012;
use warnings;

my @old_nodes = qw/ a b c d /;
my %old = map {; $_ => 1 } @old_nodes;

my @cur_nodes = qw/ a d /;

foreach (@cur_nodes) {
    if ($old{$_}) {
        say "$_ exists in old_nodes";
    }
}
于 2012-11-17T07:28:20.280 に答える
3

これにはArray::Diffモジュールを使用できます。

于 2012-11-17T07:19:45.463 に答える
2

これは、スマート マッチ演算子 (~~) を使用して行うことができます。

#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
my @curNodes = qw' US UK ';
my @oldNodes = qw' London US ';

my $flag;

foreach my $item (@curNodes) {
  $flag = @oldNodes~~$item ? 0 : 1;
  last if !$flag; #perform some action
}
于 2012-11-17T07:34:28.393 に答える
0

Perl には実際には多次元配列はありません。しかし、確かに配列参照の配列があります。

Perl 5.10 以降を実行していると仮定すると、smartmatch 演算子は理にかなっていると思います。

あなたの説明に基づいて、ここに私が思いついたものがあります:

#!/usr/bin/perl -Tw

use 5.010;
use strict;
use warnings;
use Data::Dumper;

my @curNodes = (
    [ 'US', 'UK' ],
);

my @oldNodes = (
    [ 'London',  'US' ],
);

my @matchedElements = grep { $_ ~~ @{ $oldNodes[0] } } @{ $curNodes[0] };

say Dumper( \@curNodes );
say Dumper( \@oldNodes );
say Dumper( \@matchedElements );

これは以下を発行します:

$VAR1 = [
          [
            'US',
            'UK'
          ]
        ];

$VAR1 = [
          [
            'London',
            'US'
          ]
        ];

$VAR1 = [
          'US'
        ];

プログラムで @matchedElements を反復処理したいと思うでしょう。

于 2012-11-18T03:03:06.507 に答える