regex – 在Perl代码中改进(优化)现有字符串替换的任何建议?

前端之家收集整理的这篇文章主要介绍了regex – 在Perl代码中改进(优化)现有字符串替换的任何建议?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Perl 5.8

在现有的Perl脚本中对相当简单的字符串替换的改进.
代码的意图很明确,代码正在运行.

对于给定的字符串,将每个出现的TAB,LF或CR字符替换为单个空格,并用双引号替换每个双引号.这是现有代码的片段:

# replace all tab,newline and return characters with single space
$val01  =~s/[\t\n\r]/ /g;
$val02  =~s/[\t\n\r]/ /g;
$val03  =~s/[\t\n\r]/ /g;

# escape all double quote characters by replacing with two double quotes
$val01  =~s/"/""/g;
$val02  =~s/"/""/g;
$val03  =~s/"/""/g;

问题:有没有更好的方法来执行这些字符串操作?

通过“更好的方式”,我的意思是更有效地执行它们,避免使用正则表达式(可能使用tr ///来替换tab,换行符和lf字符),或者可能使用(qr //)来避免重新编译.

注意:我已经考虑将字符串操作操作移动到子例程,以减少正则表达式的重复.

注意:此代码有效,它并没有真正破坏.我只是想知道是否有更合适的编码约定.

注意:这些操作在循环中执行,大量(> 10000)次迭代.

注意:此脚本当前在perl v5.8.8下执行. (该脚本具有require 5.6.0,但可以将其更改为要求5.8.8.(安装更高版本的Perl当前不是生产服务器上的选项.)

> perl -v
    This is perl,v5.8.8 built for sun4-solaris-thread-multi
    (with 33 registered patches,see perl -V for more detail)

解决方法

您现有的解决方案对我来说很好.

至于避免重新编译,您不必担心这一点. Perl的正则表达式只按原样编译一次,除非它们包含内插表达式,而不包含内插表达式.

为了完整起见,我应该提到即使存在插值表达式,也可以通过提供/ o标志告诉Perl只编译一次正则表达式.

$var =~ s/foo/bar/;    # compiles once
$var =~ s/$foo/bar/;   # compiles each time
$var =~ s/$foo/bar/o;  # compiles once,using the value $foo has
                       # the first time the expression is evaluated

猜你在找的Perl相关文章