Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]12217[/thread]

Auswertung des Ergebnisses einer Variable



<< >> 9 Einträge, 1 Seite
tecker
 2008-07-21 17:51
#112396 #112396
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo,

habe ein kleines Problem. Ich will über eine Variable bzw. Referens auf das erfolgreiche Ergebnis eines regulären Ausdruckes überprüfen. Klingt komisch ich weis, aber ist in meinem Fall der beste Weg. Vereinfacht dargestellt sieht es etwa so aus:

Code: (dl )
1
2
3
4
5
my $variable = "$number =~ /(9*0*)";
my $ref_variable = \$variable;

if(${$ref_variable}){ ....}
else {...}


Scheinbar ist die IF-Bedingung aber immer true, da er ja immer einen gültigen String (in dem Fall) findet. Er soll aber die Abfrage die in dem String steht, also den Regex, auf Gültigkeit überprüfen. Jemand eine Idee wie man sowas macht?

VG
moritz
 2008-07-21 17:55
#112397 #112397
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
tecker+2008-07-21 15:51:09--
Code: (dl )
1
2
3
4
5
my $variable = "$number =~ /(9*0*)";
my $ref_variable = \$variable;

if(${$ref_variable}){ ....}
else {...}


Scheinbar ist die IF-Bedingung aber immer true, da er ja immer einen gültigen String (in dem Fall) findet.


Vor allem steht in dem String immer ein "=" mit drin, deswegen ist die if-Abfrage immer true. Einfach die quotes weglassen:

Code: (dl )
1
2
3
4
5
6
my $variable = $number =~ m/(9*0*)/;
my $ref = \$variable;
...
if ($$ref){
...
}


Allerdings wird das immer noch immer true ergeben, weil 0*9* auf den leeren string matcht, und damit immer erfolgreich ist. Also überleg dir noch eine andere Regex...
tecker
 2008-07-21 18:21
#112398 #112398
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
Also das Weglassen der Quotes funktioniert nicht so ganz. Um es mal genauer zu beschreiben ...

Code: (dl )
1
2
3
4
if($area==1){   
$area_in = $calling_number =~ /(9*0*)(\S+)/ && $2 gt $start_nr && $2 lt $end_nr;
$area_reference_in = \$area_in;
}


Im weiteren Programmverlauf findet u.a. eine Datenbankabfrage statt in der u.a. die calling_number abgefragt wird und dort soll dann eine Verzweigung in eine Schleife statt finden sofern die Calling number z.B. mit 90 oder 900 beginnt.

Ich will also über if($$area_reference_in) testen ob die Nummer gültig ist oder nicht. Vielleicht hilft das mehr?
moritz
 2008-07-21 18:41
#112401 #112401
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
tecker+2008-07-21 16:21:42--
Also das Weglassen der Quotes funktioniert nicht so ganz.


In welcher Hinsicht funktioniert es nicht? Welchen Fehler bekommst du?

Um es mal genauer zu beschreiben ...

Code: (dl )
1
2
3
4
if($area==1){   
$area_in = $calling_number =~ /(9*0*)(\S+)/ && $2 gt $start_nr && $2 lt $end_nr;
$area_reference_in = \$area_in;
}

[/quote]

Wenn du numerisch vergleichen willst, solltest du das mit < und > machen, lt und gt vergleichen Strings (es gilt z.B. "9" gt "10").
tecker
 2008-07-21 18:59
#112403 #112403
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
Keinen Fehler, aber ein
Code: (dl )
print LOG "REF: $$area_reference_in\n"; 

