Perl 多if-else语句
我的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
$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 ];