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放映したら大騒ぎだろう(最上の褒め言葉

<<2026/1>>
    123
45678910
11121314151617
18192021222324
25262728293031
検索:

【最近の20件】