Как заменить $*=1 альтернативой, которая теперь $* больше не поддерживается

StackOverflow https://stackoverflow.com/questions/88518

  •  01-07-2019
  •  | 
  •  

Вопрос

Я полный новичок в 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 5.8 версия perlvar:

Установите ненулевое целое число для выполнения многострочного сопоставления в строке [...] использование $* устарело в современном 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top