#!/usr/bin/env perl use strict; use warnings; use Tie::File; my $file = 'pm_file_insert_re.file'; my $re = qr{ \A echo .* install_list \z }x; my $insert_line = 'echo ":app:new-name-here:" >> /mnt/install_list'; tie my @lines, 'Tie::File', $file or die "Can't tie $file: $!"; my $last_found = 0; @lines = reverse map { /$re/ && ! $last_found++ ? ($insert_line, $_) : $_ } reverse @lines; untie @lines;