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

  • 本文关键字:命令行 标量 赋值 Perl perl
  • 更新时间 :
  • 英文 :


我正在尝试以下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可以在宣布后立即定义。

最新更新