使用三元运算符分配?

时间:2012-01-19 20:45:43

标签: perl variables ternary-operator

我在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 = '';

但这也不起作用。

有谁知道如何更有效地分配这个? 珍妮

7 个答案:

答案 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' : '';