Calling awk in backticks from perl is a pretty nasty thing to do. perl replicates pretty much all the same functionality - all you do is introduce additional overhead, inefficiency and quoting problems (like you've got in your example).
Why not instead:
open ( my $input, '<', 'data.txt' ) or die $!;
my ($record) = grep { (split /[:;]/)[0] eq 'Amy' } <$input>;
This replicates what you're doing, but you could instead do something altogether more elegant like:
my %person;
while ( <$input> ) {
chomp;
my ( $name, @fields ) = split /[;:]/;
$person{$name} = \@fields;
}
And then:
print join " ", @{$person{'Amy'}},"\n";
my ($record) = map scalar(qx($_)), q(awk -F'[:;]' '$1 == "Amy"' data.txt);