#perl #module #packages
#perl — язык программирования #модуль #пакет #perl
Вопрос:
У меня вопрос о пакетах, модулях и синтаксисе. Когда вы обращаетесь к пакету в том же файле, я замечаю, что вы использовали бы что-то вроде….
package test;
$testVar="This is a test";
#and to access it using..
package main;
print($test::testVar);
или просто…
package test;
print($testVar);
Тем не менее, когда я использую этот синтаксис для использования с модулем, отправляя аргумент, я должен исключить $ из начала функции print, но выше я этого не делаю. Я заметил, что иначе это не сработало, и я не знаю почему. Мои материалы не проясняют.
require module;
print(package::sub("argument"));
Почему это?. Я в замешательстве.
Ответ №1:
Знак доллара здесь является символом, который указывает, что именованная переменная является скалярной.
Если предшествующего package
объявления нет, использование $var_name
main
содержит подразумеваемое пространство имен $main::var_name
, т.е. оно является сокращением от, ,,. В случае вашего примера, где у вас есть package main;
первое, вам нужно указать, что пространство имен является test
, а не main
требуется so $test::testVar
.
Для вызова функции вам не нужно использовать символ. Если бы вы это сделали, вы бы использовали амперсанд ( amp;
), но использование амперсандов при вызове функций вышло из моды у многих программистов.*
Как и прежде, sub_name()
является сокращенной версией main::sub_name()
… таким же образом, для вызова sigil не требуется package::sub()
.
*Ссылки на использование amp;
:
- Обсуждение монахов Perl
- Perl::Critic это не нравится, следуя лучшим практикам Perl
- Согласно perldoc, использование
amp;
с именем функции позволяет отклоняться от обычного поведения. Это может привести к незначительным ошибкам.
Комментарии:
1. Амперсанды не являются устаревшими ни в каком виде. Некоторым людям они просто не нравятся, и они часто не нужны, а использование amp; без использования также () создает особый вид вспомогательного вызова, который обычно не предназначен. Этот последний бит иногда используется в качестве аргумента против использования amp; в целом, но я не нахожу его убедительным.
2. @ysth справедливый комментарий. Я изменил формулировку и добавил несколько ссылок, чтобы расширить этот раздел.
3. ссылка Тая в этой первой ссылке — отличное резюме: perlmonks.org/?node_id=29139
4. Пространство имен по умолчанию в
$var_name
не являетсяmain
, но каким бы ни был текущий пакет.main
— это просто пакет, с которого вы начинаете до появленияpackage
объявления.5.Возможно, вы это понимаете, но ваш ответ подразумевает, что это
$var_name
всегда означает$main::var_name
, что неверно. Люди, которые еще не совсем разбираются в упаковках, могут запутаться.