2015-01-07 64 views
2

是否可以使用條件項目創建數組?使用條件項目生成列表

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 ..

+0

「想有」 和「不想排除「幾乎是一回事。 – TLP

+0

'my @a =(1,$ condition?2:「no-op」,3);'應該可以工作 –

+0

@TLP是的,但是在這裏它們並不意味着同樣的東西.. :) –

回答

6

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

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

謝謝,它完美的工作!...(我會離線幾個小時..我稍後接受..) –

+0

這就是我該怎麼做。但有些人使用列表重複運算符:'my @a =(1,(2)x !! $ condition,3);' – ysth

+0

@ysth是的,不幸的是它不會短得多,幾乎不像三元一樣的普通習慣用法嗎? :' –

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; 
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(".");