#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 работает так, как должно. Итак, вот мои вопросы,
- Как я могу заставить его работать в Windows (что я должен ввести в качестве аргумента командной строки, чтобы заставить его работать)
- Если есть способ заставить его работать в 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"