<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">package FileHandle;

use 5.006;
use strict;
our($VERSION, @ISA, @EXPORT, @EXPORT_OK);

$VERSION = "2.05";

require IO::File;
@ISA = qw(IO::File);

@EXPORT = qw(_IOFBF _IOLBF _IONBF);

@EXPORT_OK = qw(
    pipe

    autoflush
    output_field_separator
    output_record_separator
    input_record_separator
    input_line_number
    format_page_number
    format_lines_per_page
    format_lines_left
    format_name
    format_top_name
    format_line_break_characters
    format_formfeed

    print
    printf
    getline
    getlines
);

#
# Everything we're willing to export, we must first import.
#
IO::Handle-&gt;import( grep { !defined(&amp;$_) } @EXPORT, @EXPORT_OK );

#
# Some people call "FileHandle::function", so all the functions
# that were in the old FileHandle class must be imported, too.
#
{
    no strict 'refs';

    my %import = (
	'IO::Handle' =&gt;
	    [qw(DESTROY new_from_fd fdopen close fileno getc ungetc gets
		eof flush error clearerr setbuf setvbuf _open_mode_string)],
	'IO::Seekable' =&gt;
	    [qw(seek tell getpos setpos)],
	'IO::File' =&gt;
	    [qw(new new_tmpfile open)]
    );
    for my $pkg (keys %import) {
	for my $func (@{$import{$pkg}}) {
	    my $c = *{"${pkg}::$func"}{CODE}
		or die "${pkg}::$func missing";
	    *$func = $c;
	}
    }
}

#
# Specialized importer for Fcntl magic.
#
sub import {
    my $pkg = shift;
    my $callpkg = caller;
    require Exporter;
    Exporter::export($pkg, $callpkg, @_);

    #
    # If the Fcntl extension is available,
    #  export its constants.
    #
    eval {
	require Fcntl;
	Exporter::export('Fcntl', $callpkg);
    };
}

################################################
# This is the only exported function we define;
# the rest come from other classes.
#

sub pipe {
    my $r = IO::Handle-&gt;new;
    my $w = IO::Handle-&gt;new;
    CORE::pipe($r, $w) or return undef;
    ($r, $w);
}

# Rebless standard file handles
bless *STDIN{IO},  "FileHandle" if ref *STDIN{IO}  eq "IO::Handle";
bless *STDOUT{IO}, "FileHandle" if ref *STDOUT{IO} eq "IO::Handle";
bless *STDERR{IO}, "FileHandle" if ref *STDERR{IO} eq "IO::Handle";

1;

__END__

=head1 NAME

FileHandle - supply object methods for filehandles

=head1 SYNOPSIS

    use FileHandle;

    my $fh = FileHandle-&gt;new;
    if ($fh-&gt;open("&lt; file")) {
        print &lt;$fh&gt;;
        $fh-&gt;close;
    }

    my $fh = FileHandle-&gt;new("&gt; FOO");
    if (defined $fh) {
        print $fh "bar\n";
        $fh-&gt;close;
    }

    my $fh = FileHandle-&gt;new("file", "r");
    if (defined $fh) {
        print &lt;$fh&gt;;
        undef $fh;       # automatically closes the file
    }

    my $fh = FileHandle-&gt;new("file", O_WRONLY|O_APPEND);
    if (defined $fh) {
        print $fh "corge\n";
        undef $fh;       # automatically closes the file
    }

    my $pos = $fh-&gt;getpos;
    $fh-&gt;setpos($pos);

    $fh-&gt;setvbuf(my $buffer_var, _IOLBF, 1024);

    my ($readfh, $writefh) = FileHandle::pipe;

    autoflush STDOUT 1;

=head1 DESCRIPTION

NOTE: This class is now a front-end to the IO::* classes.

C&lt;FileHandle::new&gt; creates a C&lt;FileHandle&gt;, which is a reference to a
newly created symbol (see the L&lt;Symbol&gt; package).  If it receives any
parameters, they are passed to C&lt;FileHandle::open&gt;; if the open fails,
the C&lt;FileHandle&gt; object is destroyed.  Otherwise, it is returned to
the caller.

