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


Автор: tishaishii 8.9.2018, 16:21
Давно связывался с этой темой. Помню, кажется, в Perl 5.8 можно было разыменовывать переменные my.
Сейчас сумел добиться разыменования только глобальных переменных и local:
Код

# 1.pl

use warnings ;
use strict ;
use Perl::Critic ;

no strict 'refs' ;

{
        local( $::b , $::c , $::d ) = 'a' .. 'c' ; # здесь странность с обозначением $c и $d, по полной форме, в отличие от $b.

        print( $$${ __PACKAGE__ . '::d' } ) ; # a
}


Если выполнить`perl -MO=Deparse,-P 1.pl`, то на выходе получим:
Код

use warnings;
use strict 'subs', 'vars';
{
    local($b, $main::c, $main::d) = ('a', 'b', 'c');
    print $$${ 'main::d' ; };
}


Тот же эффект есть при последовательном объявлении переменных с помощью трёх операторов local.

Объясните, почему $b можно объявить без указания пакета, а $c и $d обязательно с указанием пакета?

Автор: starikanisbackbaby 8.9.2018, 16:56
Очень просто.
В маршрутизации локальных пакетов в ядре компилятора Perl определяется двусторонними переменными 3-го уровня, входящие в изолированные паки дополнительных интеграций баз компилятора. Соответственно в данном случае непосредственно операторы local работают по данной схеме.

Автор: tishaishii 9.9.2018, 06:20
Цитата(starikanisbackbaby @ 8.9.2018,  16:56)
Очень просто.
В маршрутизации локальных пакетов в ядре компилятора Perl определяется двусторонними переменными 3-го уровня, входящие в изолированные паки дополнительных интеграций баз компилятора. Соответственно в данном случае непосредственно операторы local работают по данной схеме.

А что если, по вопросу?

Если не понятно, то почему-то нельзя объявить 
Код
local( $b , $c , $d )
, но можно 
Код
local( $b , $::c , $::d )
.

Ещё раз вопрос. Чем провинились c и d, если для $b можно использовать текущий пакет?

Автор: arto 10.9.2018, 13:13
$b -- спецпеременная

Автор: tishaishii 12.9.2018, 19:34
>> $b -- спецпеременная 

Вы правы. Проверил: "local($e, $main::c, $main::d) = ('a', 'e', 'c');". Выводит ошибку: "Global symbol "$e" requires explicit package name (did you forget to declare "my $e"?)".

Вот это ...здец. Нешто, до сих пор в Perl не разобрались с локализацией? Ну, используются какие-то $a и $b в sort, так я всегда думал, они дальше кода в sort не идут.

Мдааа. Этот промах - источник ошибок.

Автор: arto 19.9.2018, 12:45
они много где могут использоваться, на то они и специальные

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