The reason is in what fetchall_arrayref returns. In general an SQL statement car return many columns, so you get array of rows, not an array of values. Each row in turn is an array ref or hash ref depending on how you call fetchrow_arrayref. In your case, you only have one column, and you can use fetchcol_arrayref to obtain that one column's data directly without havning to dereference anything for each row.
Update: I misremembered the existence of a fetchcol_arrayref method. No such method exists; I was thinking of selectcol_arrayref which operates on a dbh, not a sth, and takes a statement as its first argument.