Merkwuerdiges bei split
am 01.11.2006 16:55:48 von unknownPost removed (X-No-Archive: yes)
Post removed (X-No-Archive: yes)
Christoph Biedl wrote:
> | my $h = { 'pattern' => '234' };
> | @parts = split (/($h -> {'pattern'})/, $s);
Das funktioniert nicht.
> Alternativ kann ich auch die Leerzeichen bei der Dereferenzierung
> auslassen:
> | @parts = split (/($h->{'pattern'})/, $s);
Das funktioniert.
GrüÃe
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
On 2006-11-01 15:55, Christoph Biedl
> Im gegebenen Fall ist das Muster aber tiefer in einer Datenstruktur
> versteckt:
>| my $h = { 'pattern' => '234' };
>| @parts = split (/($h -> {'pattern'})/, $s);
> und plötzlich bekomme ich
>| 12345
> ihn nicht nicht gespaltet!
[...]
>
> Alternativ kann ich auch die Leerzeichen bei der Dereferenzierung
> auslassen:
>| @parts = split (/($h->{'pattern'})/, $s);
>
> Also gut, ich habe einen Worgaround. Aber was ist da eigentlich passiert?
Ganz normale String-Interpolation, hat nichts mit split zu tun. Bei
my $h = { 'pattern' => '234' };
my $foo = "($h -> {'pattern'})";
print "<$foo>\n";
ist das Ergebnis das gleiche (und da siehst Du auch schön, was
passiert).
> Und wie ist die saubere Lösung (doppelte Klammerung ist es nicht)?
Lass die Leerzeichen um "->" weg. Die tragen nichts zur Lesbarkeit bei
und verwirren den Menschen genauso wie perl. Ich zumindest könnte
»$h -> {'pattern'}« durchaus als »$h => {'pattern'}« lesen, weil das für
mich optisch ähnlicher ausschaut als das gewohnte »$h->{'pattern'}«. Der
-> Operator bindet sehr eng und das sollte man auch optisch zum Ausdruck
bringen.
hp
--
_ | Peter J. Holzer | > Wieso sollte man etwas erfinden was nicht
|_|_) | Sysadmin WSR | > ist?
| | | hjp@hjp.at | Was sonst wäre der Sinn des Erfindens?
__/ | http://www.hjp.at/ | -- P. Einstein u. V. Gringmuth in desd
Peter J. Holzer wrote:
> On 2006-11-01 15:55, Christoph Biedl
>>
>>| @parts = split (/($h -> {'pattern'})/, $s);
[...]
> Lass die Leerzeichen um "->" weg. Die tragen nichts zur Lesbarkeit bei
> und verwirren den Menschen genauso wie perl. Ich zumindest könnte
> »$h -> {'pattern'}« durchaus als »$h => {'pattern'}« lesen, weil das für
> mich optisch ähnlicher ausschaut als das gewohnte »$h->{'pattern'}«. Der
> -> Operator bindet sehr eng und das sollte man auch optisch zum Ausdruck
> bringen.
Die Wahlfreiheit besteht in einem String oder Regex ohnehin nicht,
da "$h -> {'pattern'}" dort schlicht falsche Syntax ist.
GrüÃe
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
On 2006-11-02 09:54, Frank Seitz
> Peter J. Holzer wrote:
>> On 2006-11-01 15:55, Christoph Biedl
>>>
>>>| @parts = split (/($h -> {'pattern'})/, $s);
> [...]
>> Lass die Leerzeichen um "->" weg. Die tragen nichts zur Lesbarkeit bei
>> und verwirren den Menschen genauso wie perl.
[...]
> Die Wahlfreiheit besteht in einem String oder Regex ohnehin nicht,
> da "$h -> {'pattern'}" dort schlicht falsche Syntax ist.
Das hoffte ich eigentlich in der ersten Hälfte der Mail klar gemacht zu
haben.
hp
--
_ | Peter J. Holzer | > Wieso sollte man etwas erfinden was nicht
|_|_) | Sysadmin WSR | > ist?
| | | hjp@hjp.at | Was sonst wäre der Sinn des Erfindens?
__/ | http://www.hjp.at/ | -- P. Einstein u. V. Gringmuth in desd
Peter J. Holzer wrote:
> On 2006-11-02 09:54, Frank Seitz
>>Peter J. Holzer wrote:
>>>On 2006-11-01 15:55, Christoph Biedl
>>>
>>>>| @parts = split (/($h -> {'pattern'})/, $s);
>>[...]
>>>Lass die Leerzeichen um "->" weg. Die tragen nichts zur Lesbarkeit bei
>>>und verwirren den Menschen genauso wie perl.
> [...]
>>Die Wahlfreiheit besteht in einem String oder Regex ohnehin nicht,
>>da "$h -> {'pattern'}" dort schlicht falsche Syntax ist.
>
> Das hoffte ich eigentlich in der ersten Hälfte der Mail klar gemacht zu
> haben.
s/der Mail/des Posting/;
Nein, nicht so sehr klar (IMO), deswegen meine ergänzende Bemerkung.
GrüÃe
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Christoph Biedl wrote:
> Getestet mit Perl 5.8.4 und 5.8.8, mit "use strict;", Aufruf
> mit "perl -w"
Das untige hast Du im Leben nicht 1:1 getestet.
> Das Prinzip ist immer dasselbe: Ich habe einen Text
> | my $s = '12345';
> und ein Muster
> | my $pattern = '345';
Wie hat Deine Testumgebung erraten, dass Du '234' meinst?
> und spalte den Text entlang des Musters:
> | my @parts = split (/($pattern)/, $s);
> (Die Klammern um $pattern sind nicht wesentlich.)
Falsch. Die sind wesentlich.
> Zu Kontrolle gebe ich das Ergebnis aus:
> | print join (":", @parts), "\n";
> und erwarte
> | 1:234:5
Abgesehen dass das nur gilt, wenn ($pattern eq '234')
hast Du das auch nur den Klammern um das Pattern zu
verdanken.
Weià jemand, warum das überhaupt (mit Klammern) so
funktioniert?
MP