perl6.suОсвоим perl6 к 2015 году!

nota CVI. Вызов системных команд и получение результата


       В предыдущей ноте мы использовали команду run($программа, @аргументы). Это выглядит так:
    
#!/usr/bin/perl6
my $результат=run('date','-R','-u');
$результат.say;
Wed, 06 Feb 2013 15:00:40 +0000
0

       date - команда. -R и -u это два аргумента. Добавился какой-то непонятный нолик в конце. Это вроде бы false, означающее, что программа завершилась с ошибкой. Но почему она тогда выдала результат?!
       UPD. Как подсказал Александр Алексеев, 0 - это как раз хорошо. Если было бы целое число, то это означает код ошибки:
    
#!/usr/bin/perl6
my $res=run('sdfasfsf');
$res.say;
255

       В документации по этому поводу написано:
       The return value is the exit status of the program, and can be
       evaluated in the following contexts:
       Bool - True = success; False = failure
       Int - Exit status (per the .exit method)
       See "wait" for more detail on how the "Proc::Status" object is
       used.
       Очевидно, надо сразу проверять, нет ли ошибки. Как в пятом перле при вызове system():
    
#!/usr/bin/perl6
if (my $результат=run('date','-R','-u')) {
	say "Bene. Результат: $результат"
	}
else { say "Male. Код ошибки: $результат" }
if ($результат=run('sdfsfsfaadfaf')) {
	say "Bene. Результат: $результат"
	}
else { say "Male. Код ошибки: $результат" }
Wed, 06 Feb 2013 15:00:44 +0000
Bene. Результат: 0
Male. Код ошибки: 255

       run подобна старому system, вывод программы подаётся на терминал, а не в переменную, как мне это показалось сначала.
       В пятом перле можно было получать результаты или с помощью обратных кавычек ($ls=`ls`) или с помощью qx ($ls=qx/ls/). Сейчас есть qqx!
    
#!/usr/bin/perl6
my $effectus=qqx/temperature/;	
"Температура в помещении: $effectus\n".say;
$effectus=qqx/tail -n 3 \/bibl\/last.news/;
$effectus.say;
$effectus=qqx[head -n 3 /bibl/last.news]; # чтобы не экранировать слэши 
$effectus.say;
Температура в помещении: 24.31

Кевин Дюрант смазал решающий бросок
Весли Снейдер продолжит карьеру в турецком клубе
Реал забил Валенсии пять мячей за один тайм

Госдума предложила запретить электронные сигареты
Всеволод Чаплин назвал фильм НТВ о церкви адекватным
Похороны Деда Хасана в Грузии сорвались из-за статуса друзей покойного

       Если удобнее, можно задавать аргументы в таком виде: qqx/$команда @аргументы[]/
    
#!/usr/bin/perl6
my $команда='find';
my @аргументы=('/usr/share/doc/perl','-name','*.gz');
my $гз=qqx/$команда @аргументы[]/;
$гз.say;
/usr/share/doc/perl/AUTHORS.gz
/usr/share/doc/perl/pumpkin.pod.gz
/usr/share/doc/perl/changelog.Debian.gz
/usr/share/doc/perl/README.gz
/usr/share/doc/perl/changelog.gz
/usr/share/doc/perl/Changes.gz

       А вот что будет, если забыть вызвать массив с квадратными скобками:
    
#!/usr/bin/perl6
my $команда='find';
my @аргументы=('/usr/share/doc/perl','-name','*.gz');
my $гз=qqx/$команда @аргументы/; 
$гз.say;
find: `@аргументы': Нет такого файла или каталога

       Bene.
# mutatio postrema: 18 Oct 2012

   run, qqx      charta situs       nota CV <<     >> nota CVII   

    RSS     stdin@perl6.su    © Alexius Karmanov, 2010-2011