Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не могу найти как исправить, Use of uninitialized value $match in... 
V
    Опции темы
worsvch
Дата 28.5.2009, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 23.4.2009

Репутация: нет
Всего: нет



#!/perl -w

use strict;
use Encode qw(from_to);

system('cls');

my @str;
my $x = 0;
my @tags = ("Surname","Name","Age");
my @klassf = ("Фамилия","Имя","Возраст");

sub parseStr {
    my $klsf = shift(@_);
    my $match = shift(@_); 
    my $var = shift(@_);
    if ($str[$x] =~ m/<$var>(\W+)<\/$var>/) {    
       from_to($klsf,"cp1251","cp866");
       print "$klsf: $match\n";
    }
    elsif ($str[$x] =~ m/<$var>(\d+)<\/$var>/) {    
       from_to($klsf,"cp1251","cp866");
       print "$klsf: $match\n";
    }        
}

open XML, "< test.xml" or die "can't find file test.xml";
 while (<XML>) {
       push @str, $_;
       from_to($str[$x],"cp1251","cp866");    
       for (my $y = 0;$y <= 2;$y++) {
           parseStr($klassf[$y],$1,$tags[$y]);
       }
       $x++;       
 }
close XML;

Результат выходит такой:

Use of uninitialized value $match in concatenation (.) or string at c:\...\test.pl line 19, <XML> line 3.
Фамилия:
Use of uninitialized value $match in concatenation (.) or string at c:\...\test.pl line 19, <XML> line 4.
Имя:
Use of uninitialized value $match in concatenation (.) or string at c:\...\test.pl line 23, <XML> line 5.
Возраст:

А вот xml:
<?xml version="1.0" encoding="windows-1251"?>
<root>
 <Surname>Иванов</Surname>
 <Name>Иван</Name>
 <Age>23</Age>
</root>

Все файлы тестовые но скоро придется делать скрипт для настоящих, поэтому и прошу вас помочь разобраться

Это сообщение отредактировал(а) worsvch - 28.5.2009, 09:04
PM MAIL   Вверх
amg
Дата 28.5.2009, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Ой, лень разбираться, но в в подобных случаях лучше использовать хэш, а не массивы. Вкратце, так:
Код
my %tags = (Surname=>'Фамилия', Name=>'Имя' ,Age=>'Возраст');
my %result;

open XML, "<", "test.xml" or die "Can't open file test.xml: $!\n";
while (<XML>) {
  $result{$1} = $2 if m/<(\w+)>(.*?)<\/\1>/ && exists $tags{$1};
}
close XML;

print "$tags{$_}: $result{$_}\n" foreach keys %result;


PM MAIL   Вверх
shurf
Дата 28.5.2009, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Просто программист



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 19.7.2007
Где: Чернигов

Репутация: нет
Всего: нет



Ага, а я разобрался в этом коде. Вот так работает:

Код

#!/perl -w

use strict;
use Encode qw(from_to);

system('cls');

my @str;
my $x = 0;
my @tags = ("Surname","Name","Age");
my @klassf = ("Фамилия","Имя","Возраст");

sub parseStr {
    my $klsf = shift(@_);
    my $match = shift(@_); 
    my $var = shift(@_);
    if ($str[$x] =~ m/<$var>(\W+)<\/$var>/) {    
       from_to($klsf,"cp1251","cp866");
       $match = eval "$match";
       print "$klsf: $match\n";
    }
    elsif ($str[$x] =~ m/<$var>(\d+)<\/$var>/) {    
       from_to($klsf,"cp1251","cp866");
       $match = eval "$match";
       print "$klsf: $match\n";
    }        
}

open XML, "< test.xml" or die "can't find file test.xml";
 while (<XML>) {
       push @str, $_;
       from_to($str[$x],"cp1251","cp866");    
       for (my $y = 0;$y <= 2;$y++) {
           parseStr($klassf[$y],'$1',$tags[$y]);
       }
       $x++;       
 }
close XML;


Вторым параметром parseStr надо передавать не переменную, строку.
А потом эту строку выполнять как выражение с помощью eval

PM MAIL WWW ICQ Skype Jabber   Вверх
worsvch
Дата 1.6.2009, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 23.4.2009

Репутация: нет
Всего: нет



Цитата(shurf @ 28.5.2009,  09:59)
Ага, а я разобрался в этом коде. 

Вторым параметром parseStr надо передавать не переменную, строку.
А потом эту строку выполнять как выражение с помощью eval

Я попробовал сделать как Вы сказали, вместо данных, во всех строках выходит $1. А с eval делал, вообще какая-то чушь выходит. Может делал чего неправильно?  smile 
PM MAIL   Вверх
mvsgt
Дата 1.6.2009, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 27.3.2009

Репутация: 1
Всего: 1



Переписывайте скрипт целиком. Работать в реальной системе он не будет. Например, parseStr($klassf[$y],$1,$tags[$y]); - очень странная строка, столько ошибок может породить...  Вообще XML лучше парсить стандартными средствами.

