Perl列表上下文作为哈希键

时间:2017-11-18 16:31:17

标签: arrays perl hash casting

我有一个变量,我想进行第一次捕获并将其用作散列的关键字。我找到了解决方案,但似乎不是最理想的。

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

似乎必须有一个更好的方法然后去list-> array->标量。也许只是list->标量。我知道我也可以捕获另一个变量,然后将其用作关键,但我想避免这种情况。有更好的方法吗?

3 个答案:

答案 0 :(得分:5)

无需创建数组引用。

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

答案 1 :(得分: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};

答案 2 :(得分:0)

出了什么问题?

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

在列表上下文中使用=~的输出用于多个匹配是有用的,但对于单个匹配?

如果您希望正则表达式不匹配(按照其他人的建议),最好先检查一下。例如:

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

如果您想要单行,您可以使用:

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

如果正则表达式不匹配,这将发出警告。首先由@tinita建议。