我想声明一个巨大的常量数组列表,如:
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);
Run Code Online (Sandbox Code Playgroud)
但它会引发错误:1.2 Syntax error, near dm do dz
.no such class mz, near "mw mx my mz"
有关如何删除这些错误的指示?如果我在该列表之前使用qw它没有显示错误,为什么?上述声明有什么问题?
qw 引用和分离给你.
my @foo = ( "bar", "baz" );
Run Code Online (Sandbox Code Playgroud)
意思是:
my @foo = qw( bar baz );
Run Code Online (Sandbox Code Playgroud)
拥有一堆连续的不带引号的值只是一个错误.
有关运算符的报价,请参阅文档.
所述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
Run Code Online (Sandbox Code Playgroud)
在你的情况下,perl愉快地解析了看起来像间接对象语法的内容,直到遇到一个关键字,这会破坏链并导致语法错误.
如果你没有在列表中使用关键字,那么代码编译得很好,那么你就会在包中找到关于丢失方法的运行时错误.如果你在use strict;pragma 下运行你的代码(你总是应该这样),那么最后的裸字将成为语法错误(因为strict subs阻止将极字提升为字符串.这至少会在编译时捕获到错误.
这一点的重要之处在于,Perl有许多类似引用的运算符,它们是附加特殊处理的有效字符串.删除类似引号的运算符将不可避免地导致语法错误,因为任意格式化的字符串无效Perl.可以在perlop联机帮助页上找到类似buitin引号的运算符列表.