$match = eval "$match";  - это вообще перл...


PM MAIL   Вверх
gcc
Дата 1.6.2009, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



Код

#use strict;

PM WWW ICQ Skype GTalk Jabber   Вверх
shurf
Дата 1.6.2009, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Просто программист



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 19.7.2007
Где: Чернигов

Репутация: нет
Всего: нет



Цитата(mvsgt @  1.6.2009,  08:56 Найти цитируемый пост)
$match = eval "$match";  - это вообще перл...

Ну да, не ассемблер.

Человек попросил исправить программу...

Цитата(worsvch @  1.6.2009,  07:28 Найти цитируемый пост)
Я попробовал сделать как Вы сказали, вместо данных, во всех строках выходит $1. А с eval делал, вообще какая-то чушь выходит. Может делал чего неправильно?

Какую чушь? Может быть что-то не так с кодировками? Я проверял под linux - выводит в cp866.

$1 выводит, если не использовать $match = eval "$match", или использовать, но с одинарными кавычками.

PM MAIL WWW ICQ Skype Jabber   Вверх
shamber
Дата 1.6.2009, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



Цитата(shurf @  1.6.2009,  22:48 Найти цитируемый пост)
Ну да, не ассемблер.

я думаю, тут перл совсем не язык программирования smile
PM MAIL Jabber   Вверх
worsvch
Дата 2.6.2009, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 23.4.2009

Репутация: нет
Всего: нет



Цитата(shurf @ 1.6.2009,  22:48)
Цитата(worsvch @  1.6.2009,  07:28 Найти цитируемый пост)
Я попробовал сделать как Вы сказали, вместо данных, во всех строках выходит $1. А с eval делал, вообще какая-то чушь выходит. Может делал чего неправильно?

Какую чушь? Может быть что-то не так с кодировками? Я проверял под linux - выводит в cp866.

$1 выводит, если не использовать $match = eval "$match", или использовать, но с одинарными кавычками.

С кодировками никаких проблем, в консоли все на русском языке выходит.
Я имел ввиду, что вместо данных из xml файла выходит $1. Перепроверю код еще раз, может чего не усмотрел

Добавлено через 4 минуты и 44 секунды
Цитата(shamber @ 1.6.2009,  23:28)
Цитата(shurf @  1.6.2009,  22:48 Найти цитируемый пост)
Ну да, не ассемблер.

я думаю, тут перл совсем не язык программирования smile

Вот Вам смешно smile А вот хотелось бы увидеть Ваш совет или даже лучше образец кода, как совет человека продвинутого в программировании на языке perl.
PM MAIL   Вверх
DaemonSuw
Дата 2.6.2009, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 11.3.2008

Репутация: 3
Всего: 3



parseStr($klassf[$y],$1,$tags[$y]); откуда берется переменная $1? 
PM MAIL ICQ   Вверх
worsvch
Дата 2.6.2009, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 23.4.2009

Репутация: нет
Всего: нет



Цитата(DaemonSuw @ 2.6.2009,  19:06)
parseStr($klassf[$y],$1,$tags[$y]); откуда берется переменная $1?

  if ($str[$x] =~ m/<$var>(\W+)<\/$var>/) - переменная $1 - берется из этого шаблона, по идее она должна быть равна следующим значениям, выдранным из xml-файла:
Иванов
Иван
23
PM MAIL   Вверх
KSURi
Дата 2.6.2009, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



$1 - лексическая переменная, со всеми вытекающими


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
worsvch
Дата 2.6.2009, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 23.4.2009

Репутация: нет
Всего: нет



Цитата(KSURi @ 2.6.2009,  19:55)
$1 - лексическая переменная, со всеми вытекающими

Что это означает?  smile 
PM MAIL   Вверх
shurf
Дата 2.6.2009, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Просто программист



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 19.7.2007
Где: Чернигов

Репутация: нет
Всего: нет



Цитата(worsvch @  2.6.2009,  16:47 Найти цитируемый пост)
Я имел ввиду, что вместо данных из xml файла выходит $1. Перепроверю код еще раз, может чего не усмотрел

Раз выводится $1, значит не работал eval.

eval "$match" или eval $match возвращает значение выражения, хранящегося в переменной $match.
В данном случае eval должен вернуть значение переменной $1

eval '$match' или eval{$match} возвращает значение переменной $match
То есть строку '$1'.

У меня код работает правильно. Я проверял под Linux, perl v5.8.8

PS Попробуй отключить режим strict, как предложил gcc

PM MAIL WWW ICQ Skype Jabber   Вверх
KSURi
Дата 3.6.2009, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Цитата(worsvch @  2.6.2009,  20:13 Найти цитируемый пост)
Что это означает?  smile  

Код

$ perl
{
  'string' =~ /(.+)/;
  print $1,$/;
}
print $1||'<undef>',$/
^D
string
<undef>
$


perldoc perlvar

Это сообщение отредактировал(а) KSURi - 3.6.2009, 09:11


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0809 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.