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

标签 regex perl string substitution

珀尔 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/

相关文章:

javascript - 为什么我的正则表达式在 PHP 中有效,但在 JavaScript 中无效?

C#正则表达式模式匹配

perl - 在 perl 中构建可变深度哈希引用数据结构

linux - 在Linux服务器上使用Web应用程序来运行脚本

php - VSCODE 片段 PHP 自动填充命名空间

正则表达式语法用于检测括号内的任何字符

java - 提取特定模式后的子串

python - 创建 numpy 数组时 dtype=object 是什么意思?

perl - 在 Perl 中将 CSV 中的一行读入 Hash 中最抗错误的方法是什么?

php - 出于调试目的,如何将任何对象转换为字符串?