Hashref 分配使用下一个键而不是分配 undef
Hashref assignment consumes next key instead of assigning undef
我正在尝试初始化一个包含多个表达式结果的 hashref。我希望 return undefined 结果的表达式将 undef 分配给适当的键。相反,赋值只是吞噬了下一个键,就好像表达式从来没有开始过一样。
一个简单的例子可能更容易理解:
use Data::Dumper;
my $str = "vs";
my $contains = {
t => ($str =~ /t/i),
u => ($str =~ /u/i),
v => ($str =~ /v/i),
};
print(Data::Dumper->Dump([$contains]));
我希望上面的代码打印:
$VAR1 = {
'v' => 1,
't' => undef,
'u' => undef
};
相反,我得到以下信息:
$VAR1 = {
't' => 'u',
'v' => 1
};
在赋值中添加一个明确的 undef 确实得到了我正在寻找的结果:
use Data::Dumper;
my $str = "vs";
my $contains = {
t => ($str =~ /t/i || undef),
u => ($str =~ /u/i || undef),
v => ($str =~ /v/i || undef),
};
print(Data::Dumper->Dump([$contains]));
然而,这对我来说似乎有点违反直觉。有人可以解释这种行为吗?
您 运行 遇到了列表上下文与标量上下文的问题。要获得所需的输出,您必须强制匹配处于标量上下文中,例如喜欢scalar($str =~ /t/i)
,或者($str =~ /t/i) || undef
,如果你真的想要undef
,以防匹配失败。
正则表达式匹配 /.../
在不同的上下文中表现不同:
- 在标量上下文中,它 returns 一个 true/false 值取决于它是否匹配
- 在列表上下文中,行为是 more complicated:
- 如果您有任何捕获组,请成功匹配 returns 这些捕获的值。
- 如果您没有捕获组,则成功匹配 returns 具有单个元素
1
的列表。
- 匹配失败returns空列表。
在这里,您没有捕获组,因此如果您的正则表达式匹配不匹配,则它们会评估为 空列表 – 而不是 undef
。所以 hashref 构造实际上看到这些值:
my $contains = {
't',
'u',
'v', 1,
};
fat-arrow =>
运算符不创建键值对,它只是逗号运算符的变体,将左侧的键转换为字符串。
我正在尝试初始化一个包含多个表达式结果的 hashref。我希望 return undefined 结果的表达式将 undef 分配给适当的键。相反,赋值只是吞噬了下一个键,就好像表达式从来没有开始过一样。
一个简单的例子可能更容易理解:
use Data::Dumper;
my $str = "vs";
my $contains = {
t => ($str =~ /t/i),
u => ($str =~ /u/i),
v => ($str =~ /v/i),
};
print(Data::Dumper->Dump([$contains]));
我希望上面的代码打印:
$VAR1 = {
'v' => 1,
't' => undef,
'u' => undef
};
相反,我得到以下信息:
$VAR1 = {
't' => 'u',
'v' => 1
};
在赋值中添加一个明确的 undef 确实得到了我正在寻找的结果:
use Data::Dumper;
my $str = "vs";
my $contains = {
t => ($str =~ /t/i || undef),
u => ($str =~ /u/i || undef),
v => ($str =~ /v/i || undef),
};
print(Data::Dumper->Dump([$contains]));
然而,这对我来说似乎有点违反直觉。有人可以解释这种行为吗?
您 运行 遇到了列表上下文与标量上下文的问题。要获得所需的输出,您必须强制匹配处于标量上下文中,例如喜欢scalar($str =~ /t/i)
,或者($str =~ /t/i) || undef
,如果你真的想要undef
,以防匹配失败。
正则表达式匹配 /.../
在不同的上下文中表现不同:
- 在标量上下文中,它 returns 一个 true/false 值取决于它是否匹配
- 在列表上下文中,行为是 more complicated:
- 如果您有任何捕获组,请成功匹配 returns 这些捕获的值。
- 如果您没有捕获组,则成功匹配 returns 具有单个元素
1
的列表。 - 匹配失败returns空列表。
在这里,您没有捕获组,因此如果您的正则表达式匹配不匹配,则它们会评估为 空列表 – 而不是 undef
。所以 hashref 构造实际上看到这些值:
my $contains = {
't',
'u',
'v', 1,
};
fat-arrow =>
运算符不创建键值对,它只是逗号运算符的变体,将左侧的键转换为字符串。