перл. регэксп. ограничить пыл.(подробности внутри)

Phoenix

значит так.. есть текст из блоков

name xxx stuff value 23 stuff
unit: aaa bbb
name yyy stuff value 33 stuff
unit: ccc ddd
...

f(aaa) = f(bbb) = 23
f(ccc) = f(ddd) = 33
пишу

$result =~ /name.*? value (\d+).*?\nunit:.*?$user/

на все результаты 23.
что не правильно..
man perlretut - дал именно такие модификаторы(никаких)
может я чего-то не увидел

Alexei70

То, что 23 выдает - это понятно... Начало регекспа твоего всегда соответствует началу текста, а концовку содержащую $user он находит, но это уже никак не влияет на результат попавший в скобки. И модификатор "?" здесь уже не поможет - он лишь гарантирует что "ссс" взьмется первое подходящее, а не максимально дальнее.
В твоем бы случае, я бы сначала сделал бы split всего текста на строки данных - и уже среди них искал нужную и извлекал из неё нужные данные.

Phoenix

так я же указал, что должно быть всего \n - т.е. один пропуск строки.
а без модификатора /s \n - не входит в .

Ivan8209

А что ты хочешь сделать?
---
...Я работаю антинаучным аферистом...

Alexei70

Точняк...
Тогда хз почему. Может настройки перла какие-то могут иметь место?
Попробуй тесты позапускать, да выявить явно в чем дело.

ruler

* ?

sakura

Написал вот такую программку:

#!/usr/bin/perl

use strict;
use warnings;

my $result = "name xxx stuff value 23 stuff
unit: aaa bbb
name yyy stuff value 33 stuff
unit: ccc ddd";

my $aaa = f('aaa');
my $bbb = f('bbb');
my $ccc = f('ccc');
my $ddd = f('ddd');

print"
aaa = '$aaa'
bbb = '$bbb'
ccc = '$ccc'
ddd = '$ddd'
";

sub f
{
my $user = shift;

$result =~ /name.*? value (\d+).*?\nunit:.*?$user/;

return $1;
}


Вот output:

aaa = '23'
bbb = '23'
ccc = '33'
ddd = '33'

Все правильно твое регулярное выражение работает. У тебя строка $result, наверное, другая и дело скорее всего в ней, если у тебя не работает... посмотри сам или покажи реальную строку $result

Anna74

Точно, всё работает.

Phoenix

ок. значит где-то в другом месте косяк.. буду искать.
Оставить комментарий
Имя или ник:
Комментарий: