北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

perlのへぇへぇへぇ(3)

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(&@)などと指定すればいい。