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

Testen, ob Textdatei bereits existiert --> möglich?

Tags: Similar Threads

Readers: 3


<< >> 7 entries, 1 page
Dingels
 2008-11-29 23:25
#116721 #116721
User since
2008-07-07
31 articles
BenutzerIn
[default_avatar]
Hallo ihr Perl-Experten,

ich soll aus einem Textkorpus Worttyp-Häufigkeiten in einem Hash speichern.
Also "Worttyp => Häufigkeit". Dann wird später eine Benutzereingabe von der Konsole eingelesen und mit den Daten aus dem Hash verglichen.

Wenn man das Programm neu startet, muss der Hash jedes Mal neu gebildet werden. Bei nem großen Korpus ist das sehr lästig.

Deshalb habe ich mir überlegt, ob ich den Inhalt des Hashs nicht einfach in eine Textdatei schreiben könnte und die dann beim nächsten Programmstart aufrufen könnte.

Daher soll das Programm nur dann den Hash noch mal bilden, wenn die Textdatei nicht existiert. Wenn sie existiert, dann soll das Programm stattdessen die Daten aus dieser Textdatei nehmen.

Wie kann ich das implementieren? Mit ner if-Bedingung und "exists" hab ich es schon versucht, aber sonst fällt mir nix ein. Habt ihr eine Idee?

Vielen herzlichen Dank.


MfG,
Dingels
lichtkind
 2008-11-29 23:40
#116722 #116722
User since
2004-03-22
5697 articles
ModeratorIn + EditorIn
[Homepage]
user image
file test operatoren heissten in perl -e (exist) -r (read) -w (write) -d (dir) usw.

Code (perl): (dl )
if (-e $file_name) { ... }
sollte also sein was du suchst, steht aber alles auch in der perldoc perlop
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
pktm
 2008-11-29 23:57
#116724 #116724
User since
2003-08-07
2921 articles
BenutzerIn
[Homepage]
user image
Dazu gibt es auch ein nettes Modul: CPAN:Data::Serializer, und in CPAN:Data::Serializer::Cookbook fidnest du im Abschnitt "Keeping data persistent between executions of a program." das, was du beschrieben hast.
http://www.intergastro-service.de (mein erstes CMS :) )
Dingels
 2008-11-30 00:17
#116725 #116725
User since
2008-07-07
31 articles
BenutzerIn
[default_avatar]
Danke erst einmal.

Wie muss das jetzt genau aussehen? Ich habe mal etwas probiert, aber es funktioniert nicht. Ich möchte testen, ob in demselben Ordner, in dem das Perl-Skript steckt, auch eine bestimmte Textdatei steckt.

Mein Code sieht bisher so aus:


Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
my $dateinamen;

opendir(INPUT, "./");

while (my $dateien = readdir(INPUT)) {
        $dateinamen .= $dateien . ' ';
}

closedir INPUT;

my @dateinamen_liste = split(" ", $dateinamen);

foreach my $dateiname (@dateinamen_liste) {
        if (not -e "haeufigkeiten.txt") {
               ...
} else {
           ...
}


Das funktioniert allerdings nicht. Wie muss das aussehen, damit das funktioniert?
Dingels
 2008-11-30 01:08
#116726 #116726
User since
2008-07-07
31 articles
BenutzerIn
[default_avatar]
Oha, wie toll ist das denn? Hab die Lösung selbst gefunden. Geht ja ganz simpel. Lichtkinds if-Abfrage genügt ja tatsächlich. Perl sucht dann wohl automatisch im selben Ordner, wo das Skript liegt, richtig?

Das ist ja komfortabel. Dann kann ich mir den ganzen Monster-Code oben ja sparen. Feine Sache. :-)

Danke nochmals an euch beide. :-)
murphy
 2008-11-30 02:20
#116730 #116730
User since
2004-07-19
1776 articles
HausmeisterIn
[Homepage]
user image
Dingels+2008-11-29 23:17:11--
[...]
Code (perl): (dl )
1
2
3
4
5
6
7
[...]
while (my $dateien = readdir(INPUT)) {
        $dateinamen .= $dateien . ' ';
}
[...]
my @dateinamen_liste = split(" ", $dateinamen);
[...]

[...]

Was soll das denn? Abgesehen davon, dass es schrecklich redundant und ineffizient ist, ist es auch noch fehleranfällig. Niemand zwingt Dich, Daten in einem String zu speichern, wenn Du eigentlich ein Array haben willst. Und wenn Du schon Dateinamen in einem String aneinanderhängst, was eigentlich niemals nötig sein sollte, dann ist das Leerzeichen kein gutes Trennzeichen, da es auch mal in einem Dateinamen vorkommen könnte…

Also besser so:
Code (perl): (dl )
1
2
3
4
my @dateinamen;
while(my $datei = readdir(INPUT)) {
  push @dateinamen, $datei;
}


Quote
Code (perl): (dl )
1
2
3
4
5
6
[...]
foreach my $dateiname (@dateinamen_liste) {
        if (not -e "haeufigkeiten.txt") {
               ...
}
[...]

Hmm, davon, dass man dieselbe Abfrage mehrmals in einer Schleife durchführt, von deren Interationsvariablen sie völlig unabhängig ist, wird das Resultat nicht unbedingt besser. Und Du prüfst natürlich nicht, ob die Datei mit dem Namen haeufigkeiten.txt in dem Verzeichnis vorhanden ist, in dem das Skript liegt, sondern ob sie im aktuellen Arbeitsverzeichnis vorhanden ist.

Die ganzen Iterationen in Deinem Skript erfüllen keinen erkennbaren Zweck!

Um aber auf das eigentliche Problem zurückzukommen: Du solltest erstmal das Verzeichnis bestimmen, in dem Dein Skript wohnt und dann auf die Existenz der Datei prüfen. Da ersteres tatsächlich nicht ganz trivial ist, nimmt man am besten das Standardmodul CPAN:FindBin dafür her:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use strict;
use warnings;

use FindBin;
use File::Spec::Functions;

my $haeufigkeiten = catfile($FindBin::Bin, 'haeufigkeiten.txt');

if (-e $haeufigkeiten) {
  print "$haeufigkeiten gibt's schon\n"
  # lies die Datei
}
else {
  print "$haeufigkeiten haben wir hier nicht\n"
  # erzeuge die Datei
}
When C++ is your hammer, every problem looks like your thumb.
pktm
 2008-11-30 02:41
#116731 #116731
User since
2003-08-07
2921 articles
BenutzerIn
[Homepage]
user image
Da vllt. noch die Anmerkung für Neulinge: In der Doku zu CPAN:FindBin steht:
Quote
$Bin - path to bin directory from where script was invoked


und in murphys Beispiel wird das als $FindBin::Bin angesprochen.
http://www.intergastro-service.de (mein erstes CMS :) )
<< >> 7 entries, 1 page



View all threads created 2008-11-29 23:25.