Невозможно вызвать вторую подпрограмму "func2" - PullRequest
0 голосов
/ 08 мая 2018

Кодирование

print "fruit list\n";
print "1.\tApple\n";
print "2.\tOrange\n";
print "3.\tPic\n";
print "3.\tBanana\n";
print "Based on fruit list above, please key in your favorite fruit name.\n";

%fruit_list = (
    1 => 'Apple',
    2 => 'Orange',
    3 => 'Pic',
    4 => 'Banana'
);

$fruit = $fruits[<STDIN>];

if ( $fruit == $fruit_list{'1'} ) {
    func1();
}
elsif ( $fruit == $fruit_list{'2'} ) {
    func2();
}

sub func1 {
    print "executing function 1\n";
}

sub func2 {
    print "executing function 2\n";
}

Выход (ввод 1):

fruit list
1.      Apple
2.      Orange
3.      Pic
4.      Banana
Based on fruit list above, please key in your favorite fruit name.
1
executing function 1

Выход (ввод 2):

fruit list
1.      Apple
2.      Orange
3.      Pic
4.      Banana
Based on fruit list above, please key in your favorite fruit name.
2
executing function 1

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

Массива @fruits нет, поэтому $fruit = $fruits[<STDIN>] не имеет смысла. $fruit будет установлено на undef, что оценивается как ноль в числовом контексте

Между тем, $fruit_list{'1'} равно Apple, что также оценивается как ноль в числовом контексте

Оператор == сравнивает числа , поэтому if ($fruit == $fruit_list{'1'}) сравнивает ноль с нулем и всегда находит совпадение

Вы должны были видеть предупреждающие сообщения при запуске вашей программы. Вы должны никогда игнорировать такие сообщения, поскольку они существуют, чтобы помочь вам

Вы должны добавить use strict и use warnings 'all' в начало каждой написанной вами Perl-программы и исправить все полученные сообщения, прежде чем просить других о помощи

Вы также должны правильно выложить свой код, включая отступы, чтобы другие люди (и вы сами) могли его легко прочитать. Я отредактировал код в вашем вопросе: пожалуйста, сделайте это самостоятельно в будущем, по крайней мере, прежде чем просить других людей о помощи с вашим кодом

0 голосов
/ 14 мая 2018

Спасибо за ввод сравнения строк и объявление массива. Я использовал входные данные, чтобы изменить мой код, как указано ниже, и он работает, как и ожидалось.

print "fruit list\n";
print "1.\tApple\n";
print "2.\tOrange\n";
print "3.\tPic\n";
print "3.\tBanana\n";
print "Based on fruit list above, please key in your favorite fruit name.\n";
my %fruit_list = (
    1 => 'Apple',
    2 => 'Orange',
    3 => 'Pic',
    4 => 'Banana'
    );
@values = values(%fruit_list);
my $fruit = $values [<STDIN>];
if ($fruit eq $values[1]){
func1();
}
elsif ($fruit eq $values[2]){
func2();
}

sub func1 {
print "executing function 1\n";
}

sub func2 {
print "executing function 2\n";
}

Выход (ввод 2)

fruit list
1.      Apple
2.      Orange
3.      Pic
4.      Banana
Based on fruit list above, please key in your favorite fruit name.
2
executing function 2
0 голосов
/ 08 мая 2018

Похоже, что вы сравниваете строки, используя оператор == здесь: if ($fruit == $fruit_list{'1'}){ и здесь: elsif ($fruit == $fruit_list{'2'}){.

В Perl == является оператором числового сравнения, для сравнения строк используется оператор eq (т.е. if ($fruit eq $fruit_list{'1'}){).

...