Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Perl: Общие вопросы > Не могу найти как исправить |
Автор: worsvch 28.5.2009, 09:02 |
#!/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> Все файлы тестовые но скоро придется делать скрипт для настоящих, поэтому и прошу вас помочь разобраться |
Автор: amg 28.5.2009, 09:41 | ||
Ой, лень разбираться, но в в подобных случаях лучше использовать хэш, а не массивы. Вкратце, так:
|
Автор: shurf 28.5.2009, 09:59 | ||
Ага, а я разобрался в этом коде. Вот так работает:
Вторым параметром parseStr надо передавать не переменную, строку. А потом эту строку выполнять как выражение с помощью eval |
Автор: worsvch 1.6.2009, 08:28 | ||
Я попробовал сделать как Вы сказали, вместо данных, во всех строках выходит $1. А с eval делал, вообще какая-то чушь выходит. Может делал чего неправильно? ![]() |
Автор: mvsgt 1.6.2009, 09:56 |
Переписывайте скрипт целиком. Работать в реальной системе он не будет. Например, parseStr($klassf[$y],$1,$tags[$y]); - очень странная строка, столько ошибок может породить... Вообще XML лучше парсить стандартными средствами. $match = eval "$match"; - это вообще перл... |
Автор: gcc 1.6.2009, 13:48 | ||
|
Автор: shamber 1.6.2009, 23:28 |
я думаю, тут перл совсем не язык программирования ![]() |
Автор: worsvch 2.6.2009, 17:47 | ||||||
С кодировками никаких проблем, в консоли все на русском языке выходит. Я имел ввиду, что вместо данных из xml файла выходит $1. Перепроверю код еще раз, может чего не усмотрел Добавлено через 4 минуты и 44 секунды
Вот Вам смешно ![]() |
Автор: DaemonSuw 2.6.2009, 19:06 |
parseStr($klassf[$y],$1,$tags[$y]); откуда берется переменная $1? |
Автор: worsvch 2.6.2009, 19:13 | ||
if ($str[$x] =~ m/<$var>(\W+)<\/$var>/) - переменная $1 - берется из этого шаблона, по идее она должна быть равна следующим значениям, выдранным из xml-файла: Иванов Иван 23 |
Автор: KSURi 2.6.2009, 19:55 |
$1 - лексическая переменная, со всеми вытекающими |
Автор: worsvch 2.6.2009, 20:13 | ||
Что это означает? ![]() |
Автор: shurf 2.6.2009, 23:46 | ||
Раз выводится $1, значит не работал eval. eval "$match" или eval $match возвращает значение выражения, хранящегося в переменной $match. В данном случае eval должен вернуть значение переменной $1 eval '$match' или eval{$match} возвращает значение переменной $match То есть строку '$1'. У меня код работает правильно. Я проверял под Linux, perl v5.8.8 PS Попробуй отключить режим strict, как предложил gcc |
Автор: KSURi 3.6.2009, 09:10 | ||
perldoc perlvar |
Автор: mvsgt 3.6.2009, 13:36 | ||||
Мой совет - полностью исключить использование глобальных переменных всех видов, пока не научитесь писать без них. eval "lalala" тоже. И выставляя скрипт, писать что он должен сделать. Вот критика исходной программы, может быть поможет:
|
Автор: DaemonSuw 3.6.2009, 15:30 | ||||||
$1 - лучше заменить на объявленную переменную так как
|
Автор: worsvch 4.6.2009, 12:33 | ||
Всё, всем спасибо. Заработало:
|