in reply to deleting a non-numeric scalar within array

I agree with Generoso and sundialsvc4 on the use of grep. Although, I would use the BLOCK form of grep in keeping with PBP Chapter 8, "Always use a block with a map and grep." Like this:

use strict; use warnings; open my $fh, '<', 'hosts' or die; my @hosts = <$fh>; close $fh; my @new_hosts = grep { !/$ARGV[0]/ } @hosts; print "\nnew_hosts:\n"; print join "", @new_hosts;

However, this does not address your desire to print the excluded lines. For that, you could do this:

use strict; use warnings; open my $fh, '<', 'hosts' or die; my @hosts = <$fh>; close $fh; print "Excluding these lines:\n"; my @new_hosts = grep { print $_ if /$ARGV[0]/; !/$ARGV[0]/} @hosts; print "\nThe new array:\n"; print join "", @new_hosts;

But at that point, maybe your for loop might be clearer.