当返回数组可以在括号中?

时间:2015-10-15 15:18:52

标签: perl

我有一个功能,这不是我的。以下是代码

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];    

为什么在括号中返回数组?

3 个答案:

答案 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 ];
}