我正在尝试将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,我还有另外一个问题。
答案 0 :(得分:9)
在这种情况下,@_
是作为列表传递给子例程的参数。
在标量上下文中,它是该列表中元素的数量。
因此,如果您致电:variance('a', 'b', 'c', 'd');
,$deg
将为3。
答案 1 :(得分:7)
就像已经说过的那样,它是传递给函数的参数数组。它在PHP中相当于
func_get_args()
- 返回包含函数参数列表func_num_args()
- 返回传递给函数的参数数量整个功能将是
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 ) ;