While you can do this with a regex it wouldn't be as easy to maintain as an unrolled version using
split and
printf.
Contrast this:
use strict;
use warnings;
$/ = undef;
my $data = <DATA>;
$data =~ s{^(.*?)\|}{sprintf '%-45s', $1}meg;
print $data;
__DATA__
ABCDEFGHIJKLMNOPQRST|1234
ABCDEFGHI|12345
ABCDE|1234
ABCDEFGHIJKL|123
ABCDEFG|123456
ABCDEFGHIJKLMNO|12
With:
use strict;
use warnings;
while (my $line = <DATA>) {
my ($lhs,$rhs) = split /\|/, $line, 2;
printf "%-45s%s", $lhs,$rhs;
}
__DATA__
ABCDEFGHIJKLMNOPQRST|1234
ABCDEFGHI|12345
ABCDE|1234
ABCDEFGHIJKL|123
ABCDEFG|123456
ABCDEFGHIJKLMNO|12