0

私は以下のコードを持っています

    use strict;
    sub test {
       my($greeting, @names) = @_;
       my $returnString;

       foreach my $name (@names) {
           $returnString .= "$greeting, $name!\n";
       }

       return $returnString;
    }
    print &test("Hi", "Tim", "Tom", "Chris");

出力する

    Hi Tim! Hi Tom! Hi Chris!

複数の配列を追加できるようにしたい。以下のようにコードを変更してみました

       my(@greeting, @names) = @_;
       print &test("Hi", "Tim", "Hello", "Tom", "Bye", "Chris");

しかし、これはできないことがわかりました。私が行った読書から、引数を参照として渡す必要があると思います。

        my($greeting, $names) = @_;
        my @names = $names; 

しかし、これは Hi Tim! しか出力しないことがわかりました。

この状況を処理する最善の方法は何ですか?

4

4 に答える 4

4

subそれらを単一のリストではなく 2 つの別個の配列として受け取るには、それらを参照として渡す必要があります。構文が間違っているだけです。代わりにこれを試してください:

my @greetings = qw( Hi Hello );
my @names = qw( Tim Tom Chris );

# Put a \ before the variable to get a reference to it
say_greetings(\@greetings, \@names);

sub say_greetings {
  my ($greeting_ref, $name_ref) = @_;

  # Put @ before an arrayref to get the array back
  my @greet = @$greeting_ref;
...
}

また、sub呼び出しの前に&. これは Perl 4 からの持ち越しです。Perl 5 では必須ではなく、予期しない副作用が生じる可能性があります。

于 2013-06-12T07:25:06.443 に答える
3

この状況を処理する最善の方法は、ニーズによって異なります。以下にいくつかのオプションを示します。

  1. List::MoreUtils 'natatime'(順序が重要な場合)

    use List::MoreUtils 'natatime';
    
    test( 'Hi', 'Tim', 'Hi', 'Tom' );
    
    sub test {
    
        warn( "Need to provide greeting-name pairs" ), # Check for
          return if @_ % 2;                            # data completeness
    
        my $iter = natatime, 2, @_;
    
        my $string;
        while ( my ( $greet, $name ) = $iter->() ) {
    
            $string .= "$greet $name!\n";
        }
    
        return $string;
    }
    
  2. 渡されたリストをハッシュとして扱います (順序が重要でない場合):

    test( 'Hi', 'Tim', 'Hi', 'Tom' );
    
    sub test {
    
        my %set = @_;  # warnings pragma checks for
                       # data completeness during runtime
    
        return join "\n", map { "$_ $set{$_}!" } keys %set;
    }
    
  3. キーと値のペアを arrayrefs として渡します (順序を保持し、データの完全性を保証します)。

    test( [ 'Hi', 'Tim' ], [ 'Hi', 'Tom' ] );
    
    sub test { join "\n", map { "@{$_}!" } @_ }
    
于 2013-06-12T07:36:08.613 に答える
1

参照を使用する必要はありません。リストをそのまま渡し、挨拶と名前がペアで設定されているため、1 つおきの要素を反復処理します。

use strict;
use warnings;

sub test {
   my @arg = @_;

   my $returnString = "";
   foreach my $i (grep { ! ($_%2) } 0 .. $#arg) {

       my ($greeting, $name) = @arg[$i, $i+1];
       $returnString .= "$greeting, $name!\n";
   }

   return $returnString;
}

print test("Hi", "Tim", "Hello", "Tom", "Bye", "Chris");    
于 2013-06-12T07:18:41.573 に答える