Как выполнить функцию Perl qx с переменной

Как заставить функцию Perl qx выполняться с моей переменной $opt?

До (работает):

my @df_output = qx (df -k /tmp);

Я хочу использовать -k, -g или -H:

my @df_output = qx (df -$opt /tmp);

person jdamae    schedule 16.06.2011    source источник
comment
Что произошло, когда вы попробовали этот код?   -  person mob    schedule 17.06.2011
comment
Use of uninitialized value in concatenation (.) or string at ./tst.pl. Также df: -: No such file or directory. Интересно, я все еще получаю рабочий вывод, но с этими сообщениями.   -  person jdamae    schedule 17.06.2011
comment
Это означает, что $opt не определено.   -  person Eevee    schedule 17.06.2011
comment
@ Иви, спасибо. в этом была проблема.   -  person jdamae    schedule 17.06.2011
comment


Ответы (2)


То, что у вас есть, должно работать, но: никогда не используйте qx. Это древнее и опасное; все, что вы ему передаете, проходит через оболочку, поэтому очень легко быть уязвимым для внедрения оболочки или столкнуться с неожиданностями, если /bin/sh не совсем то, что вы ожидали.

Используйте форму open() с несколькими аргументами, которая полностью обходит оболочку.

open my $fh, '-|', 'df', "-$opt", '/tmp' or die "Can't open pipe: $!";
my @lines = <$fh>;  # or read in a loop, which is more likely what you want
close $fh or die "Can't close pipe: $!";
person Eevee    schedule 16.06.2011
comment
system возвращает статус выхода, а не стандартный вывод процесса. Но он также поддерживает безопасную форму с несколькими аргументами, да. - person Eevee; 17.06.2011
comment
Никто не удосужился реализовать multi-arg open -| хотя в винде :( - person ikegami; 17.06.2011

попробуйте использовать обратную косую черту \$opt, это работает.

person hack4fun    schedule 29.08.2014
comment
Это не дает ответа на вопрос. Чтобы подвергнуть критике или запросить разъяснения у автора, оставьте комментарий под его сообщением — вы всегда можете прокомментировать свои собственные сообщения, и как только у вас будет достаточно репутация, вы сможете комментировать любой пост. - person kylieCatt; 29.08.2014
comment
@IanAuld. Почему это не ответ? - person Mad Physicist; 29.08.2014