1

私は3つの配列を持っています。

  • ファイル名を含む @array1
  • ファイル名を含む @array2
  • ユニークなアイテムを含めたい@unique

次のコードを使用して 2 つの配列を比較し、一意のファイル名を含む 3 番目の配列を出力します。

@test{@array1} = ();
@unqiue = grep {!exists $test{$_}} @array2;

ただし、出力では大文字と小文字が区別されます。大文字と小文字を区別しないようにするにはどうすればよいですか?

ありがとう


こんにちは、申し訳ありませんが、質問がうまくできなかったと思います。

既に再生したトラックを含む古いトラック配列を保持し、そこから選択したい新しいトラック配列を持っています。新しいトラックを古いトラック配列と比較して、一意のトラックのみを取得してから選択したいと考えています。

したがって、現在の出力は次のとおりです。

ユニークなトラック:
\my Music\Corrupt Souls\b-corrupt.mp3
\マイ ミュージック\gta4\10 - バガボンド.mp3
\My Music\gta4\14 - 戦争は必要だ.mp3
\マイ ミュージック\バック トゥ ブラック\05 バック トゥ ブラック.mp3

最初のトラックである b-corrupt が既に古いトラック配列にあるため、大文字と小文字が異なるだけで、トラック 10、14、および 05 を返す結果が必要です。

よろしくお願いいたします。

#!/usr/bin/perl
$element = '\\My Music\\Corrupt Souls\\b-corrupt.mp3';
プッシュ (@oldtrackarray, $element);

$element = '\\My Music\\Back To Black\\03 私とジョーンズさん.mp3';
プッシュ (@oldtrackarray, $element);

$element = '\\My Music\\Jazz\\Classic Jazz-Funk Vol1\\11 - Till You Take My Love [オリジナル 12 ミックス].mp3';
プッシュ (@oldtrackarray, $element);

$element = '\\My Music\\gta4\\01 - ソヴィエト コネクション (グランド セフト オート IV のテーマ).mp3';
プッシュ (@oldtrackarray, $element);

$element = '\\My Music\\gta4\\07 - ロッキー マウンテン ウェイ.mp3';
プッシュ (@oldtrackarray, $element);

$element = '\\My Music\\gta4\\02 - ダーティ ニューヨーカー.mp3';
プッシュ (@oldtrackarray, $element);

print "旧トラック配列\n";
for($index=0; $index<@oldtrackarray+1; $index++) {
    print "$oldtrackarray[$index]\n";}


$element = '\\my Music\\Corrupt Souls\\b-corrupt.mp3';
プッシュ (@newtrackarray, $element);

$element = '\\My Music\\gta4\\10 - バガボンド.mp3';
プッシュ (@newtrackarray, $element);

$element = '\\My Music\\gta4\\14 - 戦争は必要.mp3';
プッシュ (@newtrackarray, $element);

$element = '\\My Music\\Back To Black\\05 Back to Black.mp3';
プッシュ (@newtrackarray, $element);

print "新しいトラック\n";
for($index=0; $index<@newtrackarray+1; $index++) {
    print "$newtrackarray[$index]\n";
}

@test{@oldtrackarray} = ();
@uninvited = grep {!exists $test{$_}} @newtrackarray;

print "ユニークなトラック:\n";
for($index=0; $index<$#uninvited+1; $index++) {
    print "$uninvited[$index]\n";
}

4

4 に答える 4

8
@test{ map { lc } @array1 } = ();
@new_ones = grep { !exists $test{lc $_} } @array2;

@new_onesのリストを既に にあるリストに追加して@array1、これまでに見たすべての一意のアイテムのリストを作成する場合は、次のようにします。

push @array1, @new_ones;
于 2009-01-07T17:36:36.750 に答える
6

からのユニークな要素だけが欲しい@array2ですか?両方の配列からすべての一意の要素が必要な場合は、すべての要素を調べて、前に見た要素を覚えておく必要があります。

my %Seen = ();
my @unique = grep { ! $Seen{ lc $_ }++ } @array1, @array2;

まだ処理していない要素を選択したいという更新を投稿しました。2つの配列ではなく、1つのハッシュを検討して、すべてのデータを1か所に保持します。値0ですべてを初期化することから始めます。

my %Tracks = map { $_, 0 } @all_tracks;

要素の1つを処理(または再生)するときは、そのハッシュ値を真の値に設定します。

$Tracks{ $playing } = 1;

処理していないトラックが必要な場合は、値が真でないキーを選択します。

@not_processed = grep { ! $Tracks{$_} } keys %Tracks;

あなたがあなたのアイテムについて質問があるときはいつでも、あなたはちょうど%Tracks正しい質問をします。

于 2009-01-07T17:59:08.467 に答える
1

これでうまくいくはずです..

    $test{lc $_} = 1 foreach @array1;  @unique = grep { ! exists $test{lc $_}} @array2;
于 2009-01-07T17:37:59.057 に答える
0

私は一般的にブライアンの解決策に同意し%Seenますが、最初の質問で、出力が適切な大文字と小文字の曲のタイトルを示していることに気付きました。

次の行に沿った 2 番目のハッシュ (つまり、裏返しの設計)。

my %title;
foreach (@array1, @array2) {
    my $lc = lc $_;
    $title{$lc} = $_ unless $title{$lc} && $title{$lc} =~/[:upper:][:lower:]/;
        # ie don't overwrite if saved title matches '[A-Z][a-z]'
}

次に%title、出力での内容を使用します。

于 2009-01-07T20:43:50.553 に答える