help regex and substitutions

J

john swilting

I recopied the chaphitre 5
#!/usr/bin/perl -w

use strict;
use diagnostics;

my @conf = ('XferMethod',
'rsync',
'XferLogLevel',
'1',
'RSyncShare',
'___1___',##they is these 2 pattern
'ClientNameAlias',
'___2___');##they is pattern


print @conf,"\n";
my @substitution = @conf;
my $motif =qr/___[1-9][0-9]?___/is;
my @regexes = ();
my @motif = ();
foreach $motif ( @motif ) {
push @regexes, qr/$motif/;
}

foreach my $elem ( @substitution ) {
foreach my $re ( @regexes ) {##the loop however turns well#scalar(@regexes
if ( $elem =~ /$re/) {##one do not arrive to this line
print "$elem egal $re\nentrer la valeur\n";
chop ($elem =<STDIN>);
print "nouvelle valeur de",$elem,"\n";
}
}
}
 
J

john swilting

Jim said:
john swilting said:
I recopied the chaphitre 5

In what book?
#!/usr/bin/perl -w

use warnings; # preferred these days
use strict;
use diagnostics;

my @conf = ('XferMethod',
'rsync',
'XferLogLevel',
'1',
'RSyncShare',
'___1___',##they is these 2 pattern
'ClientNameAlias',
'___2___');##they is pattern


print @conf,"\n";
my @substitution = @conf;
my $motif =qr/___[1-9][0-9]?___/is;
my @regexes = ();
my @motif = ();

The array @motif is empty.
foreach $motif ( @motif ) {
push @regexes, qr/$motif/;
}

You are iterating over the empty array @motif, assigning each value
therein to the variable $motif. At the end of this loop, since @motif
has no values, the array @regexes will also be empty.

Perhaps you want, instead of the loop, the following:

push( @regexes, $motif );
foreach my $elem ( @substitution ) {
foreach my $re ( @regexes ) {##the loop however turns
well#scalar(@regexes
if ( $elem =~ /$re/) {##one do not arrive to this line
print "$elem egal $re\nentrer la valeur\n";
chop ($elem =<STDIN>);
print "nouvelle valeur de",$elem,"\n";
}
}
}

The inner statements of the loop on @regexes will never be executed,
because @regexes has no values.
the book is programmation en perl 3eme edition
with the push (@regexes,$motif)
the substitution is well

how to make to improve my code... I look at closely the precis examples
handbook O reilly
 
J

john swilting

the book is programmation en perl 3eme edition
with the push (@regexes,$motif)
the substitution is well

how to make to improve my code... I look at closely the precis examples
handbook O reilly
#!/usr/bin/perl -w

use strict;
use diagnostics;
use warnings;

my @conf = ('XferMethod',
'rsync',
'XferLogLevel',
'1',
'RSyncShare',
'___1___',
'ClientNameAlias',
'___2___');


print @conf,"\n";
my @substitution = @conf;
my $motif =qr/(___[1-9][0-9]?___)/is;
my @regexes = ();
##my @motif = ();
##foreach $motif ( @motif ) {
## push (@regexes,qr/$motif/);
## }
push (@regexes,$motif);
foreach my $elem ( @substitution ) {
foreach my $re ( @regexes ) {
if ( $elem =~ /$re/) {
print "$elem egal $re\nentrer la valeur\n";
chop ($elem =<STDIN>);
print "nouvelle valeur de",$elem,"\n";
}
}
}


how to do improves my code
 
K

Klaus

how to make to improve my code...

#!/usr/bin/perl -w

use strict;
use diagnostics;

If you can afford, get rid of the "use diagnostics" to improve
execution speed.
use warnings;

my @conf = ('XferMethod',
'rsync',
'XferLogLevel',
'1',
'RSyncShare',
'___1___',
'ClientNameAlias',
'___2___');

print @conf,"\n";
my @substitution = @conf;
my $motif =qr/(___[1-9][0-9]?___)/is;
my @regexes = ();
##my @motif = ();
##foreach $motif ( @motif ) {
## push (@regexes,qr/$motif/);
## }

You could remove the commented out code altogether from your program,
it is confusing.
push (@regexes,$motif);
foreach my $elem ( @substitution ) {
foreach my $re ( @regexes ) {
if ( $elem =~ /$re/) {
print "$elem egal $re\nentrer la valeur\n";
chop ($elem =<STDIN>);

You could use chomp instead of chomp.
perldoc -f chomp
This safer version of chop removes any trailing string that
corresponds to the current value of $/
 
T

Tad McClellan

my $motif =qr/___[1-9][0-9]?___/is;


That is equivalent to:

my $motif =qr/___[1-9][0-9]?___/;

Both of the modifiers are no-ops. They do nothing.

m//i ignores case. Where can your pattern match letters so that
their case can be ignored? Nowhere.

m//s makes dot in your pattern match a newline. Where is the dot in
your pattern that is being modified?

You should not use a modifier unless you know what that modifier does,
and why it is needed in your regex.
 

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

Similar Threads


Members online

No members online now.

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,051
Latest member
CarleyMcCr

Latest Threads

Top