in reply to Modifying Arrays passed by reference to subroutine

You correctly pass an array reference to the function  find_broken_links, but then within the function you stringize the reference
    my $broken_links = ( defined $_[1] ) ? "$_[1]" : return ;
before assigning it to a variable. This renders the reference useless as a reference.

The solution: don't do that:
    my $broken_links = ( defined $_[1] ) ? $_[1] : return ;

In addition, my own personal preference is to separate argument assignment and validation within a function rather than trying to bury them both in a single statement. I feel it leads to more readable and maintainable code.

sub find_broken_links { my ($location, $broken_links, ) = @_; return unless defined($location) and defined($broken_links); ... do stuff ... push @$broken_links, 'stuff'; return; }
Update: BTW, kudos for using strictures and (I hope) warnings.