gpt4 book ai didi

regex - 将替换函数包装到 Perl 中的脚本中

转载 作者:行者123 更新时间:2023-12-04 20:57:05 26 4
gpt4 key购买 nike

您好 StackOverflow 社区,

我想使用脚本在 Perl 中包装替换函数 - 也就是说,我想要一个脚本接收输入和输出字符作为其参数,以及我想要进行替换的文本文件。我把所有东西都覆盖了,如何处理文件,如何遍历每一行,如何处理参数等等......唯一不起作用的是第二个参数如何“按字面意思”打印到结果文件中,不被解释为我作为参数传递的八进制代码表示的字符。

也许用例子来解释会更清楚。考虑以下文件:

Ross1 0    HP  01/11/2014^M
St J1 0 PA 01/15/2014^M
Gree1 0 GT 01/15/2014^M
UNKN1 0 HPHP01/13/2014^M
Wayn1 0 GT 01/15/2014^M

一个具体的例子是用八进制代码 = 15 替换 行尾 (^M) - 在这种情况下,CR: Carriage Return - 用 < em>空 字符(DEL,八进制代码 = 177)。换句话说,我将使用 Perl 的 s 函数来删除行尾。

一个一般的例子是用任何其他字符替换任何字符,只需将八进制代码作为参数传递到脚本中。如上所述,我几乎已经准备就绪,但我面临一个问题,我猜这是因为代码是如何转义的。我是 Perl 的新手,所以我可能遗漏了一些非常简单的东西......

我制作了这个脚本,将参数设置为:

my ($parm1, $parm2, $filename) = @ARGV;

然后使用 s 函数替换字符,如下所示:

 $_ =~ s/$parm1/$parm2/g;

当然,逐行使用类似的东西:

while (<INPUT>)
{
chomp($_);
$_ =~ s/$parm1/$parm2/g;
print OUTPUT $_."\n";
}

那么,让我们看看当我测试脚本时会发生什么:

差:

$ script.pl "\15" "\177" text

$ cat -v text
Ross1 0 HP 01/11/2014\177
St J1 0 PA 01/15/2014\177
Gree1 0 GT 01/15/2014\177
UNKN1 0 HPHP01/13/2014\177
Wayn1 0 GT 01/15/2014\177

将参数作为八进制代码传递对第一个参数有好处,但我不知道为什么字符串被替换原样而不是用八进制代码表示的相应字符替换它(\177).

好:

$ script.pl "\15" "" text

$ cat -v text
Ross1 0 HP 01/11/2014
St J1 0 PA 01/15/2014
Gree1 0 GT 01/15/2014
UNKN1 0 HPHP01/13/2014
Wayn1 0 GT 01/15/2014

如果我没有将八进制代码作为第二个参数传递,而是传递了 actual 字符(空的或什么都没有,因为我想从那里去掉 ^M),脚本将按预期工作.

无论我要替换什么字符,都会发生同样的情况——也就是说,无论我使用八进制代码作为第二个参数发送什么字符。

我错过了什么吗?当然……但是什么?

感谢您的阅读 - 我感谢你们的任何想法或建议。

最好的问候


编辑:为了以防万一,perl -v:这是为 aix-thread-multi 构建的 perl v5.8.8...


编辑:我在这里找到了有关八进制转义符的信息:http://perldoc.perl.org/perlrebackslash.html

这里肯定有一些事情要做。然而,即使将代码更改为类似 $_ =~ s/\o{$parm1}/\o{$parm2}/g; 并仅将数字传递到脚本中,它仍然不是在职的。

最佳答案

我在阅读 Perl 的文档时发现了这个问题...具体来说,这个页面:http://docstore.mik.ua/orelly/perl2/prog/ch05_02.htm

5.2.3 下。 s///运算符(替换),可以看到下面这段话:

s/PATTERN/REPLACEMENT/egimosx

...

This operator searches a string for PATTERN and, if found, replaces the matched substring with the REPLACEMENT text.

...

The replacement portion is treated as a double-quoted string.

所以,这就是为什么它没有评估 replacement 部分中的 \codes - 代码被视为文字字符串,因此编写它们是有道理的文件中的原样...

为了解决这个问题,我传递了我想要替换的字符的十进制值,并在脚本中替换了它们,如下所示:

$char_parm1 = chr($parm1);

因此,当运行脚本将 @ 替换为 ! 时,我会:

script.pl "64" "33" text

替换运算符定义如下:

$_ =~ s/$char_parm1/$char_parm2/g;

某些字符有特殊情况,例如 \.,因为它们用作转义字符或作为正则表达式的一部分……但除此之外,脚本的一般形式如下:

$char_parm1 = chr($parm1);
$char_parm2 = chr($parm2);

while (<INPUT>)
{
chomp($_);
$_ =~ s/$char_parm1/$char_parm2/g;

print OUTPUT $_."\n";
}

我希望这会有所帮助 - 它确实帮助我学习了一些新东西 :)

关于regex - 将替换函数包装到 Perl 中的脚本中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22868799/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com