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

Textblock in Datei schreiben

Leser: 1


<< |< 1 2 >| >> 11 Einträge, 2 Seiten
tecker
 2008-11-04 15:16
#115952 #115952
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hi, stehe grad etwas auf dem Schlauch.

Wie kann ich beliebig viele Zeilen inkl. Variablen in eine Datei schreiben?
Das es so geht ...

open(FH, ">$file") or die "...";
print FH "zeile1";
print FH "zeile2";
close(FH);

weis ich ja, aber wollte es mehr im Shell-Still wie

#!/usb/bin/sh
OUTPUT=/pfad/file
cat <<-EOF >>$OUTPUT
zeile1
zeileX
EOF

Die Daten sollen nicht aus einer Datei oder so gelesen werden. Geht es irgendwie über eine Pipe?

Viele Grüße
LanX-
 2008-11-04 15:19
#115953 #115953
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Du willst Here-docs!

perldoc -q "here doc"

Code (perl): (dl )
1
2
3
4
print <<"_marker";
tri 
   tra trulla
_marker


aber Perl bietet dir auch q{} und qq{}


Code (perl): (dl )
1
2
3
4
print q{
tri 
   tra trulla
};



zu guter Letzt kannst du auch den Text hinter __DATA__ einlesen

Code (perl): (dl )
1
2
3
4
5
6
7
while (<DATA>) {
  print;
}

__DATA__
tri 
   tra trulla


[tag]heredoc[/tag][tag]mehrzeilige Strings[/tag]
tecker
 2008-11-04 17:22
#115955 #115955
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ok danke. Hatte mich mit Here Dokumenten bislang noch nicht beschäftigt. Wie kann ich das ganze (also meinen Text) in eine Ausgabe Datei schreiben?

Nicht funktionieren tut:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sub header
{
my $output = @_ ;
open(OUTPUT, ">$output") or die "Cant open File: $!\n";

while (<DATA>)
{
print OUTPUT;
}

__DATA__
Mein Text

close(OUTPUT);
}



Auch nicht funktionieren tut
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
sub header
{
my $output = @_ ;
open(OUTPUT, ">$output") or die "Cant open File: $!\n";

my $text <<"END_TEXT";
Mein Text
END_TEXT

print OUTPUT "$text";
close(OUTPUT);
}



Bekomme bei erstem eine "Missing right curly or square bracket" und bei zweitem einen Syntax Fehler.

P.S. Bei dem was du geschrieben hattest fehlt ein Unterstrich oder? Also __DATA__ statt __DATA_

VG
bytebrain
 2008-11-04 17:28
#115956 #115956
User since
2008-07-21
20 Artikel
BenutzerIn
[default_avatar]
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sub header
{
        my $output = @_ ;
        open(OUTPUT, ">$output") or die "Cant open File: $!\n";

        while (<DATA>)
        {
                print OUTPUT;
        }

__DATA__
Mein Text

close(OUTPUT);
}


Das kann so nicht funktioneren.
Du öffnest die Datei $output zum schreiben. Dazu definierst du das Datei-Handle OUTPUT.
Über dieses Datei-Handle sprichst du die Datei letztendlich an.

Du machst jetzt jetzt quasi folgendes:
Schreibe via OUTPUT in Datei $output. Nur sagst du nicht, was geschrieben werden soll ;-)

Probier mal folgendes:
Code (perl): (dl )
1
2
3
4
while( <DATA> )
{
    print OUTPUT $_;
}


Grüße,
bytebrain
LanX-
 2008-11-04 17:28
#115957 #115957
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
1.Fehler
__DATA__ gehört ans Ende!
2. Fehler
"=" fehlt
3. hast Recht __DATA__, korrigiert 8 )

Hauptfehler:
du schaust nicht in die Perldocs!!!
LanX-
 2008-11-04 17:34
#115958 #115958
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
bytebrain+2008-11-04 16:28:08--
Das kann so nicht funktioneren.


doch, aber __DATA__ ist vergleichbar mit __END__ danach kommt kein Code mehr!

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
open(OUTPUT, ">output.tst") or die "Cant open File: $!\n";

        while (<DATA>)
        {
                print OUTPUT;
        }


close(OUTPUT);


__DATA__
Mein Text


EDIT: aber ne whileschleife macht nur Sinn wenn man auch wirklich was mit den Zeilen machen will!
LanX-
 2008-11-04 17:37
#115959 #115959
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
tecker+2008-11-04 16:22:44--
Ok danke. Hatte mich mit Here Dokumenten bislang noch nicht beschäftigt.


Komisch, dein bash-beispiel benutzt aber Here-Docs, irgend woher hat Perl ja schließlich das Konzept geklaut.
tecker
 2008-11-04 17:51
#115960 #115960
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
Zumindest in Perl habe ich bislang immer einen Bogen um Here-Docs gemacht. Bis heute jedenfalls, da bin ich grad drauf angewiesen.

Aber so funktionierts jetzt erstmal ... hab mich mal an dem Perldoc orientiert ;)

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sub header
{
        my $text;
        my $output = "output.txt";
        open(OUTPUT, ">$output") or die "Cant open File: $!\n";
        ($text = <<HERE_TARGET) =~ s/^\s+//gm;

        Mein Text

HERE_TARGET

print OUTPUT "$text";
print "$text\n";
close(OUTPUT);
}




Danke
LanX-
 2008-11-04 17:57
#115961 #115961
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
OK noch ne wichtige Anmerkung aus PBP
schreib lieber

<<"_EOF" ; # Mit Variableninterpolation

oder

<<'_EOF' ; # ohne diese

statt

<<_EOF ; # Mit Variableninterpolation, aber man erkennt es nicht
Gast Gast
 2008-11-04 19:00
#115962 #115962
LanX-+2008-11-04 16:57:05--
<<_EOF ; # Mit Variableninterpolation, aber man erkennt es nicht

Man erkennt es daran, das die " nicht vorhanden sind ;)
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2008-11-04 15:16.