ルモーリン
ホーム更新サービス雑談ランドナーコースガイド鉄ゲタ自転車Linuxリンク連絡先

サブルーチンのパラメタと戻り値

きっかけ

こんなツイート/ブログを見かけたので。

コード

件のブログにあるコードを書いてみたら通っちゃった(同様に使える)けれど、ブログ主のツイートによるとPerlのリストとは別の物らしい。 サブルーチンの頭でリストのエイリアスから代入する書き方で、どんな仕様か見当つくと思う。 Perlのドキュメントから。
「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が返る。