The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
use strict;
use warnings;
use Net::Amazon::MechanicalTurk;
use Net::Amazon::MechanicalTurk::RowData;

#
# This sample reads the results file and Rejects any rows
# in the file which have a Reject column with an X in it.
#
# This sample demonstrates:
#
# 1. Using the RowData class to iterate through a delimited file.
# 2. Rejecting assignments.
# 3. How to examine the error code from a failed call.
#
# Note: RowData may be used on csv or tab delimited files.
#   The rows are iterated over in the code below, the contents of
#   the file is not read completely into memory.
#

my $mturk = Net::Amazon::MechanicalTurk->new;
my $data  = Net::Amazon::MechanicalTurk::RowData->toRowData("loadhits-results.csv");

$data->each(sub {
    my ($data, $row) = @_;
    my $assignmentId = $row->{AssignmentId};
    # Reject any records that have a reject column with an X in it
    if (exists $row->{Reject} and lc($row->{Reject}) eq 'x') {
        print "Rejecting assignment $assignmentId\n";
        eval {
            $mturk->RejectAssignment( AssignmentId => $assignmentId );
        };
        if ($@) {
            if ($mturk->response->errorCode eq "AWS.MechanicalTurk.InvalidAssignmentState") {
                print "Assignment $assignmentId has already been processed.\n";
            }
            else {
                die $@;
            }
        }
    }
});