ひまつぶし雑記帖

perlの再帰でlocalの使い途

2024/11/8 [00:53:43] (金) 天気

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のコードをそのまま掲載できる個人ホームページの方が見やすくなる。

ちょっと整理してみるか。
image 
「よんでますよアザゼルさん」
アザゼル篤史とベルゼブブ優一
たぶん、今、こんなものTV放映したら大騒ぎだろう(最上の褒め言葉

»電子書籍制作代行についてはこちら

【電子書籍発売中】

doncha.net制作・発行:KindleやiBooks、楽天kobo、BOOK☆WALKERで読む電子書籍

profile

profile

 
doncha.net
contact:
»運営者
@t2aki@tokoroten.doncha.net

ため池

[2024/12/11 18:32]
弘南鉄道 大鰐線のこと
https://www.torizuka.club/2024/12/09/%E5%BC%98%E5%8D%97%E9%89%84%E9%81%93%E3%80%80%E5%A4%A7%E9%B0%90%E7%B7%9A%E3%81%AE%E3%81%93%E3%81%A8/
>ではどうして弘南鉄道は今から3年半も先の2028年3月末に廃止すると表明したのでしょうか。
>この時期を選んだのは来春高校に入る新入生が卒業する時期だからです。
>きちん ...

[2024/12/11 15:17]
年末進行だな…いつもより10日ほど発注が早い。元データもたぶん今日あたりなので待機。
検診目前で禁酒期間だし、ちょうどいいっちゃいいか(え?

[2024/12/11 12:04]
いかん、ねこあつめしかしてないんだが…。
こうして恍惚のひとにまっしぐらなのか。ぽつねんとTVばかり見てるおじいちゃんと同じ位置に到達しようとしてる、ぞ。

@t2aki@tokoroten.doncha.net

検索
<<2024/12>>
       
1234567
891011121314
15161718192021
22232425262728
293031

リンク

WINDOWS版サウンドノベル
おかえりください PC WINDOWS版サウンドノベル
『おかえりください』体験版