我有三个阵列。
我使用以下代码比较两个数组并输出包含唯一文件名的第三个数组。
@test{@array1} = ();
@unqiue = grep {!exists $test{$_}} @array2;
但输出区分大小写,如何将其更改为不区分大小写?
由于
嗨,对不起,我想我没有问过我的问题!
我保留了一个包含我已经播放的曲目的旧音轨阵列,然后我想要一个新的音轨阵列。我想将新曲目与旧曲目阵列进行比较,以确保我只获得独特的曲目然后选择。
所以目前的输出是;
Unique Tracks: \my Music\Corrupt Souls\b-corrupt.mp3 \My Music\gta4\10 - Vagabond.mp3 \My Music\gta4\14 - War Is Necessary.mp3 \My Music\Back To Black\05 Back to Black.mp3
我需要的是结果只返回曲目10,14和05,因为第一首曲目b-corrupt已经在旧的曲目阵列中,只是情况不同。
提前感谢您的帮助
#!/usr/bin/perl $element = '\\My Music\\Corrupt Souls\\b-corrupt.mp3'; push (@oldtrackarray, $element); $element = '\\My Music\\Back To Black\\03 Me and Mr Jones.mp3'; push (@oldtrackarray, $element); $element = '\\My Music\\Jazz\\Classic Jazz-Funk Vol1\\11 - Till You Take My Love [Original 12 Mix].mp3'; push (@oldtrackarray, $element); $element = '\\My Music\\gta4\\01 - Soviet Connection (The Theme From Grand Theft Auto IV).mp3'; push (@oldtrackarray, $element); $element = '\\My Music\\gta4\\07 - Rocky Mountain Way.mp3'; push (@oldtrackarray, $element); $element = '\\My Music\\gta4\\02 - Dirty New Yorker.mp3'; push (@oldtrackarray, $element); print "Old Track Array\n"; for($index=0; $index<@oldtrackarray+1; $index++) { print "$oldtrackarray[$index]\n";} $element = '\\my Music\\Corrupt Souls\\b-corrupt.mp3'; push (@newtrackarray, $element); $element = '\\My Music\\gta4\\10 - Vagabond.mp3'; push (@newtrackarray, $element); $element = '\\My Music\\gta4\\14 - War Is Necessary.mp3'; push (@newtrackarray, $element); $element = '\\My Music\\Back To Black\\05 Back to Black.mp3'; push (@newtrackarray, $element); print "New Tracks\n"; for($index=0; $index<@newtrackarray+1; $index++) { print "$newtrackarray[$index]\n"; } @test{@oldtrackarray} = (); @uninvited = grep {!exists $test{$_}} @newtrackarray; print "Unique Tracks:\n"; for($index=0; $index<$#uninvited+1; $index++) { print "$uninvited[$index]\n"; }
答案 0 :(得分:8)
@test{ map { lc } @array1 } = ();
@new_ones = grep { !exists $test{lc $_} } @array2;
如果您要将@new_ones
的列表添加到@array1
中已有的列表中,从而生成到目前为止看到的所有唯一项目的列表:
push @array1, @new_ones;
答案 1 :(得分:6)
您是否只想要@array2
中的独特元素?如果你想要两个数组中的所有独特元素,你只需要浏览所有元素并记住你之前看过的元素:
my %Seen = ();
my @unique = grep { ! $Seen{ lc $_ }++ } @array1, @array2;
您发布了一个更新,其中您说要选择尚未处理的元素。而不是两个数组,考虑一个哈希将所有数据保存在一个地方。首先使用值0初始化所有内容:
my %Tracks = map { $_, 0 } @all_tracks;
处理(或播放)其中一个元素时,请将其哈希值设置为true值:
$Tracks{ $playing } = 1;
如果您想要未处理的曲目,请选择值不为真的键:
@not_processed = grep { ! $Tracks{$_} } keys %Tracks;
如果您对自己的商品有疑问,只需问%Tracks
正确的问题。
答案 2 :(得分:1)
这应该可以解决问题..
$test{lc $_} = 1 foreach @array1; @unique = grep { ! exists $test{lc $_}} @array2;
答案 3 :(得分:0)
虽然我一般同意brian的%Seen
解决方案,但我在原始问题中注意到输出显示了正确的歌曲标题。
第二个哈希(即由内而外的设计),沿着以下几行:
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
的内容。