【问题标题】:Generate list with conditional items生成带有条件项的列表
【发布时间】:2020-08-03 05:39:13
【问题描述】:

是否可以创建带有条件项的数组?

my @a = (1, ($condition) ? 2 : "no-op", 3);

这样"no-op" 是这样工作的函数,如果$condition 为假,那么我得到列表(1, 3),但如果$condition 为真,我得到(1, 2, 3)


背景:

use strict;
use warnings;
use File::Find::Rule;

my $rule = File::Find::Rule->new();
$rule->or(
    $rule->new->name('*.cfg')->prune->discard,
    $rule->directory->name("_private.d")->prune->discard,
    $rule->new->name('*.t')->prune->discard,
    $rule->new->name('*.bak')->prune->discard,
    $rule->new->name('.*.bak')->prune->discard,
    $rule->new->name('.#*')->prune->discard,
);

my @files = $rule->in(".");

在某些情况下,我想包含该行

$rule->directory->name("_private.d")->prune->discard

在其他情况下,我不想排除目录_private.d..

【问题讨论】:

  • “想包含”和“不想排除”几乎是一回事。
  • my @a = (1, $condition ? 2 : "no-op", 3); 应该可以工作
  • @TLP 是的,但在这里它们的意思不同.. :)
  • @ZachLeighton 我不确定你的意思......
  • @ZachLeighton:不,两者都在列表上下文中。运算符创建上下文,而不是括号。

标签: perl


【解决方案1】:

您可以使用空列表() 跳过第二个元素,

my @a = (1, ($condition ? 2 : ()), 3);

【讨论】:

  • 谢谢,它工作得很好!...(我将离线几个小时..我稍后接受..)
  • 我就是这样做的。但有些人使用列表重复运算符:my @a = ( 1, (2) x !!$condition, 3 );
  • @ysth 是的,不幸的是它并没有短很多,而且不像三元 ?:
  • @ysth,它还无条件评估2
  • 是的,如果可选元素花费大量时间并且经常被省略,那么效率可能会降低
【解决方案2】:

一般来说,您可以使用

获得一些可读性增益
my @a;
push @a, 1;
push @a, 2 if $condition;
push @a, 3;

在上下文中,那将是

my @rules;
push @rules, $rule->new->name('*.cfg')->prune->discard;
push @rules, $rule->directory->name("_private.d")->prune->discard if $condition;
push @rules, $rule->new->name('*.t')->prune->discard;
push @rules, $rule->new->name('*.bak')->prune->discard;
push @rules, $rule->new->name('.*.bak')->prune->discard;
push @rules, $rule->new->name('.#*')->prune->discard;

my $rule = File::Find::Rule->new()->or(@rules);
my @files = $rule->in(".");

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 2021-11-08
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    相关资源
    最近更新 更多