別に色んなところですでにあると思うんだけど、仕事で書いたのでとりあえずさらしておく。FTPでディレクトリ毎全部アップロードするスクリプト。

  #!/usr/bin/perl
  use strict;
  use Net::FTP;
  use File::Spec;

  sub upload
  {
    my $ftp = shift;
    my $local_root = shift;
    my $remote_root = shift || '/';

    recursive_upload($ftp, $local_root, $remote_root);
  }

  sub recursive_upload
  {
    my $ftp = shift;
    my $local_root = shift;
    my $remote_root = shift;

    local *LOCAL_DIR;

    opendir(LOCAL_DIR, $local_root) or
      die "Could not open directory $local_root for reading: $!";

    while (my $e = readdir(LOCAL_DIR)) {
      next if $e =~ /^\.+$/;

      my $local  = File::Spec->catfile($local_root, $e);
      my $remote = File::Spec->catfile($remote_root, $e);

      stat($local);
      if (-f _) {
        $ftp->put($local, $remote);
      } elsif (-d _) {
        $ftp->mkdir($remote, 1);
        recursive_upload($ftp, $local, $remote);
      }
    }
  }

  my $ftp = Net::FTP->new('### HOST ADDRESS ###');
  $ftp->login('### user ###', '### password ###');
  $ftp->binary();

  upload($ftp, shift @ARGV, shift @ARGV);

こんな感じでね。

  ./ftp.pl local_directory remote_directory

scpとか使えない環境でftpアップロードを自動化する時に。