珀尔 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///
来替换制表符、换行符和 lf 字符),或者可能使用( qr//
)来避免重新编译。注意:我已经考虑将字符串操作操作移到子程序中,以减少正则表达式的重复。
注意:此代码有效,并没有真正损坏。我只想知道是否有更合适的编码约定。
注意:这些操作在循环中执行,大量 (>10000) 次迭代。
注意:此脚本当前在 perl v5.8.8 下执行。 (脚本有一个
require 5.6.0
,但这可以更改为 require 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
关于regex - 在 Perl 代码中改进(优化)现有字符串替换的任何建议?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5670716/