Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 为什么Perl正则表达式捕获组在“打印”和算术操作之间表现不同?_Regex_Perl_Text Processing_Capturing Group - Fatal编程技术网

Regex 为什么Perl正则表达式捕获组在“打印”和算术操作之间表现不同?

Regex 为什么Perl正则表达式捕获组在“打印”和算术操作之间表现不同?,regex,perl,text-processing,capturing-group,Regex,Perl,Text Processing,Capturing Group,在Perl v5.30.0中,当用作打印参数时,正则表达式作为捕获进行评估: 简化示例;真实案例有更多的文本,而捕获只覆盖其中的一部分。 echo$'1\n2\n3'| perl-ne'print/' 123 这对于文本提取非常有用。我想利用算术运算的同样便利性,但这并不像预期的那样有效: 尝试计算捕获的int值之和 echo$'1\n2\n3'| perl-ne'$tot+=/;结束{打印$tot}' 3. 尝试打印每个捕获的int值的两倍 echo$'1\n2\n3'| perl-ne'pr

在Perl v5.30.0中,当用作打印参数时,正则表达式作为捕获进行评估:

简化示例;真实案例有更多的文本,而捕获只覆盖其中的一部分。 echo$'1\n2\n3'| perl-ne'print/' 123 这对于文本提取非常有用。我想利用算术运算的同样便利性,但这并不像预期的那样有效:

尝试计算捕获的int值之和 echo$'1\n2\n3'| perl-ne'$tot+=/;结束{打印$tot}' 3. 尝试打印每个捕获的int值的两倍 echo$'1\n2\n3'| perl-ne'print/*2' 222 使用捕获变量可以:

echo$'1\n2\n3'| perl-ne'if//{$tot+=$1};结束{打印$tot}' 6. 然而,我很好奇为什么会发生这种情况,以及是否有可能以任何方式使用前面更紧凑的表单,以便对捕获的值执行算术运算。

您可以使用$将所有输入相加:

echo $'1\n2\n3' | perl -ne '$tot += $_; END { print $tot . "\n" }'

6
或者,您可以使用-a autosplit选项将输入拆分为字段:

echo $'1\n2\n3' | perl -ane '$tot += $F[0]; END { print $tot . "\n" }'

6
您可以使用$\将所有输入相加:

echo $'1\n2\n3' | perl -ne '$tot += $_; END { print $tot . "\n" }'

6
或者,您可以使用-a autosplit选项将输入拆分为字段:

echo $'1\n2\n3' | perl -ane '$tot += $F[0]; END { print $tot . "\n" }'

6
这是因为m//在标量上下文中成功返回1,请参见。您可以强制列表上下文以返回匹配的零件:

echo$'1\n2\n3'| perl-ne'$tot+=/./[0];结束{打印$tot}' 这是因为m//在标量上下文中成功返回1,请参见。您可以强制列表上下文以返回匹配的零件:

echo$'1\n2\n3'| perl-ne'$tot+=/./[0];结束{打印$tot}'
或$tot+=$1如果/;或$tot+=$&if/;问题中已经提到了捕获。我试图解释为什么不能直接使用匹配项,以及在没有匹配项的情况下如何使用它。是的,只是一些替代扫描也用于上下文:perl-wE'$tot+=$for 123=~/./g;说$tot'或$tot+=1如果/;或$tot+=$&if/;问题中已经提到了捕获。我试图解释为什么不能直接使用匹配项,以及在没有匹配项的情况下如何使用它。是的,只是一些替代扫描也用于上下文:perl-wE'$tot+=$for 123=~/./g;假设$tot'自动拆分为无操作,就像拆分“”,1\n将只拆分为1个字段。基本上与使用$\相同,但不必要地混淆。如果不是“无操作”,您将丢弃剩余的数据(如果有)。谢谢@TLP。对不起,我太天真了。但是我认为如果我们想使用$F[0],那么我们需要使用-a选项。就像我说的,在这个例子中,$F[0]和$\基本上是一样的。不同之处在于“”上的拆分将删除换行符。谢谢,我理解您的观点,即autosplit是不可操作的,就像拆分“”,1\n将只拆分为1个字段。基本上与使用$\相同,但不必要地混淆。如果不是“无操作”,您将丢弃剩余的数据(如果有)。谢谢@TLP。对不起,我太天真了。但是我认为如果我们想使用$F[0],那么我们需要使用-a选项。就像我说的,在这个例子中,$F[0]和$\基本上是一样的。不同之处在于“”上的拆分将删除新行。谢谢,我理解你的观点