Thread Wie bearbeitet man ein Array? (12 answers)
Opened by geloescht at 2012-06-25 22:35

topeg
 2012-06-26 11:48
#159384 #159384
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
while(! eof(FILEMANAGER)) ist korrekt aber hier nicht nötig. Man kann prüfen, ob die Zeile Überhaubt etwas enthält. Denn auch leere Zeilen in der Datei enthalten Mindestens ein "\n" So kann man schreiben: while(my $zeile = <FILEMANAGER>) Denn my $zeile liefert den zugewiesenen wert auch gleich weiter also relevantes steht dort: while(<FILEMANAGER>) Was so lange wahr ist wie die Datei noch Zeilen hat. Wenn man extrem faul ist kann man das auch so stehen lassen, den Perl schreibt den wert aus <FILEMANAGER> auch gleich in $_

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
while(my $zeile = <FILEMANAGER>)
{
  # Zeilenumbruch entfernen
  chomp($zeile);

  my ($DB_customstorycode, $DB_headline, $DB_benutzergeschichte, $DB_zaehler, $DB_internetpost, $DB_tbgelesen, $DB_IPAdresse, $DB_Monatstag, $DB_Monat, $DB_Jahr, $DB_Stunden, $DB_Minuten, $DB_Sekunden, $DB_clientdatakey,) = split(/;/,$zeile);

  # nun kann man alle werte in @FileData speichern.
  # perl kann auch mit mehrdimensionalen Arrays umgehen
  # hier wird ein zweidimensionales benutzt:
  my $pos=@FileData;
  $FileData[$pos][0]  = $DB_customstorycode;
  $FileData[$pos][1]  = $DB_headline;
  $FileData[$pos][2]  = $DB_benutzergeschichte;
  $FileData[$pos][3]  = $DB_zaehler;
  $FileData[$pos][4]  = $DB_internetpost;
  $FileData[$pos][5]  = $DB_tbgelesen;
  $FileData[$pos][6]  = $DB_IPAdresse;
  $FileData[$pos][7]  = $DB_Monatstag;
  $FileData[$pos][8]  = $DB_Monat;
  $FileData[$pos][9]  = $DB_Jahr;
  $FileData[$pos][10] = $DB_Stunden;
  $FileData[$pos][11] = $DB_Minuten;
  $FileData[$pos][12] = $DB_Sekunden;
  $FileData[$pos][13] = $DB_clientdatakey;
}


Das kann man aber noch kürzer schreiben:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
while(my $zeile = <FILEMANAGER>)
{
  # Zeilenumbruch entfernen
  chomp($zeile);

  #die Zeile splitten und die Einzelwerte in @data speichern
  my @data=split(/;/,$zeile);

  #Das Array @data als Element in das Array @FileData schreiben.
  push(@FileData,\@data);
}


Was hier auffällt ist das \@data damit wird eine Referenz auf das Array @data erzeugt.
Alle Arrays werden so definiert @<NAME> So kann man aber schlecht Arrays in Arrays packen, oder Arrays in Hashes. Also dachten sich die Erfinder man könnte ja einen Verweis auf ein Array in ein anderes Packen. Ein Verweis ist ein Scalar, der Perl sagt, wo das eigentliche Array zu finden ist. Das wird bei Perl Referenz genannt. Eine Referenz besetht aus einer Speicheradresse, die Perl aufsucht um daraus das Array zu lesen.

Wie ich schon schrieb lässt sich das noch minimaler schreiben. Das ist nützlich wenn man mal schnell etwas runter schreiben will. In größeren Abschnitten von Scripten sollte man es nicht nutzen, da es schnell unübersichtlich werden kann.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
while(<FILEMANAGER>)
{
  # Zeilenumbruch entfernen
  # wenn nicht angeben wurde wird "$_" benutzt
  chomp;

  #die Zeile splitten und die Einzelwerte in @data speichern
  my @data=split(/;/,$_);

  #Das Array @data als Element in das Array @FileData schreiben.
  push(@FileData,\@data);
}


