Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Помогите новичку, разбор скрипта, ч1


Автор: 7183847 17.8.2019, 11:19
Добрый день

Помогите новичку разобрать скрипт

Заранее прошу за качество оформления кода - распознал из книги.

Код не большой, все понятно кроме 2х моментов:

"'action' =>sub {" - в книгах я читал, что процедура описывается отдельно в коде типа sub имя {}, а потом вызывается как &имя, а тут что то не понятное, что это и как это работает?

и в последней процедуре не понятен этот код: 
"foreach my $issue (@{ $actions($event_type}}) {
&(Sissue>(action}}($event);" - не могу понять что этот код делает

Код

#/usr/bin/perl
use strict;
my $event;
my %actions (
'EXCP' =>[
{
'action' =>sub {
my ($event) = @_;
my ($garbage, $context) = split /Descr ='/, $event;
my ($descr, $garbage) = split/'/, $context;
$descr= s/l'/g;
$descr = s/\s+/ /g;
print "EXCP Descr $descrin" if $descr;
},},]);

while (<>) {
$event=process_event($event) if /^\d\d:\d\d\.\d+/;
$event.= $_;

sub process_event($) {
my ($event) = @_;
return unless $event;
foreach my $event type ( keys %actions ) {
next unless $event =~ /^[^,]+,$event_type,/;
foreach my $issue (@{ $actions($event_type}}) {
&(Sissue>(action}}($event);
}
}
}



Автор: arto 19.8.2019, 06:54
1. в данном случае ссылка на безымянную функцию. как раз она и вызывается в третьем вопросе.
2. @ -- онозначение спискового контекста, т.е. получение списка из $actions($event_type}, присвоение каждого элемента списка $issue. btw, не Sissue, с $issue.

Автор: 7183847 20.8.2019, 07:42
Цитата(arto @ 19.8.2019,  06:54)
1. в данном случае ссылка на безымянную функцию. как раз она и вызывается в третьем вопросе.
2. @ -- онозначение спискового контекста, т.е. получение списка из $actions($event_type}, присвоение каждого элемента списка $issue. btw, не Sissue, с $issue.

Добрый день, про описание безымянной функции впринципе понятно, получается что она как бы выступает значением хеша actions ?

По второму пункту все равно не ясно )

Где именно там происходит вызов этой безымянной функции?

И что находится в @? Параметры функции process_event? Зачем тогда при ее описании указано в скобках ($)?

Автор: arto 20.8.2019, 08:28
1. да. значение элемента хеша -- ссылка на функцию.
2. &($issue>(action}}($event); -- вызывается незымянная функция с аргументом $event.
можно записать проще -- $issue->{'actioin'}->($event). perldoc perlref
3. в $actions($event_type} находится ссылка на список. выражение @{ $actions($event_type} }
разименовывает ссылку и возвращает сам список:
Код

  DB<1> $a = [ qw( aa bb cc dd ) ]

  DB<2> print $a
ARRAY(0x2448830)
  DB<3> print join ", ", @{ $a }
aa, bb, cc, dd
  DB<4> 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)