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