我试图在Perl脚本中打开一个名称包含特殊字符“(”和“)”,括号的文件,但无法这样做。
如果我的文件名如abc_5(rt)_dgj.csv
,是否可以在脚本中打开此文件?
$inputfile = <STDIN>;
chomp($inputfile);
unless(-e $inputfile) {
usage("Input file not present\n");
exit 2;
}
system("cat $inputfile | tr '\r' '\n' > temp");
$inputfile = "temp";
# do something here, like copy the data from inputfile and write to another file
system("rm temp");
应该不会有什么问题的。例如:
rd.pl
#!/usr/bin/env perl
use strict;
use warnings;
my $file = "abc_5(rt)_dgj.csv";
open my $fh, "<", $file or die "A horrible death";
my $line = <$fh>;
print $line;
close $fh;
$ cat > "abc_5(rt)_dgj.csv"
Record 1,2014-12-30,19:43:21
$ perl rd.pl
Record 1,2014-12-30,19:43:21
$
在Mac OS X 10.10.5上使用Perl 5.22.0进行了测试。
现在问题有了示例代码,真正的问题显而易见:
system("cat $inputfile | tr '\r' '\n' > temp");
奔跑
cat abc_5(rt)_dgj.csv | …
这会产生(shell)语法错误。如果您在命令行上亲自尝试,也会看到它们。您应将文件名括在(单引号或)双引号中:
system(qq{cat "$inputfile" | tr '\r' '\n' > temp});
这样括号就不会暴露在外壳中。
当您隐藏正在发生的事情(不引用代码,不引用错误消息)时,即使问题很容易解决,也会使人们很难为您提供帮助。就像您最后所做的那样,创建MCVE(如何创建最小,完整和可验证的示例?)会极大地帮助您。它浪费了您更少的时间,也浪费了我们更少的时间。
如果文件名本身带有足够的引号,则在其自身的文件名中具有一对括号(甚至一个括号)不会造成任何麻烦。正如我所指出的,双引号足以满足此特定文件名(以及很多其他引号,甚至包含特殊字符的引号);正如ikegami所 指出的那样,还有其他名称会引起问题。具体来说,包含美元符号,反引号或双引号的名称会引起悲痛,并带有双引号。包含单引号的名称会引起单引号的悲伤。
池上还注意到有一个模块String :: ShellQuote,旨在处理这些问题。它不是Perl核心模块,因此您必须自己安装它,但是如果您必须处理用户可能抛出的任何错误名称,则使用它会很明智。
该shell_quote
模块中的功能文档说明:
如果有任何字符串不能安全地引用shell_quote会发牢骚。
我不清楚哪些字符串不能安全引用。该文档没有详细说明该问题。(croak
是来自称为Carp的核心模块的方法。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句