4

私は現在、バッククォートされたシェルコマンドからの出力をキャプチャすることに関して非常に単純な問題を抱えています。問題はかなり単純なものであるとお詫び申し上げます。

連続した重複要素が含まれていることがわかっているソート済み配列(@valid_runs)があります。この配列をuniqにエコーするためにバッククォートを使用したいと思います。STDOUTを配列でキャプチャしたい。私はこのようにそうしようとします。

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

このprintステートメントは何も生成しません。そのことについては、これもしません。

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

uniqとechoの使い方を知っています。これは私にはかなり奇妙に思えます。これは、これらのコマンドを適切に使用することよりも、perl配列に関係していると思います。私は他の場所を少し検索したので、解決策が些細なことに思えるかもしれないという理由だけで、私に反対票を投じないでください。お時間をいただき、ありがとうございました。

解決策に関する注記:TLPの解決策は、uniq問題を処理する限り最も簡単です。すべての回答がこの問題をシステムコールしないことを示唆していたので、私はかなり柔軟です。Perlのuniq関数がUnixのuniqと同じである場合、配列はソートされたままである必要があります。

ソートされた結果を気にしない場合は、JohnCorbettのソリューションが適切に機能します。

4

4 に答える 4

8

perlコードで簡単に実行できるシステムコールを使用することはお勧めできません。モジュールList::MoreUtilsには、必要なことを実行するuniq関数があります。

use List::MoreUtils qw(uniq);

my @unique = uniq @runs;

ただし、モジュール自体の内部のサブルーチンは非常に単純ですが、glauberの答えとまったく同じです。

sub uniq (@) {
    my %seen = ();
    grep { not $seen{$_}++ } @_;
}
于 2012-08-03T20:21:30.330 に答える
7

ハッシュキーは常に一意であるため、配列をハッシュに格納する必要があります。あなたはこのようにそれを行うことができます:

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

それはとにかくそれを行うperlの方法です。ここではバックチックを使用する必要はありません(できる限りバックチックを避けるようにしています)。

于 2012-08-03T18:55:34.967 に答える
5

perlでこれを行うのは簡単です。配列を重複排除するための、かなりあいまいですが楽しい方法は次のとおりです。

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

perl関数のドキュメントをチェックして、これが何をしているのかを理解してgrepください。

を使用する必要がある場合はuniq、おそらく各配列要素を別々の行に配置する必要があります。

join("\n", @your_array)

それを達成する必要があります。

于 2012-08-03T18:56:51.617 に答える
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";

これはあなたが求めることをしますが、glauberの答えはそれでもより良いPerlです。

于 2012-08-03T20:07:27.803 に答える