Почему у вас есть 3 elsif
с, где подойдет простой else
?
Я имею в виду, что они проверяют только на полную противоположность тому, на что тестировался соответствующий if
.
if ($host eq '') {
...
} elsif ($host ne '') {
...
}
if ($config{$_}{host} ne $host) {
...
} elsif ($config{$_}{host} eq $host) {
...
}
if ($ping_obj->ping($host)) {
...
} elsif (! $ping_obj->ping($host)) {
...
}
Я бы использовал обычный цикл while
вместо цикла do{...}while(...)
.
do{
RESTART:
if(...){
goto RESTART;
}
}while(...);
против
while(...){
if(...){
redo;
}
}
В этом цикле вы используете только ключи %config
, чтобы найти соответствующее значение, поэтому почему бы вам не использовать values %config
.
foreach (keys %config) {
if ($config{$_}{host} ne $host) {
last;
} elsif ($config{$_}{host} eq $host) {
warn "Configuration for $host already exists!\n";
}
}
против
for( values %config ){
if( $_->{host} ne $host ){
...
} else {
...
}
}
Если вы используете 5.10.0 или более позднюю версию, вы можете вместо этого использовать интеллектуальное совпадение (~~
) , что сделает более понятным то, что вы тестируете.
my @hosts = map{ $_->{host} } values %config;
if( $host ~~ @hosts ){
...
}