Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Новичек: В чем моя ошибка?


Автор: Mikhail0s 15.7.2005, 21:20
Пишу для себя скрипт, который достает необходимую мне информацию из файлов програмы собирающую разнообразные характеристики компьютеров в локальной сети (програма 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).

Автор: sharq 16.7.2005, 00:42
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

Автор: korob2001 16.7.2005, 00:56
М
 

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

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

Всем большое спасибо.

Автор: korob2001 16.7.2005, 11:37
А зачем создаёшь второй цикл, он же у тебя просто выводит записи, которые ты отобрал в первом цикле? Попробуй вместо того, что бы забивать массив теми записями, которые соответствуют шаблону, выводить сразу их в 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;


Удачи.

Автор: Mikhail0s 16.7.2005, 13:26
Создаю второй цикл для вывода только в целях отладки. Чтобы визуализировать то, что я там напрограммировал.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)