<STDIN>とARGVとの振る舞いの違いが分からず困っております。
<STDIN>とARGVとの振る舞いの違いが分からず困っております。
Perlといいますか、プログラム初心者です。
現在、Perlでファイル処理を行おうと思っており、下記のようなスクリプトを書き、file_test.plとして保存・実行しようとしたのですが、実行時の命令の仕方により処理が出来たり出来なかったりで、困っております。どなたか、ご教授頂けませんでしょうか。
なお、使用環境はWindows XP, Active Perl 5.8.8です。
スクリプトのソース、読み込みファイル共にShift-JISです。
(ここには記載しておりませんが、処理後の吐き出しファイルはUTF-8になります)
-------------------- file_test.plのソースファイル --------------------
use strict;
use warnings;
use encoding "cp932";
use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;
binmode STDIN, ':encoding(cp932)';
binmode STDOUT, ':encoding(cp932)';
binmode STDERR, ':encoding(cp932)';
my $csvname;
if(defined($ARGV[0])){
$csvname = $ARGV[0];
print "csvname = $csvname\n";
#文字コード判定
my $enc = guess_encoding($csvname);
ref($enc) or die "Can't guess: $enc";
print "encoding is ", $enc->name, "\n";
#UTF-8フラグチェック
print utf8::is_utf8("$csvname") ? "UTF-8 Flag\n" : "not UTF-8 Flag\n";
}
else{
print "input file: ";
$csvname = <STDIN>;
chomp($csvname);
print "csvname = $csvname\n";
#文字コード判定
my $enc = guess_encoding($csvname);
ref($enc) or die "Can't guess: $enc";
print "encoding is ", $enc->name, "\n";
#UTF-8フラグチェック
print utf8::is_utf8("$csvname") ? "UTF-8 Flag\n" : "not UTF-8 Flag\n";
}
open CSV, '<:encoding(sjis)', $csvname or die "$!";
print "FILE OPEN OK\n";
close(CSV);
------------------- file_test.plのソースファイル END -------------------
このソースを"perl file_test.pl csvfile.csv" で実行すると問題なく処理できます。
しかし、"perl file_test.pl" で実行し、あとからファイル名を入力すると、
"Invalid argument at file_test.pl line 35, <STDIN> line 1."というエラーが出ます。
(35行目はOPENコマンドの行です)
しかし、 "perl -CA file_test.pl"と-CAオプションを入れ、後からファイル名を入力した場合、動作します(上述のファイルの実行と同時にファイル名を指定したものでも動きます)。
実際にはコマンドプロンプトからの実行ではなく、plファイルをダブルクリック、その後ファイル名を指定して処理を行いたいため、悩んでおります。
どのようにしたら、うまく実行できるか、ご教授頂ければ幸いです。
お礼
ありがとうございます