in reply to peek at STDIN, to determine data type and then pass STDIN to a parser

Hello aral,

The ungets method from FileHandle::Unget works on STDIN:

#! perl use strict; use warnings; use FileHandle::Unget; $| = 1; my $fh = FileHandle::Unget->new(\*STDIN) or die "Cannot open filehandle: $!"; print "\nEnter a string: "; read($fh, my $buffer1, 10); print "\nThe first 10 characters: '$buffer1'\n"; $fh->ungets($buffer1); read($fh, my $buffer2, 15); print "The \"next\" 15 characters: '$buffer2'\n"; $fh->close;

Output:

1:17 >perl 1115_SoPW.pl Enter a string: abcdefghijklmnopqrstuvwxyz The first 10 characters: 'abcdefghij' The "next" 15 characters: 'abcdefghijklmno' 1:17 >

Update: Added print statements and renamed variables.

Hope that helps,

Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

Replies are listed 'Best First'.
Re^2: peek at STDIN, to determine data type and then pass STDIN to a parser
by ikegami (Patriarch) on Jan 07, 2015 at 15:33 UTC
    I'd use IO::Unread instead since it uses Perl's builtin support for unreading rather than reimplementing every file operation.
Re^2: peek at STDIN, to determine data type and then pass STDIN to a parser
by aral (Acolyte) on Jan 08, 2015 at 09:43 UTC

    Excellent solution as well - I just tested it and it worked out of the box like this:

    use FileHandle::Unget; my $fh = FileHandle::Unget->new(\*STDIN) or die "Cannot open filehandle: $!"; my $testline = <$fh>;; $fh->ungets($testline); print "$.: $testline"; for (my $i = 0; $i < 3; $i++) { $testline = <$fh>; print "$.: $testline"; }

    Output for "cat xmlfile | ./perscript.pl" is:

    1: <?xml version="1.0" encoding="UTF-8"?> 1: <?xml version="1.0" encoding="UTF-8"?> 2: <MFOP> 3: <Basics>

    Thank you very much! FileHandle::Unget is *the* answer to my original question.

    @ikegami: Unfortunately, the install script (Makefile) for IO::Unread fails with error messages, and there seems to be no debian packet for it available in jessie - so I was not able to test this.