Schrift
[thread]6014[/thread]

Zeilenweise aus Datei in Array lesen (Seite 2)

Leser: 3


<< |< 1 2 >| >> 15 Einträge, 2 Seiten
format_c
 2004-01-14 12:53
#79131 #79131
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
So in der Art?
Code: (dl )
1
2
3
4
5
my @array;
my $string = "/home/format_c";
$array[0] = "PATH = /homes/usr/";
$array[0] =~ s#(\w+\s+=\s+)/.*#$1 . $string#e;
print $array[0];


Gruß Alex
Patrick
 2004-01-14 12:59
#79132 #79132
User since
2004-01-07
56 Artikel
BenutzerIn
[default_avatar]
Sieht ja mega klasse aus, aber könntest Du mir mal ein bischen erzählen was da eigentlich steht!?

ich bin noch nicht so weit! :(

besonders diesen Abschnitt
Quote
$array[0] =~ s#(\w+\s+=\s+)/.*#$1 . $string#e;
\n\n

<!--EDIT|Patrick|1074078145-->
Mfg
Paddy

Perl ist göttlich, die Kunst besteht darin Perl anwenden zu können.
Strat
 2004-01-14 13:02
#79133 #79133
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
also wenn du nur die Zeile brauchst, in der am Anfang PATH steht, koenntest du das folgendermaszen machen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
my $path = ""; # oder defaultwert
unless (open (FH, $filename)) {
  die "Error: couldn't read from '$filename': $!\n";
} # unless
else {
  while (<FH>) {

    # path von anfang der zeile bis zur wortgrenze; so wird
    # z.B. PATHINFO nicht gefunden
    if ( /^PATH\s*\=\s*(.+?)$/ ) {
      $path = $1;
      last; # schleife abbrechen
    } # if
  } # while

  close (FH);
} # else
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Strat
 2004-01-14 13:08
#79134 #79134
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
wenn die ganze datei die form
NAME = Wert
hat, und NAME eindeutig ist, ist es vielleicht besser, das ganze in einen Hash einzulesen und dann damit zu arbeiten:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
my %config = ();
unless (open (FH, $filename)) {
  die "Error: couldn't read from '$filename': $! ";
} # unless
else {
  while (<FH>) {
    my ($key, $value) = split(/\s*=\s*/, $_, 2);

    # da darf $key nicht doppelt vorkommen
    # weil sonst der alte key ueberschrieben wird 
    $config{$key} = $value; 
  } # while

  close (FH);
} # else
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Crian
 2004-01-15 11:50
#79135 #79135
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
[quote=Patrick,14.01.2004, 11:59]Sieht ja mega klasse aus, aber könntest Du mir mal ein bischen erzählen was da eigentlich steht!?

ich bin noch nicht so weit! :(

besonders diesen Abschnitt
Quote
$array[0] =~ s#(\w+\s+=\s+)/.*#$1 . $string#e;
[/quote]
> Sieht ja mega klasse aus, aber könntest Du mir mal ein bischen erzählen was da eigentlich steht!?

Ich mach das mal :)

Bei $array[0] =~ s#(\w+\s+=\s+)/.*#$1 . $string#e handelt es sich um einen sogenannten regulären Ausdruck (RE), der auf die Variable $array[0], also das erste Element des Arrays, angewendet wird.

Der Ausdruck s#(\w+\s+=\s+)/.*#$1 . $string#e nimmt eine Substitution vor (deswegen auch das s an seinem Anfang, das Zeichen '#' dient hier als Trenner zwischen dem Suchteil und dem Ersetzungsteil (und dem Teil der danach folgt und wo man noch Optionen angeben kann, die die Ersetzung beeinflussen, wie im Beispiel die Option 'e').

Der Suchteil lautet hier (\w+\s+=\s+)/.*. Die Klammern "fangen" gefundene Teile, die man später in der Suche mit "\NUMMER" oder in der Ersetzung mit "$NUMMER" zitieren kann.

\w steht für einen beliebiges Wortzeichen, es ist ungefähr so etwas wie a..z,A..Z,0..9,-,_ ... genau weiß ichs nicht auswendig, müsste ich nachsehen.
Das Pluszeichen hinter dem \w gibt an, das ein bis beliebig viele dieser Wortzeichen vorkommen müssen.
\s steht für (white)Space, also Leerzeichen, Tab, Zeilenumbruch, CarriageReturn, VerticalSpace (wars das? ich glaub ja), das Plus dahinter wieder für ein bis beliebig viele.
Darauf muss das Zeichen '=' folgen, und wieder Whitespace.
Dieser Teil wird gefangen.
Danach muss noch das Zeichen '.' folgen (der Punkt steht normalerweise in einer RE für ein beliebiges Zeichen, deshalb muss er hier mit dem Backslash davor "escaped" - geschützt - werden.
Genau das ist hier aber ein Fehler, denke ich, meint ist wohl .* statt \.*, da man den Rest ja ersetzen will.
Nach dem beliebigen Zeichen kommt dann ein Stern, das bedeutet null bis beliebig oft.
Da in dem String kein Punkt an dieser Stelle vorkommt, würde das "null mal" passen, und die RE würde den neuen Pfad vor den alten schreiben. Nimmt man den Backslash weg, müsste es funktionieren :D

Ich würd den Ausdruck schreiben als

Code: (dl )
$array[0] =~ s#^(\w+\s+=\s+).*$#$1$string#;
\n\n

<!--EDIT|Crian|1074160319-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2004-01-14 08:48.