Hi Roman,
Roman wrote:
> use strict; > > my $file = shift; > my $line; > > > open(IN, "<$file") || die "$!"; > while($line =<IN>) > { > $line =~ /(\$\S+):.(\S+)/is; > > print "match1: $1; match2: $2 \n"; > }
I would redefine the record separator for your while loop to process each of the four records in your example as a whole unit, instead of going line-by-line. You can then write a regular expression to capture the path and the file name.
#!/usr/bin/perl
use strict; use warnings;
local $/ = "\n\n"; # record separator = two consecutive line breaks
while (<>) { m/ ^ # beginning of line ( # start capture [^:]+ # capture all non-colon chars ) : # colon \s+ # space chars, including line break ( # second capture [^.]+ # one or more non-period chars \. # a period \S+ # one or more non-space chars ) /x; # m/^([^:]+):\s+([^.]+\.\S+)/; print $1,'/',$2,"\n"; }
Using shift to set $file to the file name and explicitly defining $line are not necessary. This script does the same thing as yours. This is Perl's way of making things easier for you. ;)
I would also suggest you 'use warnings' when writing code. It'll catch a lot of errors for you, such as a 'Use of uninitialized value in concatenation (.) or string' in your code. You can get a (partial) explanation by adding a 'use diagnostics' line to the beginning of your program.
Best,
Damon
--
Damon Allen DAVISON http://www.allolex.net
-- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>