выполнить команду unix в скрипте perl - PullRequest
0 голосов
/ 13 марта 2012

как я могу заставить следующую внешнюю команду внутри тиков работать вместо переменных?Или что-то подобное?sed -i.bak -e '10,16d;17d' $docname;(это работает)

т.е.sed -i.bak -e '$line_number,$line_end_number;$last_line' $docname;

Ответы [ 3 ]

2 голосов
/ 13 марта 2012
my $result = 
      qx/sed -i.bak -e "$line_number,${line_end_number}d;${last_line}d" $docname/;

Там, где разделенная линия избегает горизонтальной полосы прокрутки на SO; в противном случае это будет одна строка.

Или, поскольку неясно, есть ли какие-либо выходные данные для захвата:

system "sed -i.back '$line_number,${line_end_number}d;${last_line}d' $docname";

Или вы можете сами разбить это на аргументы:

system "sed", "-i.back", "$line_number,${line_end_number}d;${last_line}d", "$docname";

Это, как правило, безопаснее, поскольку оболочка не получает возможности вмешиваться в интерпретацию аргументов.

0 голосов
/ 13 марта 2012

Я думаю, вы должны прочитать об использовании qq для строк здесь .

Возможно, вы хотите что-то вроде этого:

use strict;
use warnings;

my     $line_number = qq|10|;
my $line_end_number = qq|16d|;
my       $last_line = qq|17d|;
my        $doc_name = qq|somefile.bak|;
my     $sed_command = qq|sed -i.bak -e '$line_number,$line_end_number;$last_line' $doc_name;|;

print $sed_command;
qx|$sed_command|;
0 голосов
/ 13 марта 2012
@args = ("command", "arg1", "arg2");
system(@args) == 0 or die "system @args failed: $?"

Кроме того, в руководстве:

perldoc -f system
...