Mehrzeilige Variable in Einzelzeilen Zerlegen

Mehrzeilige Variable in Einzelzeilen Zerlegen

am 27.07.2006 19:20:08 von 3.14

Servus!

Ich habe eine Variable, in der mehrere Textzeilen stehen.
Diese möchte ich in einzelne Variablen aufsplitten. Das
ganze sieht so aus:
my($adr1,$adr2,$adr3,$adr4)=3D$adresse=3D~m|(?:^(.+))*|mg;
print "1: $adr1\n";
print "2: $adr2\n";
print "3: $adr3\n";
print "4: $adr4\n";

In $adresse stehen tatsächlich drei Zeilen. Die ersten
beiden werden an Position 1 und 3 ausgegeben. Warum? Warum
nicht in 2? elcher leere String matcht da?=20

pi
--=20
Attachment? Nein: http://piology.org/ILOVEYOU-Signature-FAQ.html

Re: Mehrzeilige Variable in Einzelzeilen Zerlegen

am 27.07.2006 19:24:09 von 3.14

Boris 'pi' Piwinger <3.14@piology.org> wrote:

>Ich habe eine Variable, in der mehrere Textzeilen stehen.
>Diese möchte ich in einzelne Variablen aufsplitten. Das
>ganze sieht so aus:
>my($adr1,$adr2,$adr3,$adr4)=3D$adresse=3D~m|(?:^(.+))*|mg;
>print "1: $adr1\n";
>print "2: $adr2\n";
>print "3: $adr3\n";
>print "4: $adr4\n";
>
>In $adresse stehen tatsächlich drei Zeilen. Die ersten
>beiden werden an Position 1 und 3 ausgegeben. Warum? Warum
>nicht in 2? elcher leere String matcht da?=20

PS: ($adr1,$adr2,$adr3,$adr4)=3Dsplit(/\n/,$adresse);
funktioniert, dennoch würde ich obiges gerne verstehen.

pi
--=20
Attachment? Nein: http://piology.org/ILOVEYOU-Signature-FAQ.html

Re: Mehrzeilige Variable in Einzelzeilen Zerlegen

am 27.07.2006 21:09:36 von Christian Lackas

* Boris 'pi' Piwinger [2006-07-27]:

Hi Boris,

> Ich habe eine Variable, in der mehrere Textzeilen stehen.
> Diese möchte ich in einzelne Variablen aufsplitten. Das
> ganze sieht so aus:
> my($adr1,$adr2,$adr3,$adr4)=$adresse=~m|(?:^(.+))*|mg;
> print "1: $adr1\n";
> print "2: $adr2\n";
> print "3: $adr3\n";
> print "4: $adr4\n";
> In $adresse stehen tatsächlich drei Zeilen. Die ersten
> beiden werden an Position 1 und 3 ausgegeben. Warum? Warum
> nicht in 2? Welcher leere String matcht da?

Irgendwo muss das Newline ja auch noch hin. Wenn du es so schreibst,
dann geht es:

/(^.+)*\n/mg

(das (?:)-Konstrukt ist ja überflüssig).

Gruss
Christian

--
Die sechs Phasen der Planung:
Begeisterung, Ernüchterung, Panik, Suche nach dem Schuldigen, Bestrafung
der Unschuldigen, Auszeichnung der Nichtbeteiligten.
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker

Re: Mehrzeilige Variable in Einzelzeilen Zerlegen

am 29.07.2006 16:35:53 von 3.14

Christian Lackas wrote:

>> Ich habe eine Variable, in der mehrere Textzeilen stehen.
>> Diese möchte ich in einzelne Variablen aufsplitten. Das
>> ganze sieht so aus:
>> my($adr1,$adr2,$adr3,$adr4)=3D$adresse=3D~m|(?:^(.+))*|mg;
>> print "1: $adr1\n";
>> print "2: $adr2\n";
>> print "3: $adr3\n";
>> print "4: $adr4\n";
>> In $adresse stehen tatsächlich drei Zeilen. Die ersten
>> beiden werden an Position 1 und 3 ausgegeben. Warum? Warum
>> nicht in 2? Welcher leere String matcht da?=20
>
>Irgendwo muss das Newline ja auch noch hin. Wenn du es so schreibst,
>dann geht es:
>
> /(^.+)*\n/mg

Wieso denn? Eigentlich war mein Verständnis, dass ^. jeweils
den ersten Buchstaben einer jeden Zeile matcht. Ob ich nun
die vorherige bis zum Ende (mit oder ohne Zeilenumbruch)
mitlese oder nicht.

Was matcht denn sonst? IOW: Was steht in $adr2 drin? Die
Bildschirmausgabe hat eben nichts gezeigt (ich hatte auch
mal dahinter ein Zeichen probiert, um zu sehen, ob
Leerzeichen o.ä. drin sind).

pi
--=20
Attachment? Nein: http://piology.org/ILOVEYOU-Signature-FAQ.html

Re: Mehrzeilige Variable in Einzelzeilen Zerlegen

am 06.08.2006 19:34:09 von hjp-usenet2

On Thu, 27 Jul 2006 19:20:08 +0200, Boris 'pi' Piwinger wrote:

> Servus!
>
> Ich habe eine Variable, in der mehrere Textzeilen stehen.
> Diese möchte ich in einzelne Variablen aufsplitten. Das
> ganze sieht so aus:
> my($adr1,$adr2,$adr3,$adr4)=$adresse=~m|(?:^(.+))*|mg;
> print "1: $adr1\n";
> print "2: $adr2\n";
> print "3: $adr3\n";
> print "4: $adr4\n";
>
> In $adresse stehen tatsächlich drei Zeilen. Die ersten
> beiden werden an Position 1 und 3 ausgegeben. Warum? Warum
> nicht in 2? elcher leere String matcht da?

Der vor dem ersten \n.

In

"Dagobert Duck\nAm Geldspeicher 1\nEntenhausen"

matcht m|(?:^(.+))*|mg

beim ersten Durchlauf "Dagobert Duck"
beim zweiten "" (Denn /^(.+)/ matcht zwar nicht, aber wegen des * muss
es ja nur 0 mal oder öfter matchen).
beim dritten "Am Geldspeicher 1"
....

Wenn Du den * weglässt, funktioniert es:

1: Dagobert Duck
2: Am Geldspeicher 1
3: Entenhausen
Use of uninitialized value in concatenation (.) or string at ./foo line 10.
4:

und da non-capturing (wie heißt das auf Deutsch?) Klammerung um den
ganzen Ausdruck redundant ist, kann man den Ausdruck weiter zu

m|^(.+)|mg

vereinfachen. Da . alle Zeichen außer Newline matcht, und das Ergebnis
der ganze Ausdruck ist, wenn keine capturing parentheses vorkommen, kann
man das noch zu

m|.+|mg

weiter vereinfachen. Das ist dann schon fast so leicht verständlich und
sogar etwas kürzer als die Variante mit split.

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