C&lt;FileHandle::new_from_fd&gt; creates a C&lt;FileHandle&gt; like C&lt;new&gt; does.
It requires two parameters, which are passed to C&lt;FileHandle::fdopen&gt;;
if the fdopen fails, the C&lt;FileHandle&gt; object is destroyed.
Otherwise, it is returned to the caller.

C&lt;FileHandle::open&gt; accepts one parameter or two.  With one parameter,
it is just a front end for the built-in C&lt;open&gt; function.  With two
parameters, the first parameter is a filename that may include
whitespace or other special characters, and the second parameter is
the open mode, optionally followed by a file permission value.

If C&lt;FileHandle::open&gt; receives a Perl mode string ("&gt;", "+&lt;", etc.)
or a POSIX fopen() mode string ("w", "r+", etc.), it uses the basic
Perl C&lt;open&gt; operator.

If C&lt;FileHandle::open&gt; is given a numeric mode, it passes that mode
and the optional permissions value to the Perl C&lt;sysopen&gt; operator.
For convenience, C&lt;FileHandle::import&gt; tries to import the O_XXX
constants from the Fcntl module.  If dynamic loading is not available,
this may fail, but the rest of FileHandle will still work.

C&lt;FileHandle::fdopen&gt; is like C&lt;open&gt; except that its first parameter
is not a filename but rather a file handle name, a FileHandle object,
or a file descriptor number.

If the C functions fgetpos() and fsetpos() are available, then
C&lt;FileHandle::getpos&gt; returns an opaque value that represents the
current position of the FileHandle, and C&lt;FileHandle::setpos&gt; uses
that value to return to a previously visited position.

If the C function setvbuf() is available, then C&lt;FileHandle::setvbuf&gt;
sets the buffering policy for the FileHandle.  The calling sequence
for the Perl function is the same as its C counterpart, including the
macros C&lt;_IOFBF&gt;, C&lt;_IOLBF&gt;, and C&lt;_IONBF&gt;, except that the buffer
parameter specifies a scalar variable to use as a buffer.  WARNING: A
variable used as a buffer by C&lt;FileHandle::setvbuf&gt; must not be
modified in any way until the FileHandle is closed or until
C&lt;FileHandle::setvbuf&gt; is called again, or memory corruption may
result!

See L&lt;perlfunc&gt; for complete descriptions of each of the following
supported C&lt;FileHandle&gt; methods, which are just front ends for the
corresponding built-in functions:

    close
    fileno
    getc
    gets
    eof
    clearerr
    seek
    tell

See L&lt;perlvar&gt; for complete descriptions of each of the following
supported C&lt;FileHandle&gt; methods:

    autoflush
    output_field_separator
    output_record_separator
    input_record_separator
    input_line_number
    format_page_number
    format_lines_per_page
    format_lines_left
    format_name
    format_top_name
    format_line_break_characters
    format_formfeed

Furthermore, for doing normal I/O you might need these:

=over 4

=item $fh-&gt;print

See L&lt;perlfunc/print&gt;.

=item $fh-&gt;printf

See L&lt;perlfunc/printf&gt;.

=item $fh-&gt;getline

This works like &lt;$fh&gt; described in L&lt;perlop/"I/O Operators"&gt;
except that it's more readable and can be safely called in a
list context but still returns just one line.

=item $fh-&gt;getlines

This works like &lt;$fh&gt; when called in a list context to
read all the remaining lines in a file, except that it's more readable.
It will also croak() if accidentally called in a scalar context.

=back

There are many other functions available since FileHandle is descended
from IO::File, IO::Seekable, and IO::Handle.  Please see those
respective pages for documentation on more functions.

=head1 SEE ALSO

The B&lt;IO&gt; extension,
L&lt;perlfunc&gt;, 
L&lt;perlop/"I/O Operators"&gt;.

=cut
</pre></body></html>