2013-06-24 4 views
1
open DMLOG, "<dmlog.txt" or &error("Can't open log file: $!"); 
chomp(@entirelog=<DMLOG>); 
close DMLOG; 
for $line (@entirelog) 
{ 

if ($line =~ m/\#F/) 
    { 
    $titlecolumn = $line; 
    last; 
    } 
} 

Я нашел, что = ~ это регулярное выражение, я думаю, но я не совсем понимаю, что он здесь делает.Что делает = ~ m/ # F/mean в Perl?

ответ

3

Вы понимаете, что такое регулярные выражения? Или, вы выбрасываете =~?

В большинстве языков программирования, вы увидите что-то вроде этого:

if (regexp(line, "/#F/")) { 
    ... 
} 

Однако в Perl регулярные выражения вдохновленный синтаксиса AWK в. Таким образом:

if ($line =~ /#F/) { 
    ... 
} 

=~ означает, что регулярное выражение будет действовать по имени переменной слева. Если шаблон #F находится в $line, утверждение if верно.

Возможно, вы захотите посмотреть на Regular Expression Tutorial, если вы не знакомы с ними. Регулярные выражения чрезвычайно эффективны и очень часто используются в Perl. Фактически, они, как правило, очень используются в Perl и являются одной из причин, по которым разработчики на других языках утверждают, что Perl является языком Write Only.

+0

Это было = ~, спасибо – user99999991

4

Он назначает первую строку $titlecolumn, которая содержит номер #, за которой следует F.

=~ является оператором связывания и применяет регулярное выражение к строке. Это регулярное выражение обычно записывается как /#F/. Префикс m можно использовать, чтобы подчеркнуть, что следующий литерал является префиксом (важно, когда используются другие разделители).

1

Да, =~ - оператор привязки, связывающий выражение с совпадением рисунка m//.

Инструкция if проверяет, соответствует ли строка данному регулярному выражению. В этом случае он проверяет, есть ли хэш-знак, за которым следует капитал F.

Обратная косая черта только что добавлена ​​(возможно), чтобы избежать обработки # в качестве знака комментария (что не требуется).

+3

'= ~' не имеет никакого отношения к регулярным выражениям. Это средство для сообщения m //, s /// и tr ///, с какой переменной они должны работать. – ikegami

+0

'\' здесь не нужен. '\ #' и '#' будут обрабатываться одинаково, так как модификатор 'x' не используется. – ikegami

+0

Да, вы правы - я был слишком быстр с моим ответом: -/ –

3

Это называется Binding Operator. Он используется для сопоставления рисунка на RHS с переменной на LHS. Аналогично у вас есть !~, что отрицает соответствие.

Для вашего конкретного случая:

$line =~ m/\#F/ 

Этот тест соответствует ли $line шаблон - /#F/.