我一直在同一堵墙上撞了48个小时。如何将命令行参数传递给Perl,以便在Perl有机会打开文件时,它可以正确处理a)目录或b)文件名中出现的Windows样式空间:
# open( PRELIM, "\"$ifile\"") or die "Cannot open $ifile";
# open( PRELIM, '\"$ifile\"') or die "Cannot open $ifile";
## Both these lines cannot deal with a space present in the path:
# open PRELIM, $ifile or print "\n* Couldn't open ${ifile}\n\n" && return;
# $ifile = qq($ifile); Doesn't help, still leaves the file as if it was 'two' files
#
# Quotes around $ifile do no good either
open( PRELIM, $ifile) or die "Cannot open $ifile"
通常,上述行是正确的,直到变量'$ ifile'中存在空格。
答案 0 :(得分:4)
要将命令行参数作为包含空格的单个参数传递,请将其括在引号内。例如:
perl script-name.pl“C:\ My space with spaces”
这将导致参数作为单个单词处理。
(在你的代码中,如果你是硬编码反斜杠,那么你需要加倍它们,因为“\”是一个特殊的元字符,因此“\”将在编译时转换为“\” -time)
答案 1 :(得分:2)
您需要open()
的三个参数形式:
open(PRELIM, '<', $ifile) or die "Cannot open $ifile" # For reading
open(PRELIM, '>', $ifile) or die "Cannot open $ifile" # For writing
始终使用open()
的三个参数版本来避免这样的问题。
答案 2 :(得分:1)
我对Perl不太熟悉,但我能够环顾四周,找到了一个可以帮助你的论坛帖子:http://www.tek-tips.com/viewthread.cfm?qid=376686&page=567
他们正在讨论你遇到的确切问题,并且那里的第一个人建议使用单引号而不是双引号来使用字符串文字 $ DIRECTORY ='C:\ Documents and Settings';
而不是
$DIRECTORY = "C:\Documents and Settings";
我希望这有帮助!
答案 3 :(得分:1)
确保您也没有在文件名中使用任何保留字符。
我错误地将问号用作默认字段值,该字段值仅在文件名中显示为问题!
答案 4 :(得分:0)
my $rootDir = shift @ARGV;
$rootDir =~ s/\p{space}/\\ /g;