2016-11-17 213 views
-1

我正在做一項任務,要求使用/etc中的passwd文件在文件中搜索用戶。字符串比較和if語句

我能夠做到這一點,但是當它找不到特定用戶時,它不會回覆我用過的打印命令。

這裏是我的代碼:

#!/usr/bin/perl 

$file = '/etc/passwd.bak' 
open (FILE, $file) or die "Error in reading file. Program will close"; 

while (<FILE>) { 

    chomp; 
    @field = split (':', $_); 

    if ($ARGV[0] eq $field[0]) { 
     print "User ID: $field[2]\n" ; 
     print "Home Directory: $field[5]\n"; 
    } 
    elsif (@ARGV[0] ~= $field[0] { 
     print "User: $ARGV[0] does not exist.\n" 
    } 
    elsif ((@ARGV > 1 || @ARGV == 0)) { 
     print "Please enter one argument only.\n"; 
     exit 0; 
    } 
} 

我試圖交換!=ne,但是當我做,它說,每一個參數沒有找到,即使我知道它的存在。

我試圖在我的書中看,並沒有運氣在網上研究它。

+0

'@ARGV [0]'不會工作,因爲'ARGV [0]'是標量,而不是一個數組。您可能是指您在第一次檢查時使用的「$ ARGV [0]」。另外,你似乎在'$ field [0]'後面缺少一個關閉的元素。考慮在腳本的頂部添加'使用警告'。 –

+0

我會試試,謝謝 – user4839691

+0

你是否清楚'while(){...}'會爲文件中的每一行執行一次塊? – Borodin

回答

0

通常參數檢查發生在開始而不是循環。

你可以說用戶只在循環之後才存在。

您應該使用$ ARGV [0]而不是@ARGV [0]。

我試圖讓程序做你所描述的:

#!/usr/bin/perl 

if ((@ARGV > 1 || @ARGV == 0)) { 
     print "Please enter one argument only.\n"; 
     exit 0; 
} 

$file = '/etc/passwd'; 
open(FILE, $file) or die "Error in reading file. Program will close"; 
$found =0; 
while (<FILE>) { 
     chomp; 
     @field = split (':', $_); 

     if ($ARGV[0] eq $field[0]) { 
       print "User ID: $field[2]\n" ; 
       print "Home Directory: $field[5]\n"; 
       $found = 1; 
     } 
} 
if ($found == 0) { 
     print "User: $ARGV[0] does not exist.\n" 
} 
+0

當我鍵入代碼時,它仍然以相同的方式發生。如果找不到用戶,則不顯示打印。 – user4839691

+0

也許你打錯了什麼。 $ found設置爲0,那麼只有在找到用戶的情況下它纔會變爲1。最後,如果$ found是0,它會打印出來。我測試過了。這個對我有用。你的版本沒有工作,因爲有幾個錯誤,缺少半個圖標,@ARGV [0]而不是$ ARGV [0],缺少「)」,「〜=」而不是「ne」。 – quantummind

0

對於初學者,ne是比較字符串是否相等的正確運算符。你大概的意思是$field[0] ne $ARGV[0]

除此之外,你的代碼有一些結構性問題。首先,你檢查你的文件中讀取while循環的參數數量。參數檢查應該是腳本所做的第一件事,而不是在處理時做的事情。其次,因爲「不存在」檢查位於while循環內部,所以您將爲每個不是用戶的行輸出該消息。如果您的輸入文件有100行,其中一行是您的搜索目標,您將輸出一個匹配消息和99「不存在」消息。

我會建議像下面這樣的結構。因爲這是作業,應該是一個學習經驗,我只給你僞代碼,不可用perl。

if (wrong_param_count) { 
    print "error message" 
    exit 
} 

found_user = 0 
while (read_line_from_file) { 
    if (this_line_is_user) { 
     print "user information here" 
     found_user = 1 
    } 
} 

if (!found_user) { 
    print "user not found" 
} 
+0

所以我對PERL很新穎。我完全沒有在課前用過它。好吧,所以我試圖按照你的僞代碼來構造它。但它給了我錯誤信息 – user4839691

+0

好吧,這是因爲我忘了添加$。現在讓我試試吧 – user4839691

+2

@ user4839691:認識到你不應該在每次從輸入文件中讀取一行時檢查參數的數量,或者你必須閱讀您可以知道用戶是否被找到之前文件的結尾。你知道什麼語言? – Borodin