Elemente in push alle Zeilen Array
Elemente in push alle Zeilen Array
am 28.02.2006 12:06:48 von Marek Stepanek
Hallo alle,
ich bin Anfänger, wie ihr gleich an meiner Frage sehen werdet:
mein Problem ist: ich lese die Zeilen meiner __DATA__ ein, und ersetze
einige durch nichts, und füge alle Zeilen außer den ersetzten Zeilen (?) in
einem Array ein. Zur Kontrolle lasse ich dieses Array ausdrucken.
Tatsächlich sind einige Zeilen nicht in diesem Array. Trotzdem bei der
foreach-Schleife durch die Elemente des Arrays tauchen die ersetzten Zeilen
wieder auf ...
War das klar ausgedrückt? Es ist nicht so einfach als Anfänger, ein Problem
klar zu beschreiben!
Danke für die Geduld, kann erst spät Abends antworten!
Grüße aus München
marek
Das Beispiel-Skript wird das besser illustrieren:
#!/usr/bin/perl -w
use strict;
my ($rech_nr);
my (@zeilen);
my $margin = " ";
$rech_nr = 0;
while () {
s/^1\d?\n$//mg;
push @zeilen, "$_";
}
print "\ncontrol to see which elements are in the array
\@zeilen:\n@zeilen\n\n";
foreach my $zeile (@zeilen) {
$rech_nr++ ;
print "${margin}Rechnungs Nr $rech_nr, $zeile";
}
print "\n\n";
__DATA__
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Re: Elemente in push alle Zeilen Array
am 28.02.2006 12:11:47 von Christian Lackas
* Marek Stepanek [2006-02-28]:
Hallo Marek,
> mein Problem ist: ich lese die Zeilen meiner __DATA__ ein, und ersetze
> einige durch nichts, und füge alle Zeilen außer den ersetzten Zeilen (?) in
> einem Array ein. Zur Kontrolle lasse ich dieses Array ausdrucken.
für die ersetzen Zeilen fügst du aber ja einen leeren Eintrag ein.
Wenn du wirklich nur alle Einträge haben willst, die nicht aus 1 gefolgt
von einer oder keiner Ziffer bestehen, dann z.B. so:
while () {
if (not /^1\d?$/) {
push @zeilen, $_
}
}
Oder auch
while () { push @zeilen, $_ unless /^1\d?$/ }
Oder auch
my @zeilen = grep !/^1\d?$/, ;
> Tatsächlich sind einige Zeilen nicht in diesem Array.
Die Zeilen selbst nicht mehr, aber trotzdem Einträge wo die Zeilen mal
waren. Schau dir die Daten doch mal mit Hilfe des Data::Dumper an:
use Data::Dumper;
print Dumper \@zeilen;
> War das klar ausgedrückt? Es ist nicht so einfach als Anfänger, ein Problem
> klar zu beschreiben!
Sehr gut ist aber dein komplettes Beispiel. Dadurch ist es für uns
leicht dein Problem nachzuvollziehen.
Gruß
Christian
--
Murphys Law 8: Die Informationen, die am dringendsten benötigt wird,
ist am wenigsten erreichbar.
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker
Re: Elemente in push alle Zeilen Array
am 28.02.2006 21:52:05 von Marek Stepanek
On 28.02.2006 12:11, in article 20060228T110610@lackas.net, "Christian
Lackas" wrote:
>
> while () {
> if (not /^1\d?$/) {
> push @zeilen, $_
> }
> }
>
> Oder auch
>
> while () { push @zeilen, $_ unless /^1\d?$/ }
>
> Oder auch
>
> my @zeilen = grep !/^1\d?$/, ;
>
Genial :-) Danke Christian!
>
> use Data::Dumper;
> print Dumper \@zeilen;
>
Das kannte ich noch nicht! Wirklich sehr aufregend :-) Sollte wohl "@zeilen"
heißen, also ohne \ ...
In meinem Testskript habe ich noch ein sort implementiert, diesmal mit
Datumsangaben. Merkwürdigerweise ist aber immer noch am Anfang eine
undefinierte Variable enthalten, was ich nicht ganz verstehe. Jedenfalls
Danke, Perl macht wirklich Spaß, wenn man solche Profis zur Seite stehen hat
:-)
marek
hier mein Skript, mit jetzt nur einem kleinen >?<
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
my ($rech_nr);
my (@zeilen,@dates);
my $margin = " ";
$rech_nr = 0;
while () { push @zeilen, $_ unless /^17[\d.]+$/ }
print "@zeilen\n\n";
foreach my $zeile (sort @zeilen) {
$rech_nr++ ;
print Dumper "${margin}Rechnungs Nr $rech_nr, $zeile";
}
print "\n\n";
__DATA__
18.01.2006
18.01.2006
19.01.2006
20.01.2006
16.01.2006
16.01.2006
17.01.2006
17.01.2006
18.01.2006
Re: Elemente in push alle Zeilen Array
am 28.02.2006 22:18:03 von Ch Lamprecht
Marek Stepanek schrieb:
> Genial :-) Danke Christian!
>
>
>> use Data::Dumper;
>> print Dumper \@zeilen;
>>
>
>
> Das kannte ich noch nicht! Wirklich sehr aufregend :-) Sollte wohl "@zeilen"
> heißen, also ohne \ ...
>
> In meinem Testskript habe ich noch ein sort implementiert, diesmal mit
> Datumsangaben. Merkwürdigerweise ist aber immer noch am Anfang eine
> undefinierte Variable enthalten, was ich nicht ganz verstehe. Jedenfalls
> Danke, Perl macht wirklich Spaß, wenn man solche Profis zur Seite stehen hat
> :-)
>
Hallo Marek,
das Sortieren von Datumsangaben ist nicht ganz so einfach mit sort zu
erledigen:
use strict;
use warnings;
use Data::Dumper;
my @zeilen;
while () {
chomp;
push @zeilen, $_ unless /^17[\d.]+$/ ;
}
@zeilen =sort @zeilen;
print Dumper \@zeilen;
__DATA__
18.01.2006
18.01.2006
19.01.2006
20.01.2006
16.01.2006
16.01.2006
17.01.2006
17.01.2006
18.01.2006
2.01.2006
22.12.2005
-wie du siehst klappt es hier nicht...
besser geht es mit Date::Calc oder Date::Pcalc bei AS-perl
Grüße, Christoph
--
perl -e "print scalar reverse q/ed.enilno@ergn.l.hc/"
Re: Elemente in push alle Zeilen Array
am 01.03.2006 10:03:30 von Christian Lackas
* Marek Stepanek [2006-02-28]:
Hallo Marek,
> > use Data::Dumper;
> > print Dumper \@zeilen;
> Das kannte ich noch nicht! Wirklich sehr aufregend :-) Sollte wohl "@zeilen"
> heißen, also ohne \ ...
doch, das mit dem '\' ist schon Absicht. Dadurch gibt Dumper das ganze
als eine Variable (nämlich die Referenz auf das Array) aus statt in
mehreren Variablen, die nicht miteinander verbunden sein müßten.
Gruß
Christian
--
Die Elbe ist ein Jungbrunnen: ein Schluck, und Du wirst nicht alt!
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker
Re: Elemente in push alle Zeilen Array
am 01.03.2006 21:49:53 von Marek Stepanek
On 01.03.2006 10:03, in article 20060301T090020@lackas.net, "Christian
Lackas" wrote:
> * Marek Stepanek [2006-02-28]:
>
> Hallo Marek,
>
>>> use Data::Dumper;
>>> print Dumper \@zeilen;
>> Das kannte ich noch nicht! Wirklich sehr aufregend :-) Sollte wohl "@zeilen"
>> heißen, also ohne \ ...
>
> doch, das mit dem '\' ist schon Absicht. Dadurch gibt Dumper das ganze
> als eine Variable (nämlich die Referenz auf das Array) aus statt in
> mehreren Variablen, die nicht miteinander verbunden sein müßten.
>
> Gruß
> Christian
Noch mal Danke Christian!
Das sortieren der Datum-se (will absichtlich nicht "Daten" sagen, um keine
Missverständnisse zu erzeugen;) muss ich wohl anders machen. Die Man Pages
von Date::Calc sind sehr (zu) lang. Dafür brauche ich mindestens ein
Wochenende. Und dann verstehe ich sowieso nur die Hälfte davon.
Ich frage mich ob die Daten nicht anders umgeformt werden könnten, einfach
als eine Zahl mit Hilfe von localtime(), um sie so zu ordnen. Aber dafür
brauche ich auch erstmal ein Wochenende.
grüße
marek
Re: Elemente in push alle Zeilen Array
am 01.03.2006 22:05:29 von Ch Lamprecht
Marek Stepanek schrieb:
> On 01.03.2006 10:03, in article 20060301T090020@lackas.net, "Christian
> Lackas" wrote:
> Noch mal Danke Christian!
>
>
> Das sortieren der Datum-se (will absichtlich nicht "Daten" sagen, um keine
> Missverständnisse zu erzeugen;) muss ich wohl anders machen. Die Man Pages
> von Date::Calc sind sehr (zu) lang. Dafür brauche ich mindestens ein
> Wochenende. Und dann verstehe ich sowieso nur die Hälfte davon.
>
Hallo Marek,
sortieren mit Date::Calc geht z.B. so:
use strict;
use warnings;
use Data::Dumper;
use Date::Pcalc qw/Decode_Date_EU Date_to_Days/; #oder Date::Calc
my @zeilen;
while () {
chomp;
push @zeilen, $_ unless /^17[\d.]+$/ ;
}
@zeilen =sort {&sort_date} @zeilen;
print Dumper \@zeilen;
sub sort_date{
my @ymd_a = Decode_Date_EU($a);
my @ymd_b = Decode_Date_EU($b);
Date_to_Days(@ymd_a)<=>Date_to_Days(@ymd_b);
}
__DATA__
18.01.2006
18.01.2006
19.01.2006
20.01.2006
16.01.2006
16.01.2006
17.01.2006
17.01.2006
18.01.2006
2.01.2006
22.12.2005
Grüße, Christoph
--
perl -e "print scalar reverse q/ed.enilno@ergn.l.hc/"
Re: Elemente in push alle Zeilen Array
am 01.03.2006 22:38:53 von Marek Stepanek
On 01.03.2006 22:05, in article du52ap$1mv$3@online.de, "Ch Lamprecht"
wrote:
> Hallo Marek,
> sortieren mit Date::Calc geht z.B. so:
>
>
> use strict;
> use warnings;
> use Data::Dumper;
> use Date::Pcalc qw/Decode_Date_EU Date_to_Days/; #oder Date::Calc
> my @zeilen;
>
> while () {
> chomp;
> push @zeilen, $_ unless /^17[\d.]+$/ ;
> }
> @zeilen =sort {&sort_date} @zeilen;
> print Dumper \@zeilen;
>
> sub sort_date{
> my @ymd_a = Decode_Date_EU($a);
> my @ymd_b = Decode_Date_EU($b);
> Date_to_Days(@ymd_a)<=>Date_to_Days(@ymd_b);
> }
>
> __DATA__
> 18.01.2006
> 18.01.2006
> 19.01.2006
> 20.01.2006
> 16.01.2006
> 16.01.2006
> 17.01.2006
> 17.01.2006
> 18.01.2006
> 2.01.2006
> 22.12.2005
>
>
>
> Grüße, Christoph
Wow! das ging aber schnell! Danke Christoph, das werde ich eingehend
studieren ...
marek
Re: Elemente in push alle Zeilen Array
am 02.03.2006 10:59:01 von Christian Lackas
* Marek Stepanek [2006-03-01]:
Hallo Marek,
wenn du Daten im ISO-Format verwenden kannst (also 2006-03-02), dann
kannst du die solche Daten einfach wieder ascii-betisch sortieren
lassen.
Gruß
Christian
--
Wer die Wahrheit im falschen Moment sagt, gilt als Zyniker.
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker