File::Findモジュールの例外処理

このQ&Aのポイント
  • サーバー内の入り組んだ階層の中にある全てのhtmlファイルをEUCコードに一括変換処理したいと考えています。
  • 特定のディレクトリ内とそのディレクト以下の階層にあるhtmlファイルは処理したくありません。
  • File::Findモジュールと例外処理を組み合わせることで、目的の処理を実現できます。
回答を見る
  • ベストアンサー

File::Findモジュールの例外処理

サーバー内の入り組んだ階層の中にある全てのhtmlファイルをEUCコードに一括 変換処理したいと考えています。 但し、あるひとつのディレクトリ内とそのディレクト以下の階層にあるhtmlファイルは 処理したくありません。 require "jcode.pl"; use File::Find; find(\&fileProc, './public_html'); sub fileProc { my $fname = $_; return unless -f $_; #### ここに例外処理を書けばいいと思うのですが・・・ return unless /\.html$/; open IN, $fname; open TMP, ">$fname.temptemp"; # 存在しないファイル名 while (<IN>) { &jcode'convert(*_,'euc'); print TMP; } close IN; close TMP; rename "$fname.temptemp", $fname or warn "cannot rename $fname because $! \n"; } どう書けばいいのかよろしくご教授ください。

  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.1

変数 $File::Find::name には、ディレクトリ名付きのファイル名がセットされます。 ある1つのディレクトリ以下は除外したいということですので、次のような感じの 行を入れるといいのではないかと思います。 return if $File::Find::name =~ m|/skip_dir/|;

AAbb11ccDD
質問者

お礼

上手くいきました。 ありがとうございました。

関連するQ&A

  • 1ファイルずつ読み込みたい

    ウィンドウズ環境でactive perlを利用しています。 あるディレクトリーの中に2000位のファイルが入っており、このファイルを読み込んで置換処理を行うため下記のようなperlを作っています。 1ファイルはおおよそ3000行くらいです。 foreach(<*.html>) { open(IN_FILE, $_) || die; open(OUT, ">$_.tmp") || die; @record=<IN_FILE>; foreach $record (@record){ $record =~s/aaa/bbb/isg; } print OUT @record; close( IN_FILE); close( OUT); rename("$_.tmp", $_) ; } 当たり前かもわかりませんが、メモリー不足になり処理が中断します。 ディレクトリーの中のファイル数を600程度に少なくすると処理が完了します。 そこで質問なのですが、ディレクトリーの中のファィルを一度に全部読み込まず、1ファイルずつ順次読み込んでいくことはできないでしょうか。 最初の1行目のforeachをwhileに変えたりしたのですがうまくいきません。 対応策あればご教示ください。

    • ベストアンサー
    • Perl
  • Perlの文字コードを意識したファイルの読み込み方

    perl5.8でファイルを読み込む場合、文字コードを意識した以下のような呼び方("<:euc-jp")があるのですが この方法で読み込んだ$datの中身はperlの内部コード(UTF8)になっているということでしょうか? それとも、普通に("<")で読み込んで$dat = Encode::decode("euc-jp", $dat);とすべきでしょうか? use utf8; use Encode; my $fname = "test.txt"; # 文字コードがEUC-JP my $dat = ""; open(IN, "<:euc-jp", "$fname) or die "open error!"; flock(IN, 2); while(<IN>){ $dat .= $_; } close(IN);

    • ベストアンサー
    • Perl
  • foreachの入れ子について。

    あるディレクトリ内の全てのファイル名を取得し、 全てのファイルを開いてカンマ、ダブルクォーテーション付加の処理をし、 別ファイルへと出力する。と言ったものを以下のように作ったのですが、 入れ子のforeach{}内へ入って行きません、 foreachの入れ子は出来ないのでしょうか? それともプログラムが間違っているのでしょうか? どなたかご教授お願いいたします。 require "./jcode.pl"; # jcode.plの呼び出し #ディレクトリ表示 opendir(DIR01,"./TestData") || die "can not open dir"; @FileName = readdir(DIR01); closedir(DIR01) || die "can not close dir"; foreach $file (@FileName) { if ($file eq '.') {next;} # '.'の時ループを抜ける if ($file eq '..') {next;} # '..'の時ループを抜ける $FName = "./TestData/$file"; # ファイルのオープン open ( FILEHANDLE , "$FName") || die "ファイルを開けません :$!\n"; @line = <FILEIN>; close (FILEIN); foreach $line (@line){ ######################### print "TEST-->$line\n"; ######################### $line =~ s/ⅰ|ⅱ|ⅲ|ⅳ|ⅴ|ⅵ|ⅶ|ⅷ|ⅸ|ⅹ//g; $line =~ s/\"/\"\"/g; $line =~ s/\,\"\?/\"\,\"/g; $line =~ s/\"\,\?/\"\,\"/g; $line =~ s/\ |\ /\"\,\"/g; &jcode::sjis2euc(\$line,"z"); # sjis --> euc コードへ変換 if (length $line != 1){ chop($line); $cd_22 = chr(0x0022); $line = "$cd_22$line$cd_22"; $line =~ s/([^\LF])$/$1\n/; } } open (FILEOUT, ">./log/TEST.txt") or die; #上書き時 print FILEOUT @line; close (FILEOUT); } } exit;

    • ベストアンサー
    • Perl
  • 複数のCSVを1つのファイルにまとめる

    リモートからダウンロードしたCSVファイルをひとつにまとめる処理をしています。 ダウンロードするリストファイルとCSVファイルのダウンロードはできたのですが、最後にダウンロードしてきたCSVファイルをひとつにまとめるところがうまくいきません。 こちらの過去ログから下記記述してみたのですが、うまくいきません。 if(open(OUT,">$path/$year$mon$mday$csv")){      for my $fname (sort @dirs){        if(open(IN,"$path/$fname")){          my @lines = <IN>;          print OUT @lines;          close(IN);        }     }     close(OUT);   } for my $fname (sort @dirs){の記述で、Unrecognized characterといったエラーが出てうまくいきません。 項目の設定に誤りがあるのでしょうか?perl初心者でよくわかりません。 $fnameや@dirsはどのように設定すればいいのでしょうか?

    • ベストアンサー
    • Perl
  • open中のファイルをrename

    オープン中のファイルをflockによる排他をしたままrenameしたいのですがどうもうまくいきません。 sysopen(LOCK, "$file", O_WRONLY);   もしくは open(LOCK, "> $file"); flock(LOCK, 2); rename($tempfile,$file); close; close前にrenameするとロックが外れてしまいます。 close後にrenameをするとやはりロックが外れた状態でのrenameになります。 renameするファイル以外にflock専用ファイルを固定で一つ用意すれば簡単なのですが openしたいファイル数は相当な数があり、各ファイルごとにロックをかけたいのです。 全ファイル分のflock専用ファイルを用意するか、排他方式をmkdirにする以外 何か良い手立てはございますでしょうか。

  • レコードの書込み判断

    ファイルを読込み、読込まれたレコードの39桁目が0であれば出力という判断を下記のコーディングに追加したいのですが、どのように記述すればよいでしょうか? if(open(OUT,">$year$mon$mday$csv")){  for my $fname (sort @dirs){   if(open(IN,"$fname")){   my @lines = <IN>;   print OUT @lines;   close(IN);   }  }  close(OUT); }

  • 例外処理がまったくわかりません!!

    下のプログラミングについていくつか質問があります。 (1)etest()メソッドってなんですか? (2)存在しないファイルを開くってどういうことですか? (3)FileReader( )対応catch節、Close( )対応catch節ってなんですか? (4)あと、プログラミングあとの本の解説の部分がよくわかりません。抜粋してみます。 「一般的な例外クラスはxxxExceptionというクラス名をしています。このタイプの例外クラスはみな「Exception例外クラス」をスーパークラスにしています。この場合、「catch(Exception e)」を使うとすべてのxxxException例外を補足できるという仕様になっています。ですから下のetest( )メソッドは次のように、ひとつのcatch節で記述することができます。このようにしても表示される4エラーメッセージ(eで指示)は、正しく発生例外(FileNotFoundExceptionまたはIOException) 対応のものになります。」 public static void etest( ) { try { // try節を書く FileReader fr = new FileReader("xfile.txt"); } catch (FileNotFoundException e) { // FileReader( )対応catch節 System.out.println("例外1: " + e); // 例外情報を表示 return; // 戻る } catch (IOException e) { // Close( )対応catch節 System.out.println("例外2: " + e); // 例外情報を表示 return; // 戻る } System.out.println("ファイルは正しくオープンされました"); } } よろしくお願いします。

    • ベストアンサー
    • Java
  • オブジェクト? perlをオーバーライドする方法?

    perl 5.6を使っております。 Perl5.8では PerlIOが入出力の際に文字コードを自動変換しているのですが この機能を5.6でもスクリプト互換で使いたい(スクリプトを5.6と5.8を同じにする)のですが、 既存のprint, getc, read, write関数をオーバーライド?することは可能でしょうか? 一々、if(5.8 <= $])としたくないためです。 例えば、外部がeucでperl処理がutf8の場合 sub getc{ return Jcode->new(...)->utf8; } sub print{ return Jcode->new(...)->euc; } sub read{ return Jcode->new(...)->utf8; } sub write{ return Jcode->new(...)->euc; }

    • ベストアンサー
    • Perl
  • DBIモジュールと Perl5.8

    Perl5.8のエンコードが理解できずに困っております。 MySQLでは、utf8の文字コードのデータがあります。 以下のスクリプトを実行させると、 Wide character in print at C:/usr/local/site/lib/DBI.pm line 1008. となります。 対処方法はあるのでしょうか? use utf8; use strict; use DBI; my $dbh = DBI->connect("dbi:mysql:dbname=test", "root", "", { AutoCommit=>1, PrintError=>1, RaiseError=>1} ); my $fname = "test.txt"; my $sth = $dbh->prepare("select id, namae from test order by id asc;"); $sth->execute(); # 出力ファイルを開く。 open FILE, ">" , $fname or die "Can't open $fname: $!"; # 整形された結果をファイルにダンプする。 my $rows = $sth->dump_results(80, "\n", ",", \*FILE); # 出力ファイルを閉じる。 close FILE or die "Error closing result file: $!\n"; $dbh->disconnect();

    • ベストアンサー
    • Perl
  • ロック処理について

    ロック処理について my$id="abc"; open(IN,"file"); while(<IN>){ my ($cid) = split(/\,/); if($cid eq $id){&error;} } close(IN); open(OUT,">>$file"); print "$id,$pass\n"; close(OUT); いままで上記のような書き方でも普通にロック機構を使っていたのですが、 ふと、追加書込みなら必要ないのではと思い至りました。 上記のようにファイルに追加書込みする場合は、ロックは必要ないのでしょうか?

    • ベストアンサー
    • Perl

専門家に質問してみよう