在./script第17行没有这样的文件或目录

时间:2012-06-13 13:59:59

标签: perl file-io

确切错误:

$ ./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缓冲区,但我无法弄清楚如何修复它。

2 个答案:

答案 0 :(得分:5)

这就是魔术钻石操作员在Perl中的工作方式。如果使用参数启动脚本,它会尝试从文件中读取输入。如果您输入标准输入,则从那里读取。

答案 1 :(得分:2)

如果您计划使用<STDIN>,请使用<>而不是@ARGV来读取标准输入。

或者,甚至更好,直接从终端读取(如果 STDIN是终端)。快速搜索brought up Term::ReadKey,但我自己没有尝试过。