2014-01-28 3 views
4

Может кто-нибудь объяснить, что разница между следующими двумя синтаксисом:Как скобки изменяют результат соответствия регулярного выражения?

($x) = $a =~ /(\d+)/; 

$y = $a =~ /(\d+)/; 

В примере, если $a = 100lkj затем $x = 100 но $y = 1.

С помощью этого кода я пытаюсь извлечь численное значение в строке $a.

Я не совсем понимаю, почему?

ответ

1

В режиме списка =~ возвращает список совпадений. Если ваш $a был abc123def456ghi, первое выражение вернет (123, 456). Вы назначаете первый из этих совпадений $x.

В скалярном режиме оператор =~ возвращает количество найденных совпадений, которое равно 1 в вашем случае.

Чтобы извлечь значения, не используйте возвращаемое значение оператора регулярного выражения, вместо этого используйте переменные $& и $1 .. $9.

+2

нет флага/g, поэтому он не будет пытаться сопоставлять более одного раза – ysth

6

Когда вы пишете переменную внутри скобки, она вызывает контекст списка. Это означает, что материал, который вы хотите назначить этой переменной, будет также интерпретироваться как список.

В вашем случае у вас нормальный матч. Возвращаемое значение совпадения - это список, содержащий все совпадения. Если вы принудительно перенаправляете список на скалярный контекст, возвращается количество записей внутри этого списка. Таким образом, у вас есть 1 совпадение, что означает, что этот список содержит 1 совпадение.

Не рекомендуется использовать возвращаемое значение регулярного выражения.

Вы можете использовать переменные $1, $2, $3,... для совпадений (совпадений из скобок).

В вашем случае:

$a =~ /(\d+)/; 
$x = $1; 

КСТАТИ: $a и $b специальные переменные для sort. Пожалуйста, не используйте их :).

($x) = $a =~ /(\d+)/; 
# $x is the first element of the RegEx return value 
# ($x, $y, $z) = $a =~ /(\d)(\d)(\d)/; 
# $x = first match, $y = second and so on. 
+0

Почему не рекомендуется использовать возвращаемое значение регулярного выражения? –

+0

Нет контекста массива. См. Http://friedo.com/blog/2013/07/arrays-vs-lists-in-perl – simbabque

+0

Да. Ты прав. я просто понял [это] (http://perldoc.perl.org/perlop.html#/PATTERN/msixpodualgc) –

4

Поскольку регулярные выражения тестов обычно используется в логическом контексте, скалярное возвращение контекста всегда успех или неудача, не захваченное значение, и только контекст список даст вам захваченное значение. Если он всегда возвращает зафиксированное значение, захваченное «0» будет выглядеть как сбой в булевом тесте.

Насколько мне известно, абсолютно рекомендуется использовать возвращаемое значение, когда это возможно; но для этого вы должны использовать контекст списка, например назначение списка.

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