2011-05-27 118 views
5

我无法理解Windows中perl的命令参数引用。使用以下程序: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

如果你dbl引用你在perl代码中使用$ dir会怎么样?祝你好运。 – shellter 2011-05-27 19:44:50

+0

'-d“$ dir”'如果在命令行中使用了单引号,则仍会失败。在这种情况下,不使用引号也是可行的,但只是因为路径没有空格。 – 2011-05-27 19:51:29

+0

你确定它说'H:\ Test!'不存在吗?而不是'H:\ Test'? – Quentin 2011-05-27 20:05:42

回答

4

在命令行上,引用规则是shell的权限,而不是程序(perl)。 Unix shell的规则类似于Perl的规则(双引号内插变量,单引号不包含),但Windows“shell”具有不同的规则。一些主要区别是:

  • 单引号'不是特殊字符

    C:>\ dir > 'foo'

将创建(引号将被包含在文件名)

称为 'foo'文件
  • ""个引号内插,看起来像%NAME%环境变量,但它不会试图解释perl的标量变量名称作为环境变量:

    C:>\ perl -e "print '%PATH'"

  • Windows外壳会,如果你“关闭”你的报价为您忘记

    C:>\ perl -e "print qq/Hello world/

    Hello world

即使我忘记使用第二个双引号,它也能正常工作。

0

由于驱动器号我假设你在Windows的(拇指)下工作。那么你只需要接受,双引号是唯一的引号。

0

请考虑使用的Getopt ::龙,而不是做你自己的说法在这种情况下,目录解析

http://perldoc.perl.org/Getopt/Long.html

​​

用户是否确实

yourscript.pl -dir = foo 
    yourscript.pl -dir "foo" 
    yourscript.pl -dir foo 

如果你有目录这样做

GetOptions 
    (
     '[email protected]' => \@dir, 
    ) or die ("Couldnot process arguments"); 

您将获得一个普通的旧阵列

yourscript.pl -dir foo -dir blah 
+0

OP没有对交换机进行任何解析,所以Getopt :: Long在这里什么也不做。 – mkb 2011-05-27 19:59:48

+1

很酷。我想我会在某个地方使用它,但不是在这个脚本中,因为我只解析了一个参数。 – 2011-05-27 20:02:38

1

这有什么好做的Perl解释器的所有目录。它是解释命令及其参数的外壳。

当您提供双引号参数(例如"H:\Test!")时,shell将引号内的所有内容视为字符串的内容,传递给Perl解释器的是不带引号的字符串。

相比之下,当您提供'H:\Test!'时,shell将单引号作为字符串本身的一部分,并将其以这种方式传递给Perl解释器。

+1

使用该文件名,它可能不是bash,并且bash不会将单引号作为字符串的一部分传递。 – Quentin 2011-05-27 20:05:04

+0

我删除了shebang行。我有那里的习惯,但我不需要它,因为我在Windows上工作。 – 2011-05-27 20:23:56