Perl Ternary声明正则表达式作为其结果之一

时间:2015-07-10 14:11:44

标签: regex perl ternary

我目前有以下代码:

my $class = $rs->{'CLS_ID'};
$class =~ s/^C\S{1,3}\s+// if ($transform);

这很好用,但我想知道这两个语句是否可以组合成一个三元表达式?

3 个答案:

答案 0 :(得分:3)

三元条件运算符允许您指定测试和两个值。

E.g。

my $value = somecondition ? value-if-true : value-if-false;

现在,您没有使用您的示例 - 您正在设置一个值,然后在条件为真时运行子例程(正则表达式)。

所以我建议你尽可能的,你颠覆了三元运算符的概念。你仍然可以在表达的两个方面进行任务。

例如:

my $class = ($transform) ? $rs->{'CLS_ID'} : $rs->{'CLS_ID'} =~ s/^C\S{1,3}\s+//r;

'r'标志告诉正则表达式“返回”修改后的值,而不修改原始值。但是我不会这样做,因为它使你做得不那么清楚。

请注意,regex的r修饰符适用于perl 5.14及更高版本。

答案 1 :(得分:2)

不是条件运算符,但我认为你正在寻找这个:

(my $class = 'initial-val') =~ s/something// if ($transform);

注意:这是官方未定义的行为,并且有非常奇怪的副作用。不过,我会把它留在这里作为不该做的一个例子。

可以实现的另一种方式(假设$transform01):

use strict;

my $rs = {'CLS_ID' => 'Cabc    and this should be left'};

# True value
my $transform = 1;
my $class = (($transform.$rs->{'CLS_ID'}) =~ s/^(1C\S{1,3}\s+)|0//r);
print $class . "\n";

# False value
my $transform = 0;
my $class = (($transform.$rs->{'CLS_ID'}) =~ s/^(1C\S{1,3}\s+)|0//r); 
print $class . "\n";

打印:

and this should be left
Cabc    and this should be left

但是...... 请不要这样做;)

答案 2 :(得分:2)

条件运算符,没有可变冗余,

my ($class) = map { $transform ? s/^C\S{1,3}\s+//r : $_ } $rs->{'CLS_ID'};

用于较旧的perl,/r

没有s///开关
$transform and s/^C\S{1,3}\s+// for my $class = $rs->{'CLS_ID'};