我有一个功能,这不是我的。以下是代码
my ( $cls_option ) = @_;
my ( %temp, @temp );
@temp = split /\,/,$cls_option if ( $cls_option =~ /\,/ );
$temp[0] = $cls_option if ( $cls_option !~ /\,/ );
foreach my $temp (@temp) {
$temp{$temp}++;
}
@temp = sort keys %temp;
return[@temp];
为什么在括号中返回数组?
答案 0 :(得分:1)
[ ... ]
表示法创建数组引用,标量值。例如:
my $aref = [ 1, 2, 3 ];
这类似于这样做:
my @array = (1, 2, 3);
my $aref = \@array;
因此有时候使用起来会更方便。在这种情况下,这不是一个好主意。更好的选择是简单地返回\@temp
,因为它是一个词法变量,并且在子例程退出时将超出范围。
您可能也有兴趣知道这一部分:
@temp = split /\,/,$cls_option if ( $cls_option =~ /\,/ );
$temp[0] = $cls_option if ( $cls_option !~ /\,/ );
...完全是多余的,可以简化为
@temp = split /,/, $cls_option;
如果字符串不包含分隔符split
,,
将永远不会返回不同的值。此外,,
不需要转义。
您还可以进一步减少代码。我会改变你的哈希的名字,以表明它的作用。
# dedupe arguments
my ( $cls_option ) = @_;
my %seen;
$seen{$_}++ for split /,/, $cls_option;
return [ sort keys %seen ];
答案 1 :(得分:1)
return [ @temp ];
与
基本相同my @anon = @temp;
return \@anon;
这里没有必要复制(因为@temp
将不再存在),所以作者应该使用
return \@temp;
答案 2 :(得分:0)
我建议你的子程序会更好(并且更像Perlishly)写成这样的
sub unique_csv {
my %uniq = map { $_ => 1 } split /,/, shift;
[ sort keys %uniq ];
}