Как заменить $*=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;

огромное спасибо,

  • Рори

person Rory    schedule 17.09.2008    source источник


Ответы (5)


Из perlvar:

Использование $* не рекомендуется в современном Perl, его заменяют модификаторы /s и /m при сопоставлении с образцом.

Если у вас есть доступ к месту, где он сопоставляется, просто добавьте его в конец:

 $haystack =~ m/.../sm;

Если у вас есть доступ только к строке, вы можете окружить выражение

 qr/(?ms-ix:$expr)/;

Или в вашем случае:

s/\n((\w*\-*\.*\w*\/*)+\:)/$1/gsm;
person Axeman    schedule 17.09.2008
comment
Привет, я столкнулся с той же проблемой. перла не знаю. не могли бы вы объяснить, что именно является заменой $* здесь .. - person debonair; 31.01.2014
comment
@debonair, начиная с 5.8 Perlvar: $* — установите ненулевое целочисленное значение, чтобы выполнить многострочное сопоставление в строке. Теперь это делается путем применения переключателя m в конце регулярного выражения или переключателя m внутри группы. - person Axeman; 31.01.2014

Из версии perlvar для Perl 5.8:

Установите ненулевое целочисленное значение, чтобы выполнить многострочное сопоставление в строке [...] Использование $* устарело в современном Perl, заменено модификаторами /s и /m при сопоставлении с образцом.

Хотя использование /s и /m намного лучше, вам нужно установить модификаторы (соответствующим образом!) для каждого регулярного выражения.

perlvar также говорит "Эта переменная влияет на интерпретацию только ^ и $." что создает впечатление, что она эквивалентна только /m, а не /s.

Обратите внимание, что $* — это глобальная переменная. Поскольку его изменение не является локальным с помощью ключевого слова local, оно повлияет на все регулярные выражения в программе, а не только на те, которые следуют за ним в блоке. Это затруднит корректное обновление скрипта.

person Michael Carman    schedule 17.09.2008

Из perldoc perlvar:

$*

Установите ненулевое целочисленное значение, чтобы выполнить многострочное сопоставление в строке, 0 (или неопределенное), чтобы сообщить Perl, что он может предполагать, что строки содержат одну строку, с целью оптимизации сопоставления с образцом. Совпадения с образцом в строках, содержащих несколько символов новой строки, могут привести к запутанным результатам, если $* равно 0 или не определено. Значение по умолчанию не определено. (Мнемоника: * соответствует нескольким вещам.) Эта переменная влияет на интерпретацию только ^ и $. Буквальный перевод строки можно искать, даже если $* == 0.

Использование $* устарело в современном Perl, его заменили модификаторы /s и /m при сопоставлении с образцом.

Присвоение нечислового значения $* вызывает предупреждение (и заставляет $* действовать так, как если бы $* == 0), а присвоение числового значения $* приводит к тому, что к значению применяется неявное целое число.

person Notitze    schedule 17.09.2008

По сути, это был способ сказать, что в последующих регулярных выражениях (s/// или m//) утверждения ^ или $ должны совпадать до или после новых строк, встроенных в строку.

Рекомендуемым эквивалентом является модификатор m в конце регулярного выражения (например, s/\n((\w*-*.*\w*/*)+:)/$1/gm;).

person Alex    schedule 17.09.2008

Он включает многострочный режим. Начиная с perl 5.0 (1994 г.), правильный способ сделать это — добавить модификатор m и/или s к вашим регулярным выражениям, например

 s/\n?Project.*rebuilt\.//msg
person Leon Timmermans    schedule 17.09.2008