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


Автор: Slauta 30.6.2009, 10:47
Вот вопрос. Что может выдавать ошибку 'Terminating on signal SIGINT(2)' при выполнении скрипта:
Код

#!/usr/local/bin/perl
print "Заполните массив...\n";
@massiv = <STDIN>;
print "Введите № строки (от 0): ";
chomp ($stroka = <STDIN>);
print "---------------\n";
print "Число находящаеся на строке №$stroka является - $massiv[$stroka].";

После ввода в @massiv, нажимаю Win+S (По другому никак), открывается браузер а perl выводит ошибку 'Terminating on signal SIGINT(2)'

Точно так же и здесь:
Код

#!/usr/local/bin/perl
print "Введите данные в массив...\n";
@list = <STDIN>;
$reverselist = reverse @list;
print $reverselist;


Я вот подумал, мот это где то в настройках интерпретатора perl?




P.S. Спасибо за уделённое время.

Автор: FishHunter 30.6.2009, 11:25
таки а до каких пор то вводить элементы массива?
правильно тебе пишет INT -  сигнал о нажатии клавиши прерывания на компе.
сделай чтобы сначала вводилось число элементов массива, а потом в цикле от 1 до этого числа каждый элемент
(токо не забудь что первый элемент массива имеет индекс 0)

Автор: Slauta 30.6.2009, 14:12
Цитата(FishHunter @  30.6.2009,  11:25 Найти цитируемый пост)
сделай чтобы сначала вводилось число элементов массива, а потом в цикле от 1 до этого числа каждый элемент

чет немного не догнал,  если посмотреть на второй мой выложеный пример, там всё точна по условию, и она далжна полюбэ наверн работать, но, прога (reverse) поменяв местами первую строку выдает ошибку:

Цитата(Slauta @  30.6.2009,  10:47 Найти цитируемый пост)
'Terminating on signal SIGINT(2)

а поменяв 2 строку прекращается работа программы. 

можно какой нить пример?

Автор: amg 30.6.2009, 14:32
Цитата(Slauta @  30.6.2009,  14:12 Найти цитируемый пост)
если посмотреть на второй мой выложеный пример, там всё точна по условию, и она далжна полюбэ наверн работать
Slauta, вдумайтесь все же в то, что сказал FishHunter и воспользуйтесь его советом. Или можно так:
Код
print "Введите элементы массива через ; ...\n";
@list = split /;/, <STDIN>;
print "@list\n";

Автор: Slauta 30.6.2009, 18:09
Цитата(amg @ 30.6.2009,  14:32)
Цитата(Slauta @  30.6.2009,  14:12 Найти цитируемый пост)
если посмотреть на второй мой выложеный пример, там всё точна по условию, и она далжна полюбэ наверн работать
Slauta, вдумайтесь все же в то, что сказал FishHunter и воспользуйтесь его советом. Или можно так:
Код
print "Введите элементы массива через ; ...\n";
@list = split /;/, <STDIN>;
print "@list\n";

ну с этим понятно...

Я ючусь по книжке, там написан ответ так (второго моего примера)....
Код

print "Введите данные в массив...\n";
@list = <STDIN>;
$reverselist = reverse @list;
print $reverselist;

тютелька в тютельку, но выдаёт ошибку.... Че за хрень???

Автор: DaemonSuw 30.6.2009, 20:27
'Terminating on signal SIGINT(2) - это сигнал посланный вашему приложения вами с клавиатуры... это не ошибка нажмите ctrl+c увидите тоже самое,
можно сделать цикл и проверять ввод

while (<STDIN>)
{
....
last if $_ =~ /__end__/;
}

или можно попробывать обрабатывать сигнал...

Автор: Slauta 1.7.2009, 01:46
А каким тогда нажатием (если не win+s) инецеировать (на винде 7) конец ввода массива с  <STDIT>?

Автор: amg 1.7.2009, 06:20
Цитата(Slauta @  1.7.2009,  01:46 Найти цитируемый пост)
А каким тогда нажатием (если не win+s) инецеировать (на винде 7) конец ввода массива с  <STDIT>?
Ctrl Z

Автор: Slauta 1.7.2009, 11:30
Ctrl+Z у мя не работает!
Блин, придется на переписывать под linux, и каждый раз в неё заходить!

Автор: korob2001 1.7.2009, 11:47
Вообще лучше всего заполнять массив с клавиатуры в бесконечном цикле, при вводе определённой последовательности прерывать его, это как раз и привёлDaemonSuw.
Можно так же перехватить сигнал INT, вот небольшой пример:
Код

#!/usr/bin/perl -w
use strict;
my $count = 0;

# Перехватываем сигнал INT
$SIG{INT} = sub {
    # Делаем, что-то если получили сигнал INT, в данном случае выводим строку и завершаем выполнение программы
    print "Bye, bye...\n";
    exit(0);
};

# Запускаем бесконечный цикл
while (1) {
    print ++$count . "\n";
}

Автор: Slauta 1.7.2009, 20:24
Я не продвинутый программист, я тока учюсь... Этот код я мало понимаю, хоть он и маленький, и описан подробна... У меня проблема другая... В книжке вроде ошибок недолжно быть, однако некоторые скрипты не работают. Это сильно тормозит меня, вот приходится спрашивать на форумах и знающих людей.. :(

Автор: DaemonSuw 1.7.2009, 20:35
Slauta, мы все учимся)...

Суть обработки сигналов - сделать что то до завершения скрипта/получению сигнала... 
Например если вы просто отправите скрипту (допустим вашему) - то он просто завершиться и 
Код

$reverselist = reverse @list;
print $reverselist;

не выполниться...
а если тоже самое сделаете с скриптом korob2001, то получите Bye, bye...
тоесть если вы засуните в 
Код

$SIG{INT} = sub {
  # что вам надо
};


То это обязательно выполниться перед заершением... если только не послать -kill

Автор: Slauta 2.7.2009, 02:17
А чё значит kill? Убойное завершение скрипта или просто ибит скрипт?

Автор: amg 2.7.2009, 05:48
Цитата(Slauta @  1.7.2009,  11:30 Найти цитируемый пост)
Ctrl+Z у мя не работает!
Забыл добавить: Enter, Ctrl+Z и затем еще Enter. Пробовал на WinXP.

Автор: Slauta 2.7.2009, 09:15
Ентер, контрол+z, ентер - заработало! Пасиб...

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