如何在Perl中找到两个数组的不区分大小写的唯一元素?
我有三个数组 @包含文件名的数组1 @包含文件名的array2 @我想包含唯一项的唯一项 我使用以下代码比较这两个数组,并输出第三个数组,其中包含唯一的文件名如何在Perl中找到两个数组的不区分大小写的唯一元素?,perl,arrays,grep,Perl,Arrays,Grep,我有三个数组 @包含文件名的数组1 @包含文件名的array2 @我想包含唯一项的唯一项 我使用以下代码比较这两个数组,并输出第三个数组,其中包含唯一的文件名 @test{@array1} = (); @unqiue = grep {!exists $test{$_}} @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开始时为空;从这一点开始,我们将通过将新条目推到其中来积累独特的结果-请参阅我编辑的解决方案。