在perl中,无法从命令行为标量赋值

在perl中,无法从命令行为标量赋值,perl,Perl,我正在尝试以下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 se

我正在尝试以下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";       
使用严格;
使用警告;
使用Scalar::Util(“看起来像数字”);
我的颜色;
如果(未定义$color)
{
my$color=$ARGV[0];
}
打印“$0\n”;
打印“$ARGV[0]\n”;
我的@colors=(“蓝色”、“黄色”、“棕色”、“白色”);
打印“请选择一个数字:\n”;
foreach my$i(0..$#颜色)
{
my$j=$i+1;
打印“$j$颜色[$i]\n”;
}
我的$num=;
chomp($num);
if(看起来像数字($num)和定义的$colors[$num-1])
{
$color=$colors[$num-1];
}
其他的
{
打印“错误选择\n”;
}
打印“所选颜色为$color\n”;

我想为相应的颜色选择选择任何数字,或者我应该能够通过命令行提供color by$color变量的值,我尝试在windows cmd中使用“perl[C:/scriptname.pl][color]”运行它,但它不接受参数,但当我打印ARGV[0]时,它显示了正确传递的参数。那么,我的“if(undef ARGV[0])语句有什么问题,它没有被执行。

您两次声明变量
$color

 my $color;
 if (undef $color)
 {
     my $color = $ARGV[0];
 }
第二个
my$color
将创建名称
$color
和您分配给它的值的第二个绑定,并且该绑定将不在范围外可见,即封闭的花括号

表情

 if (undef $color)
不做你想做的事。将始终将值设置为
undef
。你想用它来代替

应用这两个更改后,代码可能如下所示:

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

您两次声明变量
$color

 my $color;
 if (undef $color)
 {
     my $color = $ARGV[0];
 }
第二个
my$color
将创建名称
$color
和您分配给它的值的第二个绑定,并且该绑定将不在范围外可见,即封闭的花括号

表情

 if (undef $color)
不做你想做的事。将始终将值设置为
undef
。你想用它来代替

应用这两个更改后,代码可能如下所示:

 my $color;
 if (! defined $color)
 {
     $color = $ARGV[0];
 }
这看起来很奇怪。在第1行中,您声明了一个称为
$color
的标量变量。在第2行中,调用该变量,该变量将
$color
的内容替换为
undef()
(这是不必要的,因为新声明的Perl标量将始终包含
undef()
)。此表达式将返回
undef
,该值为false,因此
if
块中的代码永远不会执行

在第4行中,声明一个新变量,也称为
$color
,并将其设置为
$ARGV[0]
。这有两个问题。首先,由于上一段解释的原因,这一行永远不会执行。其次,一旦离开块,新的
$color
变量将不再存在,因此您将永远看不到此更改的效果

我认为这里的主要问题是你混淆了
undef()
将始终为变量提供未定义的值,但我怀疑您需要
defined()
来告诉您变量是否包含已定义的值

你可能想要的是:

my $color;

if (!defined $color) {
  $color = $ARGV[0];
}
可写为:

my $color //= $ARGV[0];
但它仍然有点令人困惑,因为不清楚为什么您认为
$color
可以在声明后立即定义

这看起来很奇怪。在第1行中,您声明了一个称为
$color
的标量变量。在第2行中,调用该变量,该变量将
$color
的内容替换为
undef()
(这是不必要的,因为新声明的Perl标量将始终包含
undef()
)。此表达式将返回
undef
,该值为false,因此
if
块中的代码永远不会执行

在第4行中,声明一个新变量,也称为
$color
,并将其设置为
$ARGV[0]
。这有两个问题。首先,由于上一段解释的原因,这一行永远不会执行。其次,一旦离开块,新的
$color
变量将不再存在,因此您将永远看不到此更改的效果

我认为这里的主要问题是你混淆了
undef()
将始终为变量提供未定义的值,但我怀疑您需要
defined()
来告诉您变量是否包含已定义的值

你可能想要的是:

my $color;

if (!defined $color) {
  $color = $ARGV[0];
}
可写为:

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

但它仍然有点令人困惑,因为不清楚为什么您认为
$color
可以在声明后立即定义。

这是一个很好的答案,但是
如果
仍然是冗余的-
$color
没有初始化,所以它总是未定义的,所以代码可以简化为
my$color=$ARGV[0]
这是一个很好的答案,但是如果
仍然是冗余的-
$color
没有初始化,所以它总是未定义的,所以代码可以简化为
my$color=$ARGV[0]