Schrift
[thread]8732[/thread]

join (//, @buffer): join mit // hängt von Matching ab



<< |< 1 2 >| >> 17 Einträge, 2 Seiten
El Ron
 2007-02-07 10:35
#74098 #74098
User since
2007-02-07
1 Artikel
BenutzerIn
[default_avatar]
Hallo

ich habe ein Problem mit join:

Code: (dl )
1
2
3
4
5
   my $dummy = "Y";
my @buffer = qw(a b c d);

$dummy =~ /Y/i;
print join(//,@buffer),"\n";


liefert als Ergebnis:
abcd

Code: (dl )
1
2
3
4
5
   my $dummy = "Y";
my @buffer = qw(a b c d);

$dummy =~ /N/i;
print join(//,@buffer),"\n";


liefert dagegen:
a1b1c1d

Solange es im Skript kein erfolgreiches Patternmatching gegeben
hat, liefert die join-Funktion mit // ein fehlerhaftes Ergebnis.
Nach einem erfolgreichen Matching gibt es danach keine
Probleme mehr.

Ist die Schreibweise mit // für join überhaupt zulässig? mit ''
oder "" funktioniert es auch ohne erfolgreiches Matching.

Danke,
El Ron
esskar
 2007-02-07 10:42
#74099 #74099
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
du übergibst ein pattern mit //
das ist nicht zulässig, aber möglich
übergib lieber einen string
perldoc -f join
Dubu
 2007-02-07 19:14
#74100 #74100
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Ich fürchte, du hast von
split /pattern/, $string
unzulässig auf
join /pattern/, $string
geschlossen. Zwischen den Schrägstrichen bei split steht aber ein Regex-Pattern. Bei split ist das Pattern auch sicherlich sinnvoll, aber was sollte es bei join machen?

/pattern/ ist aber die Kurzform für $_ =~ /pattern/.
Dein Code bedeutet also wohl so viel wie
join($_ =~ //, @buffer)
Und der Rückgabewert des Pattern-Matches ist die Anzahl der Treffer...
jan
 2007-02-07 21:46
#74101 #74101
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
ja - aber das matching wird doch vorher gemacht und es sieht aus (hab's nicht getestet), als wenn // das ergebnis des letzten matchings zurückliefert in den beispielen - kann das sein?
Taulmarill
 2007-02-08 01:05
#74102 #74102
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Ich würde mal schätzen, dass das verhalten der regex-engine bei einem undef Pattern nicht fest definiert ist. Konnte zumindest im Perldoc nichts definitives dazu finden. Wenn du es ganz genau wissen willst, solltest du das Problem evtl. mal bei Perlmonks posten.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
pq
 2007-02-08 10:41
#74103 #74103
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
perlre, "Repeated patterns matching zero-length substring"
aber verstehen muss man das nicht =)
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Taulmarill
 2007-02-08 12:01
#74104 #74104
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Ok, das Kapitel war interessant, erklärt aber soweit ich das verstanden habe nicht, warum die beiden Programme vom OP unterschiedliche Ergebnisse erzielen.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
sid burn
 2007-02-08 16:45
#74105 #74105
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Ein leerer Pattern m// ist bei Perl Magisch.
Wenn du soetwas benutzt dann wird automatisch die zuletzt gematchte Regex verwendet.

Code: (dl )
1
2
3
4
5
6
7
my $s1 = 'hallo, welt';
my $s2 = 'hallo';
my $s3 = 'welt';

print "\$s1 matcht auf hallo\n" if $s1 =~ m/hallo/;
print "\$s2 matcht auf hallo\n" if $s2 =~ //;
print "\$s3 matcht auf hallo\n" if $s3 =~ //;


Folgender Code gibt dann folgendes aus:

Code: (dl )
1
2
$s1 matcht auf hallo
$s2 matcht auf hallo


Du kannst rein theoretisch z.B. 3 Regexe gegen den selben String matchen lassen. Und mit // wird dann die zuletzt gematchte Regex verwendet. Ein Praxis Beispiel wo das nützlich wäre fällt mir aber nicht ein.

Zum anderen kannst du das ganz aber auch so wie oben dazu nutzen etwas Code zu sparen. Halt für die ganz Faulen Menschen.

Das ganze steht auch irendwo im Buch "Reguläre Ausdrücke" drin. Weiß aber nicht wo. Muss ich irgendwann nochmal raus suchen, vielleicht stand dort ja ein Praxis Beispiel dazu drin.


EDIT:
Paar Sätze geändert.\n\n

<!--EDIT|sid burn|1170946649-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
betterworld
 2007-02-08 17:01
#74106 #74106
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=Dubu,07.02.2007, 18:14]Und der Rückgabewert des Pattern-Matches ist die Anzahl der Treffer...[/quote]
Nee, es ist nur 1 oder "", je nach dem, ob das Pattern matcht oder nicht. Und "1" und "" sind auch gerade die Strings, die offenbar zum joinen benutzt wurden.
betterworld
 2007-02-08 17:05
#74107 #74107
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
In perlop steht die Sache mit dem leeren Pattern auch beschrieben:
Quote
              If the PATTERN evaluates to the empty string, the last success-
              fully matched regular expression is used instead. In this case,
              only the "g" and "c" flags on the empty pattern is honoured -
              the other flags are taken from the original pattern. If no
              match has previously succeeded, this will (silently) act
              instead as a genuine empty pattern (which will always match).

Das hat mich schon einige Male beim Obfuskieren von Signaturen gestoert, denn ein echtes leeres Pattern koennte man da gut gebrauchen.

[quote=pq,08.02.2007, 09:41]perlre, "Repeated patterns matching zero-length substring"
aber verstehen muss man das nicht =)[/quote]
Dies hingegen bezieht sich nicht auf leere Patterns, sondern auf Patterns, die auf leere Strings matchen.\n\n

<!--EDIT|betterworld|1170947404-->
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2007-02-07 10:35.