Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl “未定义”中的变量;如果;条件_Perl - Fatal编程技术网

Perl “未定义”中的变量;如果;条件

Perl “未定义”中的变量;如果;条件,perl,Perl,我在Perl中遇到了一个问题。我希望有人能帮助我 my $bCommType = 'none'; my %commTypes = ( 'none' => '0', 'public' => '1', 'custom_percentage' => '2', 'custom_permeg' => '2', 'custom_flat' => '2', ); my

我在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
中的输出是
unde
,有人能帮我确定问题吗?

您使用的是条件声明。这是不赞成的。Perl可能会给您一个警告(您正在使用
使用警告,对吗?)

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

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

您需要提供一个默认值或起始值,因为Perl中的新变量总是以
undef

开头,因为您使用的是条件声明。这是不赞成的。Perl可能会给您一个警告(您正在使用
使用警告,对吗?)

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

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

您需要提供默认值或起始值,因为Perl中的新变量总是以
undef

开头,如果
$commTypes{$bCommType}
的值为2,则将
$commrate
设置为
$rateTypes{$bCommType}
。但是
$bCommType
none
$commTypes{none}
为零,因此不会发生赋值,并且
$commrate
未定义


这是问题的根源,但除此之外,不应该有条件地声明变量。如果你尝试的话,它会做各种奇怪的和未定义的事情。正如simbabque所说,您需要单独声明变量并使assigment成为有条件的,但是在这种情况下,如果
$commTypes{$bCommType}
的值为2,则结果将与我上面描述的原因相同
您将
$commrate
设置为
$rateTypes{$bCommType}
。但是
$bCommType
none
$commTypes{none}
为零,因此不会发生赋值,并且
$commrate
未定义


这是问题的根源,但除此之外,不应该有条件地声明变量。如果你尝试的话,它会做各种奇怪的和未定义的事情。正如simbabque所说,您需要单独声明变量并使assigment成为有条件的,但是在这种情况下,结果将是相同的,因为我在上面描述了这是使用有条件声明的更好方法。无论您使用的是Perl、JavaScript、Java还是PHP,此方法都可以使用。在我声明条件的地方,问号前的陈述就是条件。问号后面的值是当条件计算为true时将分配给变量的值。如果语句的计算结果为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;

这是使用条件声明的更好方法。无论您使用的是Perl、JavaScript、Java还是PHP,此方法都可以使用。在我声明条件的地方,问号前的陈述就是条件。问号后面的值是当条件计算为true时将分配给变量的值。如果语句的计算结果为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;

你的问题是什么?你忘了问一个。您希望我们识别什么?my$commrate=$rateTypes{$bCommType}如果($commTypes{$bCommType}==2);我的变量中有一个未定义的值。:)你还没有问过一个问题。你只是在陈述事实,你的问题是什么?你忘了问一个。您希望我们识别什么?my$commrate=$rateTypes{$bCommType}如果($commTypes{$bCommType}==2);我的变量中有一个未定义的值。:)你还没有问过一个问题。你只是在陈述事实。谢谢,我会试试的。那么,我如何将条件输出传递给commrate变量?@jonnegrite对不起,我忘了赋值。更新。重要的部分是:1)在有条件地分配某个变量之前,需要声明该变量;2)需要分配某个变量,这样它就不会以
undef
.my%commTypes开头=('none'=>'0'、'public'=>'1'、'custom_permeg'=>'2'、'custom_flat'=>'2',)这是commType@JonjonNegrite这是一个不同类型的列表。哪一个是默认类型?我认为您真正想要做的是
$commrate=$rateType{$rateTypes{$bCommType};
。将
$commrate
设置为
$bCommType
中类型号后面的速率。顺便说一句,您的变量名不是很好。在Perl中,我们通常不使用驼峰大小写。请尝试为您的变量选择非常详细的名称,以便很容易理解它们的作用。谢谢,我将尝试一下。然后,如何传递条件输出ut到commrate变量?@jonnegrite抱歉,我忘记了赋值。已更新。重要的部分是1)在有条件地赋值之前需要声明变量,2)需要赋值,这样它就不会以
undef
开头。my%commTypes=('none'=>'0'、'public'=>'1'、'custom_permeg'=>'2'、'custom_flat'=>'2',)这是commType@JonjonNegrite这是一个不同类型的列表。哪一个是默认类型?我认为您真正想要做的是
$commrate=$rateType{$rateTypes{$bCommType};
。将
$commrate
设置为
$bCommType
中类型号后面的速率。顺便说一句,您的变量名不是很好。在Perl中通常不使用驼峰大小写。尝试为您的变量选择非常详细的名称,以便很容易理解它们的作用。