Командная строка Perl: одинарные или двойные кавычки для аргументов каталога - PullRequest
5 голосов
/ 27 мая 2011

У меня проблемы с пониманием командных аргументов для perl в Windows. Используя следующую программу:

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 ]

4 голосов
/ 28 мая 2011

В командной строке правила цитирования относятся к сфере оболочки, а не к программе (perl).Правила для оболочек Unix аналогичны правилам для Perl (двойные кавычки интерполируют переменные, одинарные кавычки - нет), но оболочка Windows имеет другие правила.Вот некоторые основные различия:

  • Одинарная кавычка ' не является специальным символом

    C:>\ dir > 'foo'

создастфайл с именем 'foo' (кавычки будут включены в имя файла)

  • "" двойные кавычки интерполируют переменные окружения, которые выглядят как %NAME%, но не будут пытатьсяинтерпретировать имена скалярных переменных perl как переменные среды:

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

  • Оболочка Windows "закроет" вашу цитату для вас, если вы забудете

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

    Hello world

Это работает, хотя я забыл использовать вторую двойную кавычку.

1 голос
/ 28 мая 2011

Это не имеет ничего общего с интерпретатором Perl. Это оболочка, которая интерпретирует команды и их аргументы.

Когда вы указываете аргумент в двойных кавычках, например "H:\Test!", оболочка обрабатывает все, что находится внутри кавычек, как содержимое строки, а то, что передается интерпретатору Perl, - это строка без кавычек.

В отличие от этого, когда вы вводите 'H:\Test!', оболочка принимает одинарные кавычки как часть самой строки и передает ее таким образом интерпретатору Perl.

0 голосов
/ 27 мая 2011

Пожалуйста, рассмотрите возможность использования 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
0 голосов
/ 27 мая 2011

Из-за буквы диска я предполагаю, что вы работаете под (большим пальцем) Windows.Тогда вам просто нужно принять, что двойные кавычки - это единственные и единственные кавычки.

...