- ベストアンサー
テキストを参照としたPerlによる名前の変更
- ディレクトリ内のファイル名をテキストデータを参照として変更するためのPerlプログラムを作成したが、エラーが発生してうまく動作しない。
- プログラムの内容は、ファイルを1行ずつ読み込んでテキストデータと比較し、一致する場合にファイル名を変更すること。
- エラーメッセージは、変数の型が異なるために比較演算子がエラーとなっていることが原因である。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
すみません, 言い忘れていたことがあります. ロジックとしては間違っていない (かもしれない) ですが, 「普通の書き方」ではないです. まず, ファイル sansyo.txt をディレクトリに存在する全てのファイルに対して毎回読み直してますが, 普通に考えたらこれは無意味です. 最初に 1回だけ読めばいいはず. また, eq で比較するのではなく, sansyo.txt の内容から適切なハッシュを作るのが常道でしょう. まとめると, 最初に my %cvt; open(FILE2,"sansyo.txt"); for my $line (<FILE2>) { chomp($line); my ($a, $b, $c) = split(/,/, $line); $cvt{"$a,$b.txt"} = "$line.txt"; } として「$cvt{リネーム前} = リネーム後」という形でハッシュ %cvt を作っておき, あとは for my $dir (readdir(DIR)) { next unless -f $dir; rename($dir, $cvt{$dir}) if defined $cvt{$dir}; } とするのが普通じゃないかなぁ.
その他の回答 (4)
- pick52
- ベストアンサー率35% (166/466)
>>Tacosanさん > grep じゃなくて glob>#2 そのようですね。 すみません、間違えました。ご指摘ありがとうございます。 ActivePerlなどでも内部的にバッチで対応しているみたいですね。 返信ついでに調べてみるとディレクトリ内のファイル検索方法って 他にもいくつかあるみたいですね。 http://perl-mongers.org/2008/05/opendirglobfilefindrule.html
- Tacosan
- ベストアンサー率23% (3656/15482)
grep じゃなくて glob>#2. でも, なんでリネームしようとしているファイルの中身を読んでるんだろう. しかも使ってないし.
- pick52
- ベストアンサー率35% (166/466)
関係ないのですがファイル名に半角カンマって使用できたんですね。 でもあまり使用しない方がいいような気も。 実はディレクトリないのファイル名はopendirを使用しなくても while(<*>) { print "$_\n"; } これで取得できたりします。 (これって確かgrep関数の省略形だったような気が...) # 微妙にopendirと動作が異なるので注意 # 1. カレントディレクトリ(.)と親ディレクトリ(..)は取得されません # 2. 絶対パスまたは相対パスで指定するとその部分まで取得されます # 他にもあるかも # なので適材適所で使用した方がいいでしょう # (上記の方法の方が簡単だけどopendirの方がより厳密に操作できる)
- Tacosan
- ベストアンサー率23% (3656/15482)
文字列の等価比較は == じゃなくて eq.
お礼
Tacosan様、pick52様 ご回答ありがとうございました。別件で多忙だったため、コメントが遅れました。なるほど、確かに無駄なプロセスを組み込んでいましたね。どうも初心者なもので、今ある知識だけで組んだものなので非常に勉強になりました。感謝いたします。