1 (21.03.2014 15:23:08 отредактировано yars)

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

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.


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

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

    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/;
        }
"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

2

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

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

3 (21.03.2014 17:42:06 отредактировано moshell)

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

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

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

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


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

#!/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/;
        }
}
"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

4

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

my ($replace, $target);

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

foreach (@UtranCells){

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

5

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

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

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

6

yars пишет:

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

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

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

7

moshell пишет:

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

зачем?

moshell пишет:

как раз "регулярный" язык.

sed тоже. Он тоже тьюринг-полный.

moshell пишет:

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

короткую сказку про дурака и хрустальный пенис знаешь?

moshell пишет:

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

я не видел ничего более плохого за последнюю неделю.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)