Problem bei regulärem Ausdruck
Linda
- perl
Hallo,
ich habe das Problem, daß in meinem Perlscript folgender Ausdruck:
if (($from2 =~ /$fromwhom/i) && ...
prima funktioniert, wenn das eine im anderen enthalten ist, aber nicht mehr, wenn die beiden identisch sind.
Ist das normal?
Und wie kann ich die Bedingung als erfüllt gelten lassen, für den Fall, daß beide indetisch sind?
Danke und schönes WE
Linda
Hi,
if (($from2 =~ /$fromwhom/i) && ...
prima funktioniert, wenn das eine im anderen enthalten ist, aber nicht mehr, wenn die beiden identisch sind.
dann ist Dein "..." fehlerhaft - oder Deine Definition von "identisch". $foo =~ /$foo/ gilt für alle skalaren $foo.
Cheatah
Hi,
if (($from2 =~ /$fromwhom/i) && ...
prima funktioniert, wenn das eine im anderen enthalten ist, aber nicht mehr, wenn die beiden identisch sind.dann ist Dein "..." fehlerhaft - oder Deine Definition von "identisch". $foo =~ /$foo/ gilt für alle skalaren $foo.
Cheatah
Hi Cheatah, hi Danny,
@Danny: Habe Deinen Ausdruck verwendet, der ändert nichts :-(
@Cheatah: Der reguläre Ausdruck ist Teil eines eigenen Emailspamfilters. Ich habe mal einen Auszug gemacht, damit Du sehen kannst, was genau nicht funktioniert, vielleicht wird es dann deutlicher:
#! /usr/bin/perl
$test1="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
$test2="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
if($test2 =~ /$test1/i) {
print"ja, enthalten"
} else {
print"nein, nicht enthalten"
Ergebnis: Nein, nicht enthalten
Und das, obwohl die beiden doch identisch sind, verstehst Du?
Grüße, Linda
Hi,
natürlich wird auch ein Posting hier unten gelesen.
$test1="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
$test2="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
if($test2 =~ /$test1/i) {
Hm. $test1 enthält einige Zeichen, die im Kontext des regulären Ausdrucks Sonderbedeutung haben, z.B. die Fragezeichen.
Probier mal die Zeichen mit Sonderbedeutung zu escapen, also
$test1="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
cu,
Andreas
你好 MudGuard,
Probier mal die Zeichen mit Sonderbedeutung zu escapen, also
$test1="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
Dafuer gibt es btw. quotemeta() (perldoc -f quotemeta).
再见,
CK
Hi,
Probier mal die Zeichen mit Sonderbedeutung zu escapen, also
$test1="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
Dafuer gibt es btw. quotemeta() (perldoc -f quotemeta).
Ich hab zu lange nichts mehr mit Perl angestellt ...
cu,
Andreas
Hi,
erstmal danke an alle. Klar, genau die Sonderzeichen in den "". Ich bin wohl auch schon zu lange aus Perl raus, das hätte ich früher auch gewußt :-)
Das mit der speziellen Funktion allerdings ist mir neu.
Danke an alle, ich glaube, jetzt hab' ich wieder genug Input zum selber weiterbasteln.
Grüße, danke und schönen Abend an alle
Linda
#! /usr/bin/perl
$test1="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
$test2="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
$test1=quotemeta($test1);
$test2=quotemeta($test2);
if($test1 =~ /$test2/i) {
print"ja, enthalten";
} else {
print"nein, nicht enthalten";
}
Ausgabe: nein, nicht enthalten
Erstmal gute Nacht :-)
Linda
#! /usr/bin/perl
$test1="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
$test2="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";$test1=quotemeta($test1);
$test2=quotemeta($test2);Inhalt öffnen, Inhalt einlesen, wieder schliessen
if($test1 =~ /$test2/i) {
print"ja, enthalten";
} else {
print"nein, nicht enthalten";
}Ausgabe: nein, nicht enthalten
Erstmal gute Nacht :-)
Linda
print "\n$test1\n$test2"
Ausgabe:
=?utf-8?q?Ida\ Gtu?=\ compulsivehnaauf.com
=?utf-8?q?Ida\ Gtu?=\ compulsivehnaauf.com
Nun, was läuft denn da falsch?
Linda
Hi,
$test1="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
$test2="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
$test1=quotemeta($test1);
$test2=quotemeta($test2);
Der String, den Du mit dem regulären Ausdruck vergleichen/matchen willst, darf natürlich nicht mit quotemeta behandelt werden.
cu,
Andreas
Hi,
$test1="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
$test2="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
$test1=quotemeta($test1);
$test2=quotemeta($test2);Der String, den Du mit dem regulären Ausdruck vergleichen/matchen willst, darf natürlich nicht mit quotemeta behandelt werden.
Hallo Andreas,
warum darf er das denn nicht? Wenn doch in beiden Sonderzeichen drinne sind?
Linda
cu,
Andreas
你好 Linda,
$test1="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
$test2="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
$test1=quotemeta($test1);
$test2=quotemeta($test2);Der String, den Du mit dem regulären Ausdruck vergleichen/matchen
willst, darf natürlich nicht mit quotemeta behandelt werden.warum darf er das denn nicht? Wenn doch in beiden Sonderzeichen drinne
sind?
Weil das Pattern, dass du dann benutzen muesstest auch die Backslashes in
dem ersten String matchen muesste. In dem String steht dann ja nicht mehr
"=?", sondern "=\?". Du willst ja mit dem quotemeta() nur die
Sonderbedeutung bestimmter Zeichen deaktivieren.
再见,
CK
你好 Linda,
$test1="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
$test2="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
$test1=quotemeta($test1);
$test2=quotemeta($test2);Der String, den Du mit dem regulären Ausdruck vergleichen/matchen
willst, darf natürlich nicht mit quotemeta behandelt werden.warum darf er das denn nicht? Wenn doch in beiden Sonderzeichen drinne
sind?Weil das Pattern, dass du dann benutzen muesstest auch die Backslashes in
dem ersten String matchen muesste. In dem String steht dann ja nicht mehr
"=?", sondern "=\?". Du willst ja mit dem quotemeta() nur die
Sonderbedeutung bestimmter Zeichen deaktivieren.再见,
CK
Hi Christian,
wenn ich doch 2 Variablen habe, die gleich sind, nämlich $test1 und $test2, so sollten sie doch auch nach jeweiliger Behandlung mit quotemeta immer noch identisch sein, oder?
quotemeta ist doch nur dazu da, die Sonderzeichen zu "eliminieren".
Oder?
Linda
你好 Linda,
wenn ich doch 2 Variablen habe, die gleich sind, nämlich $test1 und
$test2, so sollten sie doch auch nach jeweiliger Behandlung mit
quotemeta immer noch identisch sein, oder?
Da liegt ja das Problem. Du moechtest mit quotemeta() erreichen, dass die
Sonderzeichen im ersten String deaktiviert werden, so dass du problemlos den
zweiten String damit matchen kannst. Behandelst du jetzt den zweiten String
auch mit quotemeta(), so machst du aus dem String "a?b?c?" eben
"a\?b\?c\?". Dadurch matcht natuerlich der erste String (wir erinnern
uns: der ist jetzt ebenfalls "a\?b\?c\?") nicht mehr auf den zweiten
String. Stell dir einfach vor, was jetzt im Klartext da stehen wuerde:
'a?b?c?' =~ /a?b?c?/;
Du siehst, das kann gar nicht matchen, weil der Match auf die \ in dem
ersten String jetzt fehlen.
再见,
CK
Du siehst, das kann gar nicht matchen, weil der Match auf die \ in dem
ersten String jetzt fehlen.再见,
CK
Hi Christoph,
ok, so langsam kommt mein spärliches Wissen zurück :-)
Leider bekomme ich jetzt trotzdem eine Fehlermeldung, mit der ich nichtsgenaues anfangen kann.
Trailing \ in regex m/=?utf-8?q?Ida\ Gtu?=\ compulsivehnaauf@zerosexlife.com>/ at /.../homepages/... usw.
Der reg. Ausdruck hieß ja if (($from2 =~ /$fromwhom/i)...
Linda
Hi,
Der String, den Du mit dem regulären Ausdruck vergleichen/matchen willst, darf natürlich nicht mit quotemeta behandelt werden.
warum darf er das denn nicht? Wenn doch in beiden Sonderzeichen drinne sind?
Weil Du nur einen davon als regulären Ausdruck benutzen willst.
cu,
Andreas
Привет Linda.
#! /usr/bin/perl
$test1="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";
$test2="=?utf-8?q?Ida Gtu?= compulsivehnaauf@zerosexlife.com";Inhalt öffnen, Inhalt einlesen, wieder schliessen
if($test2 =~ /$test1/i) {
print"ja, enthalten"
} else {
print"nein, nicht enthalten"
Ergebnis: Nein, nicht enthalten
Du solltest dich mit der Bedeutung der Hochkommata nochmal belesen. Doppelte bedeuten, dass Perl den String interpolativ auswertet, sprich: es werden alle Perl bekannten reservierten Zeichen umgesetzt. In deinem Musterstring $test2 wird ein "@" verwendet, Perl erwartet also einen Array, den es in das Muster einsetzen kann. Du willst aber den literalen Kontext, also das, was da steht. Dazu müsstest du dann aber entweder das @ durch einen vorangestellten Backslash maskieren oder aber einfache Hochkommata verwenden.
Ansonsten stellt sich im speziellen Fall die Frage, ob die Perl-eigenen Stringfunktionen oder sogar der simple Stringvergleich nicht völlig ausreichend wären.
Дружба!
Siechfred
Hi,
versuche es mal so:
if (($from2 =~ / ^ $fromwhom $ /ix) && ...
Ich vermute den Fehler aber irgendwo anders (in den folgenden Bedingungen nach &&).
MfG
Danny