ひまつぶし雑記帖

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

ため池

[2025/05/13 09:03]
@ozoramore@social.t2arc.net をを!ActivityのJSONありがとうございます。unicodeの絵文字を使う方がサーバーごとでの対応状況を気にする必要もなさそうかもですね

[2025/05/13 08:41]
ええ。爺さんですよ!朝イチから歯医者なもんで、歯茎から血を流しながら歯磨きしてますよ!!
#還暦

[2025/05/13 08:39]
EmojiReactをcontextで設定して、LikeのActivityのcontentに入れるってのもあるのか…伏魔殿かなあ

@t2aki@tokoroten.doncha.net

検索
<<2025/5>>
    123
45678910
11121314151617
18192021222324
25262728293031

リンク

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