もしも既存のコードにlocalを見つけたら
投稿:2019-03-26
localの説明から。
「あなたはが本当に望んでいるのは my の方でしょう; local はほとんどの人々が『ローカル』と考えるものと 違うからです。」(原文ママ)
Perlの組み込み関数 local の翻訳 - perldoc.jp
「警告: 一般的には、local ではなくmy を使うべきです; なぜなら、そちらの ほうが早く、安全だからです」
perlsub - Perl のサブルーチン - perldoc.jp
という事で、これからコードを書く時はmyがあるのでlocalを使いません。
sample_85.plのコード
#!/usr/bin/env perl -w use strict; use warnings; use utf8; use feature "say"; use Encode::Argv; use Encode::Locale; use FindBin; use lib $FindBin::Bin; use sample_85; use open IO => ":utf8"; binmode STDIN, ":encoding(console_in)"; binmode STDOUT, ":encoding(console_out)"; $| = 1; local $a = "たこルカ"; say "最初:$a"; s1(); say "s1戻り:$a"; s2(); say "最後:$a"; sub s1 { say "s1入口:$a"; local $a = "は"; say "s3呼び出し前:$a"; sample_85::s3(); say "s3呼び出し後:$a"; say "s1出口:$a"; } sub s2 { say "s2入口:$a"; $a = "嫁"; say "s3呼び出し前:$a"; sample_85::s3(); say "s3呼び出し後:$a"; say "s2出口:$a"; }
sample_85.pmのコード
package sample_85; use utf8; use feature "say"; sub s3 { say "s3入口:$::a"; $::a = "俺"; say "s4呼び出し前:$::a"; s4(); say "s4呼び出し後:$::a"; say "s3出口:$::a"; } sub s4 { say "s4入口:$::a"; $::a = "の"; say "s4出口:$::a"; } 1;
localを呼んだ所のスコープから抜ける(localを書いたブロックが終わる、サブルーチンの呼び出し元に戻る)と呼ぶ前の値に回復する事に注目してご覧ください。 「s1出口」が回復前で「s1戻り」が回復後です。
最初:たこルカ s1入口:たこルカ s3呼び出し前:は s3入口:は s4呼び出し前:俺 s4入口:俺 s4出口:の s4呼び出し後:の s3出口:の s3呼び出し後:の s1出口:の s1戻り:たこルカ s2入口:たこルカ s3呼び出し前:嫁 s3入口:嫁 s4呼び出し前:俺 s4入口:俺 s4出口:の s4呼び出し後:の s3出口:の s3呼び出し後:の s2出口:の 最後:の