не в состоянии дать значение скаляру из командной строки в Perl - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь использовать следующий код Perl:

 use strict;
 use warnings;
 use Scalar::Util ("looks_like_number"); 
 my $color;
 if (undef $color)
 {
 my $color = $ARGV[0];
 }
 print "$0\n";
 print "$ARGV[0]\n";
 my @colors = ("blue", "yellow", "brown", "white");
 print "Please select a num:\n";
 foreach my $i (0..$#colors)
 {
 my $j = $i+1;
 print " $j $colors[$i]\n"; 
 }

 my $num = <STDIN>;
 chomp($num);
 if (looks_like_number($num) and defined $colors[$num-1])
 {
 $color = $colors[$num-1];
 }

 else
 {
 print "Bad Selection\n";
 }
 print "selected color is $color\n";       

Я хочу выбрать любое число для соответствующего выбора цвета, или я должен быть в состоянии предоставить значение цвета переменной $ color через командную строку,Я пытаюсь запустить его в Windows cmd, используя 'perl [C: /scriptname.pl] [color]', но аргумент не принимает, но когда я печатаю ARGV [0], он показывает, что аргумент передан правильно.так в чем же проблема с моим оператором if (undef ARGV [0]), который не выполняется.

Ответы [ 2 ]

0 голосов
/ 16 октября 2018
my $color;
if (undef $color)
{
my $color = $ARGV[0];
}

Это выглядит довольно странно.В строке 1 вы объявляете скалярную переменную с именем $color.В строке 2 вы вызываете undef() для этой переменной, которая заменяет содержимое $color на undef() (это не нужно, поскольку недавно объявленный скаляр Perl всегда будет содержать undef()).Это выражение вернет undef, что неверно, поэтому код в вашем блоке if никогда не выполняется.

В строке 4 вы объявляете новую переменную, также называемую $color, и задаете для нее значение$ARGV[0].Есть две проблемы с этим.Во-первых, эта строка никогда не будет выполнена по причинам, описанным в предыдущем абзаце.И, во-вторых, ваша новая переменная $color прекратит свое существование после того, как вы покинете блок, поэтому вы никогда не увидите эффекта этого изменения.

Я думаю, что главная проблема здесь в том, что вы запутали undef() с defined().undef() всегда будет давать переменной неопределенные значения, но я подозреваю, что вы хотели defined(), который говорит вам, содержит ли переменная определенное значение.

Что вы, вероятно, хотели:

my $color;

if (!defined $color) {
  $color = $ARGV[0];
}

Что можно записать как:

my $color //= $ARGV[0];

Но это все еще немного сбивает с толку, так как неясно, почему вы думаете, что $color может быть определен сразу после объявления.

0 голосов
/ 16 октября 2018

Вы объявляете переменную $color дважды:

 my $color;
 if (undef $color)
 {
     my $color = $ARGV[0];
 }

Вторая my $color создаст вторую привязку имени $color и значения, которое вы ей присвоите, и эта привязка не будетбыть видимым за пределами области видимости, заключенными в фигурные скобки.

Выражение

 if (undef $color)

не соответствует тому, что вы намеревались сделать. undef всегда будет устанавливать значение undef.Вместо этого вы хотите использовать определенный .

После применения этих двух изменений код может выглядеть следующим образом:

 my $color;
 if (! defined $color)
 {
     $color = $ARGV[0];
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...