und noch mehr lässt sich weglassen:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
while(<FILEMANAGER>)
{
  # Zeilenumbruch entfernen
  # wenn nicht angeben wurde wird "$_" benutzt
  chomp;

  #Das Array @data als Element in das Array @FileData schreiben.
  push(@FileData,[ split(/;/,$_) ]);
}

Das besondere Hier ist [ ... ] das sagt Perl "Erzeuge ein anonymes Array"
Ein anonymes Array ist eines das keinen Namen hat, also nie mit @<NAME> definiert wurde.
Der Rückgabewert von [ ... ] ist nur eine Referenz, ein Verweis auf den Speicherort des Arrays. Und mehr wird im Code oben auch nicht gebraucht. Die Referenz wird glich dem Array @FileData zugewiesen

Wenn man es auf kürze anlegt:
Code (perl): (dl )
chomp and push(@FileData,[ split(/;/,$_) ]) while(<FILEMANAGER>);

Das ist aber schon extrem. Hier wird ausgenutzt das man viele Schleifen auf zwei weiten schreiben kann.

EDIT:

Aber nun zu deiner eigentlichen Frage. Wie findest du im Array @FileData eine bestimmte IP-Adresse:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
my $gesuchte_ip='192.168.111.111';
my ($DB_customstorycode, $DB_headline, $DB_benutzergeschichte, $DB_zaehler, $DB_internetpost, $DB_tbgelesen, $DB_IPAdresse, $DB_Monatstag, $DB_Monat, $DB_Jahr, $DB_Stunden, $DB_Minuten, $DB_Sekunden, $DB_clientdatakey);
for my $eintrag (@FileData)
{
  my @data=@$eintrag;
  if($data[6] eq $gesuchte_ip)
  {
    ($DB_customstorycode, $DB_headline, $DB_benutzergeschichte, $DB_zaehler, $DB_internetpost, $DB_tbgelesen, $DB_IPAdresse, $DB_Monatstag, $DB_Monat, $DB_Jahr, $DB_Stunden, $DB_Minuten, $DB_Sekunden, $DB_clientdatakey)=@data;
    last;
  }
}


Der Code geht alle Einträge in @FileData durch und schaut nach ob der Eintrag mit der IP-Adresse übereinstimmt. Wenn dem so ist dann werden alle Werte übernommen und die Schleife beendet.

EDIT2:

Das besondere hier ist @$eintrag das Bewirkt das aus der Referenz auf das Array eine echtes Array wird.

Man kann es aber auch anders schreiben. So verstehst du es möglicherweise besser:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
my $gesuchte_ip='192.168.111.111';
my ($DB_customstorycode, $DB_headline, $DB_benutzergeschichte, $DB_zaehler, $DB_internetpost, $DB_tbgelesen, $DB_IPAdresse, $DB_Monatstag, $DB_Monat, $DB_Jahr, $DB_Stunden, $DB_Minuten, $DB_Sekunden, $DB_clientdatakey);
for( my $pos=0; $pos<@FileData; $pos++ )
{
  if( $data[$pos][6] eq $gesuchte_ip )
  {
    $DB_customstorycode    = $data[$pos][0];
    $DB_headline           = $data[$pos][1];
    $DB_benutzergeschichte = $data[$pos][2];
    $DB_zaehler            = $data[$pos][3];
    $DB_internetpost       = $data[$pos][4];
    $DB_tbgelesen          = $data[$pos][5];
    $DB_IPAdresse          = $data[$pos][6];
    $DB_Monatstag          = $data[$pos][7];
    $DB_Monat              = $data[$pos][8];
    $DB_Jahr               = $data[$pos][9];
    $DB_Stunden            = $data[$pos][10];
    $DB_Minuten            = $data[$pos][11];
    $DB_Sekunden           = $data[$pos][12];
    $DB_clientdatakey      = $data[$pos][13];

    last;
  }
}

Last edited: 2012-06-26 12:07:31 +0200 (CEST)

View full thread Wie bearbeitet man ein Array?