Schrift
[thread]8846[/thread]

Dynamisch in Filehandles printen



<< >> 6 Einträge, 1 Seite
Aleks
 2007-03-16 15:11
#75086 #75086
User since
2006-06-12
19 Artikel
BenutzerIn
[default_avatar]
Hallo Forum,
ich habe eine reihe Filehandles, die heißen alle 'S1, S2, S3,...'.
Nun würde ich gerne soetwas machen:

Code: (dl )
1
2
3
for (qw/1 2 3/){
print S$_ "meinzeug";
}


Leider mag der das nicht "Strinf found where operator expected". Was wohl daran liegt das print einen Listenkontext erwartet?. Dann habe ich folgendes probiert:

Code: (dl )
1
2
3
4
for (qw/1 2 3/){
my $fh = "S".$_;
print $fh "meinzeug";
}

Ergebnis:
Can't use string ("S1") as a symbol ref while "strict refs"..

Nun habe ich zwar eine Lösung die funktioniert aber hässlich ist.
Gibt es keine Möglichkeit soetwas in "einer print Anweisung" hinzubekommen? Vom Prinzip her sowas wie der erste Ansatz, nur das es halt funktioniert ;-)

Falls es interessiert, so habe ich es dann gemacht:
Code: (dl )
1
2
3
4
5
for (qw/1 2 3/){
my $fh = "S".$_;
select (fh);
print "meinzeug";
}


Gruß,
Aleks
jan
 2007-03-16 15:18
#75087 #75087
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
die filehandles in einem hash anlegen, der s1, s2, s3 als keys hat.
Aleks
 2007-03-16 16:29
#75088 #75088
User since
2006-06-12
19 Artikel
BenutzerIn
[default_avatar]
Hallo Jan,
danke für die Antwort.

Gruß,
Aleks
betterworld
 2007-03-16 16:36
#75089 #75089
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Du kannst es auch so machen:
Code: (dl )
print {"S$_"} $string;


Aber was Du eigentlich brauchst, das sind lexikalische Filehandles und ein Array. Durchnumerieren von Variablen ist immer schlecht, weil es dazu doch Arrays gibt.
Also hier ein kleines Beispiel, um die Dateien "datei0", "datei1", "datei2" alle gleichzeitig zu oeffnen und dann etwas hineinzuschreiben:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
my @array;
# Erst alle Dateien oeffnen
for my $number (0..2) {
open my $f, '>', "datei$number" or die "datei$number: $!";
# Schiebe das Handle in das Array
push @array, $f;
}

# Dann ueber alle Handles iterieren
for my $handle (@array) {
print $handle "text\n" or die $!;
close $handle or die $!;
}

(Das ist nur ein Beispiel... normalerweise wuerde man, wenn man in mehrere Dateien einen String reinschreiben will, eine Datei erst oeffnen, wenn man die vorherige geschlossen hat.)
betterworld
 2007-03-16 16:41
#75090 #75090
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=Aleks,16.03.2007, 14:11]
Code: (dl )
1
2
3
for (qw/1 2 3/){
 print S$_ "meinzeug";
}


Leider mag der das nicht "Strinf found where operator expected". Was wohl daran liegt das print einen Listenkontext erwartet?[/quote]
Nein, das liegt einfach daran, dass man Strings nicht aneinanderfuegen kann, indem man sie einfach hintereinander hinschreibt. Das gilt auch fuer Variablennamen (bzw. Dateihandlenamen).
Aleks
 2007-04-03 17:54
#75091 #75091
User since
2006-06-12
19 Artikel
BenutzerIn
[default_avatar]
Hi betterworld,
'S$_' ist natürlich totaler Schwachsinn, da gebe ich Dir Recht ;-)
Schneller getippt als.. Deine Lösung ist okay.

Gruß,
Aleks
<< >> 6 Einträge, 1 Seite



View all threads created 2007-03-16 15:11.