0

我遇到了一种情况,我需要从名为 login.txt(在当前目录中)的文件中读取 2 行数据(用户名和密码)。读取后,用户名(第一行)必须存储在 $user 中,第二行(密码)必须存储在 $pass 中。

如果找不到该文件,我必须提示用户输入用户名和密码并将其存储在 $user 和 $pass 并创建文件 login.txt(在当前目录中)并将这两行写入文件.

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.

不知道这里有什么问题

4

2 回答 2

1

您必须将条件ifelsif括号括起来。还要小心在哪里使用===。这应该适合你:

if    ($. == 1) { $user = $line;  }
elsif ($. == 2) { $pass = $line;  }
于 2013-04-16T11:45:49.957 回答
1

如果找不到 login.txt 文件,为什么会退出?因为die声明?这是perldoc -f die

模具清单

die 引发异常。在 eval 中,错误消息被填充到 $@ 中,并且 eval 以未定义的值终止。如果异常在所有封闭的 eval 之外,则未捕获的异常将 LIST 打印到 STDERR 并以非零值退出。如果您需要使用特定的退出代码退出进程,请参阅退出。

虽然这不是很清楚(准确地说,对于新手来说非常不清楚),但您可能应该知道这die意味着程序退出,执行停止在那里。

使用 时open,这是推荐的做法,因为打开调用中的任何错误通常都应该被认为是致命的。但是,您稍后会忽略此调用并在该块中稍后在同一文件句柄上open使用另一个调用。open我能看到的唯一原因

unless(open LINFO, $login) {

然后是您正在尝试确定该文件是否存在,并且您可以读取它。为此,您可以使用命令-X例如

if (-e $login)     # if file exists
if (-r $login)     # effective uid/gid can read file
...
于 2013-04-16T11:46:28.747 回答