【发布时间】:2018-02-28 13:56:17
【问题描述】:
我有一个 perl 脚本(使用 -p 标志)对损坏的 C 源文件执行一些更正。这是脚本的一部分:
sub remove_sp {
$_ = shift;
s/ /, /g;
return $_;
}
s/(\([^}]*\))/remove_sp($1)/eg;
这会将括号内的空格替换为, ,例如foo(bar baz) 变为 foo(bar, baz)。但是,它不是很聪明。它还将foo("bar baz") 更改为foo("bar, baz"),这显然不是我想要的。
我想不出一种方法来重写脚本,以便仅当空格不在引号之间时才用逗号空格替换空格。我该怎么做?
这是一个简单的表格,列出了我需要什么以及什么不起作用。
Search | Replace | Currently handled correctly?
--------------------------------------------------------------------------------------------
foo(bar baz) | foo(bar, baz) | Yes
foo("bar baz") | foo("bar baz") | No
foo("bar baz" bak) | foo("bar baz", bak) | No
foo("bar baz" bak "123 abc") | foo("bar baz", bak, "123 abc") | No
【问题讨论】:
-
@MattJacob 问题出在
print("foo bar" baz)等输入上,应该是print("foo bar", baz)。 -
提示:不要破坏
$_!!!至少使用local $_ = shift;,但即使这样也会导致问题,因为$_并不罕见地别名为神奇或只读变量。for (my $s = shift) { ... }是安全的,但在大多数情况下最好只使用my $s = shift;。
标签: regex perl syntax space removing-whitespace