in reply to Re^2: Break a long regex across multiple lines of code, with comments
in thread Break a long regex across multiple lines of code, with comments

Hello davidfilmer,

Here's my demonstrator program, which works properly

It will work properly only as long as you have no more than one configuration/memory/serial_no dataset in the file. As soon as you add a second set, the regex fails:

#! perl use strict; use warnings; my $string = join("\n", <DATA>); # slurp it all into a string with + newlines my ($configuration, $memory, $serial_number) = $string =~ /System Configuration:\s+([\w\s]*?)\n.*Memory size:\s+( +\d+).*Chassis Serial Number\W+(\w+)/s; print "System Configuration: '$configuration'\n", "Memory Size: '$memory'\n", "Serial Number: '$serial_number'\n\n"; __DATA__ ============================ FW Version 1 ============================ System Configuration: Oracle Corporation sun4v SPARC Enterprise T5220 Memory size: 65408 Megabytes Version ------------------------------------------------------------ Sun System Firmware 7.4.7 2014/01/14 18:48 ====================== System PROM revisions ======================= Version ------------------------------------------------------------ OBP 4.33.6.e 2014/01/14 15:19 Chassis Serial Number --------------------- FDL10792DE ============================ FW Version 2 ============================ System Configuration: Oracle Corporation sun4v SPARC Enterprise T5221 Memory size: 65409 Megabytes Version ------------------------------------------------------------ Sun System Firmware 7.4.7 2014/01/14 18:48 ====================== System PROM revisions ======================= Version ------------------------------------------------------------ OBP 4.33.6.e 2014/01/14 15:19 Chassis Serial Number --------------------- abcdefg

Output:

17:45 >perl 1379_SoPW.pl System Configuration: 'Oracle Corporation sun4v SPARC Enterprise T5220 +' Memory Size: '65409' Serial Number: 'abcdefg' 17:45 >

That’s because there are two occurrences of .* in the regex which are greedy, but need to be made non-greedy: .*?

BTW, why don’t you use warnings? Also, why are you adding an extra newline to the end of each line of input data? Simply joining on the empty string would make $string contain the same data as in the file. But the usual Perl idiom for slurping is this (which is simpler):

my $string = do { local $/; <DATA>; };

Hope that helps,

Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,