我目前有以下代码:
my $class = $rs->{'CLS_ID'};
$class =~ s/^C\S{1,3}\s+// if ($transform);
这很好用,但我想知道这两个语句是否可以组合成一个三元表达式?
答案 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);
注意:这是官方未定义的行为,并且有非常奇怪的副作用。不过,我会把它留在这里作为不该做的一个例子。
可以实现的另一种方式(假设$transform
为0
或1
):
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'};