簡體   English   中英

Perl等同於(Python-)列表理解

[英]Perl equivalent of (Python-) list comprehension

我正在尋找在Perl中表達此Python代碼段的方法:

data = {"A": None, "B": "yes", "C": None}
key_list = [k for k in data if data[k]]  
# in this case the same as filter(lambda k: data[k], data) but let's ignore that

因此,從一種角度看,我只想要鍵值為Noneundef的鍵。 從另一種角度來看,我想要的是簡潔的perl等同於帶條件列表理解

我想你想要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;

我還認為輸入速度太慢,因此在發布答案之前應該重新加載頁面。 順便說一句,值為0undef可能是處理值的好方法,但是請確保記住使用的值。 在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 :: CoreMoose :: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM