任何人都可以帮忙解决这个问题:
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"
有人可以告诉我这里会出现什么问题吗?
答案 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没有像你想象的那样解释你的输入。
希望有所帮助!