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

swap関数を試作

きっかけ

このツイートを見て。
なぜ交換する変数のリファレンスを指定するのだろう? 変数を直接指定しても交換できると思う。

こんな感じ?

ActivePerl(Windows)とPerlBrew(CentOS)の両方で確認しました。
Perlのバージョンは共に5.24です。
#!/usr/bin/env perl

use utf8;
use warnings;
use strict;
use open IO => ":utf8";

use Encode::Locale;

binmode STDOUT, ":encoding(console_out)";

$| = 1;

sub swap ($$) {
	my $s = $_[0];
	$_[0] = $_[1];
	$_[1] = $s;
}

my ($a, $b) = ("たこルカ", "俺の嫁");
print "${a}は$b。\n";
swap $a, $b;
print "${a}は$b。\n";

exit;

実行結果

たこルカは俺の嫁。
俺の嫁はたこルカ。

種明かし

Perlのサブルーチンは参照渡しなので引数を更新できます(定数なら実行時にエラー)。
大抵のサブルーチンの頭で「my ($a) = @_;」とか書くのは引数を不用意に更新しないための防護策なんですね。
こちらをご覧ください。
配列 @_ は local 配列ですが、その要素は実際の スカラパラメータの別名です。 たとえば $_[0] が更新された場合、対応する引数が更新されます (更新できない場合にはエラーとなります)。 perlsub - Perl のサブルーチン - perldoc.jp