Как передать регулярное выражение и замену в Perl в качестве аргумента командной строки (@ARGV)

#cmd

#cmd

Вопрос:

Я создал следующую программу, чтобы проиллюстрировать суть Perl:

 use strict;

my $text       = (@ARGV >= 1) ? $ARGV[0] : "This is some random text.";
my $regexp     = (@ARGV >= 2) ? $ARGV[1] : "[A-Za-z]([^ ] )";
my $replacment = (@ARGV >= 3) ? $ARGV[2] : '"$1"';
if (@ARGV > 0) {
    for (my $argIndex = 0; $argIndex < @ARGV; $argIndex  ) {
        print "ARG [$argIndex]: "$ARGV[$argIndex]"n";
    }
}

print "TEXT: "$text" ->n";
$text =~ s/$regexp/$replacment/eeg;
print "      "$text"n";
 

Если бы я запустил эту программу без аргумента командной строки, поскольку > perl regexp.pl она работает так, как должна.

 TEXT: "This is some random text." ->
      "his s ome andom ext."
 

Тем не менее, я хочу передать регулярное выражение и замену в Perl в качестве аргумента командной строки (@ARGV). Поэтому, когда я пытаюсь выполнить ту же программу с аргументом командной строки: > perl regexp.pl "This is some random text 2" "[A-Za-z]([^ ] )" '"$1"' в командной строке Windows, это не работает. Вместо этого я получаю следующий результат:

 ARG [0]: "This is some random text 2"
ARG [1]: "[A-Za-z]([^ ] )"
ARG [2]: "'$1'"
TEXT: "This is some random text 2" ->
      "$1 $1 $1 $1 $1 2"
 

В качестве дополнительной информации, использование того же аргумента командной строки в Linux работает так, как должно. Итак, вот мои вопросы,

  1. Как я могу заставить его работать в Windows (что я должен ввести в качестве аргумента командной строки, чтобы заставить его работать)
  2. Если есть способ заставить его работать в Windows, то зачем мне передавать его таким образом?

Комментарии:

1. Так что на самом деле cmd вопрос в том, как получить " аргумент, а не аргумент Perl. Попробуйте выполнить экранирование: ... "This is some random text." "[A-Za-z]([^ ] )" ""$1""

2. Невозможно передать строку аргумента через cmd.exe другому исполняемому файлу, который содержит " . Невозможно экранировать двойную кавычку, чтобы она интерпретировалась как буквальный символ внутри строки аргумента в двойных кавычках. Но механизмы регулярных выражений с синтаксисом Perl поддерживают x22 определение в строке поиска / замены символа двойной кавычки с его значением шестнадцатеричного кода. Здесь это можно использовать для передачи строки замены "$1" как "x22$1x22" или просто как x22$1x22 , поскольку эта строка аргумента не содержит пробела или одного из этих символов amp;()[]{}^=;!' ,`~<>| .

Ответ №1:

Работает следующее (как указано в sticky bit):

 perl regexp.pl "This is some random text 2" "[A-Za-z]([^ ] )" ""$1""
perl regexp.pl "This is some random text 2" "[A-Za-z]([^ ] )" "$1"
perl regexp.pl "This is some random text 2" "[A-Za-z]([^ ] )" $1
 

Все они дают:

 TEXT: "This is some random text 2" ->
      "his s ome andom ext 2"
 

Для замены двойными кавычками выполняется следующее (как указано в Mofi):

 perl regexp.pl "This is some random text 2" "[A-Za-z]([^ ] )" ""x22$1x22""
 

Они дают:

 TEXT: "This is some random text 2" ->
      ""his" "s" "ome" "andom" "ext" 2"