在 Perl 中,我可以用三元条件运算符设置无限条件吗?
In Perl, can I put unlimited conditions with the ternary conditional operator?
我对一段代码有些困惑。这是关于perl中的三元运算符。我不知道如何为其设置更多条件。字里行间,我不是很理解这个表达。
my $class = $user_name ? '' : (grep { $_ eq $task_id } @tasks_todo) ? 'class="todo" : 'class="crossed"';
我想用我的新变量添加另一个条件,它应该是这样的:
$required ? '' : 'class="todo"' : 'class="crossed"'
$required
是 Mojo:Collection 类型,表示查询获取的集合类型数据。
谁能给我解释一下下面的条件,并告诉我是否可以在三元运算符上加上另一个条件?允许多少个条件以及使用三元运算符的最佳做法是什么?
如果设置了 $username,则 $class-变量设置为空,
否则,如果 $task_id 在 @task_todos 中 $class 设置为 'class="todo"' 如果两者都不成立, $class 设置为 'class="crossed"'。
您可以使用三元运算符在表达式中添加任意数量的条件,但您应该考虑至少添加一些空格以使其更具可读性,尽管将其放在 if/then/else 中会更好。
my $class = $user_name
? ''
: (grep { $_ eq $task_id } @tasks_todo)
? 'class="todo"'
: 'class="crossed"';
当您 运行 进入像这样的复杂逻辑时,您不会丢失任何东西,只需将其拆开一点并将其放入您可以单独测试的专用方法中。通过仅 returning class 名称而不是填充的 class="todo"
属性值,您可以更轻松地使用 return 值,即使这意味着它现在成为调用者的责任写 push @classes, css_class(...)
后跟 sprintf '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
我通过在前面给出的例子之后添加一个新条件解决了我的问题。
use List::Util qw/any/;
my $class = "";
unless ($user_name) {
if (any { $_ eq $task_id } @tasks_todo) {
$class = 'class="todo"';
}
else
{
$class = 'class="crossed"';
}
if ($required ne $month) {
$class = 'class="crossed"'
}
这成功了,要么我更改了我的查询,然后我得到了正确的顺序。
我对一段代码有些困惑。这是关于perl中的三元运算符。我不知道如何为其设置更多条件。字里行间,我不是很理解这个表达。
my $class = $user_name ? '' : (grep { $_ eq $task_id } @tasks_todo) ? 'class="todo" : 'class="crossed"';
我想用我的新变量添加另一个条件,它应该是这样的:
$required ? '' : 'class="todo"' : 'class="crossed"'
$required
是 Mojo:Collection 类型,表示查询获取的集合类型数据。
谁能给我解释一下下面的条件,并告诉我是否可以在三元运算符上加上另一个条件?允许多少个条件以及使用三元运算符的最佳做法是什么?
如果设置了 $username,则 $class-变量设置为空, 否则,如果 $task_id 在 @task_todos 中 $class 设置为 'class="todo"' 如果两者都不成立, $class 设置为 'class="crossed"'。
您可以使用三元运算符在表达式中添加任意数量的条件,但您应该考虑至少添加一些空格以使其更具可读性,尽管将其放在 if/then/else 中会更好。
my $class = $user_name
? ''
: (grep { $_ eq $task_id } @tasks_todo)
? 'class="todo"'
: 'class="crossed"';
当您 运行 进入像这样的复杂逻辑时,您不会丢失任何东西,只需将其拆开一点并将其放入您可以单独测试的专用方法中。通过仅 returning class 名称而不是填充的 class="todo"
属性值,您可以更轻松地使用 return 值,即使这意味着它现在成为调用者的责任写 push @classes, css_class(...)
后跟 sprintf '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
我通过在前面给出的例子之后添加一个新条件解决了我的问题。
use List::Util qw/any/;
my $class = "";
unless ($user_name) {
if (any { $_ eq $task_id } @tasks_todo) {
$class = 'class="todo"';
}
else
{
$class = 'class="crossed"';
}
if ($required ne $month) {
$class = 'class="crossed"'
}
这成功了,要么我更改了我的查询,然后我得到了正确的顺序。