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