Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разыменование и локализация 
V
    Опции темы
tishaishii
Дата 8.9.2018, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: 4
Всего: 8



Давно связывался с этой темой. Помню, кажется, в 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 обязательно с указанием пакета?
PM MAIL ICQ Skype   Вверх
starikanisbackbaby
Дата 8.9.2018, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 8.9.2018

Репутация: нет
Всего: нет



Очень просто.
В маршрутизации локальных пакетов в ядре компилятора Perl определяется двусторонними переменными 3-го уровня, входящие в изолированные паки дополнительных интеграций баз компилятора. Соответственно в данном случае непосредственно операторы local работают по данной схеме.
PM MAIL   Вверх
tishaishii
Дата 9.9.2018, 06:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: 4
Всего: 8



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

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

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

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

Это сообщение отредактировал(а) tishaishii - 9.9.2018, 07:19
PM MAIL ICQ Skype   Вверх
arto
Дата 10.9.2018, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



$b -- спецпеременная
PM MAIL ICQ   Вверх
tishaishii
Дата 12.9.2018, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: 4
Всего: 8



>> $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 не идут.

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

Это сообщение отредактировал(а) tishaishii - 12.9.2018, 19:35
PM MAIL ICQ Skype   Вверх
arto
Дата 19.9.2018, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



они много где могут использоваться, на то они и специальные
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1243 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.