使perl数组独一无二

ord*_*der 4 unix arrays perl uniq

我目前遇到一个非常简单的问题,即从反引用的shell命令中捕获输出.我很抱歉问题很简单.

我有一些排序数组(@valid_runs),我知道它包含连续的重复元素.我想使用反引号将此数组回显给uniq.我想捕获数组中的STDOUT.我试图这样做.

@unique_valids = `echo '@valid_runs' | uniq`;
print @unique_valids;
Run Code Online (Sandbox Code Playgroud)

这个打印声明什么都没有.就此而言,这也不是.

@unique_valids = `echo '@valid_runs'`;
print @unique_valids;
Run Code Online (Sandbox Code Playgroud)

我知道如何使用uniq和echo.这对我来说似乎很奇怪.我认为这与perl数组有关,而不是正确使用这些命令.我在其他地方搜索了一下,所以请不要因为解决方案看起来微不足道而感谢我.感谢你的宝贵时间.

关于解决方案的说明:TLP的解决方案是处理uniq问题最直接的解决方案.我很灵活,因为所有的回复都表明没有系统调用这个问题.如果Perl的uniq功能与Unix的uniq相同,那么数组应该保持排序.

如果您不关心排序结果,John Corbett的解决方案效果很好.

Joh*_*ett 6

您应该将数组存储到散列中,因为散列键始终是唯一的.你可以这样做:

my %temp_hash = map { $_ => 1 } @valid_runs;
my @unique_valids = keys %temp_hash;
Run Code Online (Sandbox Code Playgroud)

这无论如何都是这样做的perl方式.这里没有必要使用背部抽搐(我尽量避免使用这些).


TLP*_*TLP 6

使用系统调用可以使用perl代码轻松完成某些操作并不是一个好主意.模块List :: MoreUtils有一个uniq函数可以满足你的需要:

use List::MoreUtils qw(uniq);

my @unique = uniq @runs;
Run Code Online (Sandbox Code Playgroud)

然而,模块内部的子程序非常简单,就像theglauber的答案一样:

sub uniq (@) {
    my %seen = ();
    grep { not $seen{$_}++ } @_;
}
Run Code Online (Sandbox Code Playgroud)


the*_*ber 5

在perl中很容易做到这一点.对于重复数组,这是一种相当模糊但有趣的方法:

@dedup = grep !$seen{$_}++ @orig_array;
Run Code Online (Sandbox Code Playgroud)

通过检查perl函数的文档来弄清楚这是做什么的grep.

如果必须使用uniq,则可能需要将每个数组元素放在单独的行中.

join("\n", @your_array)
Run Code Online (Sandbox Code Playgroud)

应该实现这一点.