Оператор qw
является оператором кавычек, как и все остальные ключевые слова q*
(q qq qw qr qx
), каждое из которых принимает символ-разделитель (или пару в случае фигурных скобок) и обрабатывает все внутри разделителей какстрока.Каждый из операторов делает что-то свое, а qw
разбивает строку на пустое пространство, чтобы создать список.
Когда вы пишете серию голых слов в Perl, вы получаете большую вложенную цепочкукосвенные вызовы объектов.Вот краткий пример без ключевых слов (так что это не синтаксическая ошибка):
$ perl -MO=Deparse -e 'ac ad ae aero af ag ai al am an ao aq ar'
'ad'->ac('aero'->ae('ag'->af('al'->ai('an'->am('aq'->ao('ar'))))));
-e syntax OK
В вашем случае perl весело проводил синтаксический анализ того, что выглядит как косвенный синтаксис объекта, пока не встретил ключевое слово, которое нарушило работуцепочки и вызвало синтаксическую ошибку.
Если бы вы не использовали ключевое слово в своем списке, код скомпилировался бы нормально, и тогда бы вы получили ошибку времени выполнения по поводу отсутствующего метода в пакете.Если бы вы выполняли свой код с прагмой use strict;
(что всегда следует делать), то последним голым словом станет синтаксическая ошибка (поскольку strict subs
запрещает преобразование голых слов в строки. Это, по крайней мере, перехватило бы ошибку во время компиляции.
Важным выводом из этого является то, что в Perl есть много операторов, подобных кавычкам, которые фактически являются строками со специальной обработкой. Удаление оператора, подобного кавычкам, неизбежно приведет к синтаксическим ошибкам, поскольку произвольно отформатированные строки не являются допустимыми Perl.Список операторов, похожих на буитиновые кавычки, можно найти на справочной странице perlop .