在 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"'
}

这成功了,要么我更改了我的查询,然后我得到了正确的顺序。