Thread Referenzierung von Teilmustern dynamisch ausgeben: Referenzierungs variable dynmaisch setze (18 answers)
Opened by eisbaermann at 2006-01-12 11:29

Strat
 2006-01-12 13:45
#61729 #61729
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Irgendwie habe ich das gefuehl, ihr doktort an der voellig falschen stelle herum...

Regulaere Ausdruecke sollte man lieber nicht als string angeben, sondern als regulaeren ausdruck:
Code: (dl )
1
2
3
4
$testar{ 'reg1' } = { 
'exp' => qr~\Q/var/logs/logger/\E(\d*)/(\d*)~,
'desc' => 2,
};

das \Q....\E sagt aus, dass dort irgendwelche Zeichen, die fuer eine Regex Sonderzeichen sind, gequotet werden; sonst kann die verwendung probleme bereiten (z.B. oeffnende Klammern, +, *, ...)

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl
use strict;

# besser aus -w, weil es nur auf den aktuellen scope geht;
# hier ist der scope die komplette datei.
# es gibt naemlich immer noch einige Module, die bei -w (globale warnungen an) warnungen
# produzieren; deshalb besser use warnings verwenden...
use warnings;

# nummerierte Variable, die du ausgeben oder zwischenspeichern moechtest
my $desc = 2;
...

# wofuer braucht man hier das no strict? und das ${$desc} ???
# Das gibt den dereferenzierten wert von $desc zurueck, und $desc ist eine
# zahl, keine referenz => ergo sinnlos
{ no strict 'refs'; print "${$desc}\n"; }


1. Loesungsansatz: vermutlich unnoetig kompliziert, aber falls 2. nicht in frage kommt...
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
my %testar = (
'reg1' => {
'exp' => qr~\Q/var/logs/logger/\E(\d*)/(\d*)~,
'desc' => 2,
},
'req2' => {
'exp' => qr~...~,
'desc' => 1,
},
);

# entweder ueber ein explizites array:
my @fields = $string =~ $testar{req1}->{exp};
my $wantedField = @fields[ $testar{req1}->{desc} - 1 ];

# oder kuerzer, ohne das explizite array
my $wantedField = ( $string =~ $testar{req1}->{exp} )[ $testar{req1}->{desc} -1 ];


2. Loesungsansatz:
aber diese loesung ist immer noch viel zu kompliziert; wenn du nur ein einziges feld haben willst und dich der rest nicht interessiert, warum capturest du es dann? Mit (?:\d*) kannst du nicht einfangende klammern schreiben; dann kannst du auf das desc verzichten, auf den arrayindex -1 und vielleicht auch auf eine ebene, z.B.
Code: (dl )
1
2
3
4
5
my %testar = (
'reg1' => qr~\Q/var/logs/logger/\E(?:\d*)/(\d*)~,
'req2' => qr~...~,
);
my ($wantedField) = $string =~ $testar{'req1'};

(wobei man in diesem fall (?:\d*) auch einfach durch \d* ersetzen koennte...)

wenn man ueberlegt, no strict zu verwenden, ist man in 95% der faelle auf dem falschen weg, und handelt sich nur mehr probleme ein als man damit loest.\n\n

<!--EDIT|Strat|1137066483-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/

View full thread Referenzierung von Teilmustern dynamisch ausgeben: Referenzierungs variable dynmaisch setze