2009-05-26 9 views
2

私は設定ファイルから読み込んだリストを含むハッシュを作成する、より洗練された方法を探しています。ここに私のコードです:Perlで配列リファレンスからエレガントにハッシュを作成する方法はありますか?

read_config($config_file => my %config); 

my $extension_list_reference = $config{extensions}{ext}; 

my @ext; 

# Store each item of the list into an array 

for my $i (0 .. (@$extension_list_reference - 1)) { 
    $ext[$i] = $extension_list_reference->[$i]; 
} 

# Create hash with the array elements as the keys 

foreach my $entry (@ext) { 
    $extensions{$entry} = "include"; 
} 

ありがとう。

+0

Iあなたに疑念の恩恵を与えようとしていて、あなたは「厳密な使用」を含めるのを忘れてしまったと仮定します。と "警告を使用する";確かにあなたのコードの一番上にあります。 –

+0

Perlについて私が最初に学んだときに私が見つけた最も不満なことの一つは、デフォルトでは厳格ではないということです。私はそれらを完全に投げ捨てます。 – Neil

+0

ああ待って、これは私の質問ではありません。他のNeilの質問です。おっとっと! – Neil

答えて

6

マップを使用してみてください:私はあなたの問題を理解していれば、これはあなたが1行でそれを行う方法です

my %extensions = map { $_ => "include" } @{ $config{extensions}{ext} }; 
+0

ありがとうございます。ブルックリンはどうですか?私の発祥の地。 –

+0

4ヶ月前にここに移動していいですね。 – Neil

+0

my%extensions = map {$ _ => "include"} @ {$ config {extensions} {ext}} –

13

my %hash = map { $_ => 'include' } @list;

+1

以下は機能しました:%extensions = map {$ _ => "include"} @ $ extension_list_reference; –

2

http://perldoc.perl.org/functions/map.html

はここにあなたの新しいコードがどのように見えるかです:

@extensions{@$extension_list_reference} =(); 

注:ハッシュの各値は空ですが、あなたはまだキーが機能を使用して、ハッシュ内に存在するかどうかを確認することができ、このように、の存在:

if(exists $extensions{$some_key}) {... 

P.S.何らかの理由であなたが本当にそれらの文字列 'を含む' を必要とする場合の値として、あなたも、それらを持つことができます。

@extensions{@$extension_list_reference} = ('include') x @$extension_list_reference; 
+0

これはなぜ機能しません:%extensions {@ $ extension_list_reference} =(); ? –

+0

'ハッシュスライス'で操作しているため、http://perldoc.perl.org/perldata.html#Slices –

+0

リストに複数の値が含まれている場合、これは正常に機能します。誰かが設定ファイルに1つの値しか持たない可能性があります。 1つの値と多くの値をどのように扱うことができますか? –

1

この方法:

read_config($config_file => my %config); 
%extensions = map +($_ => "include"), @{$config{extensions}{ext}}; 

またはこのよう:

read_config($config_file => my %config); 
@extensions{@{$config{extensions}{ext}}} = ("include") x @{$config{extensions}{ext}}; 
+0

私はこのアプローチが好きです - ありがとう。 –

関連する問題