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

Ausgabe in Array oder String



<< >> 10 Einträge, 1 Seite
kerstenk
 2004-06-18 01:11
#83562 #83562
User since
2004-06-17
5 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich habe eine Suche, die sieht so aus:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
use File::Find;
       $i = 0;
       find(\&archive, $directory);

       sub archive
       {
               if($ext)
               {
                       // HIER //
                       $i++;
               }
       }


nun möchte ich, wo das // HIER // steht ein Array oder String füllen. Dies sollte dann so aussehen: /var/www/index.html|/var/www/email.php|usw... wie bekomme ich die Ausgabe also nun so in da rein?

mfg Kersten

Bearbeitet von Crian: Code-Tags spendiert\n\n

<!--EDIT|Crian|1087691563-->
format_c
 2004-06-18 01:28
#83563 #83563
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Also ich würde da für Array pledieren, weil man da mit evtl. Sortierungen flexibler ist.

Ich habe mal den Code etwas abgeändert so wie ich denke wie du es wahrscheinlich gemeint hast. Wenn nicht beschreib bitte nochmal genauer was das if ($ext) bedeutet.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
use File::Find;
my @array = ();

find(\&archive,$directory);

sub archive {
# Wenn Dateiname auf eine bestimmte Extension endet...
if (/(?:\.php?|\.htm?|\.cgi|\.pl)$/) {
push @array,$File::Find::name; #Hänge die Datei mit vollständigen Namen an das Array
}# if
}# sub


Gruß Alex\n\n

<!--EDIT|format_c|1087507750-->
kerstenk
 2004-06-18 01:35
#83564 #83564
User since
2004-06-17
5 Artikel
BenutzerIn
[default_avatar]
Also das $ext steht für die endung z.b. * für alle dateien. nun möchte ich alles was gefunden wurde mit einem | in die Datenbank eintragen. Das sollte dann so aussehen datei|datei2|datei3|usw...

dies sollte aber schon immer mit dem kompletten pfad sein.

mfg kersten
format_c
 2004-06-18 01:53
#83565 #83565
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Ok wie sieht es denn mit dem Ansatz aus?
Hab mal File::Find weggelassen weil es sich für diesen Gebrauch nicht soo gut eignet. Aber wir müssen uns schon an die Globbing-Regeln halten. * bedeutet beliebiger Dateiname. Darunter Fallen Datein, meist mit Punkt Extension getrennt, Verzeichnisse, auch . und ..

Besser für Dateien mit beliebigen Endungen eigent sich immer noch *.* besser. Was die Globbing Wildcards für Effekt haben kannst du auch in der z.B. Windows Suche ausprobieren.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use strict;
my @array = ();
my $ext = '*.*';
my @verz = ('/verzeichnis');

for my $file (@verz) {
next unless -d $file;
chdir $file or warn "Could not change into directory $file: $!";
for (glob($ext)) {
push @array,$file . '/' . $_;
}
opendir DIR,$file or warn "Konnte Verzeichnis $file nicht öffnen: $!";
push @verz,map { $file . '/' . $_ } grep !/^\.\.?$/, readdir DIR;
closedir DIR;
}

print join '|',@array;


Gruß Alex\n\n

<!--EDIT|format_c|1087509403-->
Gast Gast
 2004-06-18 12:26
#83566 #83566
Hm,

ich hatte das schon so geplant, mit "File::Find", da ich auch so die Dateien und Verzeichnisse in eine tar-file packe. Ich wollte nur das die Dateien mit Pfaden auch in der SQL-Datenbank stehen, da ich sie dann per php auslesen will und auf der Website anzeigen lassen will, damit man weiss was drin ist. Daher auch das | Zeichen, damit ich hinterher mit "explode" arbeiten kann. Oder geht das mit der tar-file auch nach deinem Beispiel?

mfg Kersten

