0..$$#user seems to go far higher than I'm expecting
I think you're looking for just
0 .. $#$user
As a side note/excercise, try Dumper'ing out the results if you change it to be:
my $users = $db_ref->selectall_arrayref("SELECT last_name, first_name
+from user", {Slice=>{}}) or die "$!\n";
You might prefer (hash keys are much more meaningful to read than array indices) the way this then looks:
printf "%s, %s\n", $user->[$_]->{last_name}, $user->[$_]->{first_name}
+ for 0..5;
printf "%s, %s\n", @{$user->[$_]}{ qw/last_name first_name/ } for 0..5
+; # using a hash slice
# or, if going through all rows:
printf "%s, %s\n", $_->{last_name}, $_->{first_name} for @$user;
printf "%s, %s\n", @{$_}{ qw/last_name first_name/ } for @$user;