Mit lexikalischen Filehandles ist es in Perl leicht möglich, File-I/O
objektorientiert zu kapseln. Hier zur Veranschaulichung eine Klasse
Filehandle mit drei Methoden: new() (Datei öffnen), close()
(Datei schließen) und slurp() (Datei komplett einlesen):
1 |
package Filehandle; |
2 |
|
3 |
use strict; |
4 |
use warnings; |
5 |
|
6 |
sub new { |
7 |
my ($class,$mode,$file) = @_; |
8 |
|
9 |
open my $fh,$mode,$file or die "ERROR: open failed: $file ($!)\n"; |
10 |
return bless $fh,$class; |
11 |
} |
12 |
|
13 |
sub close { |
14 |
my $self = shift; |
15 |
|
16 |
close $self or die "ERROR: close failed ($!)\n"; |
17 |
return; |
18 |
} |
19 |
|
20 |
sub slurp { |
21 |
my $self = shift; |
22 |
|
23 |
local $/; |
24 |
return scalar <$self>; |
25 |
} |
26 |
|
27 |
1; |
28 |
|
29 |
# eof |
Beispiel: Lies eine Datei komplett ein und gib sie auf STDOUT aus
1 use Filehandle;
2
3 my $fh = Filehandle->new('<',$file);
4 print $fh->slurp;
5 $fh->close;
Der Clou: Die Filehandle $fh kann unabhängig von der Klasse wie
jede andere Perl-Filehandle benutzt werden, z.B. mit dem
Diamant-Operator <> oder jeder anderen Filehandle-Operation
wie read(), write() usw. Obiges Programm lässt sich also auch so
implementieren:
1 use Filehandle;
2
3 my $fh = Filehandle->new('<',$file);
4 while (<$fh>) {
5 print;
6 }
7 $fh->close;