perlの再帰でlocalの使い途
perlでディレクトリを辿ってファイルをリストする。
というのは File::Find というモジュールがあるのでそれを使えば一発で解決するんだけど。自分のモジュールに組み込む方法がよくわからず。
File::Find - ディレクトリツリーを辿る
https://perldoc.jp/docs/modules/File-Find-1.19/File/Find.pod
読んでもなんか使い勝手が違う、というかナニソレwanted?
てことで自分のモジュールで使えるものを自作。
「static」というディレクトリ以下にある、ホームページ用のhtmlファイルをリストアップする。というもの。以前から同じことをやってるスクリプトからの使い回しのサブルーチンの再帰。
use vars qw( $HTML );
〜〜〜〜〜
〜〜〜〜〜
sub parse_static{
my $self = shift;
my $args = shift;
my @dirs = ();
my $d = ($args->{dir} || 'static');
opendir(DIR, $d ) || die;
@dirs = grep(!/^\.\.?/, readdir(DIR));
closedir(DIR);
foreach my $f (sort @dirs){
if(-d $d . '/' . $f ){
$self->parse_static({dir=> sprintf(qq{%s/%s}, $d ,$f) });
}
else{
push(@{$HTML}, $d . '/' . $f) if $f =~ m!\.x?html!;
}
}
return $HTML;
}
1)ディレクトリ一覧を取得して
2)ファイルなら配列に放り込んで
3)ディレクトリなら(1)に戻る
というありがちなスクリプト。
…なんだけど、放り込む配列は use vars を使ってのグローバル変数。そうグローバル変数!なのが前から気に入らなかった。
もっと「かっこいい書き方」があるんじゃないかと。わたしのような野良、素人にとって「かっこいい」かどうかがポイント。
検索してみた。やっぱりこれも以前からちょっと気になってた my と local の違いがきっと魔法の種だと思ったらビンゴだった。
Perl で再帰呼出し時のスタック間データ共有
https://amachang.hatenablog.com/entry/20061010/1160506848
知りたかったのが、まさにこれ。かっちょええよなあ。
ダイナミックスコープとかレキシカルスコープとか意味は分からない、グローバル変数を局所化するとかも分からない。
けど、匂いでわかるかっこよさ。さっそくこのままいただいた(多謝!
sub parse_static{
my $self = shift;
my $args = shift;
my @dirs = ();
my $d = ($args->{dir} || 'static');
local $ongoldenpond::html = $ongoldenpond::html;
opendir(DIR, $d ) || die;
@dirs = grep(!/^\.\.?/, readdir(DIR));
closedir(DIR);
foreach my $f (sort @dirs){
if(-d $d . '/' . $f ){
$self->parse_static({dir=> sprintf(qq{%s/%s}, $d ,$f) });
}
else{
push(@{$ongoldenpond::html}, $d . '/' . $f) if $f =~ m!\.x?html!;
}
}
return $ongoldenpond::html;
}
おかげで、このサブルーチンの中だけで記述が完結することができた。
パッケージ名ongoldenpondというのは、わたしがここんとこどっぷりハマってる 個人ホームページ(On Golden Pond) 用のオレオレMovableTypeのスクリプトだから。
このブログ『ひまつぶし雑記帖』にはperlの小ネタもあるから、その手のも集めて、改めて個人ホームページに掲載するかなあ。
前にも書いたように、ここは日常雑記のために記法というか、書き込んだものを変換するけど、perlやhtmlのコードをそのまま掲載しても見づらいだけになってしまう。今さら変換規則を変えると過去25年以上の分全部に影響するんで、HTMLやperlのコードをそのまま掲載できる個人ホームページの方が見やすくなる。
ちょっと整理してみるか。
「よんでますよアザゼルさん」
アザゼル篤史とベルゼブブ優一
たぶん、今、こんなものTV放映したら大騒ぎだろう(最上の褒め言葉
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
【電子書籍発売中】