我无法理解Windows中perl的命令参数引用。使用以下程序:
use strict;
use warnings;
use File::Find;
use File::Copy;
my $dir = shift;
die 'Usage: perl Folderize.pl <directory>' unless $dir;
die "$dir doesn't exist" unless -d $dir;
取决于我是否对目录使用单引号或双引号,我会得到不同的结果。如果我用'perl script.pl 'H:\Test!'
调用它,则打印“'H:\ Test!'不存在“。但是,如果我用'perl script.pl "H:\Test!"
调用它,它就可以了。为什么会这样?
答案 0 :(得分:4)
在命令行中,引用规则是shell的范围,而不是程序(perl)。 Unix shell的规则类似于Perl的规则(双引号插值变量,单引号不),但Windows“shell”具有不同的规则。一些主要的区别是:
单引号'
不是特殊字符
C:>\ dir > 'foo'
将创建一个名为'foo'
的文件(引号将包含在文件名中)
""
双引号内插环境变量,看起来像%NAME%
,但它不会尝试将perl标量变量名称解释为环境变量:
C:>\ perl -e "print '%PATH'"
如果您忘记了
,Windows shell将“关闭”您的报价 C:>\ perl -e "print qq/Hello world/
Hello world
即使我忘了使用第二个双引号也行。
答案 1 :(得分:1)
这与Perl解释器无关。它是解释命令及其参数的shell。
当您提供双引号参数时,例如"H:\Test!"
,shell会将引号内的所有内容视为字符串的内容,并且传递给Perl解释器的内容是不带引号的字符串。< / p>
相比之下,当你提供'H:\Test!'
时,shell将单引号作为字符串本身的一部分,并以这种方式传递给Perl解释器。
答案 2 :(得分:0)
由于驱动器号,我假设您在Windows(拇指)下工作。那么你只需要接受,双引号是唯一的引号。
答案 3 :(得分:0)
请考虑使用Getopt :: Long而不是自己的参数解析
http://perldoc.perl.org/Getopt/Long.html
use Getopt::Long;
GetOptions
(
'dir=s' => \$dir,
) or die ("Couldnot process arguments");
在这种情况下,dir将具有目录,无论用户是否
yourscript.pl -dir = foo
yourscript.pl -dir "foo"
yourscript.pl -dir foo
如果你这样做
GetOptions
(
'dir=@s' => \@dir,
) or die ("Couldnot process arguments");
您将获得普通旧数组中的所有目录
yourscript.pl -dir foo -dir blah