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


Автор: Gandhi 21.2.2011, 23:42
Пытаюсь восстановить из книги перл 24 часа, копия мне досталась плохо распознали и теперь приходится мучаться..

Исходный текст программы Customer:

Код

#!/usr/bin/perl -w

open (PH, "customers.txt") or die "Ошибка при открытии customers.txt: $!\n";
while (<PH>) {
chomp;
($number, $email)=(split(/\s+/, $_))[1, 2];
$Email {'$email'}='$_';
$Phone {'$number'}='$_';
}
close(PH);

print "Для выхода из программы введите 'q'\n"; 
while (1) {
print "\nНомер?";
$number=<STDIN>; chomp($number);
$address="";
if (! $number ) {
print "Email?";
$address=<STDIN>; chomp($address);
}
}
next if (! $number and ! $address);
last if ($number eq 'q' or $address eq 'q');

if ($number and exists $Phone{number} ) {
print "Заказчик: $Phone{$number}\n";
next;
}

if ($address and exists $Email{$address})  {
print "Заказчик: $Email{$address}\n";
next;
} {
print "Заказчик не найден.\n";
next;
}
print "\nПрограмма завершена.\n";


также содержимое файла customer.txt

Smith,John    (248)-555-9430 [email protected]
Hunter,Apryl    (810)-555-3029 [email protected]
Stewart,Pat    (405}-555-8710 [email protected]
Ching,Iris    (305)-555-0919 [email protected]
Doe,John    (212)-555-0912 [email protected]
Jones,Tom    (312)-555-3321 [email protected]
Smith,John    (607)-555-0023 [email protected]
Crosby,Dave    (405)-555-1516 [email protected]
Johns,Pan    (313J-555-6790 [email protected]
Jeter,Linda    (810)-555-8761 [email protected]
Garland,Judy    (305)-555-1231 [email protected]


и Вот как должно работать:
Код

Для выхода нз программы введите ' q '
Номер? <Enter>
E-Mail? [email protected]
Заказчик: Crosby, Dave (405)-555-1516 [email protected]

Номер? (305)-555-0919
Заказчик: Ching, Iris (305)-555-0919  [email protected]

Номер? q

Программа завершена.




у меня не работает.. не пойму где что не так, выдает что на 6 строке.. не ясно :(

Автор: Jimy 22.2.2011, 00:35
в строках 7,8 одинарные кавычки явно лишние.

Автор: Gandhi 22.2.2011, 21:03
пробовал их убрать, вот что выходит:

Код

Use of uninitialized value $email in hash element at customer line 7, <PH> line 12.
Use of uninitialized value $number in hash element at customer line 8, <PH> line 12.



когда пытаюсь ввести чей то номер для поиска или email то ничего не происходит! а 
Код

q


тоже не работает

Автор: alezzz 23.2.2011, 10:32
Цитата(Gandhi @  22.2.2011,  21:03 Найти цитируемый пост)
Use of uninitialized value $email in hash element at customer line 7, <PH> line 12.

не получает $email и $phone тут: 
Код

($number, $email)=(split(/\s+/, $_))[1, 2];

проверяйте customers.txt
Цитата(Gandhi @  22.2.2011,  21:03 Найти цитируемый пост)
когда пытаюсь ввести чей то номер для поиска или email то ничего не происходит! 

где-то лишняя "}", next и last стоят за циклом while.

Автор: Gandhi 24.2.2011, 09:10
Код

#!/usr/bin/perl -w

open (PH, "customers.txt") or die "Ошибка при открытии customers.txt: $!\n";
while(<PH>) {
chomp; 
($number, $email)=(split(/\s+/, $_))[1, 2];
$Email {$email}=$_;
$Phone {$number}=$_;
}
close(PH);

print "Для выхода из программы введите 'q'\n"; 
while (1) {
print "\nНомер?";
$number=<STDIN>; chomp($number);
$address="";
if (! $number ) {
print "Email?";
$address=<STDIN>; chomp($address);
}

next if (! $number and ! $address);
last if ($number eq 'q' or $address eq 'q');

if ($number and exists $Phone{number} ) {
print "Заказчик: $Phone{$number}\n";
next;
}

if ($address and exists $Email{$address})  {
print "Заказчик: $Email{$address}\n";
next;
}
print "Заказчик не найден.\n";
next;
}
print "\nПрограмма завершена.\n";



фигурные скобки переставил, теперь программа завершается при нажатии на q, но по прежнему не может осуществить поиск

Код

Use of uninitialized value $email in hash element at customer line 7, <PH> line 12.

Use of uninitialized value $number in hash element at customer line 8, <PH> line 12.

Автор: alezzz 24.2.2011, 10:13
Последняя строка в customers.txt пустая, ничего страшного, проблема не в этом. Проблема в буферизации вывода:
Код

#!/usr/bin/perl -w
$| = 1;
open (PH, "customers.txt") or die "Ошибка при открытии customers.txt: $!\n";
...
и т.д.


и ошибка в 25 строке:
Код

if ($number and exists $Phone{$number} ) {


Автор: Gandhi 24.2.2011, 22:30
Код

#!/usr/bin/perl -w
$| = 1;
open (PH, "customers.txt") or die "Ошибка при открытии customers.txt: $!\n";
while(<PH>) {
chomp; 
($number, $email)=(split(/\s+/, $_))[1, 2];
$Email {$email}=$_;
$Phone {$number}=$_;
}
close(PH);
print "Для выхода из программы введите 'q'\n"; 
while (1) {
print "\nНомер?";
$number=<STDIN>; chomp($number);
$address="";
if (! $number ) {
print "Email?";
$address=<STDIN>; chomp($address);
}
next if (! $number and ! $address);
last if ($number eq 'q' or $address eq 'q');
if ($number and exists $Phone{number} ) {
print "Заказчик: $Phone{$number}\n";
next;
}
if ($address and exists $Email{$address})  {
print "Заказчик: $Email{$address}\n";
next;
}
print "Заказчик не найден.\n";
next;
}
print "\nПрограмма завершена.\n";


исправил так, но всеравно не работает

Автор: alezzz 24.2.2011, 22:47
что именно не работает? я попробовал запустить, все работает

Автор: Gandhi 26.2.2011, 00:07
когда пробую поиск по номеру или email то пишет заказчик не найден
 
при запросе номера например набираю:
Код

(248)-555-9430


а почты:
Код

[email protected]


и заказчик не найден

а у вас как работает?

Автор: alezzz 26.2.2011, 10:43
работает:
Цитата

Для выхода из программы введите 'q'

Номер?(248)-555-9430
Заказчик: Smith,John    (248)-555-9430 [email protected]

Номер[email protected]
Заказчик не найден.

Номер?1212
Заказчик не найден.

Номер?
Email?ertyrty
Заказчик не найден.

Номер?
Email?

Номер?q

Программа завершена.

Вот ваша программа:
Код

#!/usr/bin/perl -w
$| = 1;
open (PH, "customers.txt") or die "Ошибка при открытии customers.txt: $!\n";
while(<PH>) {
    chomp;
    ($number, $email)=(split(/\s+/, $_))[1, 2];
    $Email {$email}=$_;
    $Phone {$number}=$_;
}
close(PH);
print "Для выхода из программы введите 'q'\n";
while (1) {
    print "\nНомер?";
    $number=<STDIN>; chomp($number);
    $address="";
    if (! $number ) {
        print "Email?";
        $address=<STDIN>; chomp($address);
    }
    next if (! $number and ! $address);
    last if ($number eq 'q' or $address eq 'q');
    if ($number and exists $Phone{$number} ) {
        print "Заказчик: $Phone{$number}\n";
        next;
    }
    if ($address and exists $Email{$address})  {
        print "Заказчик: $Email{$address}\n";
        next;
    }
    print "Заказчик не найден.\n";
    next;
}
print "\nПрограмма завершена.\n";


Автор: Gandhi 26.2.2011, 11:39
 smile  всеравно никак...

в таком случае может быть я неверно сделал txt файл?

я создал файл с расширением txt  и названием customers:

Smith,John (248)-555-9430 [email protected]

Hunter,Apryl (810)-555-3029 [email protected]

Stewart,Pat (405}-555-8710 [email protected]

Ching,Iris (305)-555-0919 [email protected]

Doe,John (212)-555-0912 [email protected]

Jones,Tom (312)-555-3321 [email protected]

Smith,John (607)-555-0023 [email protected]

Crosby,Dave (405)-555-1516 [email protected]

Johns,Pan (313J-555-6790 [email protected]

Jeter,Linda (810)-555-8761 [email protected]

Garland,Judy (305)-555-1231 [email protected]

верно?

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