3

正確なエラー:

$ ./script.pl file.txt  
Can't open file.txt: No such file or directory at ./script.pl line 17. 
Use of uninitialized value in chomp at ./script.pl line 17. 
Username: Password:

コマンドラインからファイル名を取得し、その出力を書き込むスクリプトを作成しています。

#!/usr/bin/perl
use warnings;
use strict;
use Term::ReadKey;

my @array;
my $user;
my $pass;

# get login info
print "Username: ";
chomp($user = <>); # line 17
print "Password: ";
ReadMode 2;
chomp($pass = <>);
ReadMode 0;
print " \n";

# ...
# connect to database, and save the info in "@array" 
# ...

# save the array to a file
if (defined($ARGV[0])) {
    open (MYFILE, ">".$ARGV[0]) or die "Can't open ".$ARGV[0].": $!\n";
    foreach (@array) {
        print MYFILE $_."\n";
    }
    close (MYFILE);
# otherwise, print the names to the screen
} else {
    foreach (@array) {
        print $_."\n";
    }
}

ただし、何かに置き換えるARGV[0]"file.txt"、ファイルへの印刷は正常に機能します。ファイル名を指定しない場合、スクリプトは正常に機能します。私の推測では、print ステートメントが iostream バッファーに干渉しているのですが、それを修正する方法がわかりません。

4

2 に答える 2

5

これが、Perl でのマジック ダイヤモンド オペレータの動作です。引数を指定してスクリプトを開始すると、ファイルから入力を読み取ろうとします。標準入力を入力すると、そこから読み取ります。

于 2012-06-13T14:03:06.830 に答える
3

を使用する<STDIN>場合は、を使用して、<>標準入力から読み取ります@ARGV

または、さらに良いことに、端末から直接読み取ります(STDINが端末の場合)。クイック検索が表示されました Term::ReadKeyが、私はそれを自分で試していません。

于 2012-06-13T14:19:29.650 に答える