Es que te falta, justamente, un read(). El módulo debe saber a qué fichero
crontab te estás refiriendo: si al del usuario (con
crontab -l), o un fichero aparte. Si no indicas ninguno, entonces está creando un fichero nuevo cada vez.
Por ejemplo, con el siguiente ejemplo, se puede cambiar un fichero
crontab. Y cada vez que lo ejecutas, se agrega un bloque más. Eso es porque primero se lee el fichero actual.
Using perl Syntax Highlighting
#!/usr/bin/perl
use Config::Crontab;
my $ct = new Config::Crontab;
$ct->read(-file => 'cron.txt'); # Leemos el crontab actual
$ct->write('cron.bak'); # Grabamos una copia del estado actual
my $block = Config::Crontab::Block->new;
$block->last( new Config::Crontab::Comment( -data => '## Envio' ) );
$block->last( new Config::Crontab::Env ( -name => 'ENVIO', -value => 'sitedata' ) );
$block->last( new Config::Crontab::Event ( -minute => 40,
-hour => 3,
-command => "wget 'url.com'",
)
);
$ct->last($block); # Añadimos el bloque
$ct->write('cron.txt'); # Sacamos una copia del estado final
Si, en lugar de querer modificar un fichero, queremos que se modifique el crontab del usuario, solo tienes que modificar el read() y el write(), quitándoles los argumentos.