2017-06-27 9 views
2

grepmapをperlで一度に実行する方法はありますか?perl:grepとmapを一度に実行

my $files = [ { path=>'/path/to/file1', 
       size=>123}, 
       { path=>'/path/to/file2', 
       size=>987}, 
       { path=>'/path/file3', 
       size=>1234}, 
       { path=>'/path/to/file4', 
       size=>543}, 
       { path=>'/path/to/my/file5', 
       size=>1357} ]; 
my @large = grep { $_->{size} > 1024 } $files; 
my @large_filepaths = map { $_->{path} } @large; 
:私はしたい特定の値を取得する mapそして、Perlで

files = [{ 'path':'/path/to/file1', 
      'size':123}, 
     { 'path':'/path/to/file2', 
      'size':987}, 
     { 'path':'/path/file3', 
      'size':1234}, 
     { 'path':'/path/to/file4', 
      'size':543}, 
     { 'path':'/path/to/my/file5', 
      'size':1357}] 
large_filepaths = [file['path'] for file in files if file['size'] > 1024] 

を、私は大容量のファイルをフィルタリングするgrepを実行する必要があります。Pythonはリスト内包を実行できる方法と同様に

1つの操作でこれを実行する簡単な方法がありますか、2つのステートメント(または1つの複合ステートメント)を使用する必要がありますか?

+0

grep {$ _-> {size}> 1024} $ files; '...それはあなたを悲しくする可能性があります。あなたは '@ $ files'のように' $ files'を逆参照するか、私の好きな新しい構文 '$ files - > @ *'を使う必要があります。 –

答えて

9

一つの文にそれを行うには、「標準」方法とあなたはPythonでやっていることに最も近い同等です。

技術的mapはゼロを含め、各入力値のために任意の数の値を返すことができるので、それは、単一mapでそれを行うことが可能です - あなたは
map { $_->{size} > 1024 ? $_->{path} :() } @$filesような何かを行うことができますが、それは実質的に少ない明らかだと私は「wouldnそれを一般的にお勧めしません。

2

単一の操作でこれを実行するための簡単な方法は、あなたが1つの複合文としてそれを行うことができ、

あります:

my @large_paths = map { $_->{path} } grep ...; 
4
  1. $filesは、配列の参照です、従ってvalues $filesは意味をなさない。

  2. map BLOCKgrep BLOCKは、それぞれ、map EXPRgrep EXPRよりも遅くなる傾向があります。可能であれば後者を推奨します。 map { ... } grep { ... } @$files

my @large_filepaths = 
    map $_->{path}, 
    grep $_->{size} > 1024, 
    @$files; 
+0

'values $ files'は、参照変数を自動的に逆参照する実験的な(ただし廃止されました)機能で動作します – Alnitak

2

あなたは

my @large_filepaths = map { $_->{size} > 1024 ? ($_->{path}) : () } @$files; 

をしたいが、私はmap/grep組み合わせが明確だと思う場合は、mapにだけ呼び出しでこれを行うことができます。