从文件读取数据并创建文件和写入数据是找不到的文件

时间:2013-04-16 11:39:00

标签: perl file

我遇到了一个需要从名为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.

不确定这里的问题是什么

2 个答案:

答案 0 :(得分:1)

您必须在括号中附上ifelsif的条件。另外请注意使用===的位置。这应该适合你:

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
...