У меня есть 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
print("foo bar" baz)
, который должен получиться какprint("foo bar", baz)
. - person MD XF   schedule 28.02.2018$_
!!! По крайней мере, используйтеlocal $_ = shift;
, но даже это может вызвать проблемы, потому что$_
нередко ассоциируется с магической или доступной только для чтения переменной.for (my $s = shift) { ... }
безопасен, но в большинстве случаев лучше использовать толькоmy $s = shift;
. - person ikegami   schedule 28.02.2018