2015-07-07 4 views
1

Следующий пример Perl является частью длинного скрипта Perl.Perl регулярное выражение и аргументы

Этот сценарий принимает результаты от ifconfig -a и печатает IP-адрес.

Может кто-нибудь объяснить, как $1 получает IP-адрес?

А что регулярное выражение

$RESULTS =~ /addr:(\S+)\s+/ 

средства?

my $COMMAND = "ifconfig -a | grep inet | grep -v 127.0.0.1 | head -1"; 
    my $RESULTS = `$COMMAND`; 
    chomp $RESULTS; 
    #   inet addr:106.13.4.9 Bcast:106.13.4.255 Mask:255.255.255.0 
    #   inet 106.13.4.9 netmask ffffff80 broadcast 106.13.4.127 


if ($RESULTS =~ /addr:(\S+)\s+/) { 
    $IpAddress = $1; 
} 
elsif ($RESULTS =~ /inet\s+(\S+)\s+/) { 
    $IpAddress = $1; 
} 

print "IpAddress = $IpAddress\n"; 

ответ

5

Если выражение а =~ матча истинно, специальные переменные $1, $2, ... будут подстроками, которые соответствуют части шаблона в скобках. $1 соответствует первой левой скобке, $2 второй левой скобкой и так далее.

\S соответствует любому символу,
+ матч 1 или несколько раз,
\s спичек любой символ пробела (пробел, табуляция, перевод строки),

Таким образом, в своем регулярном выражении это соответствует addr:(any non-whitespace character 1 or more time)matches any whitespace character one or more time. И $1 в захвате значения в скобках.

Посмотрите этот вопрос, чтобы понять $1: What does $1 mean in Perl?

+0

очень интересно, но как $ 1 взять только IP-адрес, а не все addr: 106.13.4.9 string? – maihabunash

+1

Потому что '$ 1' хранит только то, что находится в круглых скобках, но не вне круглых скобок. Посмотрите на данную ссылку, вы поймете поведение '$ 1'. – serenesat

1

=~ оператор совпадений в Perl и имеет значение истина, если строка (здесь $RESULTS) могут быть сопоставлены с регулярным выражением (здесь /addr:(\S+)\s+/)

Когда регулярное выражение подобрано в Perl переменные автоматически назначаются:

  • $& удерживает часть согласованного по всему выражению
  • $1 удерживает часть согласованной первой группой захвата (набор скобок)
  • $2 части второй группы захвата
  • и так далее ...
+0

Можете ли вы, пожалуйста, также проинсталлировать синтаксис в exp (as \ S + и \ s + /) и т. Д. – maihabunash

+1

'$ 0' содержит имя файла, содержащего исполняемый скрипт perl. '$ &' возвращает всю согласованную строку. –

+0

'\ S +' означает «1 или более символов без пробелов», а '\ s +' означает «1 или более пробельных символов», передние косые черты - это просто разделители, которые отмечают начало и конец регулярного выражения, скобки заключают, что соответствует шаблон внутри них и сохраняет его в $ 1 в этом случае, остальные - буквальные символы.Это регулярное выражение используется для захвата всего следующего «addr:» вплоть до первого символа пробела (например, «106.13.4.9'). – MC93

1

$1, $2, $& и т.д. захватит Значение последнего успешного матча.

\S+ соответствует любому и отрицает \s (пробелы).

+3

'' '' не использовать для захвата чего-либо. Если вы хотите написать 'и ', тогда напишите' and'. Существует специальное значение [&] (http://stackoverflow.com/a/8915304/4248931) в perl. – serenesat

+0

Там я пропустил $. Я имею в виду, что $ & – Sant

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