Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何使用条件运算符在perl映射操作中放置正则表达式_Regex_Perl_Mapping_Ternary Operator - Fatal编程技术网

Regex 如何使用条件运算符在perl映射操作中放置正则表达式

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'

嗨,我尝试使用映射操作和带正则表达式的条件运算符来缩短循环构造,但没有得到正确的结果。我认为失败的原因是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';
}
$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”
,如果这是您的意思,则code>不会比
慢。只有两种写同样东西的方式。