Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.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 多if-else语句_Perl - Fatal编程技术网

Perl 多if-else语句

Perl 多if-else语句,perl,Perl,我的if-else语句有问题。即使我使用的$key与我的if语句中的文本匹配,底部的else语句也会被计算,因此我会为每个$key获取多个值,这是一个问题。我做错了什么 my $key = $line[0]; if ($key eq 'this_setting') { my $counter1 = $counter + 1; my $counter2 = $counter + 2; $value = join(' ', @line[$counter1..$counter2

我的if-else语句有问题。即使我使用的
$key
与我的
if
语句中的文本匹配,底部的
else
语句也会被计算,因此我会为每个
$key
获取多个值,这是一个问题。我做错了什么

my $key = $line[0];
if ($key eq 'this_setting') {
    my $counter1 = $counter + 1;
    my $counter2 = $counter + 2;
    $value = join(' ', @line[$counter1..$counter2]);                        
    $my_setting_hash{$key} = $value;
}
if ($key eq 'some_setting_abc') {
    my $counter1 = $counter + 1;
    my $counter2 = $counter + 2;
    $value = join(' ', @line[$counter1..$counter2]);
    $my_setting_hash{$key} = $value;
}
if ($key eq 'another_setting_123') {
    my $counter1 = $counter + 1;
    my $counter3 = $counter + 3;
    $value = join(' ', @line[$counter1..$counter3]);
    $my_setting_hash{$key} = $value;
}       
else {
    my $counter1 = $counter + 1;
    $value = $line[$counter1];
    $my_setting_hash{$key} = $value;
}

如果计算了我的一条
if
语句,为什么不绕过该
else
语句?

您需要将它们链接在一起:


否则,前两个
if
语句独立于第三个
if
/
else
语句。

假设
$key
的值是
'some\u setting\u abc'
。第一个
if
不适用,但第二个
if
适用。第三个
if
也不适用,但该函数有一个
else
因此被执行。同样,您需要一个带有链式
elsif
s的
if
和一个最终的
else

但是,我想指出,您的代码中存在大量重复。如果您编写的代码更简洁一些,生活就会更简单:

my $key = $line[0];
my $index = $counter + 1;

if (($key eq 'this_setting') or ($key eq 'some_setting_abc')) {
    $my_setting_hash{$key} = join ' ', @line[$index .. ($index + 1)];
}
elsif ($key eq 'another_setting_123') {
    $my_setting_hash{$key} = join ' ', @line[$index .. ($index + 2)];
}       
else {
    $my_setting_hash{$key} = $line[$index];
}

正如已经指出的,您需要关键字

但是,另一种解决方案是将每个键的特殊规则放入哈希中,以便共享代码:

my %key_length = (
    this_setting        => 1,
    some_setting_abc    => 1,
    another_setting_123 => 2,
);

my $key = $line[0];

my $index_low = $counter + 1;
my $index_high = $index_low + ($key_length{$key} // 0);

$my_setting_hash{$key} = join ' ', @line[ $index_low .. $index_high ];

我想你是说elsif,ElliottFrisch-是的,刚刚纠正了这个问题。实际上我是对的,然后我的大脑打嗝了,我把它“纠正”到
elseif
。现在又回来了,谢谢!非常有帮助和简洁。
my %key_length = (
    this_setting        => 1,
    some_setting_abc    => 1,
    another_setting_123 => 2,
);

my $key = $line[0];

my $index_low = $counter + 1;
my $index_high = $index_low + ($key_length{$key} // 0);

$my_setting_hash{$key} = join ' ', @line[ $index_low .. $index_high ];