This page is for tips and tricks when working with Geo::GDAL.
First few lines
You should probably use Perlbrew and the latest Perl.
#!/usr/bin/env perl
use strict;
use v5.10;
use Geo::GDAL;
GDAL style progress function in Perl
# call this somewhere early:
$|++; # flush print right away for one line progress
sub progress {
    state $s = -1; # requires 'use v5.10;'
    my $p = int($_[0]*100);
    return 1 if $p == $s;
    $s = 0 if $s < 0;
    while ($s < $p) {
        print $s%10 == 0 ? $s : ($s%2 == 0 ? '.' : '');
        ++$s;
    }
    return 1;
}
Note: this will not catch Ctrl-C (SIGINT). For that you could cook up something like the following.
$SIG{'INT'} = progress('Return 0 next time!');
# modify progress to understand the above
Get the raster coordinates in iteration
my $transform = $raster->GeoTransform;
my ($xoff, $yoff, $w, $h) = (0, 0, 200, 200);
$|++;
while (1) {
    progress($yoff/$H);
    if ($xoff >= $W) {
        $xoff = 0;
        $yoff += $h;
        last if $yoff >= $H;
    }
    my $data = $raster->Band(1)->ReadTile($xoff, $yoff, min($W-$xoff, $w), min($H-$yoff, $h));
    for my $y (0..$#$data) {
        for my $x (0..$#{$data->[$y]}) {
            my ($px, $py) = $transform->Apply([$xoff+$x], [$yoff+$y]);
                     GeometryType => 'Point',
                     Points => [$px->[0], $py->[0]])});
        }
    }
    $xoff += $w;
}
sub min {
    return $_[0] < $_[1] ? $_[0] : $_[1];
}