Macos 在Perl中用文件名中的特殊字符打开文件

Macos 在Perl中用文件名中的特殊字符打开文件,macos,perl,Macos,Perl,我试图在Perl脚本中打开一个文件,该文件的名称包含特殊字符“(“and”)”和括号,但我无法这样做 如果我的文件名像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' '

我试图在Perl脚本中打开一个文件,该文件的名称包含特殊字符“(“and”)”和括号,但我无法这样做

如果我的文件名像
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");
$inputfile=;
chomp($inputfile);
除非(-e$inputfile){
用法(“输入文件不存在\n”);
出口2;
}
系统(“cat$inputfile | tr'\r'\n'>temp”);
$inputfile=“temp”;
#在这里执行一些操作,例如从inputfile复制数据并写入另一个文件
系统(“rm temp”);
反例
应该没什么问题。例如:

rd.pl
在Mac OS X 10.10.5上使用Perl 5.22.0进行测试


真正的问题 现在问题有了示例代码,真正的问题很明显:行

system("cat $inputfile | tr '\r' '\n' > temp");
运行

这将生成(shell)语法错误。如果您在命令行中亲自尝试,您也会看到它们。应将文件名用(单引号或双引号)括起来:

system(qq{cat "$inputfile" | tr '\r' '\n' > temp});
这样括号就不会暴露在壳中

当你隐藏正在发生的事情时——不引用代码,不引用错误消息——你让人们很难帮助你,即使问题很容易解决。正如您最后所做的那样,创建MCVE()非常有帮助。它能减少你的时间浪费,也能减少我们的时间浪费


甚至在文件名中有更奇怪的字符——这有一个模块! 如果文件名本身有一对括号(甚至一个括号),并且引用足够多,则不会引起任何问题。正如我所指出的,双引号对于这个特定的文件名(以及许多其他文件名,甚至包含特殊字符的文件名)是足够的;同样,还有其他名称会导致问题。具体而言,包含美元符号、反引号或双引号的名称将使用双引号引起悲伤;包含单引号的名称将使用单引号引起悲伤

Ikegami还指出,有一个模块专门用于处理这些问题。它不是一个Perl核心模块,因此您必须自己安装它,但是如果您必须处理用户可能会对您造成影响的任何错误名称,那么使用它将是明智的

模块中的
shell\u quote
功能的文档说明:

如果任何字符串不能被安全引用,shell将发出咯咯声


我不清楚什么字符串不能被安全引用;文件中没有详细说明这个问题。(
croak
是一个名为的核心模块的方法。)

应该没有任何问题。你能展示一下你使用的代码吗?我不认为这会有什么不同,但你使用的是什么文件系统和操作系统?@Schwern:根据标签,操作系统是Mac OS X。文件系统可能是HFS,普通的MacOSX文件系统(保留大小写但不区分大小写的文件名)。如果我将文件拖放到终端上,osx将在括号前添加“\”转义字符。我试图用从控制台读取的名称打开该文件,并在从文件名中删除“\”后尝试打开它。两者似乎都不起作用。我一直收到“意外标记附近的语法错误”()。显示代码!如果不查看您的代码,我们将无能为力。我已经向您展示了什么是有效的;您必须向我们展示什么是失败的,我们才有机会解决您的问题。您是否记得
chomp
输入?Re“您应该将文件名包含在(单个或多个)中?”双引号“,单引号会更好,但仍然是错误的。您应该使用String::ShellQuote的
shell_quote
@ikegami:您只能在以下情况下使用:(a)您知道它存在,并且(b)您采取步骤安装它(因为它不是核心模块)。同样的两个问题也存在于你的解决方案中。此外,我说应该,不能。他应该,因为他特别询问了带有奇数字符的文件名,但你的解决方案未能解决该问题。
system("cat $inputfile | tr '\r' '\n' > temp");
cat abc_5(rt)_dgj.csv | …
system(qq{cat "$inputfile" | tr '\r' '\n' > temp});