Schrift
[thread]12810[/thread]

Zwei Arrays "synchron" ausgeben

Leser: 1


<< >> 10 Einträge, 1 Seite
cbxk1xg
 2008-11-23 15:18
#116545 #116545
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Hallo Freunde der Sonne,

ich quäle mich grade mit zwei Arrays, die nicht so wollen wie ich will. Konkret habe ich zwei eindimensionale Arryays die ich in einer Schleife ausgeben möchte.
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
        
use strict, etc. pp.

my $max = @PICS;

for my $i( 0 .. $max )
        {
        $Pictures .= "PIC:<br><img src=\"$PICS[$i]\" alt=\"$CAPTIONS[$i]\" border=\"0\" class=\"GalleryPic\">CAPTION:<br>$CAPTIONS[$i]";
        }


In @PICS stehen URLs zu Bildern, diese stimmen auch und die Bilder werden alle angezeigt. In @CAPTIONS stehen die Bildunterschriften. Auch diese werden angezeigt. ABER: Die Captions werden alle gleich unter dem ersten Bild rausgeworfen und ich verstehe nicht warum?!
Gast Gast
 2008-11-23 15:31
#116546 #116546
wie stehen sie denn in den Arrays?
Benutze mal "Data::Dumper" und mach ein "print Dumper(\@CAPTIONS);" bzw. "print Dumper(\@PICS);"
Es kann ja sein, dass wirklich alles in einem Eintrag steht...
cbxk1xg
 2008-11-23 15:33
#116547 #116547
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
PICS = url1, url2, url3
CAPTIONS = bla fasel, super bild, hallo welt

Es sind halt zwei ganz normale arrays.
Linuxer
 2008-11-23 15:48
#116548 #116548
User since
2006-01-27
3891 Artikel
HausmeisterIn

user image
Wie werden denn @PICS und @CAPTIONS gefüllt? Zeig doch bitte mal richtigen (den produktiven) Perl-Code dafür.

Prinzipiell funktioniert das:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl
use strict;
use warnings;

my @pics     = map { sprintf "%02d.jpg", $_ } 1..6;
my @captions = qw( quark mehl tomate schinken kaese ananas );

for my $i ( 0 .. $#pics ) {
        print <<BILDINFO;
PIC:<br>
<img src="$pics[$i]" alt="$captions[$i]" border="0" class="gallery_pic" />
CAPTION:<br>
$captions[$i]
BILDINFO
}
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
cbxk1xg
 2008-11-23 16:20
#116549 #116549
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
OK, ich hab die Ursache gefunden. Die Schleife macht genau das, was sie soll. Allerdings ist das Splitten der CAPTIONS-Datei falsch. Ich habe eine TXT-Datei, die auf Windows-Rechnern erzeugt wird. Diese Datei ist nach folgendem Muster aufgebaut.
Code: (dl )
1
2
3
4
5
<b>Hans im Glück auf Mallorca</b>
Hier sieht man in beim Bananabootfahren.

<b>Marry Poppins auf der Weihnachtsfete</b>
Sie verteilt Süßigkeiten an die Kinder


Ich müsste also beim Absatz splitte. Aber genau das gelingt mir nicht. Ich habe es mit folgenden Lösungsansätzen versucht, bin aber gescheiter.

Code (perl): (dl )
1
2
3
4
5
# Variante 1
my ($caption) = split(/^\n*$/,$line);

#Variante 2
my ($caption) = split(/\n\n/,$line);


Was mache ich falsch?
cbxk1xg
 2008-11-23 16:25
