PerlIO::via::Limit - PerlIO layer for length restrictions
use PerlIO::via::Limit; PerlIO::via::Limit->length(256); # - or - use PerlIO::via::Limit length => 256; # reading open( my $fh, "<:via(Limit)", $file ); # writing open( my $fh, ">:via(Limit)", $file ); # If you want to use various limits simultaneously my $limit256 = PerlIO::via::Limit->create(256); my $limit512 = PerlIO::via::Limit->create(512); open( my $fh256, "<:via($limit256)", $hoge ); open( my $fh512, ">:via($limit512)", $fuga );
PerlIO::via::Limit implements a PerlIO layer that restricts length of stream.
There is an important constraint, it is able to specify only one limit value within application because the 'length' is a class data.
The following example does not work as expected:
PerlIO::via::Limit->length(256); open( my $fh1, "<:via(Limit)", $file1 ); PerlIO::via::Limit->length(512); open( my $fh2, "<:via(Limit)", $file2 ); local $/ = undef; my $data1 = <$fh1>; my $data2 = <$fh2>; CORE::length($data1); # is not 256 but 512 CORE::length($data2); # is also 512
Therefore, it is necessary to divide namespace, in order to use two or more limit values simultaneously.
package Foo; use base PerlIO::via::Limit; package main; PerlIO::via::Limit->length(256); Foo->length(512); open( my $fh1, "<:via(Limit)", $file1 ); open( my $fh2, "<:via(Foo)", $file2 ); local $/ = undef; my $data1 = <$fh1>; my $data2 = <$fh2>; CORE::length($data1); # is 256 CORE::length($data2); # is 512
Actually you do not have to code like the above, instead, the create() method supports it by simple interface.
my $limit256 = PerlIO::via::Limit->create(256); my $limit512 = PerlIO::via::Limit->create(512); open( my $fh1, "<:via($limit256)", $file1 ); open( my $fh2, "<:via($limit100)", $file2 );
Create an anonymous class that is inheritable PerlIO::via::Limit.
You do not have to care about the class, only pass ':via' the returned value as it is.
It accepts an optional parameter for 'length' available.
my $limit = PerlIO::via::Limit->create(512); open( my $fh, ">:via($limit)", $file );
Also it can call 'length' and 'sensitive' class methods.
my $limit = PerlIO::via::Limit->create; $limit->length(256); $limit->sensitive(0); open( my $fh, ">:via($limit)", $file );
Limit length of stream. Default is undef that means unlimited.
If set true value, an exception will be occurred when stream reaches limit of length. Default is false.
use PerlIO::via::Limit sensitive => 1; open( my $in, "<:via(Limit)", $file ) or die; eval { while( <$in> ){ # do something... } };if( $@ ){ # "$in is trying to read exceeding the limit." warn "$@"; } close $in or die;
Note that the $@ is an Exception::Class object.
When the exception is thrown by sensitive option, the buffer for reading does not be filled.
PerlIO::via::Limit is hosted on github https://github.com/hiroaki/PerlIO-via-Limit
PerlIO::via
Exception::Class
WATANABE Hiroaki <hwat@cpan.org>
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
To install PerlIO::via::Limit, copy and paste the appropriate command in to your terminal.
cpanm
cpanm PerlIO::via::Limit
CPAN shell
perl -MCPAN -e shell install PerlIO::via::Limit
For more information on module installation, please visit the detailed CPAN module installation guide.