For Programmers: Free Programming Magazines  


Home > Archive > PERL Miscellaneous > November 2007 > regex instead of a new lover. . .









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author regex instead of a new lover. . .
aardvarkman

2007-11-25, 4:28 am

Well, I'd rather get ahold of anusha and forget this whole business,
but I guess I should finish this first:

I have a config file that get read by my main script. A sub parses the
file and does just fine under simple circumstances. It finds all
this:

Index directory === C:/
HTML resource directory === C:/Aardvark/res/user_html/test_index
HTML resources === *.html *.htm
File types to index === html|htm|pdf|xml|zip|mif|txt

# Frame template options:

Template directory === C:/Aardvark/res/frame_templates
Template types === *.fm
Template objects === Para,Char,XRefs,Vars,Tables,Page Layouts,Math
Defs,Ref Pages,Conditions

I get the values on both sides of the ===.

The problem is that when there is a . or ? (and maybe other things)
it fails:

# Stuff I can't read
Title rule choices === title.fm
TOC rule choices === TOC.fm
Appendix rule choices === apx.fm
Index rule choices === IOM.fm|IX.fm
Body rule choices === Everything else!
Other rule choices 1 === ????????
Other rule choices 2 === ????????

What I am looking for is a regex that finds anything one line at a
time separated by ===. In other words, all my config options are on a
single line like: key === value.

I started guessing, then started researching, and now I ask the
experts: what will work?

Stuff I tried:

while(<$fh> ){
if (/#########/){
last;
} # todo: make this match . and ?
elsif (/^\ *(.*?)\ *===\ *(.*?)\ *$/){ # original
# elsif (/^\ *(.*?)\ *===\ *(.*?)\ *$/sm){
# elsif (/\A\ *(.*?)\ *===\ *(.*?)\ *\Z/sm){
# elsif (/^ *(.*?) *=== *(.*?) *$/){
# elsif (/^ *(.*?) *=== *(.*?) *$/sm){
# elsif (/^\ *(.*?)\ *===\ *(.*?)$/is){
# elsif (/^(.*?)===(.*?)$/){
# elsif (/^\s+(.*?)\s+$===^\s+(.*?)\s+$/) {
# elsif (/^\s+(.*?)\s+$===^\s+(.*?)\s+$/m) {
# elsif (/^(.*?) === (.*?)$/sm) {
$items -> {$1} = $2;
}
}
return $items;
Gunnar Hjalmarsson

2007-11-25, 4:28 am

aardvarkman wrote:
> What I am looking for is a regex that finds anything one line at a
> time separated by ===. In other words, all my config options are on a
> single line like: key === value.


my %config;
while (<$fh> ) {
if ( /(.+) === (.+)/ ) {
$config{ $1 } = $2;
}
}

--
Gunnar Hjalmarsson
Email: http://www.gunnar.cc/cgi-bin/contact.pl
Uri Guttman

2007-11-25, 4:28 am

>>>>> "GH" == Gunnar Hjalmarsson <noreply@gunnar.cc> writes:

GH> aardvarkman wrote:[color=darkred]

GH> my %config;
GH> while (<$fh> ) {
GH> if ( /(.+) === (.+)/ ) {
GH> $config{ $1 } = $2;
GH> }
GH> }

a 2 liner that also does the i/o (untested):
(assuming the config come from a file)

use File::Slurp ;
my %config = read_file( 'config' ) =~ /^([^=]+)===(.*)$/mg ;

uri

--
Uri Guttman ------ uri@stemsystems.com -------- http://www.stemsystems.com
--Perl Consulting, Stem Development, Systems Architecture, Design and Coding-
Search or Offer Perl Jobs ---------------------------- http://jobs.perl.org
aardvarkman@gmail.com

2007-11-25, 10:07 pm

Thanks! Turns out many of these regexs worked. The new ones you
provided taught me something.

However, the problem was in some other code. My match ended up getting
sent to a sub that creates LabEntry widgets on the fly. So when a
value with a non-word character went into $textvar, my validation
string removed it from the entry field. So I was getting the correct
stuff, but it just wasn't showing up in user interface.

sub createLabEntry {
my $parentwidget = $_[0];
my $label = $_[1];
my $textvar = $_[2];
my $width = $_[3];

if ( $$textvar !~ /^[\w+\|]*$/i ) { $$_textvar = ''; }
$parentwidget->LabEntry(
-label => $label,
-labelPack => [ "-side" => "left" ],
-textvariable => $textvar,
-width => $width,
-background => 'white',
-validate => 'key',
-validatecommand => sub { $_[0] =~ /^[\w+\|]*$/i },
-invalidcommand => sub { $parentwidget->bell }
);
}
Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com