2

私は2つの配列を持っています:

  1. @array1blah1~を含むblah100
  2. @array2Name: creating "blah1"~を含むName: creating "blah100"

の各要素@array1が入っていることを確認する必要があります@array2が、そのName: creating部分が邪魔になっています。

@array1からのすべての要素が にあることを確認するための最良のルートは何@array2ですか?

@array1たぶん、に対してループしながらマッチングに正規表現を使用し@array2ますか?
別のより速い方法はありますか?

配列の 1 つにノイズの多い文字列がある場合、、、または動作しarray_diffますintersectか?unique

また

@array2 を操作してName: creating、各データの一部を取り除くことはできますか?

どちらの方法が速いでしょうか?

4

5 に答える 5

4
die if @array1 != @array2;
for (0..$#array1) {
   die if $array2[$_] ne qq{Name: creating "$array1[$_]"};
}

または名前部分が変数の場合、

die if @array1 != @array2;
for (0..$#array1) {
   die if $array2[$_] !~ /: creating "\Q$array1[$_]\E"$/;
}
于 2013-07-31T21:29:29.677 に答える
1

map を使用して 2 番目の配列から必要な部分をフィルター処理し、2 つをスマート マッチング演算子 (~~) で比較します。

#!/usr/bin/perl

use strict;
use warnings;

my @arr1 = qw(blah1 blah2 blah3);
my @arr2 = ('Name: creating "blah1"','Name: creating "blah2"','Name: creating "blah3"');

my @compare = map { local $_ = $_; s/^.+\: creating "([a-zA-Z0-9]+)"/$1/; $_ } @arr2;

if (@arr1 ~~ @compare){
    print "all blahs there\n";
}

この例では、「並べ替え」を使用するだけでなく、両方の配列が既に並べ替えられていると想定しています。

于 2013-07-31T21:47:53.657 に答える
1

これは最速であるはずですが、ikegamiソリューションと比較してわずかなマージンしかありません。

die if @array1 != @array2;
my $i;
for my $e (@array1) {
   die if $array2[$i++] ne qq{Name: creating "$e"};
}

編集

文字列の名前部分が可変の場合:

die if @array1 != @array2;
my $i;
for my $e (@array1) {
   die if $array2[$i++] !~ m/: creating "\Q$e\E"/;
}
于 2013-07-31T22:36:17.617 に答える