ignik (ignik) wrote in ru_perl,
ignik
ignik
ru_perl

вот как бывает:

#!/usr/bin/perl -w
use strict;

print ";-)\n" if "foo" =~ //;
"bar" =~ /bar/;
print ":-(\n" if "foo" =~ //;
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 19 comments
Баг? Или я не понимаю?
Видимо, имеется в виду стиль кода.
нет, имеется ввиду достаточно сумрачное поведение m/$pattern/ при $pattern внезапно оказывашимся равным пустой строке.
багофича. очень опасная.

man perlop:
If the PATTERN evaluates to the empty string, the last successfully matched regular expression is used instead. ...
If no match has previously succeeded, this will (silently) act instead as a genuine empty pattern (which will always match).
ась?

Bareword "bar" not allowed while "strict subs" in use at t.pl line 5.
Execution of t.pl aborted due to compilation errors.

ignik

June 20 2017, 15:11:34 UTC 1 year ago Edited:  June 20 2017, 15:11:51 UTC

Я закопипастил, какой смысл рожать `#!/usr/bin/env perl` - всегда найдётся к-л извращенец у которого #!/opt/perl-5.18.2/bin/perl или вааще мастдайка...

Достаточно в консоли запустить perl и выполнить эти три строки - приводит к некоторой задумчивости (хотя в чистом виде ответ найти быстро). А вот в коде как-то не очень ожидаешь, что отработавший наверху /$pattern/ не всегда будет работать десятью строчками ниже ;-)
так и я закопипастил.

ну и три строки -- это совсем не то же самое, что пять строк.
И вот тут я готов согласиться с Гвидо - явное лучше неявного.
это почему так?
ну чтобы вопросы по языку на собеседовании задавать ;-)
Вот ещё для садистов на собеседовании, объяснить вывод скрипта:

#! /usr/bin/perl
use warnings;
use strict;
use 5.10.0;
for (1 .. 2) {
my $i = $_ if 0;
say $i //= $_ + 2;
}
Ну это таки пример, как писать не надо, всё же вынимать переменную из мусорного контекста несколько неосмотрительно. Я бы для завала студента заменил бы $i на $a и добавил перед for что-то на тему my $a=2; а для прикола ещё бы и цикл сделал до $a после чего бы сам бы точно не стал объяснять "какая херня творится и почему она такая". Ибо by histerical reasons!
О том, что $a является предопределённой статической переменной, знает гораздо больше людей, чем о вот таком способе создания статической переменной $i изнутри блока и без каких-либо предупреждений. А если таким образом создать объект, то его деструктор выполнится только при завершении всего скрипта, а не при выходе из scope.

Вот ещё пример на области видимости и неявные определения переменных, вгоняющий в ступор особенно тех, кто привык к C (но тут поведение documented, в отличие от "my $i = 1 if 0"):

my $i = 1;
foreach $i (2, 3) {
my $j = $i;
}
say $i;
Ну да конечно, а ты попробуй, будешь внезапно удивлён ;-)

gul_kiev

1 year ago

ignik

1 year ago

gul_kiev

1 year ago

gul_kiev

1 year ago

стремная фича. польза сомнительная, а грабли можно разложить знатные, и ищи потом...
по ссылке обсуждается почему в perl6 это надо отменить.
perl6 . org/archive/rfc/144.html

p.s.: а нельзя ли выключить вот это вот отмечание комментариев как подозрительные из-за ссылок?