1b8851fccSafresh1package Test::Builder::IO::Scalar; 2b8851fccSafresh1 3b8851fccSafresh1 4b8851fccSafresh1=head1 NAME 5b8851fccSafresh1 6b8851fccSafresh1Test::Builder::IO::Scalar - A copy of IO::Scalar for Test::Builder 7b8851fccSafresh1 8b8851fccSafresh1=head1 DESCRIPTION 9b8851fccSafresh1 10b8851fccSafresh1This is a copy of L<IO::Scalar> which ships with L<Test::Builder> to 11b8851fccSafresh1support scalar references as filehandles on Perl 5.6. Newer 12b8851fccSafresh1versions of Perl simply use C<open()>'s built in support. 13b8851fccSafresh1 14b8851fccSafresh1L<Test::Builder> can not have dependencies on other modules without 15b8851fccSafresh1careful consideration, so its simply been copied into the distribution. 16b8851fccSafresh1 17b8851fccSafresh1=head1 COPYRIGHT and LICENSE 18b8851fccSafresh1 19b8851fccSafresh1This file came from the "IO-stringy" Perl5 toolkit. 20b8851fccSafresh1 21b8851fccSafresh1Copyright (c) 1996 by Eryq. All rights reserved. 22b8851fccSafresh1Copyright (c) 1999,2001 by ZeeGee Software Inc. All rights reserved. 23b8851fccSafresh1 24b8851fccSafresh1This program is free software; you can redistribute it and/or 25b8851fccSafresh1modify it under the same terms as Perl itself. 26b8851fccSafresh1 27b8851fccSafresh1 28b8851fccSafresh1=cut 29b8851fccSafresh1 30b8851fccSafresh1# This is copied code, I don't care. 31b8851fccSafresh1##no critic 32b8851fccSafresh1 33b8851fccSafresh1use Carp; 34b8851fccSafresh1use strict; 35b8851fccSafresh1use vars qw($VERSION @ISA); 36b8851fccSafresh1use IO::Handle; 37b8851fccSafresh1 38b8851fccSafresh1use 5.005; 39b8851fccSafresh1 40b8851fccSafresh1### The package version, both in 1.23 style *and* usable by MakeMaker: 41*9f11ffb7Safresh1$VERSION = "2.114"; 42b8851fccSafresh1 43b8851fccSafresh1### Inheritance: 44b8851fccSafresh1@ISA = qw(IO::Handle); 45b8851fccSafresh1 46b8851fccSafresh1#============================== 47b8851fccSafresh1 48b8851fccSafresh1=head2 Construction 49b8851fccSafresh1 50b8851fccSafresh1=over 4 51b8851fccSafresh1 52b8851fccSafresh1=cut 53b8851fccSafresh1 54b8851fccSafresh1#------------------------------ 55b8851fccSafresh1 56b8851fccSafresh1=item new [ARGS...] 57b8851fccSafresh1 58b8851fccSafresh1I<Class method.> 59b8851fccSafresh1Return a new, unattached scalar handle. 60b8851fccSafresh1If any arguments are given, they're sent to open(). 61b8851fccSafresh1 62b8851fccSafresh1=cut 63b8851fccSafresh1 64b8851fccSafresh1sub new { 65b8851fccSafresh1 my $proto = shift; 66b8851fccSafresh1 my $class = ref($proto) || $proto; 67b8851fccSafresh1 my $self = bless \do { local *FH }, $class; 68b8851fccSafresh1 tie *$self, $class, $self; 69b8851fccSafresh1 $self->open(@_); ### open on anonymous by default 70b8851fccSafresh1 $self; 71b8851fccSafresh1} 72b8851fccSafresh1sub DESTROY { 73b8851fccSafresh1 shift->close; 74b8851fccSafresh1} 75b8851fccSafresh1 76b8851fccSafresh1#------------------------------ 77b8851fccSafresh1 78b8851fccSafresh1=item open [SCALARREF] 79b8851fccSafresh1 80b8851fccSafresh1I<Instance method.> 81b8851fccSafresh1Open the scalar handle on a new scalar, pointed to by SCALARREF. 82b8851fccSafresh1If no SCALARREF is given, a "private" scalar is created to hold 83b8851fccSafresh1the file data. 84b8851fccSafresh1 85b8851fccSafresh1Returns the self object on success, undefined on error. 86b8851fccSafresh1 87b8851fccSafresh1=cut 88b8851fccSafresh1 89b8851fccSafresh1sub open { 90b8851fccSafresh1 my ($self, $sref) = @_; 91b8851fccSafresh1 92b8851fccSafresh1 ### Sanity: 93b8851fccSafresh1 defined($sref) or do {my $s = ''; $sref = \$s}; 94b8851fccSafresh1 (ref($sref) eq "SCALAR") or croak "open() needs a ref to a scalar"; 95b8851fccSafresh1 96b8851fccSafresh1 ### Setup: 97b8851fccSafresh1 *$self->{Pos} = 0; ### seek position 98b8851fccSafresh1 *$self->{SR} = $sref; ### scalar reference 99b8851fccSafresh1 $self; 100b8851fccSafresh1} 101b8851fccSafresh1 102b8851fccSafresh1#------------------------------ 103b8851fccSafresh1 104b8851fccSafresh1=item opened 105b8851fccSafresh1 106b8851fccSafresh1I<Instance method.> 107b8851fccSafresh1Is the scalar handle opened on something? 108b8851fccSafresh1 109b8851fccSafresh1=cut 110b8851fccSafresh1 111b8851fccSafresh1sub opened { 112b8851fccSafresh1 *{shift()}->{SR}; 113b8851fccSafresh1} 114b8851fccSafresh1 115b8851fccSafresh1#------------------------------ 116b8851fccSafresh1 117b8851fccSafresh1=item close 118b8851fccSafresh1 119b8851fccSafresh1I<Instance method.> 120b8851fccSafresh1Disassociate the scalar handle from its underlying scalar. 121b8851fccSafresh1Done automatically on destroy. 122b8851fccSafresh1 123b8851fccSafresh1=cut 124b8851fccSafresh1 125b8851fccSafresh1sub close { 126b8851fccSafresh1 my $self = shift; 127b8851fccSafresh1 %{*$self} = (); 128b8851fccSafresh1 1; 129b8851fccSafresh1} 130b8851fccSafresh1 131b8851fccSafresh1=back 132b8851fccSafresh1 133b8851fccSafresh1=cut 134b8851fccSafresh1 135b8851fccSafresh1 136b8851fccSafresh1 137b8851fccSafresh1#============================== 138b8851fccSafresh1 139b8851fccSafresh1=head2 Input and output 140b8851fccSafresh1 141b8851fccSafresh1=over 4 142b8851fccSafresh1 143b8851fccSafresh1=cut 144b8851fccSafresh1 145b8851fccSafresh1 146b8851fccSafresh1#------------------------------ 147b8851fccSafresh1 148b8851fccSafresh1=item flush 149b8851fccSafresh1 150b8851fccSafresh1I<Instance method.> 151b8851fccSafresh1No-op, provided for OO compatibility. 152b8851fccSafresh1 153b8851fccSafresh1=cut 154b8851fccSafresh1 155b8851fccSafresh1sub flush { "0 but true" } 156b8851fccSafresh1 157b8851fccSafresh1#------------------------------ 158b8851fccSafresh1 159b8851fccSafresh1=item getc 160b8851fccSafresh1 161b8851fccSafresh1I<Instance method.> 162b8851fccSafresh1Return the next character, or undef if none remain. 163b8851fccSafresh1 164b8851fccSafresh1=cut 165b8851fccSafresh1 166b8851fccSafresh1sub getc { 167b8851fccSafresh1 my $self = shift; 168b8851fccSafresh1 169b8851fccSafresh1 ### Return undef right away if at EOF; else, move pos forward: 170b8851fccSafresh1 return undef if $self->eof; 171b8851fccSafresh1 substr(${*$self->{SR}}, *$self->{Pos}++, 1); 172b8851fccSafresh1} 173b8851fccSafresh1 174b8851fccSafresh1#------------------------------ 175b8851fccSafresh1 176b8851fccSafresh1=item getline 177b8851fccSafresh1 178b8851fccSafresh1I<Instance method.> 179b8851fccSafresh1Return the next line, or undef on end of string. 180b8851fccSafresh1Can safely be called in an array context. 181b8851fccSafresh1Currently, lines are delimited by "\n". 182b8851fccSafresh1 183b8851fccSafresh1=cut 184b8851fccSafresh1 185b8851fccSafresh1sub getline { 186b8851fccSafresh1 my $self = shift; 187b8851fccSafresh1 188b8851fccSafresh1 ### Return undef right away if at EOF: 189b8851fccSafresh1 return undef if $self->eof; 190b8851fccSafresh1 191b8851fccSafresh1 ### Get next line: 192b8851fccSafresh1 my $sr = *$self->{SR}; 193b8851fccSafresh1 my $i = *$self->{Pos}; ### Start matching at this point. 194b8851fccSafresh1 195b8851fccSafresh1 ### Minimal impact implementation! 196b8851fccSafresh1 ### We do the fast fast thing (no regexps) if using the 197b8851fccSafresh1 ### classic input record separator. 198b8851fccSafresh1 199b8851fccSafresh1 ### Case 1: $/ is undef: slurp all... 200b8851fccSafresh1 if (!defined($/)) { 201b8851fccSafresh1 *$self->{Pos} = length $$sr; 202b8851fccSafresh1 return substr($$sr, $i); 203b8851fccSafresh1 } 204b8851fccSafresh1 205b8851fccSafresh1 ### Case 2: $/ is "\n": zoom zoom zoom... 206b8851fccSafresh1 elsif ($/ eq "\012") { 207b8851fccSafresh1 208b8851fccSafresh1 ### Seek ahead for "\n"... yes, this really is faster than regexps. 209b8851fccSafresh1 my $len = length($$sr); 210b8851fccSafresh1 for (; $i < $len; ++$i) { 211b8851fccSafresh1 last if ord (substr ($$sr, $i, 1)) == 10; 212b8851fccSafresh1 } 213b8851fccSafresh1 214b8851fccSafresh1 ### Extract the line: 215b8851fccSafresh1 my $line; 216b8851fccSafresh1 if ($i < $len) { ### We found a "\n": 217b8851fccSafresh1 $line = substr ($$sr, *$self->{Pos}, $i - *$self->{Pos} + 1); 218b8851fccSafresh1 *$self->{Pos} = $i+1; ### Remember where we finished up. 219b8851fccSafresh1 } 220b8851fccSafresh1 else { ### No "\n"; slurp the remainder: 221b8851fccSafresh1 $line = substr ($$sr, *$self->{Pos}, $i - *$self->{Pos}); 222b8851fccSafresh1 *$self->{Pos} = $len; 223b8851fccSafresh1 } 224b8851fccSafresh1 return $line; 225b8851fccSafresh1 } 226b8851fccSafresh1 227b8851fccSafresh1 ### Case 3: $/ is ref to int. Do fixed-size records. 228b8851fccSafresh1 ### (Thanks to Dominique Quatravaux.) 229b8851fccSafresh1 elsif (ref($/)) { 230b8851fccSafresh1 my $len = length($$sr); 231b8851fccSafresh1 my $i = ${$/} + 0; 232b8851fccSafresh1 my $line = substr ($$sr, *$self->{Pos}, $i); 233b8851fccSafresh1 *$self->{Pos} += $i; 234b8851fccSafresh1 *$self->{Pos} = $len if (*$self->{Pos} > $len); 235b8851fccSafresh1 return $line; 236b8851fccSafresh1 } 237b8851fccSafresh1 238b8851fccSafresh1 ### Case 4: $/ is either "" (paragraphs) or something weird... 239b8851fccSafresh1 ### This is Graham's general-purpose stuff, which might be 240b8851fccSafresh1 ### a tad slower than Case 2 for typical data, because 241b8851fccSafresh1 ### of the regexps. 242b8851fccSafresh1 else { 243b8851fccSafresh1 pos($$sr) = $i; 244b8851fccSafresh1 245b8851fccSafresh1 ### If in paragraph mode, skip leading lines (and update i!): 246b8851fccSafresh1 length($/) or 247b8851fccSafresh1 (($$sr =~ m/\G\n*/g) and ($i = pos($$sr))); 248b8851fccSafresh1 249b8851fccSafresh1 ### If we see the separator in the buffer ahead... 250b8851fccSafresh1 if (length($/) 251b8851fccSafresh1 ? $$sr =~ m,\Q$/\E,g ### (ordinary sep) TBD: precomp! 252b8851fccSafresh1 : $$sr =~ m,\n\n,g ### (a paragraph) 253b8851fccSafresh1 ) { 254b8851fccSafresh1 *$self->{Pos} = pos $$sr; 255b8851fccSafresh1 return substr($$sr, $i, *$self->{Pos}-$i); 256b8851fccSafresh1 } 257b8851fccSafresh1 ### Else if no separator remains, just slurp the rest: 258b8851fccSafresh1 else { 259b8851fccSafresh1 *$self->{Pos} = length $$sr; 260b8851fccSafresh1 return substr($$sr, $i); 261b8851fccSafresh1 } 262b8851fccSafresh1 } 263b8851fccSafresh1} 264b8851fccSafresh1 265b8851fccSafresh1#------------------------------ 266b8851fccSafresh1 267b8851fccSafresh1=item getlines 268b8851fccSafresh1 269b8851fccSafresh1I<Instance method.> 270b8851fccSafresh1Get all remaining lines. 271b8851fccSafresh1It will croak() if accidentally called in a scalar context. 272b8851fccSafresh1 273b8851fccSafresh1=cut 274b8851fccSafresh1 275b8851fccSafresh1sub getlines { 276b8851fccSafresh1 my $self = shift; 277b8851fccSafresh1 wantarray or croak("can't call getlines in scalar context!"); 278b8851fccSafresh1 my ($line, @lines); 279b8851fccSafresh1 push @lines, $line while (defined($line = $self->getline)); 280b8851fccSafresh1 @lines; 281b8851fccSafresh1} 282b8851fccSafresh1 283b8851fccSafresh1#------------------------------ 284b8851fccSafresh1 285b8851fccSafresh1=item print ARGS... 286b8851fccSafresh1 287b8851fccSafresh1I<Instance method.> 288b8851fccSafresh1Print ARGS to the underlying scalar. 289b8851fccSafresh1 290b8851fccSafresh1B<Warning:> this continues to always cause a seek to the end 291b8851fccSafresh1of the string, but if you perform seek()s and tell()s, it is 292b8851fccSafresh1still safer to explicitly seek-to-end before subsequent print()s. 293b8851fccSafresh1 294b8851fccSafresh1=cut 295b8851fccSafresh1 296b8851fccSafresh1sub print { 297b8851fccSafresh1 my $self = shift; 298b8851fccSafresh1 *$self->{Pos} = length(${*$self->{SR}} .= join('', @_) . (defined($\) ? $\ : "")); 299b8851fccSafresh1 1; 300b8851fccSafresh1} 301b8851fccSafresh1sub _unsafe_print { 302b8851fccSafresh1 my $self = shift; 303b8851fccSafresh1 my $append = join('', @_) . $\; 304b8851fccSafresh1 ${*$self->{SR}} .= $append; 305b8851fccSafresh1 *$self->{Pos} += length($append); 306b8851fccSafresh1 1; 307b8851fccSafresh1} 308b8851fccSafresh1sub _old_print { 309b8851fccSafresh1 my $self = shift; 310b8851fccSafresh1 ${*$self->{SR}} .= join('', @_) . $\; 311b8851fccSafresh1 *$self->{Pos} = length(${*$self->{SR}}); 312b8851fccSafresh1 1; 313b8851fccSafresh1} 314b8851fccSafresh1 315b8851fccSafresh1 316b8851fccSafresh1#------------------------------ 317b8851fccSafresh1 318b8851fccSafresh1=item read BUF, NBYTES, [OFFSET] 319b8851fccSafresh1 320b8851fccSafresh1I<Instance method.> 321b8851fccSafresh1Read some bytes from the scalar. 322b8851fccSafresh1Returns the number of bytes actually read, 0 on end-of-file, undef on error. 323b8851fccSafresh1 324b8851fccSafresh1=cut 325b8851fccSafresh1 326b8851fccSafresh1sub read { 327b8851fccSafresh1 my $self = $_[0]; 328b8851fccSafresh1 my $n = $_[2]; 329b8851fccSafresh1 my $off = $_[3] || 0; 330b8851fccSafresh1 331b8851fccSafresh1 my $read = substr(${*$self->{SR}}, *$self->{Pos}, $n); 332b8851fccSafresh1 $n = length($read); 333b8851fccSafresh1 *$self->{Pos} += $n; 334b8851fccSafresh1 ($off ? substr($_[1], $off) : $_[1]) = $read; 335b8851fccSafresh1 return $n; 336b8851fccSafresh1} 337b8851fccSafresh1 338b8851fccSafresh1#------------------------------ 339b8851fccSafresh1 340b8851fccSafresh1=item write BUF, NBYTES, [OFFSET] 341b8851fccSafresh1 342b8851fccSafresh1I<Instance method.> 343b8851fccSafresh1Write some bytes to the scalar. 344b8851fccSafresh1 345b8851fccSafresh1=cut 346b8851fccSafresh1 347b8851fccSafresh1sub write { 348b8851fccSafresh1 my $self = $_[0]; 349b8851fccSafresh1 my $n = $_[2]; 350b8851fccSafresh1 my $off = $_[3] || 0; 351b8851fccSafresh1 352b8851fccSafresh1 my $data = substr($_[1], $off, $n); 353b8851fccSafresh1 $n = length($data); 354b8851fccSafresh1 $self->print($data); 355b8851fccSafresh1 return $n; 356b8851fccSafresh1} 357b8851fccSafresh1 358b8851fccSafresh1#------------------------------ 359b8851fccSafresh1 360b8851fccSafresh1=item sysread BUF, LEN, [OFFSET] 361b8851fccSafresh1 362b8851fccSafresh1I<Instance method.> 363b8851fccSafresh1Read some bytes from the scalar. 364b8851fccSafresh1Returns the number of bytes actually read, 0 on end-of-file, undef on error. 365b8851fccSafresh1 366b8851fccSafresh1=cut 367b8851fccSafresh1 368b8851fccSafresh1sub sysread { 369b8851fccSafresh1 my $self = shift; 370b8851fccSafresh1 $self->read(@_); 371b8851fccSafresh1} 372b8851fccSafresh1 373b8851fccSafresh1#------------------------------ 374b8851fccSafresh1 375b8851fccSafresh1=item syswrite BUF, NBYTES, [OFFSET] 376b8851fccSafresh1 377b8851fccSafresh1I<Instance method.> 378b8851fccSafresh1Write some bytes to the scalar. 379b8851fccSafresh1 380b8851fccSafresh1=cut 381b8851fccSafresh1 382b8851fccSafresh1sub syswrite { 383b8851fccSafresh1 my $self = shift; 384b8851fccSafresh1 $self->write(@_); 385b8851fccSafresh1} 386b8851fccSafresh1 387b8851fccSafresh1=back 388b8851fccSafresh1 389b8851fccSafresh1=cut 390b8851fccSafresh1 391b8851fccSafresh1 392b8851fccSafresh1#============================== 393b8851fccSafresh1 394b8851fccSafresh1=head2 Seeking/telling and other attributes 395b8851fccSafresh1 396b8851fccSafresh1=over 4 397b8851fccSafresh1 398b8851fccSafresh1=cut 399b8851fccSafresh1 400b8851fccSafresh1 401b8851fccSafresh1#------------------------------ 402b8851fccSafresh1 403b8851fccSafresh1=item autoflush 404b8851fccSafresh1 405b8851fccSafresh1I<Instance method.> 406b8851fccSafresh1No-op, provided for OO compatibility. 407b8851fccSafresh1 408b8851fccSafresh1=cut 409b8851fccSafresh1 410b8851fccSafresh1sub autoflush {} 411b8851fccSafresh1 412b8851fccSafresh1#------------------------------ 413b8851fccSafresh1 414b8851fccSafresh1=item binmode 415b8851fccSafresh1 416b8851fccSafresh1I<Instance method.> 417b8851fccSafresh1No-op, provided for OO compatibility. 418b8851fccSafresh1 419b8851fccSafresh1=cut 420b8851fccSafresh1 421b8851fccSafresh1sub binmode {} 422b8851fccSafresh1 423b8851fccSafresh1#------------------------------ 424b8851fccSafresh1 425b8851fccSafresh1=item clearerr 426b8851fccSafresh1 427b8851fccSafresh1I<Instance method.> Clear the error and EOF flags. A no-op. 428b8851fccSafresh1 429b8851fccSafresh1=cut 430b8851fccSafresh1 431b8851fccSafresh1sub clearerr { 1 } 432b8851fccSafresh1 433b8851fccSafresh1#------------------------------ 434b8851fccSafresh1 435b8851fccSafresh1=item eof 436b8851fccSafresh1 437b8851fccSafresh1I<Instance method.> Are we at end of file? 438b8851fccSafresh1 439b8851fccSafresh1=cut 440b8851fccSafresh1 441b8851fccSafresh1sub eof { 442b8851fccSafresh1 my $self = shift; 443b8851fccSafresh1 (*$self->{Pos} >= length(${*$self->{SR}})); 444b8851fccSafresh1} 445b8851fccSafresh1 446b8851fccSafresh1#------------------------------ 447b8851fccSafresh1 448b8851fccSafresh1=item seek OFFSET, WHENCE 449b8851fccSafresh1 450b8851fccSafresh1I<Instance method.> Seek to a given position in the stream. 451b8851fccSafresh1 452b8851fccSafresh1=cut 453b8851fccSafresh1 454b8851fccSafresh1sub seek { 455b8851fccSafresh1 my ($self, $pos, $whence) = @_; 456b8851fccSafresh1 my $eofpos = length(${*$self->{SR}}); 457b8851fccSafresh1 458b8851fccSafresh1 ### Seek: 459b8851fccSafresh1 if ($whence == 0) { *$self->{Pos} = $pos } ### SEEK_SET 460b8851fccSafresh1 elsif ($whence == 1) { *$self->{Pos} += $pos } ### SEEK_CUR 461b8851fccSafresh1 elsif ($whence == 2) { *$self->{Pos} = $eofpos + $pos} ### SEEK_END 462b8851fccSafresh1 else { croak "bad seek whence ($whence)" } 463b8851fccSafresh1 464b8851fccSafresh1 ### Fixup: 465b8851fccSafresh1 if (*$self->{Pos} < 0) { *$self->{Pos} = 0 } 466b8851fccSafresh1 if (*$self->{Pos} > $eofpos) { *$self->{Pos} = $eofpos } 467b8851fccSafresh1 return 1; 468b8851fccSafresh1} 469b8851fccSafresh1 470b8851fccSafresh1#------------------------------ 471b8851fccSafresh1 472b8851fccSafresh1=item sysseek OFFSET, WHENCE 473b8851fccSafresh1 474b8851fccSafresh1I<Instance method.> Identical to C<seek OFFSET, WHENCE>, I<q.v.> 475b8851fccSafresh1 476b8851fccSafresh1=cut 477b8851fccSafresh1 478b8851fccSafresh1sub sysseek { 479b8851fccSafresh1 my $self = shift; 480b8851fccSafresh1 $self->seek (@_); 481b8851fccSafresh1} 482b8851fccSafresh1 483b8851fccSafresh1#------------------------------ 484b8851fccSafresh1 485b8851fccSafresh1=item tell 486b8851fccSafresh1 487b8851fccSafresh1I<Instance method.> 488b8851fccSafresh1Return the current position in the stream, as a numeric offset. 489b8851fccSafresh1 490b8851fccSafresh1=cut 491b8851fccSafresh1 492b8851fccSafresh1sub tell { *{shift()}->{Pos} } 493b8851fccSafresh1 494b8851fccSafresh1#------------------------------ 495b8851fccSafresh1 496b8851fccSafresh1=item use_RS [YESNO] 497b8851fccSafresh1 498b8851fccSafresh1I<Instance method.> 499b8851fccSafresh1B<Deprecated and ignored.> 500b8851fccSafresh1Obey the current setting of $/, like IO::Handle does? 501b8851fccSafresh1Default is false in 1.x, but cold-welded true in 2.x and later. 502b8851fccSafresh1 503b8851fccSafresh1=cut 504b8851fccSafresh1 505b8851fccSafresh1sub use_RS { 506b8851fccSafresh1 my ($self, $yesno) = @_; 507b8851fccSafresh1 carp "use_RS is deprecated and ignored; \$/ is always consulted\n"; 508b8851fccSafresh1 } 509b8851fccSafresh1 510b8851fccSafresh1#------------------------------ 511b8851fccSafresh1 512b8851fccSafresh1=item setpos POS 513b8851fccSafresh1 514b8851fccSafresh1I<Instance method.> 515b8851fccSafresh1Set the current position, using the opaque value returned by C<getpos()>. 516b8851fccSafresh1 517b8851fccSafresh1=cut 518b8851fccSafresh1 519b8851fccSafresh1sub setpos { shift->seek($_[0],0) } 520b8851fccSafresh1 521b8851fccSafresh1#------------------------------ 522b8851fccSafresh1 523b8851fccSafresh1=item getpos 524b8851fccSafresh1 525b8851fccSafresh1I<Instance method.> 526b8851fccSafresh1Return the current position in the string, as an opaque object. 527b8851fccSafresh1 528b8851fccSafresh1=cut 529b8851fccSafresh1 530b8851fccSafresh1*getpos = \&tell; 531b8851fccSafresh1 532b8851fccSafresh1 533b8851fccSafresh1#------------------------------ 534b8851fccSafresh1 535b8851fccSafresh1=item sref 536b8851fccSafresh1 537b8851fccSafresh1I<Instance method.> 538b8851fccSafresh1Return a reference to the underlying scalar. 539b8851fccSafresh1 540b8851fccSafresh1=cut 541b8851fccSafresh1 542b8851fccSafresh1sub sref { *{shift()}->{SR} } 543b8851fccSafresh1 544b8851fccSafresh1 545b8851fccSafresh1#------------------------------ 546b8851fccSafresh1# Tied handle methods... 547b8851fccSafresh1#------------------------------ 548b8851fccSafresh1 549b8851fccSafresh1# Conventional tiehandle interface: 550b8851fccSafresh1sub TIEHANDLE { 551b8851fccSafresh1 ((defined($_[1]) && UNIVERSAL::isa($_[1], __PACKAGE__)) 552b8851fccSafresh1 ? $_[1] 553b8851fccSafresh1 : shift->new(@_)); 554b8851fccSafresh1} 555b8851fccSafresh1sub GETC { shift->getc(@_) } 556b8851fccSafresh1sub PRINT { shift->print(@_) } 557b8851fccSafresh1sub PRINTF { shift->print(sprintf(shift, @_)) } 558b8851fccSafresh1sub READ { shift->read(@_) } 559b8851fccSafresh1sub READLINE { wantarray ? shift->getlines(@_) : shift->getline(@_) } 560b8851fccSafresh1sub WRITE { shift->write(@_); } 561b8851fccSafresh1sub CLOSE { shift->close(@_); } 562b8851fccSafresh1sub SEEK { shift->seek(@_); } 563b8851fccSafresh1sub TELL { shift->tell(@_); } 564b8851fccSafresh1sub EOF { shift->eof(@_); } 565*9f11ffb7Safresh1sub FILENO { -1 } 566b8851fccSafresh1 567b8851fccSafresh1#------------------------------------------------------------ 568b8851fccSafresh1 569b8851fccSafresh11; 570b8851fccSafresh1 571b8851fccSafresh1__END__ 572b8851fccSafresh1 573b8851fccSafresh1 574b8851fccSafresh1 575b8851fccSafresh1=back 576b8851fccSafresh1 577b8851fccSafresh1=cut 578b8851fccSafresh1 579b8851fccSafresh1 580b8851fccSafresh1=head1 WARNINGS 581b8851fccSafresh1 582b8851fccSafresh1Perl's TIEHANDLE spec was incomplete prior to 5.005_57; 583b8851fccSafresh1it was missing support for C<seek()>, C<tell()>, and C<eof()>. 584b8851fccSafresh1Attempting to use these functions with an IO::Scalar will not work 585b8851fccSafresh1prior to 5.005_57. IO::Scalar will not have the relevant methods 586b8851fccSafresh1invoked; and even worse, this kind of bug can lie dormant for a while. 587b8851fccSafresh1If you turn warnings on (via C<$^W> or C<perl -w>), 588b8851fccSafresh1and you see something like this... 589b8851fccSafresh1 590b8851fccSafresh1 attempt to seek on unopened filehandle 591b8851fccSafresh1 592b8851fccSafresh1...then you are probably trying to use one of these functions 593b8851fccSafresh1on an IO::Scalar with an old Perl. The remedy is to simply 594b8851fccSafresh1use the OO version; e.g.: 595b8851fccSafresh1 596b8851fccSafresh1 $SH->seek(0,0); ### GOOD: will work on any 5.005 597b8851fccSafresh1 seek($SH,0,0); ### WARNING: will only work on 5.005_57 and beyond 598b8851fccSafresh1 599b8851fccSafresh1 600b8851fccSafresh1=head1 VERSION 601b8851fccSafresh1 602b8851fccSafresh1$Id: Scalar.pm,v 1.6 2005/02/10 21:21:53 dfs Exp $ 603b8851fccSafresh1 604b8851fccSafresh1 605b8851fccSafresh1=head1 AUTHORS 606b8851fccSafresh1 607b8851fccSafresh1=head2 Primary Maintainer 608b8851fccSafresh1 609b8851fccSafresh1David F. Skoll (F<dfs@roaringpenguin.com>). 610b8851fccSafresh1 611b8851fccSafresh1=head2 Principal author 612b8851fccSafresh1 613b8851fccSafresh1Eryq (F<eryq@zeegee.com>). 614b8851fccSafresh1President, ZeeGee Software Inc (F<http://www.zeegee.com>). 615b8851fccSafresh1 616b8851fccSafresh1 617b8851fccSafresh1=head2 Other contributors 618b8851fccSafresh1 619b8851fccSafresh1The full set of contributors always includes the folks mentioned 620b8851fccSafresh1in L<IO::Stringy/"CHANGE LOG">. But just the same, special 621b8851fccSafresh1thanks to the following individuals for their invaluable contributions 622b8851fccSafresh1(if I've forgotten or misspelled your name, please email me!): 623b8851fccSafresh1 624b8851fccSafresh1I<Andy Glew,> 625b8851fccSafresh1for contributing C<getc()>. 626b8851fccSafresh1 627b8851fccSafresh1I<Brandon Browning,> 628b8851fccSafresh1for suggesting C<opened()>. 629b8851fccSafresh1 630b8851fccSafresh1I<David Richter,> 631b8851fccSafresh1for finding and fixing the bug in C<PRINTF()>. 632b8851fccSafresh1 633b8851fccSafresh1I<Eric L. Brine,> 634b8851fccSafresh1for his offset-using read() and write() implementations. 635b8851fccSafresh1 636b8851fccSafresh1I<Richard Jones,> 637b8851fccSafresh1for his patches to massively improve the performance of C<getline()> 638b8851fccSafresh1and add C<sysread> and C<syswrite>. 639b8851fccSafresh1 640b8851fccSafresh1I<B. K. Oxley (binkley),> 641b8851fccSafresh1for stringification and inheritance improvements, 642b8851fccSafresh1and sundry good ideas. 643b8851fccSafresh1 644b8851fccSafresh1I<Doug Wilson,> 645b8851fccSafresh1for the IO::Handle inheritance and automatic tie-ing. 646b8851fccSafresh1 647b8851fccSafresh1 648b8851fccSafresh1=head1 SEE ALSO 649b8851fccSafresh1 650b8851fccSafresh1L<IO::String>, which is quite similar but which was designed 651b8851fccSafresh1more-recently and with an IO::Handle-like interface in mind, 652b8851fccSafresh1so you could mix OO- and native-filehandle usage without using tied(). 653b8851fccSafresh1 654b8851fccSafresh1I<Note:> as of version 2.x, these classes all work like 655b8851fccSafresh1their IO::Handle counterparts, so we have comparable 656b8851fccSafresh1functionality to IO::String. 657b8851fccSafresh1 658b8851fccSafresh1=cut 659b8851fccSafresh1 660