Perl命令行:目录参数的单引号和双引号

时间:2011-05-27 19:42:04

标签: windows command-line quotes

我无法理解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!"调用它,它就可以了。为什么会这样?

4 个答案:

答案 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