[Cialug] Perl regex
    Josh More 
    morej at alliancetechnologies.net
       
    Tue Jun 19 11:11:45 CDT 2007
    
    
  
You code will work better and be easier to maintain if you approach the
problem differently.
Instead of slurping (bad habit, btw), read line by line in a while.
Then, split each line on the =, and assign to a hash with the
concatenate operator.
---- example ----
#!/usr/bin/perl -w
use strict;
my %hash = ();
open(FILE,$ARGV[0]) || die "Could not open file $ARGV[0] - $!";
while(<FILE>) {
        if ($_ !~ /^#/) {
                chomp($_);
                my ($k,$v) = split(/=/);
                $hash{$k} .= $v;
        }
}
foreach (sort(keys(%hash))) {
        print "$_=${hash{$_}}\n";
}
---- end example ----
This way, you can give your code to someone else, and you won't have to
maintain it for the rest of your life.
 
 
-Josh More, RHCE, CISSP, NCLP, GIAC 
 morej at alliancetechnologies.net 
 515-245-7701
>>> "Daniel A. Ramaley" <daniel.ramaley at DRAKE.EDU> 06/19/07 10:57 AM
>>> 
Since we're posting brain teasers, here's what i'm having trouble
with:
Is there a way to design a Perl s/// regex such that after each 
replacement it starts searcing for the next replacement at the 
beginning of where it found the previous match instead of after the 
previous match?
What i'm trying to accomplish is to take files that look something like
this:
# Comment
AB=some text
CDE=text
CDE= more text
CDE=even more
F=foo
GH=bar,
GH= baz
And concatenate the continued lines together, so after processing it 
looks like this:
# Comment
AB=some text
CDE=text more texteven more
F=foo
GH=bar, baz
Here's what i have so far, with the entire file contained in $data (i 
already had to slurp the whole thing for other processing that was done
to it first):
1 while $data =~ s/^(([^#][^=]*)=.*)\n\2=/$1/gmo;
That works, but if there is a way to tell the regex parser to not 
advance its internal pointer after each match, then i can get rid of 
the useless while loop. (As it is now, without the while it only works
on lines that have been split into 2 (such as "GH" in the example) but
not lines split into 3 or more (such as "CDE").)
------------------------------------------------------------------------
Dan Ramaley                            Dial Center 118, Drake
University
Network Programmer/Analyst             2407 Carpenter Ave
+1 515 271- 4540                        Des Moines IA 50311 USA
_______________________________________________
Cialug mailing list
Cialug at cialug.org
http://cialug.org/mailman/listinfo/cialug
    
    
More information about the Cialug
mailing list