我遇到了一个需要从名为login.txt(在当前目录中)的文件中读取2行数据(用户名和密码)的情况。读取用户名(第1行)后必须存储在$ user中,第二行(密码)必须存储在$ pass中。
如果找不到这个文件,我必须提示用户输入用户名和密码并将其存储在$ user和$ pass中并创建文件login.txt(在当前dir中)并写下这两行进入文件。
my $user;
my $pass;
my $login = "login.txt";
unless (-e $login) {
print "Entering first time execution mode....!\n";
sleep(2);
print "Enter username:\n";
$user = <STDIN>;
chomp($user);
print "Enter password:\n";
$pass = <STDIN>;
chomp($pass);
unless(open LINFO, '>'.$login) {
# Die with error message
# if we can't open it.
die "\nUnable to create $login\n";
}
print LINFO "$user\n";
print LINFO "$pass\n";
close LINFO;
}
if (-e $login) {
open (LINFO, '$login') or die "Cant open\n";
while( my $line = <LINFO>) {
print $line;
chomp($line);
if ($. == 1) { $user = $line; }
elsif ($. == 2) { $pass = $line; }
last if $. == 2;
}
close LINFO;
}
print $pass;
print $user;
当文件不存在时,一切正常(即使是$ user和$ pass也会被打印),但会收到如下错误消息: -
readline() on closed filehandle LINFO at loginfile.pl line 43.
如果文件已经存在,那么我会收到以下错误
readline() on closed filehandle LINFO at loginfile.pl line 43.
Use of uninitialized value $pass in print at loginfile.pl line 59.
Use of uninitialized value $user in print at loginfile.pl line 60.
不确定这里的问题是什么
答案 0 :(得分:1)
您必须在括号中附上if
和elsif
的条件。另外请注意使用=
和==
的位置。这应该适合你:
if ($. == 1) { $user = $line; }
elsif ($. == 2) { $pass = $line; }
答案 1 :(得分:1)
如果找不到login.txt文件,为什么要退出?由于die
声明?这是perldoc -f die
:
死亡列表
die引发异常。在eval中,错误消息被填充 到$ @并且eval以未定义的值终止。如果 例外是在所有封闭的逃避之外,然后是未被捕获的 异常将LIST打印到STDERR并以非零值退出。如果 您需要使用特定的退出代码退出流程,请参阅exit。
虽然这不是非常清楚(确切地说,对于新手来说非常不清楚),你应该知道die
意味着程序退出,执行在那里停止。
使用open
时,这是推荐的做法,因为通常任何打开调用中的错误都应被视为致命错误。但是,您忽略此open
调用,并在该块中稍后使用同一文件句柄上的另一个open
。
unless(open LINFO, $login) {
那么您将尝试确定文件是否存在,并且您可以阅读它。为此,您可以使用the -X
commands,例如
if (-e $login) # if file exists
if (-r $login) # effective uid/gid can read file
...