您好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
一个具体的例子是替换行的行(^ M) - 在这种情况下,CR:回车符,八进制代码= 15 - 带< 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
将参数作为八进制代码传递对第一个参数有好处,但我不知道为什么字符串被替换为 as-is 而不是用八进制代码表示的对应字符替换它( \ 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
如果不是将八进制代码作为第二个参数传递,而是传递实际字符(空,或者什么也没有,因为我想从那里剥离^ M),脚本按预期工作
无论我想要替换什么字符,都会发生同样的事情 - 也就是说,我使用其八进制代码作为第二个参数发送的字符。
我错过了什么吗?当然......但是什么?
感谢您阅读 - 我感谢您的任何想法或建议。
祝你好运
修改
以防万一,perl -v
:This is perl, v5.8.8 built for aix-thread-multi...
修改 我在这里找到了关于八进制转义的信息:http://perldoc.perl.org/perlrebackslash.html
这里有一些事情要做。但是,即使将代码更改为$_ =~ s/\o{$parm1}/\o{$parm2}/g;
之后,只将数字传递给脚本,它仍然无效。
答案 0 :(得分:0)
我在阅读Perl的文档时发现了这个问题...具体来说,这个页面:http://docstore.mik.ua/orelly/perl2/prog/ch05_02.htm
在 5.2.3下。 s ///运营商(替换),您可以看到以下段落:
S / PATTERN / REPLACEMENT / egimosx
...
此运算符在字符串中搜索PATTERN,如果找到,则替换 匹配的子字符串与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";
}
我希望这会有所帮助 - 它帮助我学习了一些新东西,确实:)