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

Андрей П. Ковбович akovbovich на gmail.com
Пн Авг 16 02:10:26 PDT 2010


> Вот этого в документации не нашёл. А чем отличается семантика
> do, кроме того, что это не цикл?

этим то и отличается

> Так это и есть символическая ссылка. perlref:
> Symbolic references
> ...
> $name = "foo";
> $name->[0] = 4;             # Sets $foo[0]

все, въехал, спасибо!


16 августа 2010 г. 11:55 пользователь Alexander Alekseev
<alex на alemate.ru> написал:
>
>
> 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 mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>
>


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