Re: use encoding 'shiftjis'; の不可解な振る舞い
林です。
> 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
> となってしまいます。)
>
> これは、なぜでしょうか?
use encoding 'shiftjis' を付加し実行すると $new の末尾に
0x0D が 付いているようです。 rename に or warn $! を付加し
た所、
Permission denied at t.pl line 16, <STDIN> line 3.
のようなメッセージが表示されました。なぜか STDIN という文字
列が表示されています。encoding のドキュメントを見ると
use encoding *ENCNAME* [ STDIN => *ENCNAME_IN* ...] ;
You can also individually set encodings of STDIN and STDOUT via
the
"STDIN => *ENCNAME*" form. In this case, you cannot omit the
first
*ENCNAME*. "STDIN => undef" turns the IO transcoding completely
off.
という説明がありました。エラーメッセージからして、STDIN がら
みだろうという事で
use encoding 'shiftjis';
ではなく
use encoding 'shiftjis', STDIN => undef;
としてみた所正常に動作しました。根本的な原因は調べてません。
とりあえず動作したのでポストします。動作させた環境は
Windows2000 です。
関係ありませんが、ポストされた記事が
ysk6406 wrote:
>
> Win98SE で、ActivePerl 5.8.6 Build 811
> を使っています。
のようになっています。
--
林拓美(Takumi Hayashi)
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735