regex instead of a new lover. . .

regex instead of a new lover. . .

am 25.11.2007 08:47:11 von ben.rogers

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;

Re: regex instead of a new lover. . .

am 25.11.2007 10:11:13 von Gunnar Hjalmarsson

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

Re: regex instead of a new lover. . .

am 25.11.2007 10:25:22 von Uri Guttman

>>>>> "GH" == Gunnar Hjalmarsson writes:

GH> 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.

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

Re: regex instead of a new lover. . .

am 26.11.2007 02:52:53 von 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 }
);
}