如何正确获取Perl列表常量的元素个数?代码报错求解
获取Perl列表常量元素个数报错的解决方法
你尝试按照文档说明将列表常量当作数组使用以获取元素个数,但代码运行报错,错误信息如下:
Bareword found where operator expected at D:\Batch/list-const-error.pl line 5, near "@(INFOFIELDS" (Missing operator before INFOFIELDS?) syntax error at D:\Batch/list-const-error.pl line 5, near "@(INFOFIELDS"
你的代码如下:
use strict; use warnings; use constant INFOFIELDS => qw( filedate filetime filesize mtime filename ); use constant OUTTEMPLATE => ' A9 A7 A12 A12 A* '; use constant NELEMENTS => scalar @(INFOFIELDS); my $line = pack( OUTTEMPLATE, @ARGV[0..NELEMENTS-1] ); print( "$line\n" );
问题
请问获取列表常量元素个数的正确方法是什么?我的代码哪里出错了?
错误原因
代码中的@(INFOFIELDS)是无效语法,Perl不支持这种写法。你误解了文档中“将列表常量放在括号中当作数组使用”的描述,正确的做法是通过列表赋值或直接标量上下文调用常量来获取元素数。
正确解决方法
有两种可靠的方式获取列表常量的元素个数:
推荐写法(兼容性更好):利用列表赋值的特性,右侧列表的元素个数会作为赋值操作的返回值,再用
scalar明确标量上下文:use constant NELEMENTS => scalar( () = INFOFIELDS );当前可用的简化写法:当前Perl版本中,列表常量在标量上下文下会直接返回元素个数,因此可以直接写:
use constant NELEMENTS => scalar INFOFIELDS;注意文档提示该行为未来可能变更,若需长期兼容性,优先选择第一种写法。
修改后的完整代码
use strict; use warnings; use constant INFOFIELDS => qw( filedate filetime filesize mtime filename ); use constant OUTTEMPLATE => ' A9 A7 A12 A12 A* '; use constant NELEMENTS => scalar( () = INFOFIELDS ); # 兼容性更好的写法 # use constant NELEMENTS => scalar INFOFIELDS; # 当前可用的简化写法 my $line = pack( OUTTEMPLATE, @ARGV[0..NELEMENTS-1] ); print( "$line\n" );
内容的提问来源于stack exchange,提问作者FreonPSandoz
相关产品推荐
相关产品推荐

