存在不明のパス名からディレクトリを構築する


公開 (UL): 2020-06-07
更新 (UD): 2020-06-07
閲覧 (DL): 2026-04-07

この記事のもくじ

→本文へ
当サイトは SNS の公式アカウントがないので,「議論ネタ」にする際は,皆さんのブログ,メーリングリスト,SNS や掲示板などで,適当にハッシュタグを付けたりリンクを掲載するなどしてご利用ください。

前の記事

2020-05-04
UTF-8 文字(列)と UNICODE の変換

次の記事

2020-12-22
年月日から曜日を求める数式

最近の記事

2024-02-11
XMPP - 長く使える安心チャット
2023-01-16
Android のキーボード・ショートカット一覧
2023-09-15
Perl の正規表現での A と Z の扱い
2022-08-09
代表的な画像ファイル形式一覧
2022-04-04
サイトのローカル試験と実ウェブ上の差を縮める手法(Perl)
新着情報
She appears also the top page.

新着情報 Recent docs.

Sorry, but most of these pages are only Japanese.
現場で活きる「電子工作」 «Get starting electronics handmaking!»
政権政党圧勝により介護福祉制度の改悪は必至! 現場の自助・自衛のための機器「手作り」入門!

人気記事 Frequent view pages.

おすすめ! Recommend

ご連絡 Contact

▼ メールフォームはこちら
SSL 証明書の更新に不具合が多いため,期限切れエラーが出た際は,お手数ですが「例外指定」をお願いいたします。

ファイルの暗号化
当サイト管理者(石川)宛にメール添付で送信するファイルを暗号化したい時は,唯一のパスワードを PPOP で取得できます。 PPOP gives a password for encryption of the file(s) attached your mail to the admini­strator of this site M.Ishikawa.
PPOP

MEMO / Email to the Author
あとで調べたい点のメモなどに利用可能。
下部ボタンでそのまま著者にメールできます。


CAPTCHA: easy math prob in Japanese

時事川柳 News Senryu

颯爽と  
アソー出てきて
  轍を踏む
Aso will finish the government of LDP also this time.

以前もこの方が(げや→)下野に導いたんでしょって。

(⌚2025-10-12)

ご支援 Support this site.

まだまだ コロナ失業中!!
CORONA-NEET, seeking works now!

この活動をご支援いただける方はこちらへ Could you support this site, see here (but Japanese).
都道府県庁さん, 地方自治体さんや教育委員会さん, 障害者就労支援機関さんやその他公的機関,省官庁さん, 「タダ見」しているだけでは, 格差が広がるだけだと思いませんか?
Welcome!
Alibaba    Google
The companies, thanks for many accesses every months! Are the articles I wrote helping for increasing your income? Although, I cannot get even a penny and jobs from that.

 ファイル作成時,指定パスの存在を確認し,ディレクトリが存在しない場合に根元に近い既存ディレクトリからディレクトリを新規作成してパスを構築していくための処理。

● perl の場合

 関数再帰呼び出しでパラメータのふるまいがおかしかったのでメモ。
 こんな関数を作ったのだが……。

▼ 再帰的ディレクトリの確認と構築(失敗する)
  sub	mkdirRc {
	return( ( -d $_[0] )||
	  ( $_[0] =~ /\/[^\/]+$/ && mkdirRc( $` ) &&
		mkdir( $_[0], 0777 ) ) );
	}

 受け取ったパラメータのパスが既存なら真を返し(2行め),存在しなければ,最後のスラッシュより前の文字列,つまり親ディレクトリのパスを再帰的に自分に渡して再調査(3行め)をしてから,受け取ったパラメータ名でディレクトリを作る(4行め)。途中で何かエラーがあれば,ディレクトリは作られず偽を返す。
 なかなかシンプルに書けたと思っていたが,正しく動作しない。途中で「File exists」というエラーが出る。つまり,存在しないディレクトリでも,「既に存在している(から作れない)」エラーが出る。

 調べたところ,親ディレクトリを辿っていき,存在するディレクトリに行き着くと再帰呼び出しから返って来た時のパラメータ($_[0])が全てそのディレクトリ名になってしまうという現象が起きていた。だから,それ以降は既存ディレクトリ名で mkdir が呼び出されるらしい。
 たとえば,このサブルーチンでファイルを作るためにパスを構築したい時は以下のように呼び出すわけだが……。

▼ ファイル作成のためのディレクトリの構築
	$filname = "/home/user/dir1/dir2/file";
	$filname =~ /\/[^\/]+$/;
	mkdirRc( $` );

 /home/user が既存の場合,親ディレクトリを辿ってそこに行き着くと,そこから返って来た時は呼び出した側の $_[0] も /home/user になってしまっていて,mkdir で「既に存在する」エラーが出てしまう。
 こうしたら出なくなった。

▼ 再帰的ディレクトリの確認と構築(成功する)
  sub	mkdirRc { my $p = $_[0];
	return( ( -d $p )||
	  ( $p =~ /\/[^\/]+$/ && mkdirRc( $` ) &&
		mkdir( $p, 0777 ) ) );
	}

 1行めの my $p に値を移しただけなのだが。パラメータ配列(@_)というのは,そのサブルーチン「唯一」のものなのか?
 そのワリに,以下の「階乗」を求める関数は正常に動作する。

▼ 階乗を求める
   sub fact { return $_[0] ?( fact( $_[0]- 1 )* $_[0] ): 1; }

 どういう現象なんだろ。



© M.Ishikawa; TREEWARE 2026.