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文档中搜索该单词.
作业的优先级低于?.这个
!$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)所述,在您的情况下,它将是最简洁和可读的解决方案.