regex instead of a new lover. . .

A

aardvarkman

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;
 
G

Gunnar Hjalmarsson

aardvarkman said:
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;
}
}
 
U

Uri Guttman

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
 
A

aardvarkman

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 }
);
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,754
Messages
2,569,527
Members
45,000
Latest member
MurrayKeync

Latest Threads

Top