Perl ne demek @ _ -1?

6 Cevap php

Ben PHP bir Perl betiği çevirmek için çalışıyorum ve bazı Perl şeyler ile sorun yaşıyorum. Örneğin, @_ -1 ne demek? Ve nasıl PHP ile yazıyorsunuz?

Aşağıdaki gibi bütün fonksiyonu:

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

Aşağıdaki gibi ok, tüm altyordamlar şunlardır:

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 ile benimle çünkü benim ilk defa alınız. Gördüğüm kadarıyla (test), bu durumda doğru cevap David Dorward biridir. I here olan değişmezler bu dizi ile ilgili başka bir soru var.

6 Cevap

Bu durumda, @_ bir liste olarak, Değişmeze geçirilen argümanlar olduğunu.

Skaler bağlamında ele alındığında, bu listedeki elemanların sayısıdır.

Yani eğer arama: variance('a', 'b', 'c', 'd');, $deg 3 olacaktır.

Bu variance altprograma eksi bir (veya @_ dizideki son elemanın indeksi) geçirilen argümanlar numara. @_ burada skaler bağlamında kullanılır.

@ _ Alt için gelen bir parametredir ancak skalar bağlamında ifade parametrelerin sayısıdır.

Php gibi bir şey olacaktır:

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

@_ altprograma paassed olan parametrelerin listesi. Eğer bir sayıl olmayan bağlamında kullandığınızda gibi:

sum_squares (@_)

Eğer listesini almak, bu yüzden muhtemelen o (ancak aşağıdaki yorum bakın) o listedeki tüm sayıların kareleri toplamını dönecekti.

Bir skaler bağlamında kullanıldığında sizin durumunuzda o $@ function listedeki öğelerin sayısı olurdu, sen uzunluğu olsun.

Yani varyans fonksiyonu hesaplama (I sum_squares kaynak koduna erişim yok çünkü ben muhtemelen demek) muhtemelen:

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

Sizin işlevi geçirilen değerler dizisi üzerinde.

(Ben her istatistikleri yaptım çünkü bir süre oldu thouugh) Varyans benim anlayış bu oran olduğunu söylemek gerekir. Ben o değerleri ve ortalaması arasındaki differences karelerinin toplamını dahil etmek gerekiyordu oldukça eminim, not değerleri kendileri. Ben daha ima basit adını daha sum_squares içeride oluyor sanıyorum.

Diğer yanıtları tamamlamak için, @_ Special Variable (diğer değişkenler ile birlikte) ücretsiz resmi Perl çevrimiçi belgelerinde açıklanmıştır:

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