Perl синтаксис сигил - PullRequest
       1

Perl синтаксис сигил

8 голосов
/ 17 февраля 2011

Могу ли я знать, что за & используется перед сабвуферами, когда без него сабы все еще могут работать.

А также, my перед переменными perl.

Я знаю, что для строгого синтаксиса языка или нет, но почему бы просто не сделать его стандартом, что каждая переменная должна быть объявлена ​​my?

РЕДАКТИРОВАТЬ

Спасибо за все ваши обсуждения / ответы, я хочу принять многие из ваших ответов, но, поскольку я могу принять только один, я приму тот, который другие пользователи могут легко понять.

Ответы [ 5 ]

12 голосов
/ 17 февраля 2011

В Perl вызовы функций были оптимизированы так, что они не требуют сигилы & всегда. Когда вы объявляете подпрограмму:

sub hello {print "world\n"}

Вы можете назвать это как hello; или hello(); или &hello();, которые будут делать то же самое.

Если ваша подпрограмма принимает аргументы, она немного отличается:

sub hello {print "Hello, @_!\n"}

hello 'World';   # prints 'Hello, World!'
hello('World');  # same
&hello('World'); # same

hello;    # prints 'Hello, !'
&hello(); # same
&hello;   # different, uses whatever was in @_ when hello was called

@_ = 'Bob';

hello;    # prints 'Hello, !'
&hello(); # prints 'Hello, !'
&hello;   # prints 'Hello, Bob!'

Итак, как вы можете видеть, использование символа & в значительной степени избыточно, за исключением случая, когда нет списка аргументов. В этом случае подпрограмма вызывается с текущими значениями в @_.

Сигиль & также имеет другое специальное поведение, связанное с прототипами Perl. Скажем, вы писали свою собственную функцию keys и хотели, чтобы она вела себя как Perl:

sub mykeys (\%) {keys %{$_[0]}}

Здесь прототип (\%) сообщает Perl, что первый аргумент mykeys должен быть литеральным хешем (который будет передан как ссылка на хеш).

my $hashref = {...};

say for mykeys %$hashref;

Если по какой-то причине вам нужно было обойти это требование (как правило, не самая лучшая идея), вы могли бы написать это:

say for &mykeys( $hashref );  # note that there is no `%`

В этом случае добавление & перед подпрограммой отключает проверку прототипа и любые последующие действия, которые он выполнил (например, получение ссылки). В этом случае & - это в основном утверждение, что вы точно знаете, какие аргументы нужны mykeys, и не хотите, чтобы perl мешал.

В целом, следует избегать использования & в подпрограммах, если вы явно не хотите одно из действий, о которых я упоминал выше.

Наконец, & также необходимо, когда вы ссылаетесь на фактическую ссылку на код:

my $coderef = \&hello;

или

if (defined &hello) {print "hello is defined\n"}  # but is not called

Как уже упоминалось, оператор my объявляет переменные в текущей лексической области. Требуется при загрузке прагмы use strict;. В Perl есть два типа переменных: лексические переменные, объявленные с my, и переменные пакета.

my переменные живут в так называемой лексической панели, которая представляет собой область памяти, создаваемую Perl каждый раз, когда вводится новая область. Переменные пакета находятся в глобальной таблице символов.

use strict;
use warnings;

$main::foo = 5;   # package variable

{ # scope start
   my $foo = 6;

   print "$foo, $main::foo\n"; # prints '6, 5';
} # scope end

print "$foo, $main::foo\n";  # syntax error, variable $foo is not declared

Вы можете использовать ключевое слово our для создания лексического псевдонима для глобальной переменной:

use strict;


our $foo = 5;  # $main::foo == $foo


{ # scope start
   my $foo = 6;

   print "$foo, $main::foo\n"; # prints '6, 5';
} # scope end

print "$foo, $main::foo\n";  # prints '5, 5' 
                             # since $foo and $main::foo are the same
8 голосов
/ 17 февраля 2011

my ограничивает переменную до текущей области. С прагмой use strict, которую вы должны использовать, вы должны объявить переменные (например, с my). Существует альтернатива, позволяющая обходиться без очень коротких сценариев по причинам гибкости.

& редко используется больше, поскольку Perl по умолчанию интерпретирует слова без сигил как подпрограммы, но полезно, если вы хотите создать ссылку на подпрограмму.

sub say_hi { print "hi\n" }
my $sub_ref = \&say_hi;
5 голосов
/ 17 февраля 2011

Могу ли я знать, что такое использование & перед сабвуферами, когда без него сабвуферы все еще могут работать.

Обратная совместимость с Perl 4

А также, my перед переменными perl.

Устанавливает область видимости блока

Я знаю, что это для строгого синтаксиса языка или нет, но почему они просто не делают его стандартом, что каждая переменная должна быть объявлена ​​my?

  1. Обратная совместимость (следовательно, use strict; запрещение объявлений переменных переменных)
  2. Переменные также могут быть объявлены с our или local
4 голосов
/ 17 февраля 2011

Если вы хотите знать, как писать на современном Perl, могу ли я порекомендовать вам прочитать Modern Perl ? Вы можете купить версию мертвого дерева или бесплатно скачать электронную версию.

0 голосов
/ 17 февраля 2011

& все еще имеет довольно хорошее различие: вызов с ним (&YourSub) делает текущий @_ видимым также для вызываемого подпрограммы.Во всяком случае, я использую его в своих сценариях в основном для ясности: он проясняет, какие мои собственные функции и какие функции из ядра или модулей.

О my.Каждый учебник и документ предлагают использовать use strict; прагму, поэтому вы должны также объявить свой varaible с my.Таким образом, ситуация, с моей точки зрения, довольно задом наперед: если область видимости так важна для наилучшей практики, было бы нормально, чтобы переменные находились в области действия по умолчанию (как мы сейчас говорим с my), и когда нам действительно нужны глобальные переменные,мы должны объявить их так.Я понимаю, что это наследие Perl, но все же это противоречит идеологии Perl - избегать избыточности.Использование my каждый раз для объявления может быть отменено какой-то прагмой.[Извините, robobooga, может быть, слишком далеко от вашего вопроса]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...