Есть ли способ установить переменные, равные друг другу внутри оператора if?

#perl

#perl

Вопрос:

Я работаю над домашним заданием, которое дает мне задание взять четыре введенных пользователем числа и сравнить их, чтобы вывести наибольшее и наименьшее. Я не могу использовать циклы, поэтому я использую операторы if / else / elsif, но я продолжаю получать ошибку. Я получил это до сих пор, и я не уверен, что я делаю неправильно.

[Shebang]

 my $small;
my $big;

print "nEnter first number: ";
chomp (my $one = <>);

print "nEnter second number: ";
chomp (my $two = <>);

print "nEnter third number: ";
chomp (my $three = <>);

print "nEnter fourth number: ";
chomp (my $four = <>);

if ($one >= $two) {
    $one = $big;
    $two = $small;
}
else {
    $one = $small;
    $two = $big;
}

if ($three >= $big) {
    $three = $big;
}
elsif ($three <= $small) {
    $three = $small;
}

if ($four >= $big) {
    $four = $big;
}
elsif ($four <= $small) {
    $four = $small;
}

print "LRG: $bign";
print "SML: $smalln";
  

В идеале, вы вводите четыре числа, и выводится наибольшее и наименьшее. Вместо этого я получаю
«Использование неинициализированного значения $big в числовом формате ge (>=) в [filename].pl строка 29, <> строка 4.» в строке 29 и 36.
Я также получаю
«Использование инициализированного значения $small в конкатенации (.) или строка строка 44, <> строка 4».

Комментарии:

1. Все ваши назначения выполняются в обратном порядке. например, вы говорите, $one = $big что вы имеете в виду $big = $one

2. Это сработало! Спасибо! Думаю, я не знал, что это должен быть конкретный способ определения переменных, подобных этому.

Ответ №1:

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

 $one = $big;
  

Вы присваиваете значение $big переменной $one . Как уже указывалось в комментарии, это неправильный способ, и вы действительно хотели:

 $big = $one;
  

Есть пара более простых подходов, которые вы можете использовать. Во-первых, вы могли бы отсортировать список чисел, а затем взять первый и последний элементы из списка:

 my @sorted = sort { $a <=> $b } ($one, $two, $three, $four);
my ($small, $big) = @sorted[0, $#sorted];
  

Или вы можете использовать функции min() и max() из списка модулей::Util.

 use List::Util qw[min max];

my $small = min($one, $two, $three, $four);
my $big   = max($one, $two, $three, $four);
  

Комментарии:

1. List::MoreUtils minmax работает быстрее, если вам нужны как минимальные, так и максимальные значения

2. @ikegami: Да, но я предпочитаю использовать базовые модули при написании ответов для очевидных новичков.