2010-02-28 43 views
5

Tôi đang cố gắng dịch một kịch bản Perl sang PHP và tôi đang gặp sự cố với một số thứ Perl. Ví dụ: @_ -1 có nghĩa là gì? Và làm thế nào để tôi viết nó trong PHP?@_ -1 có nghĩa là gì trong Perl?

Toàn bộ chức năng như sau:

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

Ok, tất cả các chương trình con như sau:

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

hãy chịu với tôi bởi vì lần đầu tiên tôi với Perl. Từ những gì tôi đã nhìn thấy (thử nghiệm), câu trả lời đúng trong trường hợp này là một trong những David Dorward. Tôi có một câu hỏi khác liên quan đến tập hợp các chương trình con này là here.

+4

'$ # _ == @_ - 1' – ephemient

+0

Bằng nhau nhưng không tương đương. Đó là khôn ngoan để viết một trong những bạn có nghĩa là. Nếu bạn có nghĩa là "một ít hơn số thứ trong' @ _' "viết' @_ - 1'. Nếu bạn có nghĩa là "chỉ mục cuối cùng trong' @ _' "viết' $ # _ '. – hobbs

+7

(Về mặt kỹ thuật, nếu bạn sử dụng '$ [' không được chấp nhận và triệt để tà ác, cả hai có thể không bằng nhau. Nhưng đừng làm vậy.) – hobbs

Trả lời

9

Trong trường hợp này, @_ là các đối số được chuyển đến chương trình con, dưới dạng danh sách.

Được lấy trong ngữ cảnh vô hướng, đó là số phần tử trong danh sách đó.

Vì vậy, nếu bạn gọi: variance('a', 'b', 'c', 'd');, $deg sẽ 3.

+0

Cảm ơn! Điều đó đã giúp rất nhiều! – Alex

+5

'@ _' là một mảng, không phải danh sách. –

+3

Để là pedantic: @_ là một mảng chứa các đối số được chuyển đến chương trình con dưới dạng danh sách. –

1

@_ là danh sách các thông số được paassed vào chương trình con. Khi bạn sử dụng nó trong một bối cảnh phi vô hướng như:

sum_squares (@_) 

bạn nhận được danh sách, vì vậy có lẽ đó sẽ trả lại tổng các bình phương của tất cả các số trong danh sách đó (xem bình luận dưới đây tuy nhiên).

Khi được sử dụng trong ngữ cảnh vô hướng, bạn nhận được độ dài để trong trường hợp của bạn, nó sẽ là số lượng mục trong danh sách hàm [email protected].

Vì vậy, chức năng đúng của bạn có lẽ là (tôi nói có lẽ vì tôi không có quyền truy cập vào mã nguồn sum_squares) tính toán:

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

trên mảng các giá trị được truyền vào hàm của bạn.

Tôi phải nói rằng sự hiểu biết của tôi về phương sai là mâu thuẫn với điều đó (thouugh nó được một lúc kể từ khi tôi đã làm bất kỳ số liệu thống kê). Tôi chắc chắn nó liên quan đến tổng của các ô vuông của sự khác biệt khác nhau giữa các giá trị và giá trị trung bình, không phải là chính các giá trị đó. Tôi nghi ngờ có nhiều xảy ra bên trong sum_squares so với tên đơn giản của nó ngụ ý.

2

Đó là số lượng đối số, được chuyển đến đối tượng con variance trừ một (hoặc chỉ mục của phần tử cuối cùng trong mảng @_). @_ được sử dụng trong ngữ cảnh vô hướng ở đây.

7

Như đã nói, đó là mảng đối số được truyền cho hàm.Đó là tương đương trong PHP sẽ

  • func_get_args() - Trả về một mảng gồm danh sách đối số của một hàm số
  • func_num_args() - Trả về số đối số truyền cho hàm

Toàn bộ chức năng sẽ

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) 

Cho sum_squares, không có hàm gốc trong PHP. Giả sử nó có ý nghĩa gì, ví dụ: nâng cao mỗi đối số với sức mạnh của 2 và sau đó tổng hợp kết quả, bạn có thể thực hiện nó như

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 

Thay create_function với một hợp lambda nếu bạn đang ở trên PHP5.3

+0

Chức năng này sẽ trả về lỗi. (Xem toàn bộ mã ở trên) – Alex

+0

@ Lỗi nào? gọi hàm und_s_sares không xác định? Tất nhiên nó. Đó là một chức năng của userland và bạn phải định nghĩa nó ở đâu đó. Xem cập nhật ở trên để có thể triển khai. – Gordon

+0

@Gordon vâng, cái đó. Tôi đã định nghĩa nó. Đây là mã php: \t hàm trung bình ($ array) { \t \t trả về mảng_sum ($ array)/count ($ array); \t} \t \t chức năng sum_squares ($ array) { \t \t $ sum = 0; \t \t $ mean = mean ($ array); \t \t foreach ($ array là $ key => $ val) { \t \t \t $ sum + = pow ($ val - $ mean, 2); \t \t} \t \t trả về $ sum; \t} Sử dụng các chức năng này, phiên bản của hàm phương sai sẽ trả về lỗi. – Alex

2

@_ là tham số gọi đến sub, nhưng được gọi trong ngữ cảnh vô hướng là số tham số.

Trong php sẽ được giống như:

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

Bổ sung các câu trả lời khác, @_Special Variable được mô tả trong chính thức miễn phí Perl tài liệu trực tuyến (cùng với các biến khác):

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

0

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) ; 
Các vấn đề liên quan