swap関数を試作
投稿:2018-01-14
このツイートを見て。
なぜ交換する変数のリファレンスを指定するのだろう? 変数を直接指定しても交換できると思う。
なぜ交換する変数のリファレンスを指定するのだろう? 変数を直接指定しても交換できると思う。
ActivePerl(Windows)とPerlBrew(CentOS)の両方で確認しました。
Perlのバージョンは共に5.24です。
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) = @_;」とか書くのは引数を不用意に更新しないための防護策なんですね。
こちらをご覧ください。
大抵のサブルーチンの頭で「my ($a) = @_;」とか書くのは引数を不用意に更新しないための防護策なんですね。
こちらをご覧ください。
配列 @_ は local 配列ですが、その要素は実際の スカラパラメータの別名です。 たとえば $_[0] が更新された場合、対応する引数が更新されます (更新できない場合にはエラーとなります)。perlsub - Perl のサブルーチン - perldoc.jp