サブルーチンのパラメタと戻り値
投稿: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が返る。
