如何在Perl数组中打印唯一元素?

Che*_*eso 25 arrays perl unique

我在while语句中将元素推送到数组中.每个元素都是教师的名字.当循环结束时,最终在数组中出现重复的教师名称.有时它们在阵列中并不是彼此相邻,有时它们是.

如何在完成获取值后才能打印该数组中的唯一值?每次我想要打印元素时都不必解析整个数组.

在将所有内容推入数组后继承代码:

$faculty_len = @faculty;
$i=0;
while ($i != $faculty_len)
{
        printf $fh '"'.$faculty[$i].'"';
        $i++;
}   
Run Code Online (Sandbox Code Playgroud)

inn*_*naM 42

use List::MoreUtils qw/ uniq /;
my @unique = uniq @faculty;
foreach ( @unique ) {
    print $_, "\n";
}
Run Code Online (Sandbox Code Playgroud)

  • 如果可以安装MoreUtils,这可行.并非总是如此. (2认同)

Rob*_*t P 33

您最好的选择是使用(基本上)内置工具,如uniq(如innaM所述).

如果您无法使用uniq并希望保留顺序,则可以使用grep来模拟它.

my %seen;
my @unique = grep { ! $seen{$_}++ } @faculty;
# printing, etc.
Run Code Online (Sandbox Code Playgroud)

这首先给你一个散列,每个键是每个条目.然后,迭代每个元素,计算它们中的元素数量,并添加第一个元素.(更新了brian d foy的评论)

  • 我想你真的只是这个意思:我看到了%; @unique = grep {!$ Seen {$ _} ++} @faculty; (2认同)

use*_*650 14

我建议把它推到哈希.像这样:

my %faculty_hash = ();
foreach my $facs (@faculty) {
  $faculty_hash{$facs} = 1;
}
my @faculty_unique = keys(%faculty_hash);
Run Code Online (Sandbox Code Playgroud)


小智 5

@array1 = ("abc", "def", "abc", "def", "abc", "def", "abc", "def", "xyz");

@array1 = grep { ! $seen{ $_ }++ } @array1;

print "@array1\n"; 
Run Code Online (Sandbox Code Playgroud)


Biz*_*rck 5

perldoc中的多个解决方案都回答了这个问题.只需键入命令行:

perldoc -q duplicate
Run Code Online (Sandbox Code Playgroud)