regex - 我认为这段代码找到了字符串长度。这里到底发生了什么?

标签 regex perl

我的任务是将一些代码从 Perl 转换为 Python,我遇到了这段让我感到困惑的代码:

my $length = map $_, $root =~ /(.)/gs;

根据变量名和测试,我确定它获取字符串的长度,但这似乎是一种非常奇怪且难以理解的方法。为什么有人会使用它而不是 length($root) 或可怕的 $root =~ y///c,如 this post 中所述,有什么理由吗? ?我想确保我没有错过一些基于我不知道的奇怪 Perl 行为的功能。

最佳答案

在列表上下文中,带有/g 修饰符的 m//运算符返回所有捕获的列表,在本例中是字符串中的每个字符。该映射是一个空操作,但在标量上下文中返回它生成的列表中的元素数,因此结果是字符串中的字符数。 m//运算符在标量上下文中的工作方式不同,因此需要这个中间步骤。一个类似的成语是:

my $length = () = $root =~ /(.)/gs;

这通常用于更复杂的匹配计数,因为 length函数非常合适并且效率更高。

关于regex - 我认为这段代码找到了字符串长度。这里到底发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56976630/

相关文章:

regex - 如何编写正则表达式以仅匹配模式末尾的一位数字?

perl - Getopt::Long::Descriptive - 选项规范错误:

perl - 'global symbol requires explicit package name'的解释

linux - RedHat Perl 5.10.1-出现错误 'symbol lookup error:auto/Math/Pari/Pari.so: undefined symbol: Perl_Tstack_sp_ptr'

perl - 为什么 tinyperl 不在 Windows 上设置 ERRORLEVEL

perl selenium:Test::Exception、正确用法和好的代码示例?

删除散布在字符串中的多个标点符号

ruby - 模式匹配时 =~ 和 match() 有什么区别?

java - 0 ,1 和空字符串的正则表达式模式

javascript - 正则表达式匹配聊天室字符串中的非法字符