auslesen data.txt

amad

Grünschnabel
Hallo, Ich bin auch wie meisten hier ein Nuller in Perl, aber versuche mich daraus raus zu holen und bleibe ich gleich mit dieser Problem stecken.

die einträge in data.text stehen folgend
|item1|VorGestern|01.01.2004|
|item2|Gestern|02.01.2004|
|item3|Heute|03.01.2004|

Die Ausgabe ist das gleiche wie data.txt
item1 VorGestern 01.01.2004
item2 Gestern 02.01.2004
item3 Heute 03.01.2004

Meine Wünsch Ausgabe ist das Umgekehrte:
item3 Heute 03.01.2004
item2 Gestern 02.01.2004
item1 VorGestern 01.01.2004

Nun kann mir großzügige weise jemand lernen, was soll ich in lib.cgi:
sub get_record
{
my ($field_num,$value) = @_;
open(MAIN,"$data_file") || die "help $!\n";
@main = <MAIN>;
close(MAIN);
$found = 0;
$recsaved = 0;
foreach $main_line (@main)
{

chop($main_line);
(@records) = split(/\|/,$main_line);
if ($value eq $records[($field_num)])

{
$records_found[$found]=$main_line;
$found++;



}
else
{
}
}


return($found,@records_found);

}

oder in prog.pl

foreach $item (@records_found)
{
($Item,$Heute,$Gestern,$VorGestern,$datum)=split(/\|/, $item);
$Description =~ tr/~/\n/;


ändern.
einen schönen Dank für jede Antwort zu meine Frage
 
reverse ist dein Freund, damit kann man Arrays (Listen) umdrehen.

in lib.cgi sähe das dann so aus:

Code:
[...]
open(MAIN,"$data_file") || die "help $!\n";
@main = <MAIN>;
close(MAIN);
@main = reverse @main;
[...]

In der prog.pl siehts so aus:

Code:
foreach $item (reverse @records_found)
{
($Item,$Heute,$Gestern,$VorGestern,$datum)=split(/\|/, $item);
$Description =~ tr/~/\n/;

Schönen Tag noch! :)
Sven
 
Vielen Dank GH@NDI

Ja, herzlichen Dank GH@ANDI, reverse war die Lösung, habe ich von dir etwas gelernt, falls ich dich nicht störe, hätte ich noch etwas zum lösen, und zwar:

Ich wollte eine afghanische Datum und Uhr erstellen, so alles geht locker, aber ich kann nur nicht die Ziffern auf afghanische ziffern ändern, weil es wird automatisch von server bzw von localtime(time); gemacht.
Die standart ziffern ist:: 0 1 2 3 4 5 6 7 8 9 zb. Mo.Jan.1382
Und die afghanische: ? ? ? ? ? ? ? ? ? ? möchte haben Mo.jan.????
wie ist möglich anstatt die standard ziffern die afghanische Ziffern gezeigt wird.
die pro.cgi schaut folgendes aus

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
@afgmonth=("","??? ???,usw);
@afgday=("","???? ??????",usw);
if ($afgyear<2000){$afgyear=$afgyear+1382};
if ($mday){$afday=$mday+10};
if ($hour){$afghour=$hour+3};
if ($afghour<24){$afghour=$afghour-0};
$afgnow=$afgday[$wday].", ".$afday." ".$afgmonth[$mon+1]." ".$afgyear." ".$afghour;
$compressednow=$year*10000+($mon+1)*100+$mday;

Hast du vieleicht eine idee?
 

Anhänge

  • sharon_laughs.gif
    sharon_laughs.gif
    31,9 KB · Aufrufe: 69
Sofern es keine Probleme mit den Zeichen an sich gibt, tuts ein schlichtes Suchen und Ersetzen:

Code:
$zahlen =~ tr/[0-9]/? ? ? ? ? ? ? ? ? ? /gi;

Jetzt werden alle Zahlen die in $zahlen stecken, durch die equivalente im arabischen ersetzt. :)

Musst allerdings noch alle Leerzeichen bei den arabischen Zeichen entfernen und darauf achten, das die 0 das erste und 9 das letzte Arabische Zeiche ist.

Mehr Infos gibts auf http://www.perldoc.com/perl5.8.0/pod/perlop.html und dort nach "s/PATTERN/REPLACEMENT/egimosx " suchen.
 
habe nicht geschafft

:( habe leider nicht geschafft, es schlägt immer wieder fehler, wenn ich es auch mit standard zahlen $zahlen =~ tr/[0-9]/0 1 2 3 4 5 6 7 8 9/gi; versuche, schlägt fehler. Ich glaube, ich soll es lassen bis ich ein kopf mit Perl größer werden und dann versuche ich es.-
Danke Dir GH@NDI
 
Bitte, kein Problem, aber hast du auch beachtet was ich dazu gesagt habe:

Musst allerdings noch alle Leerzeichen bei den arabischen Zeichen entfernen und darauf achten, das die 0 das erste und 9 das letzte Arabische Zeiche ist.

Bei deinem Beispiel mit den normalen Zahlen hast du nämlich wieder Leerzeichen zwischen den einzelnen Zahlen.

Sollte das mit tr///gi; allerdings grundsätzlich nicht klappen (evtl. wegen den Arabischen Zeichen, das von Perl nicht akzeptiert werden), dann könntest du mal sowas probieren:
Code:
my %zahlen = (
	1 => 'arabisch1',
	2 => 'arabisch2',
	3 => 'arabisch3',
	4 => 'arabisch4',
	5 => 'arabisch5',
	6 => 'arabisch6',
	7 => 'arabisch7',
	8 => 'arabisch8',
	9 => 'arabisch9',
	0 => 'arabisch0'
); # Für arabisch1-0 entsprechend das arabische Zeichen zwischen den beiden ' eintragen

$text =~ s/(\d)/$zahlen{1}/egi;
# in $text müssen dann die Zahlen sein, die du übersetzen möchtest

Das könnte auch noch funktionieren.
 

Neue Beiträge

Zurück