在Perl脚本中使用双引号

时间:2014-08-01 04:24:37

标签: perl escaping double-quotes

任何人都可以帮忙解决这个问题:

use strict;
use warnings;

my $teststr="\"abcd\"";

print "\nTestStr: $teststr\n";

`echo "$teststr" >> \/home\/folder\/samplequotes.txt`;

上述程序的输出:

$ perl quotes1.pl

TestStr: "abcd"

$ cat samplequotes.txt

abcd

我面临的问题是字符串中的双引号没有进入文本文件。

理想情况下,samplequotes.txt文件的内容应为:

"abcd"

有人可以告诉我这里会出现什么问题吗?

3 个答案:

答案 0 :(得分:3)

你的问题是混合Perl和shell;这两个相似但不完全相同的引用约定,并理解它们之间的相互作用很难(因为你需要分别理解它们以及它们如何相互作用)。

Perl扩展:

`echo "$teststr" >> \/home\/folder\/samplequotes.txt`;

成:

echo ""abcd"" >> /home/folder/samplequotes.txt

并且shell将相邻的双引号视为空,因此您在文件中得到abcd。如果您不希望shell解释双引号,请写:

`echo '$teststr' >> /home/folder/samplequotes.txt`;
shell将其视为:

echo '"abcd"'  >> /home/folder/samplequotes.txt

但是,最好不要只运行shell来做那样的回声;让Perl打开文件并将输出添加到文件然后关闭文件会更加明智。

{
open my $fh, '>>', "/home/folder/samplequotes.txt" or die;
print $fh $teststr;
}

大括号将文件句柄的范围限制为显示的四行代码,并在文件句柄超出范围时自动关闭文件。

代码中文件名中的反斜杠也是毫无意义的。 Perl删除了它们(AFAICT),因此shell无法看到它们。

答案 1 :(得分:2)

使用perl的文件处理来写入文件:

use strict;
use warnings;
use autodie;

my $teststr = '"abcd"';
my $file = '/home/folder/samplequotes.txt';

print "\nTestStr: $teststr\n";

open my $fh, '>>', $file;
print $fh $teststr;

答案 2 :(得分:2)

如果修改输入字符串以包含shell的反斜杠,则可以这样解释:

use strict;
use warnings;

my $teststr="\\\"abcd\\\"";

print "\nTestStr: $teststr\n";
`echo "$teststr" >> \/home\/folder\/samplequotes.txt`;

然后,您将获得samplequotes.txt文件的所需输出。这里的问题是你的shell没有像你想象的那样解释你的输入。

希望有所帮助!