@_ -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。
在这种情况下,@_
是作为列表传递给子例程的参数。
在标量上下文中,它是该列表中元素的数量。
所以,如果你拨打:variance('a', 'b', 'c', 'd');
,$deg
将3
谢谢!这非常有帮助! – Alex 2010-02-28 22:23:58
'@ _'是一个数组,而不是一个列表。 – 2010-02-28 22:27:36
要迂回:@_是一个数组,其中包含作为列表传递给子例程的参数。 – 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相当于将
-
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
与适当3210更换create_function
如果你在PHP5.3
该函数返回一个错误。 (见上面的整个代码) – Alex 2010-03-01 06:08:20
@Alex什么错误?调用未定义的函数sum_squares?当然是的。这是一个用户级功能,你必须在某个地方定义它。有关可能的实现,请参阅上面的更新 – Gordon 2010-03-01 08:24:33
@戈登是的,那一个。我定义了它。($ 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) ;
'$#_ == @_ - 1' – ephemient 2010-02-28 22:14:21
等同但不等效。写出你的意思是明智的。如果你的意思是“一个小于@ @'中的事物数量”,写下@ @ - 1。如果你的意思是“@ _''中的最后一个索引”,写'$#_'。 – hobbs 2010-03-01 01:06:05
(从技术上讲,如果你使用过时的和彻底邪恶的''['',这两个可能不相等,但是不要这样做。) – hobbs 2010-03-01 01:07:23