@_ -1在Perl中的含义是什么?

问题描述:

我正在尝试将Perl脚本翻译成PHP,并且遇到了一些Perl问题。例如,@_ -1是什么意思?我如何在PHP中编写它?@_ -1在Perl中的含义是什么?

全功能如下:

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

+4

'$#_ == @_ - 1' – ephemient 2010-02-28 22:14:21

+0

等同但不等效。写出你的意思是明智的。如果你的意思是“一个小于@ @'中的事物数量”,写下@ @ - 1。如果你的意思是“@ _''中的最后一个索引”,写'$#_'。 – hobbs 2010-03-01 01:06:05

+7

(从技术上讲,如果你使用过时的和彻底邪恶的''['',这两个可能不相等,但是不要这样做。) – hobbs 2010-03-01 01:07:23

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

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

所以,如果你拨打:variance('a', 'b', 'c', 'd');$deg将3

+0

谢谢!这非常有帮助! – Alex 2010-02-28 22:23:58

+5

'@ _'是一个数组,而不是一个列表。 – 2010-02-28 22:27:36

+3

要迂回:@_是一个数组,其中包含作为列表传递给子例程的参数。 – 2010-03-01 09:01:32

@_是被paassed到子程序的参数列表。当你使用它在非标量上下文如:

sum_squares (@_) 

你得到的名单,这样大概会返回在该列表中的所有数字的平方和(见下文然而评论)。

当在一个标量上下文中使用,你得到的长度,在你的情况下,将在[email protected]功能列表中的项目数量。

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

variance = arr[0]^2 + arr[1]^2 + ... + arr[N-1]^2 
      -------------------------------------- 
          N - 1 
值的阵列上

被传递到你的函数。

我不得不说,我的方差的理解是在与赔率(thouugh它已经有一段时间,因为我没有任何统计数据)。我很确定它应该涉及差值的平方和之间的值和平均值,而不是这些值本身。我怀疑sum_squares里面比简单的名字暗示的更多。

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

就像已经说过的那样,它是传递给函数的参数数组。这是在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 

与适当​​3210更换create_function如果你在PHP5.3

+0

该函数返回一个错误。 (见上面的整个代码) – Alex 2010-03-01 06:08:20

+0

@Alex什么错误?调用未定义的函数sum_squares?当然是的。这是一个用户级功能,你必须在某个地方定义它。有关可能的实现,请参阅上面的更新 – Gordon 2010-03-01 08:24:33

+0

@戈登是的,那一个。我定义了它。($ array){ \t \t返回array_sum($ array)/ count($ array) \t} \t \t 功能sum_squares($阵列){ \t \t $总和= 0; \t \t $ mean = mean($ array); ($ array = $ key => $ val){ \t \t foreach($ array as $ key => $ val){ \t \t \t $ sum + = pow($ val - $ mean,2); \t \t} \t \t return $ sum; \t} 使用这些函数,您的版本的方差函数会抛出一个错误。 – Alex 2010-03-01 08:59:37

@_是传入的参数子,但在标量上下文中提到的是参数的数量。

在PHP将是这样的:

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

为了补充其他的答案中,@_Special Variable免费的官方Perl的在线文档中描述(连同其他变量):

Within a subroutine the array @_ contains the parameters passed to that subroutine. See perlsub.

In function @_ will have list of function argument which is passed to the function . Actually when we are trying to assign the list value to the scalar , it will assign the length of the array. And Here -1 is for accessing the last element of the @_ array

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