みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

perl サブルーチンでのファイル出力結果おかしい

以下のコードを実行するとカレントディレクトリの配下にある
すべてのファイルのリストがコンソールとファイルに出力される
はずですが、コンソールに表示されているファイルの一部しか
ファイルに出力されていません。
どうも、最後に do_file()を呼び出したときのファイルしか
リストされていないようなのですがなぜでしょうか。
どのようにすればよいのでしょうか。
よろしくお願いします。
(Windows7, ActivePerl(v5.16.3))

----test.pl---------------------------------------------
&do_dir('.');

sub do_dir{
 open(FILE2,'>list.txt') or die "$!";
 my $dirname=shift;
 my $delim='/';
 opendir(DIR,$dirname) or die "$!";
 foreach $entry (readdir(DIR)){
  next if($entry eq '.');
  next if($entry eq '..');
  if ($dirname=~/[\\\/]$/) {
   my $delim='';
  }
  my $filename="$dirname$delim$entry";
  if(-d $filename){
   &do_dir($filename);
  } else {
   &do_file($filename);
  }
 }
 close(DIR);
 close(FILE2);
}

sub do_file{
 my $filename=shift;
 return unless ($filename=~/\.*$/);
 print "$filename\n";
 print FILE2 "$filename\n";
}

投稿日時 - 2016-11-02 09:58:44

QNo.9250541

困ってます

質問者が選んだベストアンサー

> &do_dir('.');

> sub do_dir{
>  open(FILE2,'>list.txt') or die "$!";
>  ...
>  &do_dir($filename);
>  ...
> close(FILE2);
> }

質問のコードでは、do_dir サブルーチンを呼び出す毎に list.tex を再オープンするので、それまでに書かれた内容は消去されることになります。また、サブルーチンから戻った後は、ファイルハンドルがクローズされているので、その後のファイルは画面に書きだされますが、ファイルには記録されません。サブルーチン内の FILE2 のコードを外に出せば、すべてのファイルが書き出されると思います。

open(FILE2,'>list.txt') or die "$!";
&do_dir('.');
close(FILE2);

投稿日時 - 2016-11-02 15:40:00

お礼

do_file()の方だけに気を取られていて
do_dir()が再帰呼び出しされていることを見落としていました。
教えていただきました方法で正しく表示されるようになりました。
ありがとうございました。

投稿日時 - 2016-11-04 11:38:31

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

当該言語は知らないので見た感じですが、
sub do_file{
 my $filename=shift;
 return unless ($filename=~/\.*$/);
 print "$filename\n";
 print FILE2 "$filename\n";
}
print前にreturnしていいの?

投稿日時 - 2016-11-02 11:31:46

お礼

対象以外のファイルを処理しないように
returnさせているだけです。

投稿日時 - 2016-11-02 13:23:03

あなたにオススメの質問