Аргумент perl-скрипта содержит двойные квоты - PullRequest
0 голосов
/ 14 апреля 2011

У меня есть сценарий Perl, который получает 3 arugment.

Первый аргумент очень длинный и содержит пробелы и кавычки, и я на самом деле не знаю, какого размера ожидать, он может быть любого размера. Чтобы отделить мои аргументы, я использую знак ":".

См. Пример: ./my_script.pl 2MT5 4XAW KEAR TTRR YYMM "TEMP 2012 FEB 01": не замужем: 123.x

Проблема в том, что я теряю двойные кавычки и пробелы. Смотрите вывод:

LOG The 1st input is:2MT54XAWKEARTTRRYYMMTEMP 2012 FEB 01

LOG Type is:Single

LOG Version is:123.x

Мой код:

open (FD, ">file2.txt");

print FD @ARGV;

close FD;

my $str1=`cat file2.txt`;

my @argv_values = split(':',$str1);

$new_str = $argv_values[0];

$type = $argv_values[1];

$ver = $argv_values[2];

Ответы [ 3 ]

3 голосов
/ 14 апреля 2011

Ваша Perl-программа НЕ получает 3 аргумента, она получает 6 аргументов. Просто распечатайте их и убедитесь сами:

perl -le 'print for @ARGV' 2MT5 4XAW KEAR TTRR YYMM "TEMP 2012 FEB 01":Single:123.x

Ваш первый аргумент (2MT5) не "очень длинный", он всего 4 символа.

У вас нет проблемы с Perl, у вас есть проблема с оболочкой. Оболочка разбивает аргументы на пространства и обрабатывает двойные кавычки. Если вы не хотите, чтобы это делалось, вы должны заключить в кавычки любые аргументы, содержащие пробелы или кавычки:

./my_script.pl '2MT5 4XAW KEAR TTRR YYMM "TEMP 2012 FEB 01":Single:123.x'
3 голосов
/ 14 апреля 2011

Это оболочка, отбрасывающая этих персонажей.Правильно передавайте аргументы (включая кавычки, содержащие пробелы, и экранирование кавычек внутри), и это не будет проблемой:

./my_script.pl "2MT5 4XAW KEAR TTRR YYMM \"TEMP 2012 FEB 01\"" "Single" "123.x"

Тогда вам не нужно возиться с разбиением и объединением.Во-первых, вы будете правильно организовывать аргументы.

0 голосов
/ 14 апреля 2011
  • Из курс вы теряете двойные кавычки.Это стандартное поведение командной строки * NIX, где двойные кавычки указывают, что вы хотите, чтобы содержимое внутри них обрабатывалось как один аргумент.
  • А когда вы print составите список предметов, они будут объединены просто .

Самый простой способ сделать то, что вы намереваетесь, - это print "@ARGV";, поскольку разделитель списка по умолчанию для интерполированных списков - это один пробел.

...