OVH Cloud OVH Cloud

argument et recherche

7 réponses
Avatar
kurtz le pirate
bonjour,


dans un script j'ai une recherche de ce type :
...
if ((/^proxyAddresses: .+/io)&&(/$dn1/)) {
push (@datas,$_);
$hasAddress=1;
}
...

la variable $dn1 provient d'un argument passé au script. je voudrais
pouvoir passer un nombre d'argument variable mais je ne vois pas comment
formuler alors la recherche :

if ((/^proxyAddresses: .+/io)&&(/$dn1|...|.../)) {


c'est possible ?
merci


--
klp

7 réponses

Avatar
Paul Gaborit
À (at) Fri, 17 Nov 2006 14:34:46 +0100,
kurtz le pirate écrivait (wrote):
bonjour,


dans un script j'ai une recherche de ce type :
...
if ((/^proxyAddresses: .+/io)&&(/$dn1/)) {
push (@datas,$_);
$hasAddress=1;
}
...

la variable $dn1 provient d'un argument passé au script. je
voudrais pouvoir passer un nombre d'argument variable mais je ne
vois pas comment formuler alors la recherche :

if ((/^proxyAddresses: .+/io)&&(/$dn1|...|.../)) {


c'est possible ?


La bonne question est "comment faire ?" car tout est toujours possible
(sauf quand c'est vraiment impossible).

En supposant que les différentes expressions rationnelles à chercher
sont dans le tableau @dn, je ferai comme ça :

my $regexp = join "|", @dn;
if ((/^proxyAddresses: .+/io)&&(/$regexp/)) {
# ...
}

Je vous laisse le soin de gérer les éventuelles erreurs dûes aux
inévitables conneries que tout utilisateur (moi compris) fournit un
jour ou l'autre à un script.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
kurtz le pirate
In article ,
Paul Gaborit wrote:

À (at) Fri, 17 Nov 2006 14:34:46 +0100,
kurtz le pirate écrivait (wrote):
bonjour,


dans un script j'ai une recherche de ce type :
...
if ((/^proxyAddresses: .+/io)&&(/$dn1/)) {
push (@datas,$_);
$hasAddress=1;
}
...

la variable $dn1 provient d'un argument passé au script. je
voudrais pouvoir passer un nombre d'argument variable mais je ne
vois pas comment formuler alors la recherche :

if ((/^proxyAddresses: .+/io)&&(/$dn1|...|.../)) {


c'est possible ?


La bonne question est "comment faire ?" car tout est toujours possible
(sauf quand c'est vraiment impossible).

En supposant que les différentes expressions rationnelles à chercher
sont dans le tableau @dn, je ferai comme ça :

my $regexp = join "|", @dn;
if ((/^proxyAddresses: .+/io)&&(/$regexp/)) {
# ...
}


merci paul... c'est aussi ce que je viens de trouver :

my $domainString=""; # si pas argument
if ($#ARGV==0) {
$domainString=$ARGV[0];
}
else {
$domainString = join("|",@ARGV);
}
...
...
if ((/^proxyAddresses: .+/io)&&(/$domainString/)) {
...
}


Je vous laisse le soin de gérer les éventuelles erreurs dûes aux
inévitables conneries que tout utilisateur (moi compris) fournit un
jour ou l'autre à un script.



ha ? pas encore trouvé de conneries dans tes posts :))
merci


--
klp


Avatar
Paul Gaborit
À (at) Fri, 17 Nov 2006 15:51:00 +0100,
kurtz le pirate écrivait (wrote):
merci paul... c'est aussi ce que je viens de trouver :

my $domainString=""; # si pas argument
if ($#ARGV==0) {
$domainString=$ARGV[0];
}
else {
$domainString = join("|",@ARGV);
}


On peut se passer du test : le 'join' fonctionnera très bien même si
il n'y a qu'un seul argument (un seul élément dans @ARGV).

[...]
ha ? pas encore trouvé de conneries dans tes posts :))


C'est gentil... mais heureusement faux !

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
kurtz le pirate
In article ,
Paul Gaborit wrote:

On peut se passer du test : le 'join' fonctionnera très bien même si
il n'y a qu'un seul argument (un seul élément dans @ARGV).


et même si il n'y a pas d'argument !


ha ? pas encore trouvé de conneries dans tes posts :))


C'est gentil... mais heureusement faux !


j'ai bien dit : "pas encore" :)))


autre chose, j'ai un doute sur l'interprétation de cette variable dans
le test "if ((/^proxyAddresses: .+/io)&&(/$domainString/i))". si
$domainString contient des points (comme dans "enstimac.fr"), il sont
interprétés ou pas ?


--
klp


Avatar
Paul Gaborit
À (at) Sat, 18 Nov 2006 10:51:58 +0100,
kurtz le pirate écrivait (wrote):
In article ,
Paul Gaborit wrote:

On peut se passer du test : le 'join' fonctionnera très bien même si
il n'y a qu'un seul argument (un seul élément dans @ARGV).


et même si il n'y a pas d'argument !


À ce moment là, l'expression rationnelle obtenue (la chaîne vide) sera
reconnue à tous les coups !

[...]
autre chose, j'ai un doute sur l'interprétation de cette variable dans
le test "if ((/^proxyAddresses: .+/io)&&(/$domainString/i))". si
$domainString contient des points (comme dans "enstimac.fr"), il sont
interprétés ou pas ?


Le contenu de $domainString sera interprété comme une expression
rationnelle. Pour l'éviter, il faut passer par :

my $regexp = join "|", map {"Q$_E"} @ARGV;

Le Q empêche l'interprétation des méta-caractères et le E la
rétablit.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>


Avatar
kurtz_le_pirate
"Paul Gaborit" a écrit dans le message
de news:

À (at) Sat, 18 Nov 2006 10:51:58 +0100,
kurtz le pirate écrivait (wrote):
In article ,
Paul Gaborit wrote:

On peut se passer du test : le 'join' fonctionnera très bien même
si
il n'y a qu'un seul argument (un seul élément dans @ARGV).


et même si il n'y a pas d'argument !


À ce moment là, l'expression rationnelle obtenue (la chaîne vide)
sera
reconnue à tous les coups !


c'est justement le but :)


[...]
autre chose, j'ai un doute sur l'interprétation de cette variable
dans
le test "if ((/^proxyAddresses: .+/io)&&(/$domainString/i))". si
$domainString contient des points (comme dans "enstimac.fr"), il
sont
interprétés ou pas ?


Le contenu de $domainString sera interprété comme une expression
rationnelle. Pour l'éviter, il faut passer par :

my $regexp = join "|", map {"Q$_E"} @ARGV;

Le Q empêche l'interprétation des méta-caractères et le E la
rétablit.


heuuu... ben moi j'ai fais une bête : $domainString =~ s/././g;


merci

--
klp



Avatar
Paul Gaborit
À (at) Mon, 20 Nov 2006 17:24:26 +0100,
"kurtz_le_pirate" écrivait (wrote):
"Paul Gaborit" a écrit dans le message
de news:
Le contenu de $domainString sera interprété comme une expression
rationnelle. Pour l'éviter, il faut passer par :

my $regexp = join "|", map {"Q$_E"} @ARGV;

Le Q empêche l'interprétation des méta-caractères et le E la
rétablit.


heuuu... ben moi j'ai fais une bête : $domainString =~ s/././g;


C'est loin d'être suffisant ! Les regexp utilisent de nombreux
méta-caractères en plus du point (.). C'est pour cela qu'il existe Q
et E (ou la fonction 'quotemeta').

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>