2016-11-17 18 views
-1

ファイルを/etcで使用してファイル内のユーザーを検索するように求める作業をしています。文字列比較とif文

私はこれを行うことができましたが、特定のユーザーが見つからない場合は、私が使用した印刷コマンドで返信しません。

は、ここに私のコードです:私はneため!=を交換しようとしている

#!/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; 
    } 
} 

が、私はそれが言うことを行うとき、私はそれがあると知っている場合でも、すべての引数が見つかりません。

私は自分の本を調べて、運がないとオンラインで調べようとしました。

+0

'' ARGV [0] 'スカラー、配列ではありませんので、@ ARGV [0]'動作しません。最初のチェックで使用したように、おそらく '$ ARGV [0]'を意味します。また、 '$ field [0]'の後ろには閉じた括弧がありません。スクリプトの先頭に 'use warnings;'を追加することを検討してください。 –

+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ループを読み込みます。パラメータのチェックはスクリプトの最初のものでなければならず、処理中のものではありません。第2に、「存在しない」チェックがwhileループ内にあるため、ユーザーではないすべての行に対してそのメッセージを出力します。入力ファイルが100行で検索対象が1つの場合は、1つの一致メッセージと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:入力ファイルから行を読み込むたびにパラメータの数をチェックするべきではないこと、または読み込む必要があることを理解することは、Perlの知識ではなく常識的なことです。ユーザーが見つかったかどうかを知る前にファイルの終わりを確認してください。あなたは何の言語を知っていますか? – Borodin