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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Новичек: В чем моя ошибка? в чем же я не прав в скрипте 
:(
    Опции темы
Mikhail0s
Дата 15.7.2005, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Пишу для себя скрипт, который достает необходимую мне информацию из файлов програмы собирающую разнообразные характеристики компьютеров в локальной сети (програма Everest). Файлы длиной порядка 2000 строк.
Проблема возникает при отработке такой части скрипта:

sub getSoftwareInstalled {
$audit_data_file_name = $_[0]; #<-имя обрабатываемого файла
open (AUDIT_DATA_FILE, "$audit_data_file_name") or die ("Error:$!"); #<-открываю поток
while (my $line = <AUDIT_DATA_FILE>) {
if ($line =~ m/^ProductName=(.+)/i){ #<-То, что мне необходимо
push (@software_items, $1); #<-Отправляю в массив
}
}
foreach $software_item (@software_items){print $software_item, "\n";} #<-!!!ОШИБКА ЗДЕСЬ***
}

При выводе perl в том числе, среди выводимых строк (правильных) выдает:

[cut]
Ad-aware 6 Personal
Use of uninitialized value in print at C:\Perl\SCRIPS\audir_data\audit_data_alt.pl line 49, <AUDIT_DATA_FILE> line 4292.
Canon CAPT printers
[cut]

Когда прохожу debug'ом - всё ок - каждый элемент массива заполнен значением. Если перед print поставить spleep (1); (да, да, я не програмист, как умею, так и делаю), то всё выводится без этой ошибки.

Соответственно прошу, по возможности, не дать дураком умереть...

PS. Activestate. W2k3 (XP).
PM MAIL   Вверх
sharq
Дата 16.7.2005, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


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

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



Mikhail0s если файл открыл, не забудь его закрыть! используй use strict и проблем не будет.
Вот отлаженный пример:
Код
use strict;

my $audit_data_file_name = "test.txt";

my (@software_items);

open FILE, $audit_data_file_name or die "Error:$!";

while (my $line = <FILE>) {
    push @software_items, $1 if ($line =~ m/^ProductName=(.+)/i);
}
close FILE;


print $_, "\n" foreach (@software_items);


smile

Это сообщение отредактировал(а) sharq - 16.7.2005, 00:55


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
korob2001
Дата 16.7.2005, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



М
 

Товарищи!
Пожалуйста, пользуйтесь кнопкой "КОД", для подсветки и сохранения его форматирования. Если влом нажимать кнопку "КОД", тогда пишите теги кода ручками.
От этого будет легче жить не только тем, кто вам помогает, но и вам самим.
Спасибо.


Это сообщение отредактировал(а) korob2001 - 16.7.2005, 01:00


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Mikhail0s
Дата 16.7.2005, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да, конечно, я использую и strict и warnings. Но закрытие потока, как я проверил - не решает эту проблему (к сожалению). Как я выяснил - это проблема Activestate Komodo. Из командной строки нет никаких ошибок. Ни на win ни на bsd.
Буду писать им багрепорт - дором, чтоли я у них ide увёл smile

Всем большое спасибо.
PM MAIL   Вверх
korob2001
Дата 16.7.2005, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



А зачем создаёшь второй цикл, он же у тебя просто выводит записи, которые ты отобрал в первом цикле? Попробуй вместо того, что бы забивать массив теми записями, которые соответствуют шаблону, выводить сразу их в STDUOT, т.е. :
Код

use strict;

my $audit_data_file_name = "test.txt";

open FILE, $audit_data_file_name or die "Error:$!";

while (<FILE>) {
    print "$1\n" if /^ProductName=(.+)/i;
}

close FILE;


Удачи.

Это сообщение отредактировал(а) korob2001 - 16.7.2005, 11:41


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Mikhail0s
Дата 16.7.2005, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


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

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


 




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


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

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