openっぽいのを自分で作ってみたかったのでやってみた。
use strict;sub myopen(*$){
my ($glob_ref, $path) = @_;
local (*FH) = $$glob_ref;
return open(FH, $path);
}
myopen(OUT, '>out.txt');
print OUT "hello\n";
close(OUT);
が、Can't use string ("OUT") as a SCALAR ref while "strict refs" in use at - line 4.と言われてしまった。どうやら、型宣言で型グロブを指定しても、明示的に型グロブを渡さずに裸の識別子を渡した場合は、文字列しか来ないみたい。ってことは、中でcaller呼んで頑張るしかないってことか。
ちなみに、型宣言で裸の識別子に対するエラーを抑えることは可能。型宣言がないと、Bareword "OUT" not allowed while "strict subs" in use at - line 8.とコンパイルエラーとなる。
おまけ。sort関数のように、ブロックを渡したい場合は、型宣言でmysort(&@)などと指定すればいい。