![](/img/trans.png)
[英]Are Python list comprehensions the same thing as map/grep in Perl?
[英]perl: grep and map in one operation
有沒有辦法在perl的單個操作中執行grep
和map
? 類似於python可以執行列表理解的方式:
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]
在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;
有一種簡單的方法可以在一次操作中運行它,還是我必須使用2個語句(或一個復合語句)?
使用map { ... } grep { ... } @$files
一個語句是執行它的“標准”方式,也是與Python中所做的最接近的方式。
從技術上講,它可以在一個map
,因為map
可以為每個輸入值返回任意數量的值,包括零 - 所以你可以做類似的事情
map { $_->{size} > 1024 ? $_->{path} : () } @$files
map { $_->{size} > 1024 ? $_->{path} : () } @$files
,但這一點不太清楚,我不推薦它。
$files
是一個數組引用,因此values $files
沒有意義。
map BLOCK
和grep BLOCK
分別比map EXPR
和grep EXPR
慢。 如果可以的話,更喜歡后者。
my @large_filepaths =
map $_->{path},
grep $_->{size} > 1024,
@$files;
有一種簡單的方法可以在一次操作中運行它,
您可以將其作為一個復合語句來執行:
my @large_paths = map { $_->{path} } grep ...;
如果需要,只需調用map
即可完成此操作
my @large_filepaths = map { $_->{size} > 1024 ? ( $_->{path} ) : ( ) } @$files;
但我認為組合的map
/ grep
更清晰。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.