[英]Perl equivalent of (Python-) list comprehension
我想你想要grep
:
#!/usr/bin/env perl
use strict;
use warnings;
my %data = ( A => undef, B => 'yes', C => undef );
my @keys = grep { defined $data{$_} } keys %data;
print "Key: $_\n" for @keys;
我還認為輸入速度太慢,因此在發布答案之前應該重新加載頁面。 順便說一句,值為0
或undef
可能是處理空值的好方法,但是請確保記住使用的值。 在Perl中,false值和undefined值不是同一回事。 需要說明的是: undef
在布爾測試中返回false,但是0
undef
返回false。 如果0
是有效值,那么您要顯式測試定義性,而不僅僅是真實性。 (我之所以這樣提,是因為詹姆斯去了0
而我又去了,所以你可能不知道這是否重要。)
使用grep :
#!/usr/bin/perl
use strict;
use warnings;
my %data = ("A" => 0, "B" => "yes", "C" => 0 );
my @keys = grep { $data{$_} } keys %data;
Grep從右側列表中返回值,大括號中的表達式將其計算為真值。 正如遠距傳銷員指出的那樣,您要確保您了解Perl中的true / false值。 這個問題很好地概述了Perl中的真理。
您可能需要看一下map ,它將大括號中的表達式應用於列表的每個元素並返回結果。 一個例子是:
my @data = ("A" => 0, "B" => 1, "C" => 0 );
my @modified_data = map { $data{$_} + 1 } @data;
print join ' ', @data, "\n";
print join ' ', @modified_data, "\n";
對於主題的變化,請看一下autobox (請參閱其實現autobox :: Core和Moose :: Autobox )
use autobox::Core;
my %data = ( A => undef, B => 'yes', C => undef );
my $key_list = %data->keys->grep( sub { defined $data{$_} } );
say "Key: $_" for @$key_list;
# => Key: B
Moose :: Autobox帶有鍵/值'kv',它使代碼DRYer:
my $key_list = %data->kv->grep( sub{ defined $_->[1] } )->map( sub{ $_->[0] } );
這是上面的更明確甚至更長的版本:
my $key_list = %data->kv
->grep( sub { my ($k, $v) = @$_; defined $v } )
->map( sub { my ($k, $v) = @$_; $k } );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.