2012-01-06 2 views
0

Я хочу объявить огромный список константного массива, как:Perl синтаксических ошибки на объявление большого постоянный массива

my @tlds = (ac ad ae aero af ag ai al am an ao aq ar arpa as asia at au aw ax az ba bb bd be bf bg bh bi biz bj bm bn bo br bs bt bv bw by bz ca cat cc cd cf cg ch ci ck cl cm cns 
co com coop cr cu cv cw cx cy cz de dj dk dm do dz ec edu ee eg er es et eu fi fj fk fm fo fr ga gb gd ge gf gg gh gi gl gm gn gov gp gq gr gs gt gu gw gy hk hm hn hr ht hu id ie 
il im in info int io iq ir is it je jm jo jobs jp ke kg kh ki km kn kp kr kw ky kz la lb lc li lk lr ls lt lu lv ly ma mc md me mg mh mil mk ml mm mn mo mobi mp mq mr ms mt mu museum mv mw mx my mz na name nc ne net nf ng ni nl no np nr nu nz om org pa pe pf pg ph pk pl pm pn pr pro ps pt pw py qa re ro rs ru rw sa sb sc sd se sg sh si sj sk sl sm sn so sr st su sv sx sy sz tc td tel tf tg th tj tk tl tm tn to tp tr travel tt tv tw tz ua ug uk us uy uz va vc ve vg vi vn vu wf ws xn xxx ye yt za zm zw); 

Но он бросает ошибку: 1. Syntax error, near dm do dz 2. no such class mz, near "mw mx my mz"

Всех указатели о том, как удалить эти ошибки? Если я использую qw перед этим списком, он не показывает ошибок, почему? Что не так с вышеуказанной декларацией?

ответ

5

qw делает цитату и разделение для вас.

my @foo = ("bar", "baz"); 

означает то же самое, как:

my @foo = qw(bar baz); 

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

См. Документацию для quote like operators.

+0

Я получил это. Но неверно ли объявлять массив, как я сделал в оригинальной записи? Должен ли я процитировать его и разделять каждый элемент запятой, если не использовать qw? – Maxwell

+3

Да, как я сказал: «Наличие стека последовательных неуказанных значений - это просто ошибка». – Quentin

+0

Получил, спасибо! – Maxwell

3

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

EDIT: Несмотря на то, что мой ответ объясняет причину из-за ошибки (ну, я считаю, так), @ предложение Квентина более конструктивно: не использовать barewords (т.е. сделать использование qw// в вашем примере) чтобы сэкономить время на ловушку, как ваши. Например, у вас есть int в списке, который также является ключевым словом, lc (функция) и т.д.

5

Оператор 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; прагмы (который вы должны всегда), то окончательный bareword станет синтаксической ошибкой (с strict subs предотвращает продвижение barewords к струнам. Это было бы, по крайней мере, поймали ошибку во время компиляции.

Важным выводом из этого является то, что у Perl есть много котировочных операторов, которые эффективно связаны с привязкой к специальной обработке. Удаление оператора, похожего на цитаты, неизбежно приведет к ошибкам синтаксиса, поскольку произвольно отформатированные строки недействительны Perl.Список операторов, похожих на buitin, можно найти на perlop manpage.