Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows Perl命令行:目录参数的单引号与双引号_Windows_Command Line_Quotes - Fatal编程技术网

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

Windows Perl命令行:目录参数的单引号与双引号,windows,command-line,quotes,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; 使用严格; 使用警告; 使用File::Find; 使用文件:

我在理解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;
使用严格;
使用警告;
使用File::Find;
使用文件::复制;
我的$dir=shift;
die'用法:perl Folderize.pl',除非$dir;
死“$dir不存在”,除非-d$dir;

根据对目录使用单引号还是双引号,我会得到不同的结果。如果我用
'perlscript.pl'H:\Test!调用它它打印“'H:\Test!'不存在”。但是,如果我用perlscript.pl“H:\Test!”
调用它,它就可以正常工作。为什么会发生这种情况?

由于驱动器号的原因,我假设您在Windows下工作。然后,您将接受,双引号是唯一的引号。

< P>请考虑使用GETopt::long,而不是自己的参数解析< /p>

在这种情况下,无论用户是否这样做,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

这与Perl解释器无关。shell解释命令及其参数

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


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

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

  • 单引号
    不是特殊字符

    C:>\dir>“foo”

将创建一个名为
'foo'
的文件(文件名中将包含引号)

  • 双引号插入看起来像
    %NAME%
    的环境变量,但它不会尝试将perl标量变量名称解释为环境变量:

    C:>\perl-e“打印“%PATH”

  • 如果您忘记,Windows shell将为您“关闭”报价

    C:>\perl-e“打印qq/Hello world/

    Hello world


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

如果在perl代码中dbl引用$dir的用法会发生什么?祝你好运。
-d“$dir“
如果在命令行上使用单引号,仍然会失败。在这种情况下,使用无引号也可以,但这只是因为路径没有空格。您确定它显示的是
H:\Test不存在?而不是
H:\Test
?@Quentin是的,感叹号就在那里。你感到惊讶吗?是的。引号应该只能在解释器中产生差异,因此如果它使用特殊字符执行某些操作,那么差异应该可以从Perl错误消息中看到。OP没有对开关进行任何解析,因此Getopt::Long在这里什么都不做。非常酷。我想我会在某个地方使用它,虽然不是在这个脚本中,因为我只解析一个参数。使用这个文件名,它可能不是bash,bash不会将单引号作为字符串的一部分传递。我删除了shebang行。我有这个习惯,但我不需要它,因为我在Windows上工作。
yourscript.pl -dir  foo -dir blah