Merkwuerdiges bei split

Merkwuerdiges bei split

am 01.11.2006 16:55:48 von unknown

Post removed (X-No-Archive: yes)

Re: Merkwuerdiges bei split

am 01.11.2006 17:20:38 von Frank Seitz

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

Re: Merkwuerdiges bei split

am 01.11.2006 20:26:33 von hjp-usenet2

On 2006-11-01 15:55, Christoph Biedl wrote:
> 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

Re: Merkwuerdiges bei split

am 02.11.2006 10:54:10 von Frank Seitz

Peter J. Holzer wrote:
> On 2006-11-01 15:55, Christoph Biedl wrote:
>>
>>| @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

Re: Merkwuerdiges bei split

am 02.11.2006 16:48:26 von hjp-usenet2

On 2006-11-02 09:54, Frank Seitz wrote:
> Peter J. Holzer wrote:
>> On 2006-11-01 15:55, Christoph Biedl wrote:
>>>
>>>| @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

Re: Merkwuerdiges bei split

am 02.11.2006 17:00:45 von Frank Seitz

Peter J. Holzer wrote:
> On 2006-11-02 09:54, Frank Seitz wrote:
>>Peter J. Holzer wrote:
>>>On 2006-11-01 15:55, Christoph Biedl wrote:
>>>
>>>>| @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

Re: Merkwuerdiges bei split

am 05.11.2006 12:44:56 von Michael Perle

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