LINUX.ORG.RU

Switch в perl


0

1

Очень любопытно как работает данный модуль в перл.

use Switch;
while(1){
	print "Enter 1 or 0: ";
	$inn = <>;
	switch($inn){
		case 1 {$num="1";print "$num \n";}
		case 0 {$num="0";print "$num \n";}
		else {print "wrong \n";}
	}
}

если я верно понял и то мой «кривокод» должен по логике выводить 1 или 0 в зависимости от поступающих на вход с консоли значений, но на выход у нас постоянно wrong.

Где я не прав?

★★★★★

Ответ на: комментарий от true_admin

не содержит, дела по перлдок там именно 0 или 1, так именно работает с if конструкция.

sol13 ★★★★★
() автор топика
Ответ на: комментарий от true_admin

теперь увидел, странно.

sol13 ★★★★★
() автор топика
Ответ на: комментарий от AITap

блин вечно чего-то забываю, пошел листать перлдок

sol13 ★★★★★
() автор топика
Ответ на: комментарий от sol13

Да я не предлагаю, я сам тот ещё погромист. Ну просто зачем подключать чего-то, есть же варианты свитч реализовать. С другой стороны в доке написано, что ваш switch больше похож на сишный по поведению.

Hoodoo ★★★★★
()
Ответ на: комментарий от arsi

Ему интерпретатор по идее должен ругнуться. )

Hoodoo ★★★★★
()
Ответ на: комментарий от Hoodoo

просто привык пользоваться чем в С этим же пытаюсь пользоваться в перл, да и код получается понятным =)

sol13 ★★★★★
() автор топика
use Device::SerialPort;
use Switch;
$port = Device::SerialPort->new("/dev/ttyUSB0");

# 9600, 81N on the USB ftdi driver
$port->baudrate(9600);
$port->databits(8);
$port->parity("none");
$port->stopbits(1);
$port->write_settings();
$i=1;
while($i){
	print "Enter 1 or 0: ";
	chomp ($inn = <>);
	switch($inn){
		case 1 {$port->write("1");}
		case 0 {$port->write("0");}
		case "q" {$i=0;}
		else {print "wrong \n";}
	}
}
$port->close;
exit(0);

sol13 ★★★★★
() автор топика
Ответ на: комментарий от Hoodoo

да я это помню. но прост сегодня для примера написал код на коленке и захотелось его разнообразить, сейчас уже добавляю use strict и my к переменным.

sol13 ★★★★★
() автор топика
Ответ на: комментарий от Hoodoo
use Device::SerialPort;
use Switch;
use strict;
use warnings;

my $port = Device::SerialPort->new("/dev/ttyUSB0");

# 9600, 81N on the USB ftdi driver
$port->baudrate(9600);
$port->databits(8);
$port->parity("none");
$port->stopbits(1);
$port->write_settings();
my $i=1;
while($i){
	print "Enter 1 or 0: ";
	chomp (my $inn = <>);
	switch($inn){
		case 1 {$port->write("1");}
		case 0 {$port->write("0");}
		case "q" {$i=0;}
		else {print "wrong \n";}
	}
}
$port->close;
exit(0);

sol13 ★★★★★
() автор топика
Ответ на: комментарий от arsi

да и пока так с ардуиной нормально работает

sol13 ★★★★★
() автор топика
Ответ на: комментарий от sol13

мда… ну ничего, может когда-нибудь и выучишь %)

> print «Enter 1 or 0: »;

либо перевод строки добавь, либо $|=1. иначе оно так и будет в буфере висеть, пока он не заполнится…

arsi ★★★★★
()
Ответ на: комментарий от arsi

спасибо все потихонечку да потихонечку двигаюсь к намеченной цели, главное язык нравиться. Для привязки терминала и записи логов с железяк самое то =)

Да добавил.

sol13 ★★★★★
() автор топика
Ответ на: комментарий от sol13

А всё равно посмотрите какие-нибудь книги с learn.perl.org - в частности в том же beginning Perl, даже при том, что вы уже умеете программировать и вам будет скучно, много внимания уделяется отличию Perl от C. А то будете 'с акцентом' писать.

Ещё отличное развлечение - вооружиться Data::Dumper и почитать perldsc и perllol. Как раз для пятницы занятие.

Hoodoo ★★★★★
()
Ответ на: комментарий от Hoodoo

Спасибо. Займусь на досуге.

sol13 ★★★★★
() автор топика
Ответ на: комментарий от sol13

примерно так оно будет выглядеть на перле 5.10+

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

use Device::SerialPort;

my $port = Device::SerialPort->new('/dev/ttyUSB0');

# 9600, 81N on the USB ftdi driver
$port->baudrate(9600);
$port->databits(8);
$port->parity('none');
$port->stopbits(1);
$port->write_settings();

POLL:
for ($| = 1;;) {
    print 'Enter 1 or 0: ';
    chomp (my $inn = <>);
    given ($inn) {
        $port->write($_)  when [qw/0 1/];
        last POLL         when 'q';
        say 'wrong';
    }
}

arsi ★★★★★
()
Ответ на: комментарий от sol13

> Version : 5.12.3

в 5.12 мало интересного… вот 5.14 очень вкусным обещает быть.

arsi ★★★★★
()
Ответ на: комментарий от sol13

> Страшно, как будем перелезать на другую версию

перл6 — это не другая версия, это другой перл… :(

посижу на пятом до 5.98, а там видно будет ;)

arsi ★★★★★
()

Не юзайте switch. Он использует фильтры исходного кода и может отвалиться в самый неожиданный момент

Deprecated Modules:
Switch
Switch is buggy and should be avoided. You may find Perl's new given/when feature a suitable replacement. See «Switch statements» in perlsyn for more information.

http://search.cpan.org/perldoc?perl5120delta

Olegymous ★★★
()

1) Switch - кривое говно. Использовать только given/when.
2) На perl6 еще дооооолго не придется переходить.

oh
()
Ответ на: комментарий от oh

+0.5 Switch конечно ооочнеь медленный, но етсь нюансы. Не везде есть последний перл и не везде позволяют юзать use Modern::Perl; Так что иногда лучше оставаться на if %)

OxiD ★★★★
()
Ответ на: комментарий от OxiD

> Switch конечно ооочнеь медленный

при компиляции, не в работе. Switch, по сути, препроцессор, заменяющий switch-case конструкции на if-elif-else конструкции. если скрипт часто запускается и мало работает (обработка CGI; find -exec и т.п.), то да, падение скорости будет существенным. но если это какой-то долгоиграющий скрипт (FastCGI; монитор логов…) — падение скорости запуска не критично.

arsi ★★★★★
()
Ответ на: комментарий от OxiD

Чего? Given/when с 12ого, если не с 10ого перла. Modern::Perl тут не при чем

oh
()
Ответ на: комментарий от sol13

Страшно, как будем перелезать на другую версию

А мы не будем перелизать никуда. То что будет нам интересно, будет бакпортиться в пятерочку.

zfsed
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.