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

Nat*_*enn 5 windows quotes command-line

我无法理解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;
Run Code Online (Sandbox Code Playgroud)

我得到不同的结果取决于我是否使用单引号或双引号作为目录.如果我打电话给它'perl script.pl 'H:\Test!'打印"'H:\ Test!' 不存在".但是,如果我打电话给它'perl script.pl "H:\Test!",它的工作正常.为什么会这样?

mob*_*mob 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

即使我忘记使用第二个双引号,这仍然有效。