Ловушки Perl
Истории-страшилки про Perl-программиста, с подсказками и разоблачениями
Главная
О блоге
Об авторах
Почему?
rss
@perltrapcom
Программист написал скрипт для генерации конфигов своего приложения из шаблона. В случае, если файл конфигурации уже сущестует, скрипт предлагает забекапить старую версию.
И что, вы думаете, из этого получилось?
#!/usr/bin/perl
use strict;
use warnings;
use File::Slurp;
my $conf_file = "/path/to/app.conf";
my $new_conf = generate_conf();
if (-e $conf_file && confirm("backup old conf?")){
backup_old_conf();
}
write_file($conf_file, {}, $new_conf);
exit;
sub generate_conf
{
my $conf = '';
# ... генерация ...
return $conf;
}
sub backup_old_conf
{
rename($conf_file, $conf_file.".bak") or die "can't backup old conf";
}
sub confirm
{
my $prompt = shift;
print $prompt." [yn]";
my $choice = <>;
return ($choice eq 'y' ? 1 : 0);
}
Новый конфиг генерится.
Предложение забекапить старый конфиг появляется.
Но конфиг не бекапится – независимо от того, какой ответ дать на предложение.
Проблема в строчках:
my $choice = <>;
return ($choice eq 'y' ? 1 : 0);
Пользовательский ввод попадает в переменную $choice
вместе с финальным переводом строки, поэтому
она никогда не совпадает со строкой 'y'
,
и ответ всегда считается отрицательным.
В качестве фикса можно добавить chomp $choice
,
а еще лучше – пользоваться готовым модулем IO::Prompt.