Perl三元条件运算符

Mos*_*ose 4 perl conditional-operator operator-precedence

我正在尝试在脚本中编写更高效的代码,并且有时会实现三元条件运算符.在循环中使用三元条件运算符时,我无法理解为什么会得到额外的结果:

#!/usr/bin/perl

use strict;
use warnings;

my @array = ('Serial = "123"', 'Serial = "456"', 'Serial = "789"');
my ($test1,$test2);
foreach my $a (@array){
        !$test1 ? $test1 = $a  : $test1 .= " AND " . $a;
}
foreach my $b (@array){
        if (!$test2) {
                $test2 = $b
        } else {
                $test2 .= " AND " . $b;
        }
}
print "Test1: $test1\n";
print "Test2: $test2\n";
Run Code Online (Sandbox Code Playgroud)

输出:

~/bin/test.pl
Test1: Serial = "123" AND Serial = "123" AND Serial = "456" AND Serial = "789"
Test2: Serial = "123" AND Serial = "456" AND Serial = "789"
Run Code Online (Sandbox Code Playgroud)

Test1输出有一个额外的"Serial ="123",我做错了什么?

ike*_*ami 10

首先,您有一个优先问题.

!$test1 ? $test1 = $a : $test1 .= " AND " . $a;
Run Code Online (Sandbox Code Playgroud)

手段

( !$test1 ? $test1 = $a : $test1 ) .= " AND " . $a;
Run Code Online (Sandbox Code Playgroud)

它可以用parens来解决.

my $test1;
for (@array) {
   !$test1 ? ($test1 = $a) : ($test1 .= " AND " . $a);
}
Run Code Online (Sandbox Code Playgroud)

但这不可读.你显然走错了方向!正在执行两项任务,您正试图将它们合二为一.简单地将它们分开使代码更具可读性.

my $test1;
for (@array) {
   $test1 .= ' AND ' if $test1;
   $test1 .= $_;
}
Run Code Online (Sandbox Code Playgroud)

但我们还没有.让我来介绍一下join.

my $test1 = join(' AND ', @array);
Run Code Online (Sandbox Code Playgroud)

好多了!

最后,确实看起来你正在构建一个SQL语句.如果是这样,你的问题没有实际意义,因为你应该使用地方转移数据到数据库.在DBI文档中搜索该单词.


Chr*_*Wue 7

作业的优先级低于?.这个

!$test1 ? $test1 = $a  : $test1 .= " AND " . $a;
Run Code Online (Sandbox Code Playgroud)

相当于:

(!$test1 ? $test1 = $a  : $test1) .= " AND " . $a;
Run Code Online (Sandbox Code Playgroud)

所以首先$test1会变成Serial = "123"然后AND Serial = "123"立即追加.

试试这个:

!$test1 ? ($test1 = $a)  : ($test1 .= " AND " . $a);
Run Code Online (Sandbox Code Playgroud)

更好的解决方案是:

$test1 = !$test1 ? $a  : $test1 . " AND " . $a;
Run Code Online (Sandbox Code Playgroud)

使用三元运算符进行副作用会变得非常混乱,我建议避免它.

编辑

正如MuIsTooShort join(' AND ', array)所述,在您的情况下,它将是最简洁和可读的解决方案.