获取uniq函数返回列表首元素时出现Perl严格引用错误求助
问题解决方法
错误原因
你的uniq函数返回的是普通列表,但@{uniq(@a)}的写法存在问题:Perl在标量上下文里会把列表视为最后一个元素的值(这里是3),随后试图把这个字符串当成数组引用解引用,违反了strict refs的限制,因此触发报错。
三种修正方案
- 先存储为数组再取值
把去重后的列表存入数组,再用shift获取第一个元素:
use strict; use warnings; sub uniq { my %seen; grep !$seen{$_}++, @_; } my @a = (1, 2, 3, 1, 2); my @uniq_a = uniq(@a); print shift @uniq_a;
- 直接通过列表索引取值(推荐)
这是最简洁高效的方式,直接取列表的第一个元素:
use strict; use warnings; sub uniq { my %seen; grep !$seen{$_}++, @_; } my @a = (1, 2, 3, 1, 2); print (uniq(@a))[0];
- 转为匿名数组引用再解引用
用[]把列表包装成匿名数组引用,再解引用后执行shift,这种写法虽能解决问题但没必要:
use strict; use warnings; sub uniq { my %seen; grep !$seen{$_}++, @_; } my @a = (1, 2, 3, 1, 2); print shift @{[uniq(@a)]};
内容的提问来源于stack exchange,提问作者Ωomega
相关产品推荐
相关产品推荐

