Я набрал небольшую программу, чтобы освежить свои знания Perl, особенно интересующие меня IF и Else-Case. Как мне заставить Perl распознать, что ввод был пустым? Я проверил ввод с помощью «==", а также с помощью «eq», но моя программа всегда говорит: «Вы ничего не ввели!».
#!/usr/bin/perl
# input line
$input_line = "";
# terminal input
print "Input:";
$input_line = <STDIN>;
# input verification
print "Your input was: ", "$input_line";
print "\n";
# decider terminal input
if ($input_line == "" or $input_line eq "")
{ print "You have typed nothing!";
print "\n"; }
else
{ print "Typing nothing is bad!";
print "\n"; }
И вывод, если я наберу «Привет», будет:
Input:Hello
Your input was: Hello
You have typed nothing!
Если я наберу Hello
, то будет ввод.
Если я ничего не наберу, то в выводе должно появиться сообщение «Вы ничего не набрали!», а также должен появиться Else-Case.
Всегда добавляйте use warnings;
к своему коду, чтобы получить дополнительную информацию о том, почему он не работает:
Аргумент "" не является числовым в числовом уравнении (==) в ... строке ..., линия 1.
Один из подходов — проверить длину введенной строки. Также хорошей практикой является chop ввод, чтобы удалить любой символ новой строки.
use warnings;
use strict;
# input line
my $input_line = "";
# terminal input
print "Input:";
$input_line = <STDIN>;
chomp $input_line;
# input verification
print "Your input was: ", "$input_line";
print "\n";
# decider terminal input
if (length($input_line) == 0) {
print "You have typed nothing!";
print "\n";
}
Также полезно добавить use strict;
. В этом случае вам нужно объявить переменные с помощью my
.
Поскольку вы новичок в Perl, обратитесь к Базовому контрольному списку отладки
Спасибо. Хитрость: если переменная пуста, проверив ее длину, работает!
toolic уже дал правильный ответ, но я хотел дать несколько советов для начинающих.
Ваш код можно свести к следующему:
use strict;
use warnings; # always use these two pragmas
print "Input: ";
chomp (my $input_line = <>);
print "Your input was: '$input_line'\n";
if (length $input_line == 0) {
print "You have typed nothing!\n";
}
$input = ""
print "Input: "; # extra space to make it look nicer
chomp (my $input_line = <>); # chomp can be used directly on init and assignment
<STDIN>
мы можем использовать <>
, который при необходимости выбирает либо STDIN, либо файловый ввод.print "Your input was: '$input_line'\n";
\n
или новая кавычка для переменной.''
вокруг переменной показывает больше контекста, особенно с пробелом и пустой строкой.use feature 'say';
say "Your input was: $input"; # no \n needed
Очень хороший модуль для отладки — Data::Dumper. Это основной модуль, поэтому установка не требуется. Он покажет вам содержимое переменной
use Data::Dumper;
print Dumper $input_line;
# Will print: $VAR1 = '';
Хотя ниже приведено хорошее решение для обычных ответов:
if (length($input_line) == 0) {
print "You have typed nothing!\n";
}
Что, если кто-то ответит через пробел (не пустой) или вы забудете добавить chomp
? Например, вы можете быть более конкретным, используя регулярное выражение :
if ($input !~ /\S/) # no non-whitespace
if ($input !~ /^[abcd]+$/) # contains something other than what you need, e.g. abcd
if ($input =~ /[^abcd]/) # alternative phrasing
Несколько примеров для дополнительных исследований. Удачи!
Как говорит Икегами, можно ввести eof
только в программу (например, нажав Ctrl-D (unix) или Ctrl-Z (win) в командной строке), в результате чего readline вернет undef во входную переменную. В этом случае программа выдает несколько неопределенных предупреждений для различных операций. Чтобы решить эту проблему, вы можете изменить строку чтения ввода chomp (my $input....
на:
my $input_line = <>;
if (! defined $input_line) {
die "Input required.";
}
chomp $input_line;
Это немного сложнее, но предотвратит появление предупреждений в этом крайнем случае.
Вы рассмотрели ситуацию, когда предоставляется LF. С этим тоже следует разобраться. Но вы не обрабатываете пустой ввод. Ваша программа трижды предупреждает, если введены пустые данные.
@ikegami Я так понимаю, вы имеете в виду, если бы кто-то ввел Ctrl-D (окна Ctrl-Z), сделав входную переменную undef? Я полагаю, что это исключение, которое нужно обработать, но тогда мы можем выйти за рамки исходного вопроса. Можно справиться например с $input //= ''
.
Либо перенаправление из пустого файла и т.д.
==
преобразует оба операнда в число (т. е.0
для ввода Hello) и 0 == 0. Используйте толькоeq
(но все это объяснено в дубликате)