Как заменить $*=1 альтернативой, которая теперь $* больше не поддерживается
Вопрос
Я полный новичок в Perl, запускаю Perl-скрипт, используя Perl 5.10, и получаю это предупреждение:
$* is no longer supported at migrate.pl line 380.
Может ли кто-нибудь описать, что сделал $* и какова рекомендуемая его замена сейчас?В качестве альтернативы, если бы вы могли указать мне на документацию, описывающую это, было бы здорово.
Сценарий, который я запускаю, предназначен для переноса базы данных исходного кода из vss в svn, его можно найти здесь:http://www.x2systems.com/files/migrate.pl.txt
Два фрагмента кода, которые его используют:
$* = 1;
$/ = ':';
$cmd = $SSCMD . " Dir -I- \"$proj\"";
$_ = `$cmd`;
# what this next expression does is to merge wrapped lines like:
# $/DeviceAuthority/src/com/eclyptic/networkdevicedomain/deviceinterrogator/excep
# tion:
# into:
# $/DeviceAuthority/src/com/eclyptic/networkdevicedomain/deviceinterrogator/exception:
s/\n((\w*\-*\.*\w*\/*)+\:)/$1/g;
$* = 0;
а затем несколько способов позже:
$cmd = $SSCMD . " get -GTM -W -I-Y -GL\"$localdir\" -V$version \"$file\" 2>&1";
$out = `$cmd`;
# get rid of stupid VSS warning messages
$* = 1;
$out =~ s/\n?Project.*rebuilt\.//g;
$out =~ s/\n?File.*rebuilt\.//g;
$out =~ s/\n.*was moved out of this project.*rebuilt\.//g;
$out =~ s/\nContinue anyway.*Y//g;
$* = 0;
большое спасибо,
- Рори
Решение
От перлвар:
Использование $* устарело в современном Perl и заменено модификаторами /s и /m при сопоставлении с образцом.
Если у вас есть доступ к месту, где оно сопоставляется, просто добавьте его в конец:
$haystack =~ m/.../sm;
Если у вас есть доступ только к строке, вы можете окружить выражение
qr/(?ms-ix:$expr)/;
Или в вашем случае:
s/\n((\w*\-*\.*\w*\/*)+\:)/$1/gsm;
Другие советы
Установите ненулевое целое число для выполнения многострочного сопоставления в строке [...] использование $* устарело в современном Perl, вытесненном модификаторами /S и /M при сопоставлении шаблонов.
Хотя использовать /s и /m намного лучше, вам необходимо установить модификаторы (соответствующим образом!) для каждого регулярного выражения.
перлвар также говорит «Эта переменная влияет на интерпретацию только ^ и $». что создает впечатление, что он эквивалентен только /m, а не /s.
Обратите внимание, что $*
является глобальной переменной.Поскольку изменение в нем не производится локально с помощью local
ключевое слово, это повлияет все регулярные выражения в программе, а не только те, которые следуют за ней в блоке.Это затруднит корректное обновление скрипта.
От перлдок:
$*
Установите ненулевое целочисленное значение, чтобы выполнить многострочное сопоставление внутри строки, или 0 (или неопределенное), чтобы сообщить Perl, что он может предполагать, что строки содержат одну строку, с целью оптимизации сопоставлений с образцом.Сопоставление шаблонов в строках, содержащих несколько символов новой строки, может привести к запутанным результатам, если
$*
равно 0 или неопределенно.По умолчанию не определено.(Мнемоника:*
соответствует нескольким вещам.) Эта переменная влияет на интерпретацию только^
и$
.Буквальную новую строку можно искать, даже если$* == 0
.Использование
$*
устарел в современном Perl и заменен/s
и/m
модификаторы сопоставления с образцом.Присвоение нечислового значения
$*
вызывает предупреждение (и делает$*
действовать так, как будто$* == 0
), присвоив числовое значение$*
означает, что к значению применяется неявный int.
По сути, это был способ сказать, что в последующих регулярных выражениях (s/// или m//) утверждения ^ или $ должны иметь возможность совпадать до или после символов новой строки, встроенных в строку.
Рекомендуемым эквивалентом является модификатор m в конце вашего регулярного выражения (например, s/ ((\w*-*.*\w*/*)+:)/$1/gm;).
Включает многострочный режим.Начиная с Perl 5.0 (начиная с 1994 года), правильный способ сделать это — добавить m
и/или s
модификатор ваших регулярных выражений, например этот
s/\n?Project.*rebuilt\.//msg