我對一段代碼有些掙扎。這是關于 perl 中的三元運算子。我不知道如何設定更多條件。從字面上看,我真的不明白這個表達。
my $class = $user_name ? '' : (grep { $_ eq $task_id } @tasks_todo) ? ' : 'class="crossed"';
我想為我的新變數添加另一個條件,它應該是:
$required ? '' : '' : ''
$required 是 Mojo:Collection 型別,表示由查詢獲取的集合型別資料。
有人可以向我解釋下面的條件并告訴我是否可以在三元運算子上添加另一個條件嗎?允許有多少條件以及使用 ternery 運算子的最佳實踐是什么?
uj5u.com熱心網友回復:
寫那句話的人太聰明了。
當您遇到這樣復雜的邏輯時,將其拆開并放入可以單獨測驗的專用方法中,您不會丟失任何東西。通過僅回傳類名而不是填充的屬性值,您可以更輕松地使用回傳值,即使這意味著現在呼叫者有責任寫push @classes, css_class(...)后跟 asprintf 'class=%s', join(' ', @classes);或類似內容。
#!/usr/bin/env perl
use strict;
use warnings;
use List::Util qw( any );
use Test::More;
sub css_class {
my ($user_name, $task_id, $tasks_todo) = @_;
return '' unless $user_name;
if (any { $task_id eq $_ } $tasks_todo->@*) {
return 'todo';
}
return 'crossed';
}
my @cases = (
{
args => [undef, 'blah', []],
expected => '',
},
{
args => ['bob', 'notdone', ['notdone']],
expected => 'todo',
},
{
args => ['bob', 'done', ['notdone']],
expected => 'crossed',
},
);
for my $case (@cases) {
is css_class($case->{args}->@*), $case->{expected};
}
done_testing;
輸出:
$ prove -v pp.pl
pp.pl ..
ok 1
ok 2
ok 3
1..3
ok
All tests successful.
Files=1, Tests=3, 0 wallclock secs ( 0.08 usr 0.03 sys = 0.11 CPU)
Result: PASS
uj5u.com熱心網友回復:
如果設定了 $username,則 $class-Variable 設定為空,否則,如果 $task_id 在 @task_todos 中,則 $class 設定為 '',如果兩者都不為真,則 $class 設定為''。
您可以使用三元運算子在運算式中添加任意數量的條件,但您應該考慮至少添加一些空格以使其更具可讀性,盡管將其放在 if/then/else 中會更好。
my $class = $user_name
? ''
: (grep { $_ eq $task_id } @tasks_todo)
? '
: 'class="crossed"';
uj5u.com熱心網友回復:
我通過在前面給出的示例之后添加一個新條件來解決我的問題。
use List::Util qw/any/;
my $class = "";
unless ($user_name) {
if (any { $_ eq $task_id } @tasks_todo) {
$class = '';
}
else
{
$class = '';
}
if ($required ne $month) {
$class = ''
}
這做到了,要么我改變了我的查詢,這樣我就能得到正確的東西。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/366776.html
標籤:perl
