2011-02-03 4 views
3

Только начал изучать Perl, а именно, изучить поток программы - основные заметные различия между оценкой строк и числа и использованием соответствующих операторов. Простой скрипт, я здесь, сводит меня с ума, поскольку это супер простое, если другое заявление, которое должно быть введено в «mike» и не работает. Вместо этого выводится инструкция else. Пожалуйста, помогитеПочему eq не работает со строковым вводом?

#!C:\strawberry\perl\bin\perl.exe 

use strict; 
#use warnings; 
#use diagnostics; 

print("What is your name please?"); 
$userName = <STDIN>; 


if($userName eq "mike"){ 
    print("correct answer"); 
} 
else{ 
    print("Wrong answer"); 
} 
+3

Вы пробовали отлаживать свою программу? Что такое ценность $ userName? – BlackBear

+0

$ userName значение будет тем, что вводится пользователем, как скалярная переменная с использованием . –

+1

Право. Но он включает в себя символ новой строки, введенный пользователем. Ваше сравнение не учитывает это. –

ответ

1

Когда я прочитал ваш вопрос, я думал, что у вас будет проблема со строками и числовыми значениями на равных. Рассмотрим следующий случай:

#!/usr/bin/env perl 

use strict; 
use warnings; 

print("What is the meaning of life, the universe and everything? "); 
chomp(my $response = <STDIN>); 

if ($response == 42) { 
#if (42 ~~ $response) { 
    print "correct answer\n"; 
} else { 
    print "Wrong answer\n" ; 
} 

Попробуйте два разных заявления if. Ответьте на что-нибудь хорошее, как family и посмотрите, что произойдет. ~~ - это смарт-оператор, который помог решить эту проблему в Perl. Узнайте больше об этом here (под «умным согласованием в деталях»). Также обратите внимание на встроенное использование оператора chomp.

+0

Отлично !. Большое спасибо, Джоэл. Я читаю это сейчас !. –

11

Попробуйте добавить вызов грызть после получить значение из STDIN:

$userName = <STDIN>; 
chomp($userName); 

Поскольку значение прочитанная из STDIN будет иметь символ новой строки на конце. Встроенный chomp() удалит новую строку из конца строки.

+2

* I * могу себе представить причину. Но эти ответы «попробуйте » не являются особенно полезными. Если вы не понимаете, почему, даже правильное решение по-прежнему остается предметом культа. – delnan

+1

Я просто положил это, пока я редактировал более подробное описание. Плохая привычка, извините (вероятно, из-за количества раз, когда кто-то пишет что-то короткое, пока я пишу свой длинный ответ.) –

+0

Спасибо Fd !. Конечно, STDIN добавляет конец символу \ n, не так ли ?. Большое спасибо, ты прав. Я должен помнить об этом и пинать себя, когда узнал, что в то же время и просто забыл об этом !. –

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