LinuxForum.Fans
Тема

[perl]почему переменная в "дочерних" фигурных скобках не работает?

Автор: moshell 7 сообщений 1891 просмотров
#373300

вроде все верно, ан нет.
интерпретатор ругается, мол

Use of uninitialized value $target in quotemeta at ./perl/kget_to_xlsx_utrancell line 41, <> line 208910.
Use of uninitialized value $replace in substitution (s///) at ./perl/kget_to_xlsx_utrancell line 41, <> line 208910.

хотя, ХОТЯ.
если раскоментировать закоменченные строки. то без ошибок выводит именно то ЧТО должно быть заменено и то ЧЕМ должно быть заменено

вот сам кусок кода.

text

    my ($replace, $target);
    while (/
        ^ Struct \s (\w+) \s has \s \d+ \s members: $
        (?{ undef $replace})
        (?{ undef $target})
        \n
        (?: \s >>> \s \d+ \. (\S+) \s = \s (.*)
        (?{ $replace .= "$1.$2 $3\n"})
        \n ) +
        (?{ $target = $&})
#        (?{ print $target})
#        (?{ print $replace})
        /gmx){
            $_ =~ s/\Q$target\E/$replace/;
        }
#373310

доктор, почему ты не юзаешь пёрл?
как раз "регулярный" язык.

у меня 100лько вопросов..
неужели тут нет пёрловодов?

#373313

самое интересное это то,
что если просто брать весь файл в переменную, и этим кодом парсить его, то РАБОТАЕТ!
но файл слишком большой. и на это уходит около 5 минут, с загрузкой CPU 99,9%. (регулярка сжирает ресурсы)

поэтому я разбил файл на куски (затащил в массив)
в каждом элементе массива кусок файла.

а вот этот while уже обрабатывает каждый элемент массива, то есть каждый кусок парсит.
но не пойму, как это может повлиять?

кусок кода он и в африке кусок кода.


вот собственно весь код

text
#!/usr/bin/perl -w
use strict;
use 5.014;
my $data;

while (<>){ # all string to one variable $data .= $_; }

$data =~ s/^ .*? ^ (Proxy Id .*) ^ Total .*/$1/xms; # delete the garbage at the start and end the "file" $data =~ s/^ (MO .*) \n =+/$1/gmx; # delete middle separater "===========+"

my @MO = split /(?: =====+ \n)/x, $data; # create an array of MOs

my @UtranCells; foreach (@MO){ # create an array of UtranCells if (/^ MO .* ,UtranCell= \d+ $/mx) { push @UtranCells, $_; } }

foreach (@UtranCells){ my ($replace, $target); while ($_ =~ / ^ Struct \s (\w+) \s has \s \d+ \s members: $ (?{ undef $replace}) (?{ undef $target}) \n (?: \s >>> \s \d+ \. (\S+) \s = \s (.*) (?{ $replace .= "$1.$2 $3\n"}) \n ) + (?{ $target = $&}) # (?{ print $target}) # (?{ print $replace}) /gmx){ $_ =~ s/\Q$target\E/$replace/; } }

#373701

нужно было всего лишь взглянуть трезвой головой на код и вытащить определение переменных

my ($replace, $target);

перед началом цикла

foreach (@UtranCells){

и опять же вопрос. при чем тут язык в принципе?

#373704

при чем тут язык в принципе?

Разве что, играя в футбол, ты соблюдаешь футбольные правила, а не хоккейные :-)

#373717
yars написал:
при чем тут язык в принципе?

Разве что, играя в футбол, ты соблюдаешь футбольные правила, а не хоккейные :-)

сагласин.
но правила областёв видимостёв переменных у всех языков наверняка одинаковые.
уверен, в большинстве случаёв одинаковы.

#373825

"moshell" написал:
доктор, почему ты не юзаешь пёрл?
зачем?

"moshell" написал:
как раз "регулярный" язык.
sed тоже. Он тоже тьюринг-полный.

"moshell" написал:
что если просто брать весь файл в переменную, и этим кодом парсить его, то РАБОТАЕТ!
но файл слишком большой. и на это уходит около 5 минут, с загрузкой CPU 99,9%. (регулярка сжирает ресурсы)
короткую сказку про дурака и хрустальный пенис знаешь?

"moshell" написал:
вот собственно весь код
я не видел ничего более плохого за последнюю неделю.
Войдите или зарегистрируйтесь, чтобы ответить.