当我试图在搜索字符后查找字符时,Perl 返回散列
Perl is returning hash when I am trying to find the characters after a searched-for character
我想搜索字符串中的给定字符和 return 它后面的字符。
根据这里的post,我试着写
my $string = 'v' . '2';
my $char = $string =~ 'v'.{0,1};
print $char;
但是这个returns 1和一个散列(上次我运行它,确切的输出是1HASH(0x11823a498))。有谁知道为什么它 return 是哈希而不是字符?
Return特定模式后的字符(此处为字符)
my $string = 'example';
my $pattern = qr(e);
my ($ret) = $string =~ /$pattern(.)/; #--> 'x'
这匹配 $string
中第一次出现的 $pattern
,并捕获 returns 下一个字符 x
。 (该示例不处理后面可能没有字符的情况,例如另一个 e
;它根本无法匹配,因此 $ret
将保持 undef
。)
我使用 qr 运算符来形成模式,但普通字符串在这里也可以。
正则表达式匹配运算符 returns 标量和列表中的不同之处 contexts: in the scalar context it is true/false for whether it matched, while in the list context it returns matches. See perlretut
因此您需要在列表上下文中进行匹配,提供这种匹配的一种常见方法是将要分配给的变量放在括号中。
问题中示例的第一个问题是 =~
运算符 binds 比 .
运算符更紧密,因此该示例实际上是
my $char = ( ($string =~ 'v') . {0,1} );
所以首先是正则表达式匹配,它成功了,然后是 returns 1
(因为它在标量上下文中,由 .
运算符强加)然后是哈希-reference {0,1}
连接到 1
。因此 $char
被分配了 1
与 hashref 的字符串化连接,这是一个字符串 HASH(0x...)
(在括号中是地址的十六进制字符串化)。
接下来,模式中所需的 .
不存在。对连接 .
运算符感到困惑?
然后,捕获括号不存在,而预期的子模式需要。
最后,匹配的是标量上下文,如前所述,只会产生 true/false。
总而言之,需要
my ($char) = $string =~ ( q{v} . q{(.)} );
但我想补充一点:虽然 Perl 具有非常流畅的语义,但我建议不要像那样即时构建正则表达式模式。为了清楚起见,我还建议在匹配运算符中实际使用定界符(即使您确实大部分时间都不必这样做)。
我想搜索字符串中的给定字符和 return 它后面的字符。
根据这里的post,我试着写
my $string = 'v' . '2';
my $char = $string =~ 'v'.{0,1};
print $char;
但是这个returns 1和一个散列(上次我运行它,确切的输出是1HASH(0x11823a498))。有谁知道为什么它 return 是哈希而不是字符?
Return特定模式后的字符(此处为字符)
my $string = 'example';
my $pattern = qr(e);
my ($ret) = $string =~ /$pattern(.)/; #--> 'x'
这匹配 $string
中第一次出现的 $pattern
,并捕获 returns 下一个字符 x
。 (该示例不处理后面可能没有字符的情况,例如另一个 e
;它根本无法匹配,因此 $ret
将保持 undef
。)
我使用 qr 运算符来形成模式,但普通字符串在这里也可以。
正则表达式匹配运算符 returns 标量和列表中的不同之处 contexts: in the scalar context it is true/false for whether it matched, while in the list context it returns matches. See perlretut
因此您需要在列表上下文中进行匹配,提供这种匹配的一种常见方法是将要分配给的变量放在括号中。
问题中示例的第一个问题是 =~
运算符 binds 比 .
运算符更紧密,因此该示例实际上是
my $char = ( ($string =~ 'v') . {0,1} );
所以首先是正则表达式匹配,它成功了,然后是 returns 1
(因为它在标量上下文中,由 .
运算符强加)然后是哈希-reference {0,1}
连接到 1
。因此 $char
被分配了 1
与 hashref 的字符串化连接,这是一个字符串 HASH(0x...)
(在括号中是地址的十六进制字符串化)。
接下来,模式中所需的 .
不存在。对连接 .
运算符感到困惑?
然后,捕获括号不存在,而预期的子模式需要。
最后,匹配的是标量上下文,如前所述,只会产生 true/false。
总而言之,需要
my ($char) = $string =~ ( q{v} . q{(.)} );
但我想补充一点:虽然 Perl 具有非常流畅的语义,但我建议不要像那样即时构建正则表达式模式。为了清楚起见,我还建议在匹配运算符中实际使用定界符(即使您确实大部分时间都不必这样做)。