2017-11-18 18 views
0

私は最初のキャプチャを取り、それをハッシュのキーとして使用したい変数を持っています。私は解決策を見つけましたが、最適ではないようです。Perlリストコンテキストをハッシュキーとして

My $out = $hash{[$var =~ /(^[a-z]+)/]->[0]}; 

リスト - >配列 - >スカラーの方が良い方法があるようです。おそらくlist->スカラーです。私は別の変数に取り込んでキーとして使うこともできますが、私はそれを避けたいと思います。これを行うより良い方法はありますか?

+1

コードはコンパイルされません。また、常に警告と厳格を使用してください。 '%hash {key}'は$ hash {"key"} ' – tinita

+0

としてよく書かれたスカラーコンテキストで警告'%hash {"key"}を発行する必要があります。これをメモリからコピーしました。元のコードは$ hashを使用しました。一定。 –

答えて

3

単一のステートメントにすべてを詰め込むする必要がこのような

my ($key) = $var =~ /(^[a-z]+)/; 
my $out = $hash{ $key }; 

が、何かが

my $out; 
$out = $hash{$1} if $var =~ /(^[a-z]+)/; 

または多分

my $out = $var =~ /(^[a-z]+)/ && $hash{$1}; 
5

配列リファレンスを作成する必要はありません。

my $out = $hash{ ($var =~ m/(^[a-z]+)/)[0] }; 
0

What'sを大丈夫だろうありません間違っている?

$var =~ /^([a-z]+)/; 
my $out = $hash{$1}; 

複数の一致のために、しかし、単一のもののためにリストコンテキストで=~の出力を使用することが有用ですか?

正規表現が(他の人が示唆しているように)一致しないと思われる場合は、最初にチェックする方が良いでしょう。例えば:

if($var =~ /^([a-z]+)/) { 
    my $out = $hash{$1}; 
    ... 
} 

あなたはワンライナーをしたい場合は、あなたが使用することができます:

my $out = $hash{ ($var =~ /^([a-z]+)/)[0] }; 

正規表現が一致しない場合、これは警告を与えます。 @tinitaによって最初に提案されました。

+1

パターンマッチが成功したことを知らない限り、 '$ 1'の値を使用しないでください。 $ var =〜/(^ [a-z] +)/ 'ならば、' $ out = $ hash {$ 1} 'は自分の答えで書きました。 – Borodin

+0

最も一般的なケースについて私は同意します。しかし、その後、 '$ out'の値を使うことができるのはどうでしょうか?より一般的な場合は 'if($ var =〜/ ^([a-z] +)/){my $ out = $ hash {$ 1}; ...} '、あなたは思いませんか? –

+0

あなたが私の答えについて話しているなら、意図は 'if($ out){...}'でフォローアップすることでした。正規表現上にすべてのものを置く方が良いかもしれないし、そうでないかもしれない。私たちは、OPのアプリケーションについてはごくわずかな見解しか持っていません。 $ var =〜/(^ [a-z] +)/ 'を除いて、' qq {不正データ "$ var"}で死ぬ方が良いかもしれませんが、わかりません。 – Borodin

関連する問題