• ベストアンサー

perl cgiでサブディレクト内のファイル名取得

perl cgiでサブディレクト内のファイル名取得 例 $dir="../01/"; $id_c="*.c"; $file_c=$dir.$id_c; @InputFileAllBuf_c = glob($file_c); $InputFile = $fileAll; open IN,"$InputFile"; @InputAll = <IN> ; close(IN) ; のようにすると、指定dir内のファイル名が 取得できます。 さらに、指定dirの直下たけでなく、 指定dir内のサブディレクトも、 ファイル名を取得する方法ありますか? よろしくお願いします。

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

  • ベストアンサー
  • ykc
  • ベストアンサー率29% (28/95)
回答No.1

Perlカテゴリがあるので、そちらのほうが適切な回答が得られるとおもいますが。 File::Findモジュールを使うと、簡単に書けます。 モジュールを使わないなら、opendirでぐるぐるまわす方法もあります。 ex) use File::Find; finddpth(\&list, "$dir"); exit; sub list{ print $File::find::name, "\n"; }

関連するQ&A

  • Perl:ファイルハンドルをスカラー変数にすると変

    お世話になります。 Perlの書き方について教えてください。 Perlのファイルハンドルで、昔はINやOUTやFILEのようにベアワード(裸のワード)を使っていたと思います。 ★(プログラム1) #! /bin/perl # # fh_bareword.pl use strict; use warnings; open IN, '<', 'in.txt'; open OUT, '>', 'out.txt'; while (<IN>) { print OUT; } close IN; close OUT; ★(実行例) C:\Perl\perl>type in.txt This is a pen. That is a book. C:\Perl\perl>fh_bareword.pl C:\Perl\perl>type out.txt This is a pen. That is a book. ★★★ ところが、これだとIN、OUTがグローバル名になってしまい、他のモジュールと衝突することがあるということで、myつきのスカラー変数にした方が良いと言われました。 それで、以下のように書いてみましたが、想定のように動作しません。 ★(プログラム2) #! /bin/perl # # fh_scalar.pl use strict; use warnings; open my $in, '<', 'in.txt'; open my $out, '>', 'out.txt'; while (<$in>) { print $out; } close $in; close $out; ★(実行例) C:\Perl\perl>fh_scalar.pl GLOB(0x146ea34)GLOB(0x146ea34) C:\Perl\perl>dir out.txt ドライブ C のボリューム ラベルは eMachines です ボリューム シリアル番号は 89C9-F870 です C:\Perl\perl のディレクトリ 2013/07/09 23:05 0 out.txt 1 個のファイル 0 バイト 0 個のディレクトリ 23,226,032,128 バイトの空き領域 ★★★ たぶん print $out; の部分で、私はファイルハンドル$outに$_を表示してくださいと意図していたのですが、「ファイルハンドルSTDOUTに$outを表示してください」という意図に受け取られたらしく、上記のようにGLOBのリファレンス?が表示されてしまいました。 print $out $_; と書くと、確かに正しく表示されますが、これが正しい書き方なのでしょうか。 printの後ろに来るのは出力する文字列ではなくファイルハンドルだと、正しく判断してもらえるもっと美しい書き方はあるのでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • readdir におけるフルパスでのファイル名取得(1)

    前提: current directory---perl scriptが存在する data directory -----.\DATA¥ current directory直下のフォルダ"DATA"に含まれるファイル名(text file)の取得は、 ------------------------------ opendir(DIR,"./DATA/"); @file=readdir(DIR); closedir(DIR); foreach $myfilename(@file){ if($myfilename=~/txt|TXT/){ print "$myfilename\n"; #確認用 } } で、できますが、フルパス付は、どのようにすればできるでしょうか? 現状、DOS promptで下記のようにやっています。 dir /s/b/o .\DATA\*.txt > filelist.dat これを、perlで読み込んで、処理をやっています。 readdirをうまく使って、perlの中で済ませてしまいたいのです。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • perl-cgi「日時によるファイル操作」について

    perl-cgi「日時によるファイル操作」について perl-cgiで、あるディレクトリ中のファイル更新日が最も若い2ファイルを表示して、それ以外を削除したいのですがどのようにすればよいでしょうか? #調べたいディレクトリを読み込む。 $Dir = "./cache"; opendir DIR,"$Dir"; my @alldir = readdir DIR; close DIR; #ファイル(パス)名と作成日時を求める。 #最新2つのファイルパス(名)を表示する。 print "NewFile".ファイルパス1; print "<HR>"; print "OldFile".ファイルパス2; #最新2つ以外は全て削除 unlink($_); exit(0);

    • ベストアンサー
    • Perl
  • CGI Perlでの認証について

    CGIにてログイン認証の処理を使用してみたく勉強がてら Perlにて作成しているのですが、どうもうまくいかない ので質問させてもらいます。 ID・パスワード保存用ファイルfile.datにあらかじめ 100<>p34z7 500<>332bdz といった感じで入力してまして、 ログインボタンを押したときに &login_chk($post{'id'},$post{'pwd'}); (URIデコード処理して$post{'id'},$post{'pwd'}を取得します) を実行して下記サブルーチンを呼び出します。 sub login_chk { my ($in_id, $in_pass) = @_; my ($id, $pass); my $data; if (!open (IN, "./file.dat")) { &Error("ファイルが開けません"); } while ($data = <IN>) { ($id, $pass) = split(/<>/, $data); if ($in_id eq $id){ last; } } close(IN); unless ($in_pass eq $pass) { &Error("正しいID・パスワードを入力してください"); } } ※現状ファイルロックの処理はしてません。  パスワードの暗号化もしてません。 で、IDに100、パスワードにp34z7と入力してログインしようとするのですが 「正しいID・パスワードを入力してください」とエラーが出てきます。 当然500のときも同じくエラーでした。 どこが問題なのでしょうか?昨日から考えてずっとわからないのでご回答よろしくお願いします。

    • ベストアンサー
    • Perl
  • perl ファイルが開かない

    perl でファイルを開きたいのですが、なぜか開けません。何がいけないのでしょうか?エラーは、 Name "main::file" used only once: possible typo とでます。エラーを見るかぎり、コードに間違いはなく、apacheかOSに何か原因があるのではないかとおもうのですが、悩んでいます。OSはubuntuです。 #!/usr/bin/perl -w open (IN, "<test.txt") or die ("Could not open $file: $!"); while(<IN>) { print "$_"; } close (IN);

  • CGI のモジュールをつかってファイルのアップロード

    use CGI qw(:standard); use File::Basename; $upimg1_pm = param('upimg1'); while (read($upimg1_pm, $buffer, 2048)) { $file .= $buffer; } $FileName = basename($upimg1_pm, ""); open UP,"> $img_dir/$FileName"; binmode UP; print UP $file; close UP; 上のようにファイルのアップロードのプログラムを書いたのですが、実際アップロードしたら C:\Documents and Settings\~top.gif のようにWindowsのローカルパスがそのままファイル名としてアップロードされてしまいました。 basenameはファイル名をとるモジュールときいていたのですがなぜこうなるのでしょうか? おそれいりますがご教授おねがいします。 もしかしてFile::Basename;のモジュールがないとか・・・ Perl5です。

    • ベストアンサー
    • CGI
  • クラスパス配下のファイル名一覧取得

    ある、クラスパスの通ったフォルダ(仮にdir)があったとして そのフォルダ内にあるファイル名一覧を取得したいと考えております。 dir/ ->a.txt ->b.txt ->c.txt 結果:a.txt、b.txt、c.txt ClassLoader クラスなどを用いて取得しようと考えたのですが、 getSystemResource() メソッドなどはファイル名まで指定しないと 取得できないみたいで、現時点で望む処理ができない状態です。 フォルダまでの絶対パスの指定はしたくないため、 Fileクラスも使用できない状態です。 このような処理をやったことがある方は、 どうかご教授お願いいたします。

  • perl-cgiのリネームについて

    Perl-CGIで ABCという、ディレクトリの中のファイルの名前を、ランダムな名前に変換したいのですがうまくいきません。 これを動作させるたびになぜか、どんどんファイルが減っていってしまいます。 どなたか、教えていただけないでしょうか? 宜しくお願い致します。 #!/usr/local/bin/perl print "Content-Type: text/plain\n\n"; $| = 1; my ($sec,$min,$hour,$mday,$mon,$year,$wno) = localtime(time); my ($nowtime) = sprintf("%02d_%02d_%02d_%02d_%02d_",$year+1900,$mon+1,$mday,$hour,$min,$sec); #ディレクトリのファイル個数を記録する $dir = "./ABC/"; # ← ディレクトリを変数にセットする opendir DIR, $dir; @files = grep { !m/^(\.|\.\.)$/g } readdir DIR; # ← 「.」 「..」 以外のファイルを取得 close DIR; srand; for (my $i = @files; --$i; ) { my $j = int rand ($i + 1); next if $i == $j; @files[$i, $j] = @files[$j, $i]; } $num = 0; use File::Copy; foreach(@files){ $getpath = "$dir"."$_"; if( copy($getpath, "$dir".$nowtime.$num++.'.dat') eq 1){ $num++; unlink($getpath);}else{print "Copy Error"; exit;} }

    • ベストアンサー
    • CGI
  • Perlでテキストファイル読み込み

    基本的な質問ですみません。 サーバ上のテキストファイルを読み込んで ローカルのテキストファイルに書き込むというだけなのですが 何度やってもできません。 以下プログラムですが #!usr/bin/perl open(IN,"http://*****/***/***.txt"); $file = <IN>; close(IN); open(OUT,"> a.txt"); print(OUT "$file"); close(OUT); サーバのアドレスは、URLうってみて見れたのでhttp://***(以下略)であってると思います。 サーバのテキストにはchmodで777と権限を与えました。 プログラムに問題あるのでしょうか。 この場合考えられる原因を教えてください。

    • ベストアンサー
    • Perl
  • perl でrequireされたファイル自身のフルファイル名を取得する

    perl でrequireされたファイル自身のフルファイル名を取得する方法を教えてください __FILE__ だとパス情報がありません。 また 起動したスクリプトではないので $ENV["SCRIPT_FILENAME"] , $0 では、取得できません。 どこに格納されているのでしょうか? %INCでは、無理ですし、@INCを使う方法では、信憑性にかけます requireするときにパスをグローバル変数に代入せずに どうしてもrequireされたファイル自身で 確実に正確な同じフォルダ名を取得する必要があるのでお願いします。 (※phpでは、__FILE__でフルパスで返ってくるので私の探し方が悪いだけだと思っています) perlでの取得方法の情報を お手数ですがよろしくお願いします

    • ベストアンサー
    • Perl

専門家に質問してみよう