1

我有三个数组。

  • @array1 包含文件名
  • @array2 包含文件名
  • @unique 我想包含独特的项目

我使用以下代码比较两个数组并输出包含唯一文件名的第三个数组。

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

但是输出区分大小写,如何将其更改为不区分大小写?

谢谢


嗨,对不起,我认为我没有很好地提出我的问题!

我保留了一个旧的轨道阵列,其中包含我已经播放过的曲目,然后我有一个要从中选择的新曲目阵列。我想将新轨道与旧轨道阵列进行比较,以确保我只获得唯一的轨道然后从中进行选择。

所以目前的输出是;

独特的曲目:
\我的音乐\腐败的灵魂\b-corrupt.mp3
\我的音乐\gta4\10 - Vagabond.mp3
\我的音乐\gta4\14 - 战争是必要的.mp3
\我的音乐\回到黑色\05 回到黑色.mp3

我需要的是让结果只返回轨道 10、14 和 05,因为第一个轨道 b-corrupt 已经在旧轨道阵列中,只是情况不同。

在此先感谢您的帮助

#!/usr/bin/perl
$element = '\\My Music\\Corrupt Souls\\b-corrupt.mp3';
推(@oldtrackarray,$元素);

$element = '\\My Music\\Back To Black\\03 我和琼斯先生.mp3';
推(@oldtrackarray,$元素);

$element = '\\My Music\\Jazz\\Classic Jazz-Funk Vol1\\11 - Till You Take My Love [Original 12 Mix].mp3';
推(@oldtrackarray,$元素);

$element = '\\我的音乐\\gta4\\01 - 苏联联系(侠盗猎车手IV主题).mp3';
推(@oldtrackarray,$元素);

$element = '\\My Music\\gta4\\07 - Rocky Mountain Way.mp3';
推(@oldtrackarray,$元素);

$element = '\\我的音乐\\gta4\\02 - 肮脏的纽约客.mp3';
推(@oldtrackarray,$元素);

打印“旧轨道阵列\n”;
for($index=0;$index<@oldtrackarray+1;$index++){
    打印 "$oldtrackarray[$index]\n";}


$element = '\\my Music\\Corrupt Souls\\b-corrupt.mp3';
推(@newtrackarray,$元素);

$element = '\\我的音乐\\gta4\\10 - Vagabond.mp3';
推(@newtrackarray,$元素);

$element = '\\My Music\\gta4\\14 - War Is Necessary.mp3';
推(@newtrackarray,$元素);

$element = '\\我的音乐\\回到黑色\\05 回到黑色.mp3';
推(@newtrackarray,$元素);

打印“新曲目\n”;
for($index=0;$index<@newtrackarray+1;$index++){
    打印 "$newtrackarray[$index]\n";
}

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

打印“独特的曲目:\ 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;

您发布了一个更新,您说要选择尚未处理的元素。考虑使用一个哈希来将所有数据保存在一个位置,而不是两个数组。首先用值 0 初始化所有内容:

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

当您处理(或播放)其中一个元素时,将其哈希值设置为真值:

$Tracks{ $playing } = 1;

当您想要尚未处理的曲目时,请选择值不为 true 的键:

@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解决方案,但我在原始问题中注意到输出显示了正确大小写的歌曲标题。

第二个哈希(即由内而外的设计),大致如下:

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 回答