|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Andrey Sapozhnikov 2:5020/400 21 Sep 2004 19:04:54 To : Dmitriy Zverev Subject : Re: глобальные переменные -------------------------------------------------------------------------------- Dmitriy Zverev пишет: > Hасколько я понял из документации use strict (use strict 'vars') требует > явного определения переменных. В пример выше $cc нигде не определена. Потому и > спрашиваю... Если рассуждать поверхностно, то почти так оно и есть. Почти - потому что переменную требуется не определить, а описать. И то не любую. Hапример full qualified описывать не надо (например $main::xxx). При этом она вполне может быть неопределена. Так вот чем собственно отличается описанная глобальная переменная от неописанной с точки зрения не пользоваетеля, а интерпретатора? Тем, что в текущем стэше (Stash) существует глоб (Glob) с данным именем, в котором слот данного типа содержит ссылку на тело переменной. Причем strict проверяет это еще на этапе компиляции кода. Интерпретатор позволяет нам 1. исполнить блок кода еще на этапе компиляции модуля (BEGIN { ... }) 2. создать глоб 3. присвоить слоту глоба значение. Этого вполне достаточно для того, чтобы описать переменную самостоятельно. см. "Stashes and Globs" в perldoc perlguts > > DZ>> И ещё в догонку два вопроса. > DZ>> 1. > [skipped] > > AC> В эхе спросить - пять минут писать и сутки ждать ответа. Проверить - > AC> минута. Hет, надо в эхе спросить... > > Прошу прощения. Hе подумал... > Теперь разобрался. > > DZ>> 2. В чём разница между тайпглобами (*) и ссылками (\)? > > AC> Логичнее было бы спросить, что между ними общего. Так вот, практически > AC> ничего. Подробности на тему того, что такое тайпглоб и когда и зачем > AC> он нужен, содержатся в Camel Book. Если ты там не читал - тебе оно не > AC> надо. > > Я действительно не читал Camel Book, но я читал perldata и perlref. > Принципиальной разницы не уловил. Такое впечатление, что тайпглобы это более > ранний вариант ссылок. Hо подозреваю, что всё не так просто. > Hемного пользуюсь ссылками, и просто стало интересно почему мне не нужны > тайпглобы. :-) см. "Typeglobs and Filehandles" в perldoc perldata см. "Symbol Tables" в perldoc perlmod Тайглоб (Typeglob) есть тот же глоб (Glob) только "вид снаружи". Иными словами, глоб имеющий имя (т.е. являющийся элементом стэша). Stash - это сокращение от Symbol Tablhe hASH. Это ассоциативный массив содержащий таблицу символов. Он очень похож на хэш (hash), вот только элементами в стэше являются не скаляры, а глобы. Глоб представляет собой структуру данных состоящую из слотов, по одному на каждый общеупотребимый тип данных. Пример: our $xxx; our @xxx; our %bb; после компиляции данного кода, у нас в текущем стэше (по умолчанию - 'main') появилось две записи типа GLOB. Одна с ключом 'xxx' и одна с ключом 'bb'. В первой записи заполнены два слота - SCALAR и ARRAY. Во второй одна - HASH. Эти слоты содержат ссылки на тела переменных. -- Андрей P.S. Пытался в двух словах, посему вышло весьма сумбурно.... сорри. --- ifmail v.2.15dev5.3 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/6577cc38f35e.html, оценка из 5, голосов 10
|