@_ -1在Perl中意味着什么?

时间:2010-02-28 22:04:37

标签: php perl arrays

我正在尝试将Perl脚本转换为PHP,而我遇到了一些Perl问题。例如,@_ -1是什么意思?我如何用PHP编写它?

整个功能如下:

sub variance {
    my $sum = sum_squares (@_);
    my $deg = @_ - 1;
    return $sum/$deg;
}

好的,所有子程序如下:

sub mean { # mean of values in an array
  my $sum = 0 ;
  foreach my $x (@_) {
    $sum += $x ;
  }
  return $sum/@_ ;
}

sub sum_squares { # sum of square differences from the mean
  my $mean = mean (@_) ;
  my $sum_squares = 0 ;
  foreach my $x (@_) {
    $sum_squares += ($x - $mean) ** 2 ;
  }
  return $sum_squares ;
}

sub variance { # variance of values in an array
  my $sum_squares = sum_squares (@_) ;
  my $deg_freedom = @_ - 1 ;
  return $sum_squares/$deg_freedom ;
}

sub median { # median of values in an array
  my @sorted = sort {$a <=> $b} (@_) ;
  if (1 == @sorted % 2) # Odd number of elements
    {return $sorted[($#sorted)/2]}
  else                   # Even number of elements
    {return ($sorted[($#sorted-1)/2]+$sorted[($#sorted+1)/2]) / 2}
}

sub histogram { # Counts of elements in an array
  my %histogram = () ;
  foreach my $value (@_) {$histogram{$value}++}
  return (%histogram) ;
}

请耐心等待我,因为这是我第一次使用Perl。从我所看到的(测试过的)来看,这个案例的正确答案是David Dorward。关于这组子例程here,我还有另外一个问题。

7 个答案:

答案 0 :(得分:9)

在这种情况下,@_是作为列表传递给子例程的参数。

在标量上下文中,它是该列表中元素的数量。

因此,如果您致电:variance('a', 'b', 'c', 'd');$deg将为3。

答案 1 :(得分:7)

就像已经说过的那样,它是传递给函数的参数数组。它在PHP中相当于

整个功能将是

function variance() {
    $sum = sum_squares(func_get_args());
    $deg = func_num_args() - 1;
    return $sum/$deg;
}
// echo variance(1,2,3,4,5); // 13.75 (55/4)

对于sum_squares,PHP中没有本机函数。假设它符合名称所暗示的,例如,将每个参数提升为2的幂,然后对结果求和,您可以将其实现为

function sum_squares(array $args) {
    return array_reduce(
        $args, create_function('$x, $y', 'return $x+$y*$y;'), 0
    );
}
// echo sum_squares( array(1,2,3,4,5) ); // 55

如果您使用的是PHP5.3,请将create_function替换为正确的lambda

答案 2 :(得分:2)

传递给variance子例程减去一个(或@_数组中最后一个元素的索引)的参数个数。 @_在标量上下文中使用。

答案 3 :(得分:2)

@_是sub的传入参数,但在标量上下文中引用的是参数的数量。

在php中会是这样的:

function variance() {
    $arguments = func_get_args();
    $sum = sum_squares($arguments);
    $deg = sizeof($arguments);
    return $sum/$deg;
}

答案 4 :(得分:1)

@_是被放入子程序的参数列表。在非标量上下文中使用它时,例如:

sum_squares (@_)

你得到了这个列表,所以可能会返回该列表中所有数字的平方和(不过请参见下面的评论)。

在标量上下文中使用时,您会获得长度,因此在您的情况下,它将是$@函数列表中的项目数。

所以你的方差函数可能(我说可能因为我无权访问sum_squares源代码)计算:

variance = arr[0]^2 + arr[1]^2 + ... + arr[N-1]^2
           --------------------------------------
                            N - 1

传递给函数的值数组。

我必须说我对方差的理解与此不一致(因为我做了任何统计数据已经有一段时间了)。我很确定它应该涉及值和均值之间的差异的平方和,不是值本身。我怀疑sum_squares内部发生的事情比其简单名称暗示的更多。

答案 5 :(得分:1)

为了补充其他答案,免费官方Perl在线文档(以及其他变量)中描述了@_ Special Variable

  

在一个子程序中,数组@_   包含传递给它的参数   子程序。见perlsub。

答案 6 :(得分:0)

  

在函数中,@ _将包含传递给函数的函数参数列表。   实际上,当我们尝试将列表值分配给标量时,它将分配数组的长度。   这里-1用于访问@_数组的最后一个元素

sub test 
{ 
my $count = @_ ; # Now it will assign the number of function arguments 
# Because we are trying to assign as a scalar. 
>print "Output:$count\n" ; # Output : 4 
($count ) = @_   # Now it will assign the first element of the functions 
print "Output:$count\n" ; #  OUtput: 10 
# Because we are trying to assign as list values , So ,list as only one variable  . 
# So , first element gets assigned. 
} 
&test ( 10,20,30,40 ) ;