使perl数组独一无二

时间:2012-08-03 18:46:09

标签: arrays perl unix uniq

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

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

@unique_valids = `echo '@valid_runs' | uniq`;
print @unique_valids;

这个打印声明什么都没有。就此而言,这一点都没有。

@unique_valids = `echo '@valid_runs'`;
print @unique_valids;

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

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

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

4 个答案:

答案 0 :(得分:6)

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

my %temp_hash = map { $_ => 1 } @valid_runs;
my @unique_valids = keys %temp_hash;

无论如何,这是做到这一点的perl方式。这里没有必要使用背部抽搐(我尽量避免使用)。

答案 1 :(得分:6)

使用系统调用可以使用perl代码轻松完成某些操作并不是一个好主意。模块List::MoreUtils具有uniq功能,可以满足您的需求:

use List::MoreUtils qw(uniq);

my @unique = uniq @runs;

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

sub uniq (@) {
    my %seen = ();
    grep { not $seen{$_}++ } @_;
}

答案 2 :(得分:5)

在perl中很容易做到这一点。这是一个相当模糊但有趣的方法来重复数组:

@dedup = grep !$seen{$_}++ @orig_array;

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

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

join("\n", @your_array)

应该实现这一点。

答案 3 :(得分:0)

#!/usr/bin/perl
use warnings;

@a = (1, 2, 3, 3, 4, 4, 5);

$cmd = "/usr/bin/uniq <<EOF\n";
$cmd .= $_."\n" foreach (@a);
$cmd .= "EOF\n";

$result = `$cmd`;
print "Cmd: $cmd\n";
print "Result is $result";

@u = split /\n/,$result;
print "After ",join " ",@u,"\n";

这就是你要求的,但是格鲁伯的回答仍然是更好的Perl。