Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 使perl数组唯一_Arrays_Perl_Unix_Uniq - Fatal编程技术网

Arrays 使perl数组唯一

Arrays 使perl数组唯一,arrays,perl,unix,uniq,Arrays,Perl,Unix,Uniq,我目前在从backticked shell命令捕获输出时遇到了一个非常简单的问题。很抱歉,问题很简单 我有一些排序数组(@valid_runs),我知道它包含连续的重复元素。我想使用backticks将这个数组回显到uniq。我想捕获数组中的标准输出。我试图这样做 @unique_valids = `echo '@valid_runs' | uniq`; print @unique_valids; 这个打印语句不会产生任何结果。就这一点而言,这一点也没有 @unique_valids = `e

我目前在从backticked shell命令捕获输出时遇到了一个非常简单的问题。很抱歉,问题很简单

我有一些排序数组(@valid_runs),我知道它包含连续的重复元素。我想使用backticks将这个数组回显到uniq。我想捕获数组中的标准输出。我试图这样做

@unique_valids = `echo '@valid_runs' | uniq`;
print @unique_valids;
这个打印语句不会产生任何结果。就这一点而言,这一点也没有

@unique_valids = `echo '@valid_runs'`;
print @unique_valids;
我知道如何使用uniq和echo。我觉得这很奇怪。我认为这与perl数组有关,而不是正确使用这些命令。我已经在其他地方搜索过了,所以请不要仅仅因为这个解决方案看起来微不足道就向我投反对票。再次感谢您抽出时间

关于解决办法的说明: 就处理uniq问题而言,TLP的解决方案是最直接的。我很灵活,因为所有的回答都建议不要对这个问题进行系统调用。如果Perl的uniq函数与Unix的uniq函数相同,那么数组应该保持排序


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

您应该将数组存储到哈希中,因为哈希键总是唯一的。您可以这样做:

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

无论如何,这就是perl的方法。这里不需要使用back tics(我尽量避免使用它们)。

在perl中很容易做到这一点。以下是一种相当晦涩但有趣的阵列重复数据消除方法:

@dedup = grep !$seen{$_}++ @orig_array;
通过查看perl函数
grep
的文档,了解这是做什么的

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

join("\n", @your_array)
应该能做到这一点。

#/usr/bin/perl
#!/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";
使用警告; @a=(1,2,3,3,4,4,5);
$cmd=“/usr/bin/uniq使用系统调用实现一些可以用perl代码轻松完成的功能不是一个好主意。该模块有一个uniq函数,可以满足您的要求:

use List::MoreUtils qw(uniq);

my @unique = uniq @runs;
模块内部的子例程非常简单,但与Glauber的答案完全相同:

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

一个潜在的问题是:
@valid\u runs
的元素是否以换行符结尾?否则
echo
将只产生一行输出作为
uniq
的输入,你确定
@valid\u runs
不是空的吗?这为我打印了一些东西:
@x=(3,2,1);@y=`echo'@x'`;print@y;
@user5402我确信@valid runs不是空的。我确信每个条目在字符串的末尾都有一个换行符。你的例子很有效。这很好;表明我没有提出太疯狂的建议。下面是@valid_runs的一个片段:
/raid1/home/pharmacy/morguna/1experiments\u copy/1experiments/test10-10/run36415/raid1/home/pharmacy/morguna/1experiments\u copy/1experiments/test10-10/run36415/raid1/home/pharmacy/morguna/1experiments\u copy/1experiments/1experiments\u copy/1experiments/1experiments/test10-10/run36416
讨论您可能希望在Perl中使用数组做的各种事情,例如gett关于两个数组之间的区别,请参阅Perl常见问题解答:这并没有保留数组的顺序。他没有说需要保留。在本文中,这不是必需的,但是我确实希望能够做一些简单的事情,比如将数组放入shell命令。@JohnCorbett感谢您的解决方案。它实现了需要做的事情,bu我仍然想知道如何做我提出的。是的,对于当前的解决方案,我只是在Perl中实现了一些东西。进行不必要的系统调用是不好的。我只是因为知道uniq而变得懒惰。谢谢你的时间。