我在Perl 5.8上,我需要指定一个默认值。我最终这样做了:
if ($model->test) {
$review = "1"
} else {
$review = ''
}
$model->test
的值将是"1"
或未定义。如果$model->test
中存在某些内容,请将$review
设置为"1"
,否则将其设置为''
。
因为它不是Perl 5.10我不能使用新的时髦的定义或运算符。我的第一反应就是使用这样的三元运算符......
defined($model->test) ? $review = "1" : $review = '';
但这也不起作用。
有谁知道如何更有效地分配这个? 珍妮
答案 0 :(得分:36)
我通常把它写成:
$review = ( defined($model->test) ? 1 : '' );
其中括号是为了清楚其他人阅读代码。
答案 1 :(得分:20)
您有优先权问题。你拥有的与
相同( defined($model->test) ? $review="1" : $review ) = '';
你可以让它与parens一起使用。
my $review; $model->test ? ( $review='1' ) : ( $review='' );
但是将作业移出去会更加清晰。
my $review = $model->test ? '1' : '';
当然,你可以简单地使用
my $review = $model->test || '';
但为什么要将undef更改为空字符串?
my $review = $model->test;
答案 2 :(得分:10)
$model->test
将是"1"
或未定义。如果$model->test
中存在某些内容,请将$review
设置为"1"
,否则设置为''
然后就这样使用:
$review = $model->test || "";
答案 3 :(得分:7)
除了条件运算符之外,我经常喜欢使用do
,它返回上一个计算表达式的值:
my $review = do {
if( ... ) { 'foo' }
elsif( ... ) { 'bar' }
elsif( ... ) { 'baz' }
else { 'defaut' }
};
答案 4 :(得分:2)
首先,“那也不起作用”并不是你能告诉我们的最有用的事情。重要的是要确切地知道 它不起作用:它做了什么,你期望什么,以及它们如何不同?
但问题是
defined($model->test) ? $review="1" : $review='';
是运算符优先级。条件运算符? :
比赋值运算符=
绑定得更紧密,因此上述内容相当于:
(defined($model->test) ? $review="1" : $review) = '';
因此,如果定义了$model->test
,它就相当于
$review = "1" = '';
您可以使用括号解决该问题:
defined($model->test) ? ($review="1") : ($review='');
但实际上,你为什么要这样做?当您想要使用结果时,条件(三元)运算符很有用。如果结果将被丢弃,就像在这里一样,使用if / else语句会更清楚(并且,正如您所见,更不容易出错):
if (defined($model->test) {
$review = "1";
}
else {
$review = "";
}
或者,如果你坚持将其写在一行:
if (defined($model->test) { $review = "1"; } else { $review = ""; }
如果你真的想使用条件表达式,你可以这样做:
$review = defined($model->test) ? "1" : "";
这可能是一种合理的方式。
但
defined
运算符本身会产生"1"
(true)或""
(false)。所以整件事可以简化为:
$review = defined($model->test);
答案 5 :(得分:2)
我认为$model->test
应该返回true或false值。
除非明确指出假值为undef
,否则可以重写该方法以开始返回其他一些假值。
哪个会破坏只检查值是否定义的任何东西
(我认为该方法返回undef
而不是规范的假值是一个错误。)
因此设置$review
的最佳方法是测试返回值的真实性;不是它的定义。
my $review = $model->test ? 1 : '';
我想指出这仍有一个错误。 如果您希望能够将该值用作数字,则会在出现错误时发出警告。
要解决此问题,您应该返回!1
(规范假值),它将返回一个字符串''
,但数值为0.
my $review = $model->test ? 1 : !1;
请注意,它可以简化为:
my $review = !! $model->test; # invert it twice
如果您只想在值为false时更改值,则可以使用或运算符||
。
my $review = $model->test || !1;
如果你真的只想知道它是否被定义,或者你不知道为什么不使用defined
。
my $review = defined $model->test;
如果您只想在未定义时更改值,并且您有Perl 5.10或更新版本,则可以使用defined-or operator (//
)。
my $review = $model->test // !1;
在较旧的Perl上,这需要多个statement。
my $review = $model->test;
$review = !1 unless defined $review;
答案 6 :(得分:1)
my $result = defined $model->test ? '1' : '';