Имеется следующий код:$address = "123.221.143.167";
if ($address =~ m/(?:(\d{1,3})\.){3}\1/) {
print "Value $address is corresponds to pattern";
} else {
print "Neponyatka";
}обратная ссылка "\1" в регулярном выражении должна соответствовать "\d{1,3}". Вся конструкция, следовательно, при любом значении ip-адресса в переменной $address, должна возвращать истину в операторе ветвления. Но именно тот факт, что используется обратная ссылка на подвыражение (\d{1,3}) приводит к неожиданному поведению программы. Что интересно, если взять ip-адресс 1.1.1.1 - всё работает нормально, а 1.1.1.2 - уже не проходит. Подскажите кто знает в чём загвоздка.
>Имеется следующий код:
>
>$address = "123.221.143.167";
>if ($address =~ m/(?:(\d{1,3})\.){3}\1/) {
> print "Value $address is corresponds to pattern";
>} else {
> print "Neponyatka";
>}
>
>обратная ссылка "\1" в регулярном выражении должна соответствовать "\d{1,3}". Вся конструкция, следовательно,
>при любом значении ip-адресса в переменной $address, должна возвращать истину в
>операторе ветвления. Но именно тот факт, что используется обратная ссылка на
>подвыражение (\d{1,3}) приводит к неожиданному поведению программы. Что интересно, если взять
>ip-адресс 1.1.1.1 - всё работает нормально, а 1.1.1.2 - уже не
>проходит. Подскажите кто знает в чём загвоздка.Из man perlre:
The bracketing construct "( ... )" creates capture buffers. To refer to the digit'th buffer use \<digit> within the match.
Итак, \1 - это ссылка на буфер, в котором хранится текст, захваченный регулярным выражением в скобках. То есть на сам этот текст, а не на кусок выражения, который его захватил.
В случаях "1.1.1.1" и "1.1.1.2" \1 содержит "1", поэтому ясно, что в первом случае совпадает, а во втором - нет.
>>Имеется следующий код:
>>
>>$address = "123.221.143.167";
>>if ($address =~ m/(?:(\d{1,3})\.){3}\1/) {
>> print "Value $address is corresponds to pattern";
>>} else {
>> print "Neponyatka";
>>}
>>
>>обратная ссылка "\1" в регулярном выражении должна соответствовать "\d{1,3}". Вся конструкция, следовательно,
>>при любом значении ip-адресса в переменной $address, должна возвращать истину в
>>операторе ветвления. Но именно тот факт, что используется обратная ссылка на
>>подвыражение (\d{1,3}) приводит к неожиданному поведению программы. Что интересно, если взять
>>ip-адресс 1.1.1.1 - всё работает нормально, а 1.1.1.2 - уже не
>>проходит. Подскажите кто знает в чём загвоздка.
>
>Из man perlre:
>
>The bracketing construct "( ... )" creates capture buffers. To refer to the digit'th buffer use \<digit> within the match.
>
>Итак, \1 - это ссылка на буфер, в котором хранится текст, захваченный
>регулярным выражением в скобках. То есть на сам этот текст, а
>не на кусок выражения, который его захватил.
>
>В случаях "1.1.1.1" и "1.1.1.2" \1 содержит "1", поэтому ясно, что в
>первом случае совпадает, а во втором - нет.Спасибо, у меня была такая догадка. Просто где-то вычитал что идёт ссылка именно на подвыражение регулярного выражения. Пример приводился именно такой.