Win98SE で、ActivePerl 5.8.6 Build 811 を使っています。
以下は、ある条件に一致するファイル名を、指定パターンと連番のファイル名にリネームするスクリプトです。
print "Old pattern: ";
$opat = <STDIN>;
chop($opat);
print "New pattern: ";
$npat = <STDIN>;
chop($npat);
print "Starting #: ";
$i = <STDIN>;
chop($i);
@flist = glob("$opat");
foreach $old (@flist) {
$new = sprintf("$npat", $i);
print "Renaming $old --> $new\n";
rename($old, $new);
++$i;
}
print "Done.\n";
このスクリプトは正しく動作しているのですが、これの先頭に、
use encoding 'shiftjis';
を入れただけで、動かなくなってしまいます。
(rename にエラーチェックが入っていませんが、エラーチェックを追加すると、$old が No such file or directory となってしまいます。)
これは、なぜでしょうか?
ちなみに、perl -d で調べようにも、-d 付きでこのスクリプトを呼んだだけで Perl がクラッシュしてしまい、お手上げの状態です。
原因がおわかりの方、よろしくお願いします。
No.1ベストアンサー
- 回答日時:
確かに、動かなくなるのはおかしいですね。
という訳で色々調べてみたのですが、use encoding…を入れると、chop の動作が変わってしまうことに原因があるようです。
つまり、通常は $opat = <STDIN>; を実行すると、$opat には「文字列+\r+\n」が入り、chop で \r\n を取ってくれるのですが、use encoding…が入っていると、$opat には「文字列+\r+\r+\n」が入るようです。
従って、chop を2回やらないと正しい文字列が得られないということになります。
(こういう時のために chomp がある筈なのですが、chomp を何度実行しても \r が取り切れませんでした。)
ということで、当面の回避策としては、chop を2回実行することで、何とかなりそうです。
(手元の環境で正しく動くことを確認しました。)
ご回答ありがとうございます。
確かに、chop の動作が変ですね。
そのため、$opat にゴミ(\r)が残り、$old にもそのまま \r が追加されていたため、rename で失敗した、ということのようですね。
chop を2回実行して、すべてうまく行くことを確認しました。
perl 5.8 で日本語サポートができたと喜んでいたのですが、完成度はまだまだ低いようですね。
どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- 英語 高校英語の問題 1 2023/05/23 15:29
- その他(プログラミング・Web制作) awkのtoupper() 1 2022/10/21 20:39
- その他(クラウドサービス・オンラインストレージ) Google ColabでGoogleドライブのサブフォルダにファイルを生成する方法 1 2022/10/31 17:37
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Perl perlをバージョンアップしたら、今まで正常に動いていたプログラムが、エラーになってしまった 3 2022/10/05 15:44
- その他(プログラミング・Web制作) VScodeでpythonプログラムの関数を実行したい 2 2022/07/13 19:24
- Ruby パイソンプログラミング 2 2022/12/03 18:44
- 画像編集・動画編集・音楽編集 DVD Styler トラブル解決方法 6 2022/10/29 16:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perlをバージョンアップしたら...
-
INDIRECT 横に再度抽出したい
-
Strawberry Perl for Windows ...
-
openした後、closeしないでプロ...
-
テキストファイルで提出とは?
-
Perlのエラーについてご教授く...
-
perlのrequireの動き方について...
-
Perl の外部モジュールの利用方法
-
Windows10においての『Perl』の...
-
Perlで特定文字列から特定文字...
-
Perlでsprintf("%02d",$month)...
-
フローチャート 九九
-
perl LWPでURLにアクセスした時...
-
Perlで、「が」を、「...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PerlでIPアドレスを取得する方法
-
何時間後を求める。
-
エラー
-
PerlからSSLのページを読み込み...
-
bashのgrepで複数の検索、かつ...
-
awkのtoupper()
-
windowsXP上で動作する最新版の...
-
Perlで長音
-
$com::VDの意味がわかりません
-
perlでランダムな文字列を作りたい
-
perlスクリプト s/^\\s+//; ...
-
UTF-8で書かれたHTMLファイルを...
-
実行時パラメータを使用するとE...
-
「Referer-Sweeper」というフリ...
-
DBD::Mysql が使用する標準のso...
-
例外処理のフローチャートの記...
-
Excel VBAでリンク切れをチェッ...
-
ユーザー定義関数に#NAME?が返...
-
VBAで別モジュールへの変数の受...
-
"JScript"が見つかりません!
おすすめ情報