The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -W

use strict;
use Fcntl;
use warnings FATAL => qw (all);
use Getopt::Std;
use Net::SSH2;
use 5.010;

my %opts = (h => 'localhost');
getopts('h:u:p:', \%opts);
my ($hostname, $user, $password) = @opts{qw(h u p)};
my $fn = shift // die "filename argument missing";

my $ssh2 = Net::SSH2->new();
sub ssh2_die { die join(': ', @_, join('|', $ssh2->error)) }
$ssh2->debug(1);

$ssh2->connect($hostname)
    or ssh2_die("connect failed");;

$ssh2->auth(username => $user, password => $password)
    or ssh2_die('auth failed');

my $sftp = $ssh2->sftp()
    or ssh2_die("sftp failed");

my $remote = $sftp->open($fn, O_WRONLY | O_CREAT | O_TRUNC);

my $str = 'A' x 327480;
my $bytes = print $remote $str;
say "print returned $bytes, expected " . length($str);