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

run


       $_ в cheatsheet.txt, который имеется в дистрибутиве ракудо в каталоге docs, называется "current topic".
    
#!/usr/bin/perl6
say "Thema instans: $_";
for 1..7 {
	say "Thema instans: $_"
	}
say "Thema instans: $_"
Thema instans: 
Thema instans: 1
Thema instans: 2
Thema instans: 3
Thema instans: 4
Thema instans: 5
Thema instans: 6
Thema instans: 7
Thema instans: 

       Старая добрая $_...
       $/ содержит результат по регэксу:
    
#!/usr/bin/perl6
my $text='Non est viri timere laborem';
$text ~~ m/\w\w\w\w/;
say "Regex result: $/";
Regex result: viri

       @*ARGS содержит аргументы командной строки:
    
#!/usr/bin/perl6
my $subscript="#!/usr/bin/perl6\n@*ARGS>>.say;";
my $file=open 'subscript.tmp',:w; 
$file.say($subscript);
$file.close;
chmod '0o700','subscript.tmp'; # записали
my $out=run('./subscript.tmp','Это входные данные','и это'); # и вызвали скрипт с аргументами
unlink 'subscript.tmp'; # удалили временный скрипт
и это
Это входные данные

       В хэше %*ENV содержатся переменные окружения:
    
#!/usr/bin/perl6
%*ENV{'LANG'}.say;
%*ENV{'SHELL'}.say;
%*ENV{'TERM'}.say;
ru_RU.UTF-8
/bin/bash
linux

       В массиве @*INC содержатся пути, в которых интерпретатор ищет библиотеки. В скаляре $*PID - номер процесса исполняемого скрипта.
    
#!/usr/bin/perl6
"Process PID: $*PID".say;
Process PID: 15704

       Bene.
# mutatio postrema: 16 Oct 2012


       В предыдущей ноте мы использовали команду 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

   $_, $/, $!, @*ARGS, @*INC, %*ENV, $*PID, chmod, qqx, run, unlink      charta situs       nota CV, nota CVI   

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