Все задачи

Генерация конфигурации

15 Oct 2014

Программист написал скрипт для генерации конфигов своего приложения из шаблона. В случае, если файл конфигурации уже сущестует, скрипт предлагает забекапить старую версию.

И что, вы думаете, из этого получилось?

#!/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);
}

Подсказка

Показать

Новый конфиг генерится.

Подсказка-2

Показать

Предложение забекапить старый конфиг появляется.

Подсказка-3

Показать

Но конфиг не бекапится – независимо от того, какой ответ дать на предложение.

Разоблачение

Показать

Проблема в строчках:

my $choice = <>;
return ($choice eq 'y' ? 1 : 0);

Пользовательский ввод попадает в переменную $choice вместе с финальным переводом строки, поэтому она никогда не совпадает со строкой 'y', и ответ всегда считается отрицательным.

В качестве фикса можно добавить chomp $choice, а еще лучше – пользоваться готовым модулем IO::Prompt.