LINUX.ORG.RU

perl, switch, argv

 ,


0

1

Наткнулся на странное про switch в перле и ARGV. Вот простой код.

#!/usr/bin/perl
use strict;
use warnings;
use Switch;
my $rr='bb';
if (exists ($ARGV{-m}))
{
  switch ($rr) {
    case "bb" { print "bb"; }
    else { print "xx"; }
  }
}

Ругается


String found where operator expected at ./zz.pl line 9, near «case „bb“»
(Do you need to predeclare case?)
syntax error at ./zz.pl line 8, near ") {"
syntax error at ./zz.pl line 11, near «}»
Execution of ./zz.pl aborted due to compilation errors.


При этом если

#!/usr/bin/perl
use strict;
use warnings;
my $rr='bb';
if (exists ($ARGV{-m}))
{
  use Switch;
  switch ($rr) {
    case "bb" { print "bb"; }
    else { print "xx"; }
  }
}

То вообще ничего не выводит (??!!)
А если
#!/usr/bin/perl
use strict;
use warnings;
use Switch;
my $rr='bb';
  switch ($rr) {
    case "bb" { print "bb"; }
    else { print "xx"; }
  }

То работает как надо.
Где я туплю??

★★★★★

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

Смотри раздел BUGS в доке Switch. Он использует сурс фильтры, так что весьма хрупкий и не рекомендуется к использованию. Посмотри лучше given/when.

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

Сочувствую, вообще-то посыл был обратный - это галимый недоязычок в который базовые (в других языках) конструкции приходится встраивать фильтрами, которые ломаются на допустимых конструкциях языка (но которые в нормальном языке никогда не были бы допустимыми, потому что литералы принято обозначать явно).

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

Спасибо, уже перешёл на given. Switch и правда оказался удивительным глюкалом

svu ★★★★★ ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.