如何在Perl中找到两个数组的不区分大小写的唯一元素?

如何在Perl中找到两个数组的不区分大小写的唯一元素?,perl,arrays,grep,Perl,Arrays,Grep,我有三个数组 @包含文件名的数组1 @包含文件名的array2 @我想包含唯一项的唯一项 我使用以下代码比较这两个数组,并输出第三个数组,其中包含唯一的文件名 @test{@array1} = (); @unqiue = grep {!exists $test{$_}} @array2; 但是,输出区分大小写,如何将其更改为不区分大小写 谢谢 嗨,对不起,我想我的问题问得不太好 我保留一个旧的曲目数组,其中包含我已经播放过的曲目,然后我有一个新的曲目数组,我想从中选择。我想将新曲目与旧曲目阵列

我有三个数组

@包含文件名的数组1 @包含文件名的array2 @我想包含唯一项的唯一项 我使用以下代码比较这两个数组,并输出第三个数组,其中包含唯一的文件名

@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"; } 如果要将@new_one列表添加到@array1中已有的列表中,从而生成迄今为止看到的所有唯一项的列表:

push @array1, @new_ones;
如果要将@new_one列表添加到@array1中已有的列表中,从而生成迄今为止看到的所有唯一项的列表:

push @array1, @new_ones;

这应该能奏效

    $test{lc $_} = 1 foreach @array1;  @unique = grep { ! exists $test{lc $_}} @array2;

这应该能奏效

    $test{lc $_} = 1 foreach @array1;  @unique = grep { ! exists $test{lc $_}} @array2;

是否只需要@array2中的唯一元素?如果要从两个数组中获得所有唯一的元素,只需遍历所有元素并记住以前见过的元素:

my %Seen = ();
my @unique = grep { ! $Seen{ lc $_ }++ } @array1, @array2;
您发布了一个更新,其中您说要选择尚未处理的元素。而不是两个数组,考虑一个散列来保持你的所有数据在一个地方。从初始化值为0的所有内容开始:

my %Tracks = map { $_, 0 } @all_tracks;
处理或播放其中一个元素时,请将其哈希值设置为真值:

$Tracks{ $playing } = 1;
如果需要尚未处理的轨迹,请选择该值不为真的关键点:

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

每当你对你的物品有疑问时,你只要问正确的问题。

你只想要@array2中唯一的元素吗?如果要从两个数组中获得所有唯一的元素,只需遍历所有元素并记住以前见过的元素:

my %Seen = ();
my @unique = grep { ! $Seen{ lc $_ }++ } @array1, @array2;
您发布了一个更新,其中您说要选择尚未处理的元素。而不是两个数组,考虑一个散列来保持你的所有数据在一个地方。从初始化值为0的所有内容开始:

my %Tracks = map { $_, 0 } @all_tracks;
处理或播放其中一个元素时,请将其哈希值设置为真值:

$Tracks{ $playing } = 1;
如果需要尚未处理的轨迹,请选择该值不为真的关键点:

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

每当你对你的项目有疑问时,你只要问%就可以了。

虽然我大体上同意brian的%SEED解决方案,但我在原始问题中注意到,输出显示了正确的大小写歌曲标题

第二个散列是由内而外的设计,大致如下:

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的内容。

虽然我大体上同意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的内容。

据我所知,给出的所有解决方案仍然适用。有什么我们没有解决的吗?当我尝试解决方案时,我没有得到任何反馈,这有点令人困惑。新的曲目来自一个黑匣子,它可以大量制作曲目,不幸的是,我无法将所有曲目都粘贴到一个阵列中。干杯。。。我想我误解了。最好的方法就是使用@array1和@array2-forget@unique。确保@array1开始时为空;从这一点开始,我们将通过将新条目推到其中来积累独特的结果-请参阅我编辑的解决方案。据我所知,所有给出的解决方案仍然适用。有什么我们没有解决的吗?当我尝试解决方案时,我没有得到任何反馈,这有点令人困惑。新的曲目来自一个黑匣子,它可以大量制作曲目,不幸的是,我无法将所有曲目都粘贴到一个阵列中。干杯。。。我想我误解了。最好的方法就是使用@array1和@array2-forget@unique。确保@array1开始时为空;从这一点开始,我们将通过将新条目推到其中来积累独特的结果-请参阅我编辑的解决方案。