my $file = shift @ARGV;
if (open my $FH , $file) {
my $start_pattern_found = 0;
while (my $line = <$FH>) {
It's a side note, but I can't understand why you do this. You just want to show the use of a flag, which is a good point. Since the example may very well stay minimal, why not using good old <> instead?
In any case, using the range operator in scalar context may be much easier than maintaining a flag yourself:
while (<>) {
chomp;
next if 1 .. /^internal name/;
print "Found pattern at line $.\n" if /^need this/;
}