Subject: | pfcat.t fails on systems with older perl (2.2.0) |
On Debian/wheezy and CentOS6 systems the pfcat.t test fails:
# Failed test 'catted module function'
# at t/pfcat.t line 19.
# '=head1 /usr/share/perl5/pod/perlfunc.pod chunk 1165
#
# =item seek FILEHANDLE,POSITION,WHENCE
# X<seek> X<fseek> X<filehandle, position>
#
# Sets FILEHANDLE's position, just like the C<fseek> call of C<stdio>.
# FILEHANDLE may be an expression whose value gives the name of the
# filehandle. The values for WHENCE are C<0> to set the new position
# I<in bytes> to POSITION, C<1> to set it to the current position plus
# POSITION, and C<2> to set it to EOF plus POSITION (typically
# negative). For WHENCE you may use the constants C<SEEK_SET>,
# C<SEEK_CUR>, and C<SEEK_END> (start of the file, current position, end
# of the file) from the Fcntl module. Returns C<1> upon success, C<0>
# otherwise.
#
# Note the I<in bytes>: even if the filehandle has been set to
# operate on characters (for example by using the C<:encoding(utf8)> open
# layer), tell() will return byte offsets, not character offsets
# (because implementing that would render seek() and tell() rather slow).
#
# If you want to position file for C<sysread> or C<syswrite>, don't use
# C<seek>--buffering makes its effect on the file's system position
# unpredictable and non-portable. Use C<sysseek> instead.
#
# Due to the rules and rigors of ANSI C, on some systems you have to do a
# seek whenever you switch between reading and writing. Amongst other
# things, this may have the effect of calling stdio's clearerr(3).
# A WHENCE of C<1> (C<SEEK_CUR>) is useful for not moving the file position:
#
# seek(TEST,0,1);
#
# This is also useful for applications emulating C<tail -f>. Once you hit
# EOF on your read, and then sleep for a while, you might have to stick in a
# seek() to reset things. The C<seek> doesn't change the current position,
# but it I<does> clear the end-of-file condition on the handle, so that the
# next C<< <FILE> >> makes Perl try again to read something. We hope.
#
# If that doesn't work (some IO implementations are particularly
# cantankerous), then you may need something more like this:
#
# for (;;) {
# for ($curpos = tell(FILE); $_ = <FILE>;
# $curpos = tell(FILE)) {
# # search for some stuff and put it into files
# }
# sleep($for_a_while);
# seek(FILE, $curpos, 0);
# }
#
# =head1 /usr/share/perl5/pod/perlfunc.pod chunk 1174
#
# =item seekdir DIRHANDLE,POS
# X<seekdir>
#
# Sets the current position for the C<readdir> routine on DIRHANDLE. POS
# must be a value returned by C<telldir>. C<seekdir> also has the same caveats
# about possible directory compaction as the corresponding system library
# routine.
#
# =head1 /usr/share/perl5/pod/perlfunc.pod chunk 1551
#
# =item sysseek FILEHANDLE,POSITION,WHENCE
# X<sysseek> X<lseek>
#
# Sets FILEHANDLE's system position in bytes using the system call
# lseek(2). FILEHANDLE may be an expression whose value gives the name
# of the filehandle. The values for WHENCE are C<0> to set the new
# position to POSITION, C<1> to set the it to the current position plus
# POSITION, and C<2> to set it to EOF plus POSITION (typically
# negative).
#
# Note the I<in bytes>: even if the filehandle has been set to operate
# on characters (for example by using the C<:encoding(utf8)> I/O layer),
# tell() will return byte offsets, not character offsets (because
# implementing that would render sysseek() very slow).
#
# sysseek() bypasses normal buffered IO, so mixing this with reads (other
# than C<sysread>, for example C<< <> >> or read()) C<print>, C<write>,
# C<seek>, C<tell>, or C<eof> may cause confusion.
#
# For WHENCE, you may also use the constants C<SEEK_SET>, C<SEEK_CUR>,
# and C<SEEK_END> (start of the file, current position, end of the file)
# from the Fcntl module. Use of the constants is also more portable
# than relying on 0, 1, and 2. For example to define a "systell" function:
#
# use Fcntl 'SEEK_CUR';
# sub systell { sysseek($_[0], 0, SEEK_CUR) }
#
# Returns the new position, or the undefined value on failure. A position
# of zero is returned as the string C<"0 but true">; thus C<sysseek> returns
# true on success and false on failure, yet you can still easily determine
# the new position.
#
# '
# doesn't match '(?^:There is no .*systell.* function.\s+Use .*sysseek)'
# Looks like you failed 1 test of 2.
t/pfcat.t ........
Dubious, test returned 1 (wstat 256, 0x100)
Failed 1/2 subtests