林です。

> 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 &#12391;&#12289;ActivePerl 5.8.6 Build 811
> &#12434;&#20351;&#12387;&#12390;&#12356;&#12414;&#12377;&#12290;

のようになっています。

-- 
林拓美(Takumi Hayashi)