サブルーチンのパラメタと戻り値
投稿:2018-11-13
こんなツイート/ブログを見かけたので。
件のブログにあるコードを書いてみたら通っちゃった(同様に使える)けれど、ブログ主のツイートによるとPerlのリストとは別の物らしい。
サブルーチンの頭でリストのエイリアスから代入する書き方で、どんな仕様か見当つくと思う。
Perlのドキュメントから。
「Perl での関数呼び出しと戻り値のモデルは単純です。全ての関数は引数を、 平坦で一つのスカラのリストで受け取り、同様に全ての関数は呼び出し元に 対して平坦で一つのスカラのりストで返すというものです。」
perlsub - Perl のサブルーチン - perldoc.jp
「Perl での関数呼び出しと戻り値のモデルは単純です。全ての関数は引数を、 平坦で一つのスカラのリストで受け取り、同様に全ての関数は呼び出し元に 対して平坦で一つのスカラのりストで返すというものです。」
perlsub - Perl のサブルーチン - perldoc.jp
#!/usr/bin/env perl -w use utf8; use strict; use warnings; use boolean; use Encode::Argv; use Encode::Locale; use open IO => ":utf8"; binmode STDIN, ":encoding(console_in)"; binmode STDOUT, ":encoding(console_out)"; $| = 1; my ($x, $y) = f(3); print "サブルーチンfに3を渡すと${x}と${y}が返る。\n"; my $result = add(1, 2); print "サブルーチンaddに、1、2、を渡すと${result}が返る。\n"; $result = add(f(3)); print "サブルーチンaddに、サブルーチンfに3を渡した返り値、を渡すと${result}が返る。\n"; my $res1 = add4(1, 2, f(3)); print "サブルーチンadd4に、1、2、サブルーチンfに3を渡した返り値、を渡すと${res1}が返る。\n"; my $res2 = add4(1, f(2), 3); print "サブルーチンadd4に、1、サブルーチンfに2を渡した返り値、3、を渡すと${res2}が返る。\n"; my $res3 = add4(f(1), f(2)); print "サブルーチンadd4に、サブルーチンfに1を渡した返り値、サブルーチンfに2を渡した返り値、を渡すと${res3}が返る。\n"; $result = sum(1, 2, 3); print "サブルーチンsumに、1、2、3、を渡すと${result}が返る。\n"; my @result = f_list(true); print "サブルーチンf_listに、true、を渡すと@{result}が返る。\n"; exit; sub f { my ($a) = @_; return $a, $a * 2; } sub add { my ($a, $b) = @_; return $a + $b; } sub add4 { my ($a, $b, $c, $d) = @_; return $a + $b + $c + $d; } sub sum { my $result = 0; $result += $_ for @_; return $result; } sub f_list { my ($b) = @_; if ($b) { return 1, 2; } else { return 4, 5, 6; } }
サブルーチンfに3を渡すと3と6が返る。 サブルーチンaddに、1、2、を渡すと3が返る。 サブルーチンaddに、サブルーチンfに3を渡した返り値、を渡すと9が返る。 サブルーチンadd4に、1、2、サブルーチンfに3を渡した返り値、を渡すと12が返る。 サブルーチンadd4に、1、サブルーチンfに2を渡した返り値、3、を渡すと10が返る。 サブルーチンadd4に、サブルーチンfに1を渡した返り値、サブルーチンfに2を渡した返り値、を渡すと9が返る。 サブルーチンsumに、1、2、3、を渡すと6が返る。 サブルーチンf_listに、true、を渡すと1 2が返る。