簡體   English   中英

將數組 arguments 傳遞給 Perl 子程序

[英]Passing array arguments to Perl subroutine

我是 perl 編程的新手,我正在嘗試使用幾個子例程構建一個腳本。 首先,我試圖運行一個簡短的模擬腳本來計算子例程的行為,但我無法理解輸入。

這是我的代碼:

sub prueba{
  my (@array1, @array2)=@_;
  if (scalar(@array1)<scalar(@array2)) {
    print @array1,"\n";
  } elsif (scalar(@array1)>scalar(@array2)){
    print @array2,"\n";
  }
};

my @primero=(1,5,9);
my @segundo=(1,7,8,9,6,5,6,9);

prueba(@primero,@segundo);

我正在傳遞兩個 arrays 並且我希望子例程根據這些 arrays 檢索答案,但是當我運行它時,我沒有得到 output,甚至沒有使用警告消息,但我仍然沒有嘗試使用數組,但我仍然沒有嘗試使用警告消息...在職的:

sub prueba{
  my (@array1, @array2)=@_;
  if (scalar(@array1)<scalar(@array2)) {
    print @array1,"\n";
  } elsif (scalar(@array1)>scalar(@array2)){
    print @array2,"\n";
  }
};

my @primero=(1,5,9);
my @segundo=(1,7,8,9,6,5,6,9);

prueba(\@primero,\@segundo);

您不能將 arrays 傳遞給 subs(他們不能返回它們)。 你只能傳遞一些標量。 你正在做的相當於以下內容:

prueba(1,5,9,1,7,8,9,6,5,6,9);

所有 arguments 最終都在@array1中。 我們所做的是傳遞對 arrays 的引用。

prueba(\@primero,\@segundo);

但這也需要更換潛艇。 沒有改變,所有的 arguments 仍然在@array1中結束。 請參閱perlreftut以開始使用參考。 您可以使用

sub prueba{
  my ($array1, $array2)=@_;
  if (scalar(@$array1)<scalar(@$array2)) {
    print "@$array1\n";
  } elsif (scalar(@$array1)>scalar(@$array2)){
    print "@$array2\n";
  }
}

要不就

sub prueba {
  my ($array1, $array2) = @_;
  if    (@$array1 < @$array2) { say "@$array1"; }
  elsif (@$array1 > @$array2) { say "@$array2"; }
}

<>期望一個數字,因此它們已經強加了標量上下文。 還不如使用say ,盡管這需要use feature qw( say ); (或類似use 5.014;這也可以解決問題)。

您可以使用原型使其看起來像傳遞多個 arrays,並讓 perl 自動將它們轉換為引用:

sub prueba :prototype(\@\@) {
    my ($array1, $array2) = @_;
    if (@$array1 < @$array2) {
        print @$array1,"\n";
    } elsif (@$array1 > @$array2){
        print @$array2,"\n";
    }
}

my @primero=(1,5,9);
my @segundo=(1,7,8,9,6,5,6,9);
prueba(@primero, @segundo);

但是請仔細閱讀文檔以了解可以在不強制執行原型的情況下調用子例程的情況。

謝謝大家,我剛剛弄清楚我想要什么。 我發現我實際上可以將數組傳遞給 perl,但也許我沒有正確解釋 mysfel。問題是在子例程中按如下方式加載 arrays。

my @primero=@{$_[0]};
my @segundo=@{$_[1]};

這意味着我們正在使用參考。 Ehen 運行 function,我們必須在每個輸入之前寫下 \:

prueba(\@primero,\@segundo);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM