[Moscow.pm] Почему и как это работает?

Alexander Alekseev alex на alemate.ru
Пн Авг 16 01:55:01 PDT 2010



On Mon, 16 Aug 2010, Андрей П. Ковбович wrote:

> Что не так с перлом (или со мной?) ? Или почему это работает именно так?
>
> 1) "foo {}" превращается в "do {} -> foo"
>
>> perl -e 'package bar; sub foo { print "it works!\n" }; package main; foo {q/bar/}'
> it works!
>
> Как это видит интерпретатор:
>
>> perl -MO=Deparse -e 'package bar; sub foo { print "it works!\n" }; package main; foo { bar }'
> package bar;
> sub foo {
>    print "it works!\n";
> }
> package main;
> do {
>    'bar'
> }->foo;
> -e syntax OK
>
> Судя по всему perl пытался осуществить вызов метода foo с
> использованием косвенного объекта, в стиле METHOD INVOCANT (в отличие
> от вызова в стиле INVOCANT->METHOD). Если спрятать определение bar, то

$perl -e 'package bar; sub foo { print "it works!\n" }; package main; do {q/bar/}->foo'
it works!
$

> сразу становятся понятны намерения перла:
>
> Can't locate object method "foo" via package "bar" (perhaps you forgot
> to load "bar"?)
>
> Заглянув в Camel Book узнал, что все-таки разрешается задавать
> INVOCANT в виде блока при использовании формы косвенного объекта.
>
> Непонятно только почему он заменил блок на конструкцию do {}... У do
> {} семантика же в корне отличается от обычного блока BLOCK...
 	Вот этого в документации не нашёл. А чем отличается семантика
do, кроме того, что это не цикл?

> 2) "foo->{'bar'}" превращается в "$foo{'bar'}"
>
>> perl -e 'foo->{bar} = baz; print $foo{bar}'
> baz
>
> Как это видит интерпретатор:
>
>> perl -MO=Deparse -e 'foo->{bar} = baz; print $foo{bar}'
> $foo{'bar'} = 'baz';
> print $foo{'bar'};
> -e syntax OK
>
> По идее, левым операндом для оператора "->" должна быть ссылка на хеш
> (жесткая или символическая), в случае когда правый операнд является
> индексом хеша. Откуда появился хеш %foo?
 	Так это и есть символическая ссылка. perlref:
Symbolic references
...
$name = "foo";
$name->[0] = 4;             # Sets $foo[0]

> P.S. понятно, что use strict снимает все неоднозначности, но я
> намеренно опустил его.
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org


Подробная информация о списке рассылки Moscow-pm