質問

この Python スニペットを Perl で表現する方法を探しています。

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

一方向から見ると、値が存在するキーが必要なだけです なし または 未定義. 。別の見方をすると、私が欲しいのは、次のような簡潔な 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;

また、私はあまりにもゆっくりと入力すること、と私は答えを投稿する前に、ページをリロードする必要があることだと思います。ところで、0またはundefのいずれかの値は、のヌルの値を処理するための良い方法であることが、あなたは、あなたが使用しているどの覚えて確認することができます。偽の値とし、未定義の値は、Perlには同じものではありません。明確にする:undefは、ブールテストではfalseを返しますが、そう0ありません。 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で真/偽の値を理解したいです。 この質問はにはPerlで真実の良い概要を説明しています。

あなたには式を適用マップを、見てみたいそうよリストの各要素にブレースと結果を返します。例は以下のようになります:

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::コア そして ムース::オートボックス )

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 には、コードを DRYer にするキー/値 'kv' が付属しています。

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帰属
所属していません StackOverflow
scroll top