簡體   English   中英

Perl 命令行:目錄 arguments 的單引號和雙引號

[英]Perl command line: single vs. double quotes for directory arguments

我無法理解 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!"調用它 ,它工作得很好。 為什么會這樣?

在命令行上,引用規則是 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

即使我忘記使用第二個雙引號,這仍然有效。

這與 Perl 解釋器無關。 解釋命令及其 arguments 的是 shell。

當您提供雙引號參數時,例如"H:\Test!" , shell 將引號內的所有內容視為字符串的內容,傳遞給 Perl 解釋器的是不帶引號的字符串。

相比之下,當您提供'H:\Test!' , shell 將單引號作為字符串本身的一部分,並以這種方式將其傳遞給 Perl 解釋器。

由於驅動器號,我假設您在 Windows 下工作。 然后你只需要接受,雙引號是唯一的引號。

請考慮使用 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM