Regex 如何使用条件运算符在perl映射操作中放置正则表达式
嗨,我尝试使用映射操作和带正则表达式的条件运算符来缩短循环构造,但没有得到正确的结果。我认为失败的原因是assigment和regexp操作符之间的差异(Regex 如何使用条件运算符在perl映射操作中放置正则表达式,regex,perl,mapping,ternary-operator,Regex,Perl,Mapping,Ternary Operator,嗨,我尝试使用映射操作和带正则表达式的条件运算符来缩短循环构造,但没有得到正确的结果。我认为失败的原因是assigment和regexp操作符之间的差异(=与=~)。这种方法的正确表述是什么 长版本: 打印(“TABLE.BEGIN\n”); while(my@data=$sth->fetchrow\u数组){ $row++; 对于我的$ix(0..$#数据){ my$val=$data[$ix]; 如果($val){ $val=~s/\t/[:TAB://g; }否则{ $val='NULL'
=
与=~
)。这种方法的正确表述是什么
长版本:
打印(“TABLE.BEGIN\n”);
while(my@data=$sth->fetchrow\u数组){
$row++;
对于我的$ix(0..$#数据){
my$val=$data[$ix];
如果($val){
$val=~s/\t/[:TAB://g;
}否则{
$val='NULL';
}
$data[$ix]=$val;
}
打印“行:$ROW\t”,join(“\t”,@data),“\n”;
}
打印(“END.TABLE\n”);
长版本结果
TABLE.BEGIN
ROW: 1 12 79 1 PhoViComp 2017-05-22-PhoViComp 2017-05-22 32632 rostock HRO punjabi 2017-05-22-PhoViComp /net/server/path/
END.TABLE
TABLE.BEGIN
ROW: 1
END.TABLE
短版
打印(“TABLE.BEGIN\n”);
我的$row=0;
while(my@data=$sth->fetchrow\u数组){
$row++;
@data=map{$\ s/\t/[:TAB://g:'NULL'}@data;
打印“行:$ROW\t”,join(“\t”,@data),“\n”;
}
打印(“END.TABLE\n”);
短版本结果
TABLE.BEGIN
ROW: 1 12 79 1 PhoViComp 2017-05-22-PhoViComp 2017-05-22 32632 rostock HRO punjabi 2017-05-22-PhoViComp /net/server/path/
END.TABLE
TABLE.BEGIN
ROW: 1
END.TABLE
在列表上下文中,
s/\t/[:TAB://g
返回1
,否则不返回任何内容。您需要返回修改后的$\uu
所以你有点接近
for (@data) {
my $val = $_;
if (defined($val)) {
$val =~ s/\t/[:TAB:]/g;
} else {
$val = 'NULL';
}
$_ = $val;
}
map
版本将是
@data = map {
my $val = $_;
if (defined($val)) {
$val =~ s/\t/[:TAB:]/g;
} else {
$val = 'NULL';
}
$val
} @data;
@data = map { defined($_) ? s/\t/[:TAB:]/rg : 'NULL' } @data; # 5.14+
当然,你可以写
$_ = defined($_) ? s/\t/[:TAB:]/rg : 'NULL' for @data; # 5.14+
等效(但较慢)map
版本为
@data = map {
my $val = $_;
if (defined($val)) {
$val =~ s/\t/[:TAB:]/g;
} else {
$val = 'NULL';
}
$val
} @data;
@data = map { defined($_) ? s/\t/[:TAB:]/rg : 'NULL' } @data; # 5.14+
条件运算符只定义了一个三元运算符$\ux($\ux)?s/\t/[:TAB://rg:@data的“NULL”;为我工作!它比普通循环慢吗?不,
$\ux=defined($\ux)?s/\t/[:TAB://rg:@data的“NULL”对于(@data){$\=defined($\)?s/\t/[:TAB://rg:'NULL';}
,如果这是您的意思,则code>不会比慢。只有两种写同样东西的方式。