отобразить много строк в одну строку в Perl - PullRequest
1 голос
/ 13 сентября 2011

Я хочу сделать что-то вроде

$val = "value1"
my %test = ("value1" => "yes", "value2" => "yes", "value3" => "yes");
print  $test{$val};

Так что, если либо $ val равно значению1, либо значению2, либо значению3, тогда отображается «да», в противном случае отображается «нет»

Не уверенесли я делаю это правильным / эффективным способом.Я новичок в Perl

Ответы [ 4 ]

3 голосов
/ 13 сентября 2011

Вы должны проверить, существует ли значение с таким ключом в хэше:

print exists $tests{$val} ? $tests{$val} : "no";

В общем, после проверки его существования, вы должны проверить его определенность через defined, нов вашем конкретном случае это не является необходимым, поскольку хэш %test кажется постоянным и состоит только из констант, которые не включают undef.

2 голосов
/ 13 сентября 2011
if (defined $test{$val}) {
    print "$test{$val}\n";  # or you might use: print "yes\n"; depending on what you're doing
}
else {
    print "no\n";
}
1 голос
/ 13 сентября 2011

Является ли хеш наилучшей возможной структурой данных здесь, когда есть только два варианта?Вот три возможных альтернативных подпрограммы, которые будут в равной степени удовлетворять требованию:

sub test_ternary {
    $_[0] eq 'value1' ? 'yes' :
    $_[0] eq 'value2' ? 'yes' :
    $_[0] eq 'value3' ? 'yes' : 'no'  ;
}

sub test_regex { $_[0] =~ /value[123]/ ? 'yes' : 'no' }

use feature 'switch';
sub test_switch {
    given ( $_[0] ) {

        return 'yes' when /value[123]/;

        default { return 'no'; }
    }
}
0 голосов
/ 13 сентября 2011

Здесь довольно сложные ответы.

Если допустимые значения в вашем хэше не могут быть нулевой или пустой строкой (или любым другим значением, которое оценивается как "false" в perl), вы можете сделать:

say $test{$val} ? $test{$val} : "no";

Это выражение будет "ложным", если $test{$val} либо не существует, либо не определено, либо пусто, либо равно нулю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...