При доступе к модулям

#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; :

Комментарии:

1. Амперсанды не являются устаревшими ни в каком виде. Некоторым людям они просто не нравятся, и они часто не нужны, а использование amp; без использования также () создает особый вид вспомогательного вызова, который обычно не предназначен. Этот последний бит иногда используется в качестве аргумента против использования amp; в целом, но я не нахожу его убедительным.

2. @ysth справедливый комментарий. Я изменил формулировку и добавил несколько ссылок, чтобы расширить этот раздел.

3. ссылка Тая в этой первой ссылке — отличное резюме: perlmonks.org/?node_id=29139

4. Пространство имен по умолчанию в $var_name не является main , но каким бы ни был текущий пакет. main — это просто пакет, с которого вы начинаете до появления package объявления.

5.Возможно, вы это понимаете, но ваш ответ подразумевает, что это $var_name всегда означает $main::var_name , что неверно. Люди, которые еще не совсем разбираются в упаковках, могут запутаться.