/ / Інтерполювати змінну perl в команду shell - perl

Інтерполяція змінної perl в команду shell - perl

Я хочу взяти дату як вхід від користувача та передати цей вхід команді оболонки нижче.

для, наприклад,

$date = ARGV[0];
`cd xyz $date`

буде ця змінна інтерпольована в perl?

Відповіді:

8 для відповіді № 1

Це банально для тестування:

Вхід:

use v5.16;
use strict;
use warnings;
my $foo = 123;
say `echo $foo`;

Вихід:

123

Так так.

Остерігайтеся змінних, що містять символи зі спеціальним значенням у оболонці.


10 за відповідь № 2

У вас є пара проблем; Поперше, cd бере лише один параметр. Можливо, ви мали на увазі щось подібне cd xyz$date? По-друге, заднім полем запускається оболонка, яка виконуєтьсякоманда, яку ви даєте, яка виконає команду каталогу змін, а потім негайно вийде, не маючи ефекту. (Поточний каталог батьківського процесу perl залишається незмінним.) Можливо, ви шукаєте chdir.

Але так, інтерполяція спрацює; щоб вимкнути інтерполяцію на задній панелі, ви уникаєте спеціальних символів (echo xyz $date) або використовувати qx з роздільниками однієї цитати (qx"echo xyz $date")


6 за відповідь № 3

Перльдок має відповіді, як ніколи.

Зокрема http://perldoc.perl.org/perlop.html#Quote-and-Quote-like-Operators має "Так" в Інтерполятах? стовпця (за умови, що вам тут не потрібно хвилюватися), так що так, можна припустити, що ваша змінна буде інтерпольована.

Ви можете отримати той самий документ, часто запускаючи "perldoc perlop" у своєму локальному командному рядку.


5 за відповідь № 4

Так, вона буде інтерполювати змінну. Однак, я настійно рекомендую дві речі:

  • Використовуйте qx/../ замість задніх кліщів.
  • Встановіть команду, яку ви "запускаєте" спочатку в змінній Perl, а потім інтерполюйте цю змінну.

The qx/../ приємно, тому що це робить більш очевидним, що ти робиш:

my $variable = qx(ls $directory);

Ви можете використовувати найрізноманітніші символи для qx:

my $variable = qx(ls $directory);
my $variable = qx/ls $directory/;
my $variable = qx^ls $directory^;
my $variable = qx#ls $directory#;

Персонаж після qx буде використовуватися як цитати. Якщо ви використовуєте круглі дужки, квадратні дужки або фігурні дужки, ви використовуєте їх у парі з відкриттям та закриттям.

Це означає, що ви можете уникнути проблем, коли певний символ у вашій команді може заплутати речі.

Інша річ - це скласти свою команду в змінну Perl, а потім виконати її, коли ви намагаєтеся робити інтерполяції. Це дає вам більше контролю над тим, що ви робите:

my $HOME;
my $command;

$HOME = "bin";
$command = "ls $HOME";
print qx($command); #Lists the directory bin

$command = "ls $HOME";
print qx($command); #List user"s home directory

В обох цих прикладах я роблю qx($command). Однак у першому прикладі я дозволяю Perl підміняти значення $HOME. In the second example, I use single quotes, so Perl doesn"t substitute the value of$ ГОЛОВНА. Instead, the string$ HOME` - це лише частина моєї команди, яку я використовую. Я дозволяю оболонці інтерполювати її.

Я зазвичай пильную будь-яку програму, яка використовує qx/.../. У більшості випадків він використовується для запуску команди, яка може бути виконана в самому Perl. Наприклад, у ранніх програмах Perl ви бачите такі речі:

 $date = `date +%M/%Y/%D`
chop $date;     #Yeah, I said EARLY Perl programs

Тому що запустити команду Unix було просто набагато простіше, ніж намагатися виконувати це в чистому вигляді Perl. Однак, роблячи це Perl (тобто правильний) спосіб означає, що ви більше не залежаєте від поведінки ОС, яка не зовсім під вашим контролем.

Якщо вам потрібен вихід команди для використання у вашому скрипті Perl, вам слід скористатися відчинено виконувати свою команду та трактувати вихід команди як файл.

my $command = "ls $HOME";
open my command_fh, "|-", $command or die qq(Couldn"t execute "$command");

Якщо вам просто потрібно виконати команду, використовуйте система команда:

my $command = "xyz $date";
my $error = system $command;
if ( $error ) {
#Something terrible happened...
}

Зауважте, що якщо ви надсилаєте лише один скалярний аргумент до system команда, і він містить можливі мета символи оболонки, він виконує команду через оболонку ОС. Якщо ви надішлете system командувати списком для виконання, або немає метахарактерів оболонки, Perl зателефонує виконавцю команди, щоб виконати команду безпосередньо без будь-яких інтерполяцій оболонок:

my @command = qw(ls $HOME);
system @command;   #Will print out "No such directory "$HOME"