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

时间:2014-04-04 17:02:37

标签: regex perl substitution

您好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 -vThis is perl, v5.8.8 built for aix-thread-multi...


修改 我在这里找到了关于八进制转义的信息:http://perldoc.perl.org/perlrebackslash.html

这里有一些事情要做。但是,即使将代码更改为$_ =~ s/\o{$parm1}/\o{$parm2}/g;之后,只将数字传递给脚本,它仍然无效。

1 个答案:

答案 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";
}

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