PS: Trozdem schnmal vielen Dank für deine Hilfe. Da ich ein Neuling auf diesem gebiet bin hat mir das schon alles weitergeholfen. Aber ich verstehe immer noch nicht wofür use strict ist. Wenn das in meinem Code steht läuft nix mehr :-(
format_c
 2004-06-18 15:20
#83567 #83567
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
MMh Du hast halt ein problem mit deinem Wildcards (*) Die lassen sich mit File::Find schlecht realisieren.

Mal abgesehen von PHP, wovon ich keine Ahnung habe, kannst du mit Perl auch mit Hilfe des Moduls Archive::Tar direkt das Archiv laden und z.B. Die Files listen.

Archive::Tar

Gruß Alex

PS: strict bedeutet streng. Es ist dazu gut, um evtl. Flüchtigkeitsfehler sofort auszumerzen. Es beachtet u.a. die Lexikalischen Geltungsbereiche von Variablen:
Beispiel:
Code: (dl )
1
2
3
4
5
6
7
8
use strict;
my $test = 'hallo';
print $test;
{
my $test = 'test';
print $test;
}
print $test;

Man muss nun die Variablen speziell deklarieren. D.H. einen lexikalischen Geltungsbereich zuweisen, nämlich den in der man die Varable deklariert.
Soll eine Variable einem lexikalischen Geltungsbereich zugewiesen werden deklariert man die Variable mit my (perldoc -f my)
Mit our (perldoc -f our)kann man Variablen global machen.
Eine Variable einfach zu definieren, also sie keinem Geltungsberich zuzuweisen ist nicht mit strict zulässig.

Jetzt noch kurz was sind lexikalische Geltungsbereiche.
Nun ja das beispiel Zeigt es eigentlich.
Der oberste Geltungsbereich die eigentliche Datei.
alle Weiteren sind innerhalb geschweifter Klammern.
Code: (dl )
1
2
3
4
5
6
7
# Globaler lexikalischer Geltungsbereich
{
# ein anderer lexikalischer Geltungsbereich
{
# noch ein anderer lexikalischer Geltungsbereich
}
}


Es hört sich auf den ersten Blick ziemlich umständlich an, aber wenn du mal ein etwas komplexeres Programm mal mit und ohne strict entwickelt hast, wirst du den Unterschied merken.
Ich empfele dir strict mit warnings zusammen zu benutzen.\n\n

<!--EDIT|format_c|1087558282-->
format_c
 2004-06-18 17:45
#83568 #83568
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Ich mach dir mal heute abend ein Kleines Beispielscript, ich hoffe ich habe dich jetzt richtig verstanden, mit dem du dir den SQL, UNd Durchsuche, KlimBim sparen kannst. nämlich mit dem oben genannten Modul.

Gruß Alex
format_c
 2004-06-18 23:34
#83569 #83569
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
So hier wie versprochen ein kleines schlichtes CGI-Programm was online alle Archvdateien eines Verzeichnisses listet, welche über ein Dropdownfeld auswählbar sind und dann die enthaltenen Datenen angezeigt werden.
Code: (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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/usr/bin/perl
use strict;
use warnings;
use CGI qw/:all/;
use CGI::Carp qw/fatalsToBrowser warningsToBrowser/;
use Archive::Tar;
use FindBin;

# Verzeichnis wo sich die Archive befinden
my $dir = $FindBin::Bin . '/../archives/';

if (param('file')) {print auslesen(param('file'));}
else {print anzeigen();}


sub anzeigen {

# Verzeichnis auslesen und in Hash für CGI speichern
opendir DIR,$dir or die "Konnte Verzeichnis $dir nicht öffnen: $!";
my @files = grep !/^\.\.?$/ && /(?:\.tgz|\.tar|\.tar.gz)$/i,readdir DIR;
closedir DIR;

# HTTP-Header und HTML-Code ausgeben
return header(),
start_html(-title=>'Archivanzeige'),
h2('Archivanzeige'),
start_form(-action=>url(-relative=>1),-method=>'GET'),
scrolling_list(-name=>'file',
-size=>1,
-values=>[ sort @files ],
-default=>param('file') || ''
),
submit(-value=>'Dateien anzeigen'),
end_form,
end_html;
} #sub

sub auslesen {
# Parameter holen
my $file = shift || '';
# Anzeigeroutine wenn Parameter leer
return anzeigen() unless $file;
my $tar = Archive::Tar->new();
$tar->read($dir . $file,1) or die "Konnte Archiv $dir$file nicht lesen:$!";

#HTTP-Header und HTML-Code ausgeben
return header(),
start_html(-title=>'Archivanzeige - Dateilisting'),
h2("Folgende Dateien sind im Archiv $file enthalten:"),
join br(),sort $tar->list_files(),
a({-href=>url(-relative=>1)},"Zurück"),
end_html;

}# sub


exit;


Gruß Alex\n\n

<!--EDIT|format_c|1087587567-->
kerstenk
 2004-06-19 01:27
#83570 #83570
User since
2004-06-17
5 Artikel
BenutzerIn
[default_avatar]
Hi,

hey super nett danke!!!!! Jetzt hätte ich aber doch noch mal eine Frage zum Tar-Modul. Mein script packt das alles schon wunderbar in ein tar archiv, halt nur ohne komplette Pfade. Ich hatte das dann mit deinem Script probiert, aber wenn ich da:

$tar->add_files($file . '/'. $_);

hinschreibe macht er nix. Also das Archiv ist leer. Wenn ich das aber so mache:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
use Archive::Tar;
$tar = Archive::Tar->new();
use File::Find;
$i = 0;
find(\&archive, $backupdir);

sub archive
{
if($ext)
{
$tar->add_files($_);
$i++;
}
}


Dann geht es. Ich könnte mir vorstellen, weil du ja auch vorhin geschreiben hast, das das mit Verzeichnissen und Find:File nicht sonderlich gut geht. Wie bekomme ich jetzt aber alles in eine tar.gz-Datei?

mfg Kersten
format_c
 2004-06-19 03:17
#83571 #83571
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Was ich vorhin gesagt hab bezieht sich auch immernoch auf die vorherigen Posts. Mittlerweile hat sich das Bild ja etwas gewandelt.
Das script von mir ist zum dateilisting gemacht. Das müsste man nochmal überdenken, wenn man es als CGI-Script zum Erstellen von Tar's machen wollte (UpLoad etc pp).

Aber zurück zu deinem Script.
Wenn wir wieder bei File::Find sind und du damit die Dateien einpacken willst geht das natürlich. Du musst nur die Variable benutzen die den absoluten Pfadnamen hat, nicht nur den Dateinamen:
Verwende anstatt $_ $File::Find::name.

Du solltest wenn ich auf eine Dokumentation mit perldoc oder mit einem Link (Archive::Tar dort auch mal versuchen selbst nachzulesen.

Nachdem du alle Dateien in dein In-memory Archive gepackt hast, musst du sie mit der Methode write auf Festplatte schreiben:
Code: (dl )
$tar->write('/pfad/zum/archive.tar.gz') or warn "Konnte Archiv nicht schreiben: $!";


Gruß Alex\n\n

<!--EDIT|format_c|1087600771-->
<< >> 10 Einträge, 1 Seite



View all threads created 2004-06-18 01:11.