2013-04-16 58 views
0

我遇到了這種情況,我需要從名爲login.txt的文件(在當前目錄中)讀取2行數據(用戶名和密碼) )。讀取用戶名(第一行)後必須存儲在$ user中,第二行(密碼)必須存儲在$ pass中。從文件中讀取數據並創建文件並寫入數據是找不到文件

如果找不到這個文件,我必須提示用戶輸入用戶名和密碼並將其存儲在$ user和$ pass中,並創建文件login.txt(在currect 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; 

當文件不存在,一切工作正常(甚至$用戶和$通過獲取打印),但將如下得到一個錯誤信息: -

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. 

不知道什麼這裏的問題

回答

1

爲什麼它退出,如果它沒有找到login.txt文件?由於die聲明?這裏的perldoc -f die

模具LIST

模拋出一個例外。在eval中,錯誤消息被填入 到$ @中,並且eval以未定義的值結束。如果 異常不在所有封閉的evals中,則未捕獲的異常將LIST打印到STDERR並以非零值退出。如果 您需要退出具有特定退出代碼的進程,請參閱退出。

雖然這並不十分明確(準確地說,它的可怕不清楚的新手),你應該知道,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 
... 
+0

我工作的答案是,儘管腳本起作用,但我正面臨一個小錯誤。請檢查已編輯的問題 – mac

+0

@mac唯一的致命錯誤是,當您打開文件'open LINFO',$ login''時,您在文件名周圍使用單引號。該語句應該會導致腳本死掉,因爲單引號會阻止變量插值,並且腳本會嘗試打開名爲'$ login'的文件(該文件不應該存在)。由於它不會死亡,因此與您報告的錯誤不符。你的錯誤表明開放失敗,但腳本沒有死。所以,我的猜測是你做了和你說的不同的事情。 – TLP

+0

要解決插值問題,請刪除引號。你永遠不需要引用一個變量,只需要字符串。 – TLP

1

則必須在其括號中爲ifelsif的條件。另外要小心使用===。這應該適合你:

if ($. == 1) { $user = $line; } 
elsif ($. == 2) { $pass = $line; } 
相關問題