hinter
Code: (dl )
if($$area_reference_in) {
bleibt leer. Es besteht also keine Möglichkeit auf Ergebnisse eines gequoteten Strings zuzugreifen?

Das mit dem lt/gt ist so gewollt. Da ich Rufnummernbereiche auswerte, darf ich das nicht numerisch machen.
moritz
 2008-07-21 19:31
#112405 #112405
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
tecker+2008-07-21 16:59:48--
Keinen Fehler, aber ein
Code: (dl )
print LOG "REF: $$area_reference_in\n"; 

hinter
Code: (dl )
if($$area_reference_in) {
bleibt leer.


Was für mich bedeutet, dass die Bedingung davor fehlgeschlagen ist. Ein leerer String ist schliesslich false.

Quote
Es besteht also keine Möglichkeit auf Ergebnisse eines gequoteten Strings zuzugreifen?


Natürlich. Aber das ist nicht das, was du brauchst.
Du kannst den String ja mal quoten und danach schauen, was drinsteht.
Gast Gast
 2008-07-22 00:21
#112412 #112412
Sowas sollte funktionieren ...

Code: (dl )
1
2
if (eval "${$ref_variable}") { ....}
else {...}
defun
 2008-07-22 02:48
#112420 #112420
User since
2008-07-18
28 Artikel
BenutzerIn
[default_avatar]
Ich frage mich, wie klar du dir darüber bist, was du da tust, bzw. was du tun willst, tecker. Denn davon hängt die Antwort auf deine Frage ab.

Was genau willst du damit erreichen, dass du die Bedingung als String ablegst?

Willst du...
- den Zeitpunkt der Ausführung hinauszögern? Dann verwende am besten eine anonyme Subroutine:
Code (perl): (dl )
1
2
3
4
5
my $variable = sub {$number =~ m/(9*0*)/};
# ...
if ($variable->()){
   # ...
}

- die Prüfung ausgeben? Dann speicher vielleicht nur den Regex als String und gib ihn später aus:
Code (perl): (dl )
1
2
3
4
5
6
7
8
my $regex = qr/(9*0*)/;
my $variable = $number =~ m/$regex/;
my $ref = \$variable;
# ...
if ($$ref){
   print LOG "REF: $regex\n"; 
   # ...
}

Vielleicht musst du das Ergebnis des Tests irgendwie zusammen mit dem Regex speichern, um später zuordnen zu können, welcher Test welchen Regex verwendet.

- die Prüfung textbasiert zwischenspeichern? Dann speicher den String und verwende eval, um ihn später auszuführen. Aber wann soll $number ausgewertet werden? Vor oder nach dem Speichern? Wenn danach, dann musst du einfache Anführungszeichen verwenden:
Code (perl): (dl )
1
2
3
4
5
6
my $variable = '$number =~ m/(9*0*)/';
my $ref = \$variable;
# ...
if (eval $$ref){
   # ...
}


Ich hoffe das hilft... :)
tecker
 2008-07-22 19:05
#112444 #112444
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
Also ich habe es inzwischen über den Ansatz von moritz hinbekommen. Also alles nicht zu quoten was mir im Nachhinein acuh plausibel erscheint.

Die Sache ist, das ich eine GUI habe und der Anwender unterschiedliche Einstellungen vornehmen kann für eine spätere Auswertung. Diese wird in der Variable $area gespeichert und ich lege anhand des Wertes fest wie die Auswertung von statten gehen soll. Daher z.B.
Code: (dl )
1
2
3
4
if($area==1){   $area_out = $calling_number =~ /(9*0*)(\S+)/ && $2 gt $start_nr && $2 lt $end_nr;
$area_in = $dialed_number =~ /(9*0*)(\S+)/ && $2 gt $start_nr && $2 lt $end_nr;
}
if($area==2){...}


Ich hatte Fehler in der Reihenfolge, da ich Variablen angesprochen die erst später im Skript initialisert werden und ich keine entsprechenden Errors gesehen hatte. Erst später im Apache Log. Man verliert manchmal den Überlick ab einer gewissen Anzahl von Programmzeilen :)

Im weiteren Programmverlauf spreche ich dann die Ergbnisse über if($area_in) und verzweige dann entsprechend oder halt, je nachdem ob es matcht oder nicht. Referenzen habe ich nun garnicht mehr benutzt. Denke das würde dann dem letzten Vorschlag von defun entsprechen.


<< >> 9 Einträge, 1 Seite



View all threads created 2008-07-21 17:51.