copyしてから元のfile sizeを0にtruncateしているのであって、move してるわけじゃないから元のfile のinode変わらないので、kill -HUPしなくていいはず。してもいいけど。

use strict;
use warnings;

my $logfile = "/var/log/a.log";
my $maxcycle = 4;
foreach my $c (1..$maxcycle) {
        my $i = $maxcycle - $c;
        my $oldfile = $i ? "$logfile.$i" : $logfile;
        my $newfile = join ".", $logfile, $i+1;
        print "$oldfile $newfile\n";
}
__END__
/var/log/a.log.3 -> /var/log/a.log.4
/var/log/a.log.2 -> /var/log/a.log.3
/var/log/a.log.1 -> /var/log/a.log.2
/var/log/a.log -> /var/log/a.log.1
sub _rotate
{
    my $self = shift @_;
    my $logfile = shift @_;
    my $logsize = shift @_;
    my $logmax  = shift @_;

    if((-s $logfile) <= $logsize) {
       return;
    }

    foreach my $c (1..$logmax) {
        my $i = $logmax - $c;
        my $oldfile = $i ? "$logfile.$i" : $logfile;
        my $newfile = join ".", $logfile, $i+1;
        rename $oldfile, $newfile;
        # inode変わるとデーモンの場合ファイルを開き直す必要がある。。
        # File::Rotateのようにファイルサイズ0にするべき?
    }
}