2016-11-17 4 views
-1

Я выполняю задание, которое запрашивает пользователя в файле, используя файл passwd в /etc.Сравнение строк и операторы 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]' вам кажется, что отсутствует близкий парик. Подумайте о добавлении '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. Проверка параметров должна быть первым, что делает скрипт, а не тем, что он делает во время обработки. Во-вторых, поскольку проверка «не существует» находится внутри цикла 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

Смежные вопросы