声明大型常量数组时出现Perl语法错误

时间:2012-01-06 16:50:20

标签: 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它没有显示错误,为什么?上述声明有什么问题?

3 个答案:

答案 0 :(得分:5)

qw为您做引用和分离。

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

表示与:

相同
my @foo = qw( bar baz );

拥有一堆连续的不带引号的值只是一个错误。

请参阅quote like operators的文档。

答案 1 :(得分: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;编译指示下运行你的代码(你应该总是这样),那么最终的裸字将成为语法错误(因为strict subs阻止将极字提升为字符串。这至少会发现错误在编译时。

这一点的重要之处在于Perl有许多类似引用的运算符,它们实际上是附带特殊处理的字符串。删除类似引号的运算符将不可避免地导致语法错误,因为任意格式化的字符串无效Perl。可以在perlop manpage上找到类似buitin引号的运算符列表。

答案 2 :(得分:3)

这是因为当您省略qw/.../时,您的字符将被视为裸字,而当涉及“do”时,则会发出错误信号。

编辑:即使我的回答解释了错误的原因(好吧,我也相信),@ Quentin的建议更具建设性:不要使用裸字(即执行在您的示例中使用qw//来节省您的时间来捕获像您这样的错误。例如,您的列表中有int,也是关键字lc(函数)等。