我正在尝试以下perl代码:
use strict;
use warnings;
use Scalar::Util ("looks_like_number");
my $color;
if (undef $color)
{
my $color = $ARGV[0];
}
print "$0n";
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 Selectionn";
}
print "selected color is $colorn";
我想为相应的颜色选择选择任何数字,或者我应该能够通过命令行通过变量$color提供颜色值,我正在尝试使用 ' perl [C:/scriptname.pl] [color] ' 在 windows cmd 中运行它,但它不接受参数,但是当我打印 ARGV[0] 时,它显示参数正在正确传递。 那么我的"如果(undef ARGV[0]("语句有什么问题它没有被执行。
您声明变量$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];
}
my $color;
if (undef $color)
{
my $color = $ARGV[0];
}
这看起来很奇怪。在第 1 行中,声明一个名为$color
的标量变量。在第 2 行中,你调用该变量的undef()
,该变量用undef()
替换$color
的内容(这是不必要的,因为新声明的 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
可以在宣布后立即定义。