s ///和Perl中的正则表达式

时间:2013-01-23 16:32:38

标签: regex perl operators substitution

我是Perl的新手,我在Apache安装中找到了这个测试CGI脚本,我想知道它的用途,特别是在两个s///行之一。

#!/usr/bin/perl

print "Content-type: text/plain; charset=iso-8859-1\n\n";
foreach $var (sort(keys(%ENV))) {
    $val = $ENV{$var};
    $val =~ s|\n|\\n|g;
    $val =~ s|"|\\"|g;
    print "${var}=\"${val}\"\n";
}

$val =~ s|\n|\\n|g;行将\n的每次出现替换为\\n。但为什么呢?

$val =~ s|"|\\"|g;行怎么样?我认为这是一种替代,但似乎有一种奇怪的形式。

3 个答案:

答案 0 :(得分:2)

  

$val =~ s|\n|\\n|g;行将\n的每次出现替换为\\n

更准确地说,它用一个代表新行的公共转义序列替换每一个新行。

  

但为什么?

存在着纯粹猜测的土地。内容类型为text/plain,因此没有明显的理由这样做。

  

$val =~ s|"|\\"|g;行?我认为这是一种替代,但似乎有一种奇怪的形式。

它在许多上下文中使用表示"的转义序列替换"(但不是纯文本)。同样,没有明显的理由从它所呈现的背景中去做。


冒险猜测。看起来它的目的是将服务器的环境转储到一个文本文件中,从中可以复制/粘贴它以便在其他地方使用。

答案 1 :(得分:0)

看起来它正在尝试逃避某些其他级别的评估。即其他东西需要查看\n,但其他内容不会将\视为文字\,因此需要先将其转义\\。同样适用于"。其他东西需要它作为文字进行转义,即\",它首先需要确保\通过\保留为文字\\

答案 2 :(得分:0)

您对第一次替换的解释是正确的。第二个替换类似:它将"的每次出现替换为\"