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

Поиск:

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


Бывалый
*


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

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



Цитата(worsvch @  2.6.2009,  17:47 Найти цитируемый пост)
Вот Вам смешно smile А вот хотелось бы увидеть Ваш совет или даже лучше образец кода, как совет человека продвинутого в программировании на языке perl. 


Мой совет - полностью исключить использование глобальных переменных всех видов, пока не научитесь писать без них.
eval "lalala" тоже. И выставляя скрипт, писать что он должен сделать.

Вот критика исходной программы, может быть поможет:
Цитата(worsvch @  28.5.2009,  09:02 Найти цитируемый пост)
#!/perl -w

use strict;
use Encode qw(from_to);

system('cls'); 
идеологически неправильно. Лучше вызывать cls && perl -w script.pl - эффект тот же

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

Переменные объявлены до функции. С одной стороны они для неё доступны как глобальные, с другой стороны они доступны как замыкания, что может породить неожиданные эффекты.

sub parseStr {
    my $klsf = shift(@_); 
Запись my $var=shift; является устоявшейся и более понятной.
    my $match = shift(@_); 
    my $var = shift(@_);
    if ($str[$x] =~ m/<$var>(\W+)<\/$var>/) {    
Что-то мне подсказывает, что Вы хотели использовать $1, но не использовали. Или ниже именно отсюда?
       from_to($klsf,"cp1251","cp866");
       print "$klsf: $match\n";
Совет: для отладки использовать warn, или даже что-тоиз Carp - в больших скриптах будет удобнее.
    }
    elsif ($str[$x] =~ m/<$var>(\d+)<\/$var>/) {    
       from_to($klsf,"cp1251","cp866");
       print "$klsf: $match\n";
    }        
Не понятен результат, который Вы получаете - перекодировка и print всегда при совпадениях, возможно тут ошибка.
}

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]);
Что тут делает $1 ? Может быть, предполагалось использовать её из регекспа в parseStr?
       }
       $x++;       
 }
close XML;


PM MAIL   Вверх
DaemonSuw
Дата 3.6.2009, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

\w  Match "word" character (alphanumeric plus "_")
\W  Match non-word character

$1 - лучше заменить на объявленную переменную так как

Код

sub hello_world
{
  'string' =~ /(.+)/;
  print $1,$/;
}

hello_world;
print $1||'<undef>',$/


Цитата

string
<undef>


Это сообщение отредактировал(а) DaemonSuw - 3.6.2009, 15:32
PM MAIL ICQ   Вверх
worsvch
Дата 4.6.2009, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всё, всем спасибо. Заработало:

Код

#!/perl -w

use strict;
use Encode qw(from_to);

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: $1\n";
    }
    elsif ($str[$x] =~ m/<$var>(\d+)<\/$var>/) {    
       from_to($klsf,"cp1251","cp866");
       print "$klsf: $1\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;


Это сообщение отредактировал(а) worsvch - 4.6.2009, 12:43
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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