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

我试图在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");
乔纳森·勒夫勒(Jonathan Leffler)

反例

应该不会有什么问题的。例如:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从文件名中删除特殊字符

来自分类Dev

文件名Java中的特殊字符

来自分类Dev

从文件名中删除特殊字符

来自分类Dev

无法删除文件名中包含特殊字符的文件

来自分类Dev

无法删除文件名中包含特殊字符的文件

来自分类Dev

在Linux中批量删除文件名中的特殊字符

来自分类Dev

在Windows中从文件名中批量删除特殊字符

来自分类Dev

从powershell中的文件名中删除特殊字符

来自分类Dev

更改bash中具有特殊字符的文件名

来自分类Dev

删除文件名中带有特殊字符的目录

来自分类Dev

文件名中的特殊字符(\#033OA)

来自分类Dev

Powershell从文件名中删除特殊字符

来自分类Dev

bash-处理文件名中的特殊字符

来自分类Dev

终端命令:处理文件名中的特殊字符

来自分类Dev

文件名和路径中的特殊字符

来自分类Dev

从文件名中删除某些特殊字符

来自分类Dev

如何从PHP表单文件上传的文件名中删除特殊字符,例如撇号/引号

来自分类Dev

c#尝试使用WebClient下载文件名中包含特殊字符的文件

来自分类Dev

无法删除/移动文件名中带有特殊字符的文件

来自分类Dev

根据输入列表复制文件,文件名中包含特殊字符

来自分类Dev

pandas:文件路径和文件名中带有重音/特殊字符的 oserror

来自分类Dev

如何从PowerShell中的文档中的文件名中替换特殊字符

来自分类Dev

如何在Windows中的文件名中显示特殊字符

来自分类Dev

文件名中的批量替换字符

来自分类Dev

文件名中的php条字符

来自分类Dev

文件名中的奇怪字符

来自分类Dev

删除文件名中的特定字符

来自分类Dev

在文件名matlab中打开文件,其中包含空格

来自分类Dev

在excel中根据变量文件名VBA打开文件

Related 相关文章

热门标签

归档