> Вот этого в документации не нашёл. А чем отличается семантика > do, кроме того, что это не цикл?
этим то и отличается > Так это и есть символическая ссылка. perlref: > Symbolic references > ... > $name = "foo"; > $name->[0] = 4; # Sets $foo[0] все, въехал, спасибо! 16 августа 2010 г. 11:55 пользователь Alexander Alekseev <[email protected]> написал: > > > 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 >> [email protected] | http://moscow.pm.org > > -- > Moscow.pm mailing list > [email protected] | http://moscow.pm.org > > -- Moscow.pm mailing list [email protected] | http://moscow.pm.org
