我尝试将字符串从小写转换为大写。当我实现这一点时,我发现我的双引号已从输出中删除。我想清楚为什么替换在这里失败了。
#!/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"
答案 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