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