Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7309[/thread]

Probleme bei Datei Aufsplitten



<< >> 10 Einträge, 1 Seite
KA2065
 2005-09-26 12:42
#58391 #58391
User since
2005-09-26
2 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

Ich habe eine Variable $temp in der ich die ausgabe von IFstat gespeichert habe.
Genauer gesagt nur die beiden Zahlen werte KBin und KBout

16.98 17.78 zum Beispiel.


ich möchte diese beiden werte jedoch in zwei verschiedenen variablen speichern.

Leider bin ich noch ein perl anfänger.

Wie kann ich die beiden Zahlenwerte am besten trennen und auslesen?

Habe auch folgendes getestet funktioniert aber irgendwie nicht.

my $data = split(/ /, $temp1);

Ich bin echt um jede hilfe Dankbar.

Gruß,

Andi
vayu
 2005-09-26 13:00
#58392 #58392
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
hab dir zwar auf perl.de schon geantwortet, aber hier nochmal :)

Code: (dl )
my @data = split(/ /, $temp1); 
supersucker
 2005-09-26 13:10
#58393 #58393
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
oder:

Code: (dl )
my ($firstString, secondString) = ($1, $3) if ($temp  =~m/(\d+\.?\d+)(\s+)(\d+\.?\d+)/);


ungetestet, sollte aber laufen
vayu
 2005-09-26 13:27
#58394 #58394
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
wozu so umständlich, wenn es doch split gibt?

Code: (dl )
my ($first, $second) = split( " ", $temp);


geht doch auch.
supersucker
 2005-09-26 13:44
#58395 #58395
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
ja, stimme dir völlig zu........:-)
Dubu
 2005-09-29 14:13
#58396 #58396
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Man sollte noch auf den Unterschied zwischen
Code: (dl )
split / /, $foo

und
Code: (dl )
split " ", $foo

hinweisen.

Die erste Versionen teilt den String $foo an einzelnen Leerzeichen auf, d.h. wenn irgendwo mehrere Leerzeichen aufeinander folgen, dann werden leere Felder fuer den Raum "zwischen den Leerzeichen" zurueckgegeben. Tabs werden gar nicht als Trenner genommen.

Die Version mit " " hat dagegen eine besondere Bedeutung: Es werden Folgen von Whitespace (also Leerzeichen und Tabs) zusammengefasst, und fuehrender Whitespace am Anfang einer Zeile wird automatisch uebersprungen. split() arbeitet in diesem Fall also genauso wie das Programm awk.

Die Variante
Code: (dl )
split /\s+/, $foo

entspricht eher dem zweiten Fall, aber fuehrender Whitespace fuehrt hier zu einem leeren ersten Feld.

Fuer das angegebene Problem und aehnliche Faelle, in denen Daten durch einfache oder mehrfache Leerzeichen oder Tabs getrennt sind, ist es also definitiv besser, split " ", $temp1 zu benutzen.
Strat
 2005-09-29 17:03
#58397 #58397
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Dubu,29.09.2005, 12:13]Fuer das angegebene Problem und aehnliche Faelle, in denen Daten durch einfache oder mehrfache Leerzeichen oder Tabs getrennt sind, ist es also definitiv besser, split " ", $temp1 zu benutzen.[/quote]
hmmm, wenn ich das jetzt richtig verstehe, macht split(" ", $string) nur dann sinn, wenn man leerzeichen zu beginn und am ende von $string ignoriert haben will, sonst nicht. Oder?
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
vayu
 2005-09-29 17:10
#58398 #58398
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
so habbichs auch verstanden :)
Dubu
 2005-09-29 17:18
#58399 #58399
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=Strat,29.09.2005, 15:03]hmmm, wenn ich das jetzt richtig verstehe, macht split(" ", $string) nur dann sinn, wenn man leerzeichen zu beginn und am ende von $string ignoriert haben will, sonst nicht. Oder?[/quote]
Leerzeichen/Tabs am Anfang der Zeile, ja. Whitespace am Zeilenende wird auch von /\s+/ ignoriert.

Ein split (" ", $string) heisst soviel wie: "Gib mir alles in $string, was kein Whitespace ist, einzeln in Feldern zurueck." Wie ich finde, ist das eine Fragestellung, die sehr haeufig auftaucht. Fuehrende und anhaengende Leerzeichen in meinem String (der z.B. eine Benutzereingabe ist) interessieren mich dabei meist nicht.

Wichtig ist vor allem, dass / / und " " bei split ganz Unterschiedliches bedeuten! Das erste ist ein normaler regulaerer Ausdruck, der auf ein Leerzeichen passt, das zweite eben eine spezielle Kurzform.

Um das klar zu machen, sollte man auch den regulaeren Ausdruck bei split immer in Schraegstriche setzen und nicht in Anfuehrungszeichen, auch wenn es damit funktioniert.
Strat
 2005-10-03 14:50
#58400 #58400
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Hier noch ein Beispiel:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
C:\>perl
$" = "|";
my $string = " 20 30 40 ";
my @x = split(" ", $string);
print "X: |@x|\n";
my @y = split(" ", $string, 10);
print "Y: |@y|\n";
my @z = split(/ /, $string, 0);
print "Z: |@z|\n";
^D
X: |20|30|40|
Y: |20|30|40||
Z: ||||20|30|40|

wobei das 0 fuer das Ende zustaendig ist; lediglich fuer den anfang spielt es eine rolle, ob " " oder / / verwendet wird
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 10 Einträge, 1 Seite



View all threads created 2005-09-26 12:42.