为什么输出中缺少双引号?

时间:2017-11-23 09:00:57

标签: perl

我尝试将字符串从小写转换为大写。当我实现这一点时,我发现我的双引号已从输出中删除。我想清楚为什么替换在这里失败了。

Perl代码:

#!/usr/bin/perl

use strict;
use warnings;

my @ar = <DATA>;
my $str = join '', @ar;

#print $str;

if ( $str =~ s/\"([^"]*)\"/uc($1)/eg ) {
    print $str;
}
__DATA__
output = "    as  (10) print "it if achieved. print" # This is comment.NUMBERS"

获得输出:

output =     AS  (10) PRINT it if achieved. print # THIS IS COMMENT.NUMBERS

预期产出:

output = "    AS  (10) PRINT "it if achieved. print" # THIS IS COMMENT.NUMBERS"

2 个答案:

答案 0 :(得分:6)

引号全部消失,因为它们在你的正则表达式中的捕获之外。将其更改为s/("[^"]*")/uc($1)/eg可获得您想要的输出:

output = "    AS  (10) PRINT "it if achieved. print" # THIS IS COMMENT.NUMBERS"

请注意,内部部分未映射到所有大写字母。这是一个提示正则表达式如何实际匹配字符串中的内容 - 它找到两个匹配项:" as (10) print "" # This is comment.NUMBERS"。内部引号内的文本根本不与正则表达式匹配。这很重要,因为这意味着这个解决方案很脆弱,并且它将破坏数据,这些数据不包含两个嵌套的引号集,并且您只想大写外部引号内的文本,但在内部引号之外。

答案 1 :(得分:5)

s/\"([^"]*)\"/uc($1)/eg - $1表示匹配 括号()。您已在匹配中包含双引号以进行替换,但括号外。

可能的解决方法: s/(\"[^"]*\")/uc($1)/eg