#116550 #116550
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Hier mal die komplett SUB
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
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
58
59
60
61
62
63
64
65
66
sub GetGalleryFileAndCaptions
{
my ($URLpicdir,$PATHpicdir) = @_;


return "Error: couldn't build gallery. The following directory does not exist: $PATHpicdir" if not (-d "$PATHpicdir");


my @allfiles = ();
my @dirs = ();
my @CAPTIONS = ();
my @PICS = ();
my $PicDisplayReturn = "";

&untaint( \$PATHpicdir ) or return "Could not untaint directory: $PATHpicdir\n";

opendir(DIR, "$PATHpicdir") or return "Could not open: $PATHpicdir";
@allfiles = sort( readdir( DIR ) );
closedir(DIR);

        for my $file (@allfiles)
        {
                if (-d "$PATHpicdir$file")
                {
                push @dirs, $file unless (($file eq ".") or ($file eq ".."));
                }

                else
                {
                my ($extension) = $file =~ /\.([^.]+?)$/; 
                $extension = lc($extension);
                push @PICS, $file if ($extension eq "jpg");
                }

        }

my $CaptionFile = $PATHpicdir."bu.txt";

open DATA, "<$CaptionFile" or return qq|Program Error! Could not open file: $CaptionFile. Debugging information: $!|;
chomp (my @LINES = <DATA>);
close DATA;

        for my $line (@LINES)
        {
        $line =~ s/\015\012|\012|\015/\n/sg;
        }
        

        for my $line (@LINES)
        {
                my ($caption) = split(/^\n*$/,$line);
                {
                push(@CAPTIONS,$caption);
                }
        }

        for my $p (0 .. $#PICS)
        {

        $PicDisplayReturn .= "PIC:<br><img src=\"$URLpicdir$PICS[$p]\" alt=\"$CAPTIONS[$c]\" border=\"0\" class=\"GalleryPic\"><br>CAPTION:<br>$CAPTIONS[$c]<hr>";
        
        }

#$PicDisplayReturn =~ s/\015\012|\012|\015//sg;
return $PicDisplayReturn;
}
Linuxer
 2008-11-23 16:42
#116551 #116551
User since
2006-01-27
3891 Artikel
HausmeisterIn

user image
Wie soll das klappen?
Du liest zunächst zeilenweise ein, danach kannst Du nicht mehr an mehreren \n splitten.

Schau Dir mal die perlvar an, such dort nach INPUT_RECORD_SEPARATOR.

Code (perl): (dl )
1
2
3
4
5
6
7
8
open my $rfh, '<', $CaptionFile or return "$CaptionFile: open(ro) failed: $!\n";
{
        # perldoc perlvar
        local $/ = "\n\n";
        @captions = <$rfh>;
        chomp @captions;
}
close $rfh or die "$CaptionFile: close(ro) failed: $!\n";
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
cbxk1xg
 2008-11-23 16:58
#116552 #116552
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Mh, da ändert sich nicht wirklich was. Ich bekomme zwar alle Bilder in Reihenfolge aber unter jedem Bild stehen alle Captions aus der Datei. Ich krieg echt ne Krise!

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
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
sub GetGalleryFileAndCaptions
{
my ($URLpicdir,$PATHpicdir) = @_;


return "Error: couldn't build gallery. The following directory does not exist: $PATHpicdir" if not (-d "$PATHpicdir");


my @allfiles = ();
my @dirs = ();
my @CAPTIONS = ();
my @PICS = ();
my $PicDisplayReturn = "";


opendir(DIR, "$PATHpicdir") or return "Could not open: $PATHpicdir";
@allfiles = sort( readdir( DIR ) );
closedir(DIR);

        for my $file (@allfiles)
        {
                if (-d "$PATHpicdir$file")
                {
                push @dirs, $file unless (($file eq ".") or ($file eq ".."));
                }

                else
                {
                my ($extension) = $file =~ /\.([^.]+?)$/; 
                $extension = lc($extension);
                push @PICS, $file if ($extension eq "jpg");
                }

        }

my $CaptionFile = $PATHpicdir."bu.txt";

#open DATA, "<$CaptionFile" or return qq|Program Error! Could not open file: $CaptionFile. Debugging information: $!|;
#chomp (my @LINES = <DATA>);
#close DATA;

open my $rfh, '<', $CaptionFile or return qq|Program Error! Could not open file: $CaptionFile. Debugging information: $!|;
{
# perldoc perlvar
local $/ = "";
@CAPTIONS = <$rfh>;
chomp @CAPTIONS;
}
close $rfh or return qq|Program Error! Could not close file: $CaptionFile. Debugging information: $!|;

#       for my $line (@LINES)
#       {
#       $line =~ s/\015\012|\012|\015/\n/sg;
#       }
        

#       for my $line (@LINES)
#       {
#               my ($caption) = split(/\n\n/,$line);
#               {
#               push(@CAPTIONS,$caption);
#               }
#       }

        for my $p (0 .. $#PICS)
        {

        $PicDisplayReturn .= "PIC:<br><img src=\"$URLpicdir$PICS[$p]\" alt=\"$CAPTIONS[$c]\" border=\"0\" class=\"GalleryPic\"><br>CAPTION:<br>$CAPTIONS[$c]<hr>";
        
        }

#$PicDisplayReturn =~ s/\015\012|\012|\015//sg;
return $PicDisplayReturn;
}
cbxk1xg
 2008-11-23 17:09
#116553 #116553
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
So, ich hab's! Danke Linuxer!

Der Code, nicht schön aber selten:
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
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
sub GetGalleryFileAndCaptions
{
my ($URLpicdir,$PATHpicdir) = @_;


return "Error: couldn't build gallery. The following directory does not exist: $PATHpicdir" if not (-d "$PATHpicdir");


my @allfiles = ();
my @dirs = ();
my @CAPTIONS = ();
my @PICS = ();
my $PicDisplayReturn = "";


opendir(DIR, "$PATHpicdir") or return "Could not open: $PATHpicdir";
@allfiles = sort( readdir( DIR ) );
closedir(DIR);

        for my $file (@allfiles)
        {
                if (-d "$PATHpicdir$file")
                {
                push @dirs, $file unless (($file eq ".") or ($file eq ".."));
                }

                else
                {
                my ($extension) = $file =~ /\.([^.]+?)$/; 
                $extension = lc($extension);
                push @PICS, $file if ($extension eq "jpg");
                }

        }

my $CaptionFile = $PATHpicdir."bu.txt";

open my $rfh, '<', $CaptionFile or return qq|Program Error! Could not open file: $CaptionFile. Debugging information: $!|;
{
# perldoc perlvar
# $INPUT_RECORD_SEPARATOR
local $/ = "\r\n\r\n";
@CAPTIONS = <$rfh>;
chomp @CAPTIONS;
}
close $rfh or return qq|Program Error! Could not close file: $CaptionFile. Debugging information: $!|;


        for my $i (0 .. $#PICS)
        {

                $PicDisplayReturn .= "<img src=\"$URLpicdir$PICS[$i]\" alt=\"$CAPTIONS[$i]\" border=\"0\" class=\"GalleryPic\"><br>$CAPTIONS[$i]<br><br>";
        }

$PicDisplayReturn =~ s/\015\012|\012|\015//sg;
return $PicDisplayReturn;
}
Gast Gast
 2008-11-23 17:13
#116554 #116554
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
27
28
29
30
31
32
33
sub GetGalleryFileAndCaptions
{
#....

#open DATA, "<$CaptionFile" or return qq|Program Error! Could not open file: $CaptionFile. Debugging information: $!|;
#chomp (my @LINES = <DATA>);
#close DATA;

################################################################
# Den ganzen Datensatz auf einmal einlesen
my $data='';
open my $rfh, '<', $CaptionFile or return qq|Program Error! Could not open file: $CaptionFile. Debugging information: $!|;
{
  # perldoc perlvar
  local $/ = undef;
  $data = <$rfh>;
}
close $rfh or return qq|Program Error! Could not close file: $CaptionFile. Debugging information: $!|;
# Das "\r" entfernen
$data=~tr/\x0D//d;
# Daten splitten
my @CAPTIONS=split(/\x0A\x0A/,$data);
################################################################
        for my $p (0 .. $#PICS)
        {

        $PicDisplayReturn .= "PIC:<br><img src=\"$URLpicdir$PICS[$p]\" alt=\"$CAPTIONS[$c]\" border=\"0\" class=\"GalleryPic\"><br>CAPTION:<br>$CAPTIONS[$c]<hr>";
        
        }

#$PicDisplayReturn =~ s/\015\012|\012|\015//sg;
return $PicDisplayReturn;
}

<< >> 10 Einträge, 1 Seite



View all threads created 2008-11-23 15:18.