2014-06-26 40 views
2

我想讀一些參數傳遞到子例行在陣列和多標量在一個與@_用Perl

sub mean 
{ 
my (@values, $chan1, $chan2, $chan3, $chan4) = @_; 
print $chan1, $chan2, $chan3, $chan4; 
my $ave_value = sum($values[$chan1],$values[$chan2],$values[$chan3],$values[$chan4])/@values; 
} 

push (@avg_value , mean(@datachunk,$subchannel[0],$subchannel[1],$subchannel[2],$subchannel[3])); 

我得到錯誤的調用未初始化的數組元素中的值。我假設這是因爲我試圖讀取值。這是正確的方法嗎?

回答

3

您的數組分配正在吃掉所有參數。

例如,在下文中,$foo$bar將始終是未定義的,並@array將包含4個元素:

my (@array, $foo, $bar) = (1,2,3,4); 

這裏有兩個可能的解決方案:

1)把標量第一和那麼你的陣列:

sub mean { 
    my ($chan1, $chan2, $chan3, $chan4, @values) = @_; 
    print $chan1, $chan2, $chan3, $chan4; 
    my $ave_value = sum(@values[$chan1, $chan2, $chan3, $chan4])/@values; 
} 

# Calling method: 
mean($subchannel[0], $subchannel[1], $subchannel[2], $subchannel[3], @datachunk) 

2)或者,您可以通過引用傳遞數組:

sub mean { 
    my ($arrayref, $chan1, $chan2, $chan3, $chan4) = @_; 
    print $chan1, $chan2, $chan3, $chan4; 
    my $ave_value = sum(@{$arrayref}[$chan1, $chan2, $chan3, $chan4])/@$arrayref; 
} 

# Calling method: 
mean(\@datachunk, $subchannel[0], $subchannel[1], $subchannel[2], $subchannel[3]) 

但是,最緊密的解決方案是重新設置您的代碼。所有你想要的是一個列表的平均值。因此,直接傳遞一個列表而不是索引值的數組。

sub mean { 
    return @_ ? sum(@_)/@_ : die "Mean of 0 numbers is undefined"; 
} 

# Calling method: 
mean(@datachunk[@subchannel[0..3]]) 
+0

'undef'更有意義大於零。死亡更是如此。 – ikegami

+0

鑑於OP正在將數據推入數組中,我可能傾向於使用'()'。然而,重要的是他只是以他所選擇的某種有意識的方式來處理它。在示例代碼中包含一個顯式的die會傳達最好的結果。 – Miller

+0

我不同意從預期返回標量的函數返回空列表。它有時導致事情失敗。 – ikegami

3

的問題是,Perl是不是紅寶石那樣聰明,所以當你收集到的參數與mean分配

my (@values, $chan1, $chan2, $chan3, $chan4) = @_; 

您指定的@_整個@values離開$chan1$chan2等設置爲undef

一般來說,特別是如果你是組合陣列參數與標量,你應該通過參考傳遞數組。所以,你的子程序可以

sub mean { 
    my ($values, $chan1, $chan2, $chan3, $chan4) = @_; 
    print "$chan1, $chan2, $chan3, $chan4\n"; 
    my $avg = sum(
    $values->[$chan1], 
    $values->[$chan2], 
    $values->[$chan3], 
    $values->[$chan4] 
)/@values; 
} 

,你會稱呼其爲

push(@avg_value, mean(
    \@datachunk, 
    $subchannel[0], $subchannel[1], $subchannel[2], $subchannel[3] 
)); 

不過,如果你剛剛獲得通過的值的列表中選擇您mean子程序將更加普遍有用。舉例來說,如果你有mean定義爲

sub mean { sum(@_)/@_ } 

,那麼你可以把它使用數組切片,這樣

push(@avg_value, mean(@datachunk[@subchannel[0..3]])); 

,或者,如果這是你太多,然後拆出片

my @chunk_indices = @subchannel[0..3]; 
my @values = @datachunk[@chunk_indices]; 
push @avg_value, mean(@values)); 

我希望這有助於尋找東西的意思,當