undef变量来自" if"条件

时间:2017-03-13 11:44:15

标签: perl

我在Perl中遇到了问题。我希望有人可以帮助我。

my $bCommType = 'none';

my %commTypes = (
    'none'              => '0',
    'public'            => '1',
    'custom_percentage' => '2',
    'custom_permeg'     => '2',
    'custom_flat'       => '2',
);

my %rateTypes = (
    'custom_percentage' => '%',
    'custom_permeg'     => '$',
    'custom_flat'       => 'FLAT',
    'none'              => 'none',
);

my $commrate = $rateTypes{$bCommType} if ( $commTypes{$bCommType} == 2 );

$commrate的输出是undef,有人可以帮我识别问题吗?

3 个答案:

答案 0 :(得分:2)

您正在使用条件声明。这已被弃用了。 Perl可能会给你一个警告(你正在使用use warnings,对吧?)。

将声明移动到自己的行中,提供默认值,并使用新行中的条件进行赋值。

my $commrate = 'default'; # it's not clear which %commTypes is the default
$commrate = $rateTypes{$bCommType} if ($commTypes{$bCommType} == 2);

您需要提供默认值或起始值,因为Perl中的新变量始终以undef开头。

答案 1 :(得分:2)

如果$commrate的值为2,则将$rateTypes{$bCommType}设置为$commTypes{$bCommType}$bCommTypenone$commTypes{none}为零,所以分配不会发生,$commrate未定义

这是你问题的根源,但除此之外,你不应该有条件地声明变量。如果你尝试,它会做各种奇怪和未定义的事情。正如 simbabque 所说的那样,你需要单独声明变量并使得assigmnent有条件,但在这种情况下结果将是相同的,因为我上面描述的原因

答案 2 :(得分:0)

这是使用条件声明的更好方法。无论您是使用Perl,JavaScript,Java还是PHP,此方法都将起作用。在我宣布条件的地方,问号前面的陈述是条件。问号后面的值是当条件评估为真时将分配给变量的值。如果语句的计算结果为false,则列之后的值是将分配给变量的值。

use strict;
my $bCommType = 'none';

my %commTypes = (
    'none'              => '0',
    'public'            => '1',
    'custom_percentage' => '2',
    'custom_permeg'     => '2',
    'custom_flat'       => '2',
);

my %rateTypes = (
     'custom_percentage' => '%',
     'custom_permeg'     => '$',
     'custom_flat'       => 'FLAT',
     'none'              => 'none',
);

my $commrate = $commTypes{$bCommType} == 2? $rateTypes{$bCommType} : "false value";

print $commrate;