![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
worsvch |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Ой, лень разбираться, но в в подобных случаях лучше использовать хэш, а не массивы. Вкратце, так:
|
|||
|
||||
shurf |
|
|||
Просто программист Профиль Группа: Участник Сообщений: 12 Регистрация: 19.7.2007 Где: Чернигов Репутация: нет Всего: нет |
Ага, а я разобрался в этом коде. Вот так работает:
Вторым параметром parseStr надо передавать не переменную, строку. А потом эту строку выполнять как выражение с помощью eval |
|||
|
||||
worsvch |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 23.4.2009 Репутация: нет Всего: нет |
Я попробовал сделать как Вы сказали, вместо данных, во всех строках выходит $1. А с eval делал, вообще какая-то чушь выходит. Может делал чего неправильно? ![]() |
|||
|
||||
mvsgt |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 27.3.2009 Репутация: 1 Всего: 1 |
Переписывайте скрипт целиком. Работать в реальной системе он не будет. Например, parseStr($klassf[$y],$1,$tags[$y]); - очень странная строка, столько ошибок может породить... Вообще XML лучше парсить стандартными средствами.
$match = eval "$match"; - это вообще перл... |
|||
|
||||
gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
|
|||
|
||||
shurf |
|
|||
Просто программист Профиль Группа: Участник Сообщений: 12 Регистрация: 19.7.2007 Где: Чернигов Репутация: нет Всего: нет |
Ну да, не ассемблер. Человек попросил исправить программу...
Какую чушь? Может быть что-то не так с кодировками? Я проверял под linux - выводит в cp866. $1 выводит, если не использовать $match = eval "$match", или использовать, но с одинарными кавычками. |
|||
|
||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 17 Всего: 18 |
||||
|
||||
worsvch |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 23.4.2009 Репутация: нет Всего: нет |
С кодировками никаких проблем, в консоли все на русском языке выходит. Я имел ввиду, что вместо данных из xml файла выходит $1. Перепроверю код еще раз, может чего не усмотрел Добавлено через 4 минуты и 44 секунды
Вот Вам смешно ![]() |
|||
|
||||
DaemonSuw |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 11.3.2008 Репутация: 3 Всего: 3 |
parseStr($klassf[$y],$1,$tags[$y]); откуда берется переменная $1?
|
|||
|
||||
worsvch |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 23.4.2009 Репутация: нет Всего: нет |
if ($str[$x] =~ m/<$var>(\W+)<\/$var>/) - переменная $1 - берется из этого шаблона, по идее она должна быть равна следующим значениям, выдранным из xml-файла: Иванов Иван 23 |
|||
|
||||
KSURi |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
$1 - лексическая переменная, со всеми вытекающими
-------------------- Died at Life.pl line 21 |
|||
|
||||
worsvch |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 23.4.2009 Репутация: нет Всего: нет |
Что это означает? ![]() |
|||
|
||||
shurf |
|
|||
Просто программист Профиль Группа: Участник Сообщений: 12 Регистрация: 19.7.2007 Где: Чернигов Репутация: нет Всего: нет |
Раз выводится $1, значит не работал eval. eval "$match" или eval $match возвращает значение выражения, хранящегося в переменной $match. В данном случае eval должен вернуть значение переменной $1 eval '$match' или eval{$match} возвращает значение переменной $match То есть строку '$1'. У меня код работает правильно. Я проверял под Linux, perl v5.8.8 PS Попробуй отключить режим strict, как предложил gcc |
|||
|
||||
KSURi |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
perldoc perlvar Это сообщение отредактировал(а) KSURi - 3.6.2009, 09:11 -------------------- Died at Life.pl line 21 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |