2014-01-30 5 views
0

У меня есть код на Perl:

sub PrintVariables { 
    local (%in) = @_; 
    local ($old, $out, $output); 
    $old = $*; $* =1; 


$output .= "<DL COMPACT>"; 
    foreach $key (sort keys(%in)) { 
    foreach (split("\0", $in{$key})) { 
     ($out = $_) =~ s/\n/<BR>/g; 
     $output .= "<B> $key = </B>$out <BR>"; 
    } 
    } 
    $output .= "</DL>"; 
    $* = $old; 
    return $output; 
} 

, в котором $old = $*; $* =1; и $* = $old; дает ошибку, что $ * больше не поддерживается. Какая должна быть замена для этих двух линий. Я не знаю перла.

ответ

7

Человек, который какой-то древний код. По-видимому, предшествуют лексические переменные, что означает, что это код Perl 4.

В этом случае $* на самом деле ничего не делает. Просто удалите его.

sub PrintVariables { 
    local (%in) = @_; 
    local ($out, $output); 

    $output .= "<DL COMPACT>"; 
    foreach $key (sort keys(%in)) { 
    foreach (split("\0", $in{$key})) { 
     ($out = $_) =~ s/\n/<BR>/g; 
     $output .= "<B> $key = </B>$out <BR>"; 
    } 
    } 
    $output .= "</DL>"; 
    return $output; 
} 

Он должен глобально поворот на флаге /m регулярных выражений. Но единственное регулярное выражение, используемое этим кодом, не содержит ничего, на что влияет /m.

+0

Нижняя линия, мне просто нужно удалить эти две строки, да? – debonair

+0

В этом случае да. Они не нужны для текущего кода. Вероятно, предыдущая версия использовала другое регулярное выражение. Когда кто-то изменил регулярное выражение, чтобы многострочное совпадение больше не было актуальным, они забыли удалить бит '$ *'. – cjm

+0

Хорошо спасибо, проверит его – debonair

7

Чтобы получить более подробное объяснение предупреждающего сообщения, use diagnostics;

(D устаревшее, синтаксис) Специальная переменная $ *, устаревшее в старых Перлз, был удален в 5.9.0 и больше не поддерживается. В предыдущие версии perl используют $ * enabled или disabled multi-line , соответствующие внутри строки.

Вместо использования $ * вы должны использовать модификаторы/m (и, возможно,/s) regexp . Вы можете включить/m для лексической области (даже целый файл) с использованием re '/ m'. (В более старых версиях:., Когда $ * был установлен в истинное значение тогда все регулярные выражения вели себя так, как будто они были написаны с использованием /м)

6

От perlvar:

$* была переменной, которую можно использовать для того, чтобы согласование многострочный. После цикла устаревания его магия была удалена в Perl v5.10.0. Использование этого метода теперь вызывает предупреждение: «$ * больше не поддерживается». Вместо этого вы должны использовать модификаторы «/ s» и «/ m» regexp.

Запрещены в Perl 5.

Другими словами, этот сценарий является древний, полный плохих практик (даже для того времени), и - что хуже всего - нет необходимости в многострочный соответствие в все.

Просто удалите все строки, ссылающиеся на $*, и он все равно должен работать. В противном случае добавьте модификаторы /m ко всем регулярным выражениям в этом регионе.

+2

«и он все равно должен работать» ... потому что в patter не используются ни «^», ни «$», только две вещи, на которые влияет/m. – ikegami

Смежные вопросы