[Melbourne-pm] Error checks without packages

Mathew Robertson mathew.blair.robertson at gmail.com
Sun Jul 31 17:06:19 PDT 2011


On 29 July 2011 08:27, Jacinta Richardson <jarich at perltraining.com.au>wrote:

> On 27/07/11 05:30, Tim Hogard wrote:
>
>> I have this bit of code and the disk partition /usr/local/tmp is full:
>>        #!/usr/bin/perl
>>
>>        $SIG{PIPE} = sub { die "\nSigPIPE!\n" };
>>
>>        open(OUT,">/usr/local/tmp/x$$"**) or print "cant open $? $!\n";
>>        print "err $?\n";
>>
>>        print OUT  "foo $$ \n" or print "cant print out $? $!\n";
>>
>>        print "err $?\n";
>>        close OUT or print "cant close $? $!\n";
>>        print "err $?\n";
>>
>>  $? doesn't get set during file operations.
>
> Are you targetting a version of Perl that is more than 11 years old?  If
> not, you might prefer to write this like:
>
> Perl 5.6+
>
> #!/usr/bin/perl
> use strict;
> use warnings;
> use IO::Handle;
> use autodie;  # (Perl 5.8.0+)
>
> open my $fh, ">", "/usr/local/tmp/x$$";        # Check your errors if
> you're not using autodie
>
> $fh->autoflush();
>
> print {$fh} "...." or die "Failed to print: $!";
>
> close $fh;  # Check error if you're not using autodie
>
>
>
> Or Perl 5.14.1+
>
> #!/usr/bin/perl
> use v5.14;
> use warnings;
> use autodie;
>
> open my $fh, ">", "/usr/local/tmp/x$$";        # Check your errors if
> you're not using autodie
>
> $fh->autoflush();
> print {$fh} "...." or die "Failed to print: $!";
>
> close $fh;  # Check error if you're not using autodie
>
>
>  That helps, but it would be best to know as soon as I open the file
>> so I can put the entire output in a different file on a different
>> partition.  The unix "open" system call reports "no space" only
>> when the directory entry can't be extended and has nothing to do
>> with how much space is left on the disk.
>>
>>
> The problem is that Perl is not your operating system, and Perl cannot tell
> in advance how much data you're going to try to write to disk.  If any.  As
> such, it cannot catch this when you open the file.  What if there's 1gb of
> space available.  But you want to only write 100k.  That should be okay,
> right?  But what if you want to write 3gb?  Sure, if the disk is completely
> full you want to know in advance, but if that's the case you have bigger
> problems....  I imagine you'd have to ask your operating system.  Perl's
> open() is not the right tool here.
>

And then there is the sparse-file capability.


>
>  I could rewind but I'm opening for append since there is small
>> chance two processes could write the same file at the same time.
>>
>>
> The better solution is probably locking.  Unless it doesn't matter if
> multiple processes mix their data.
>
>  I can't flush without loading the IO package (which I don't want
>> to).
>>
>>  The IO::Handle package is harmless.  I'm really not sure why you'd be
> trying to avoid it.
>
>  Does anyone have any other ideas?
>>
>
> Look into asking the operating system how full that partition is, rather
> than trying to repurpose tools that aren't made for it.  Also, look into
> modernising your Perl syntax to reduce future maintenance pain.
>
>
>    J
>

Isn't Perl's IO (from v5.7) almost completely reliant on "PerlIO"... aka,
which means that open() is using PerlIO anyway?  So including any IO package
has minimal overhead (making the choice of "should I load an IO package?"
largely irrelevant)?

regards,
Mathew Robertson
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/melbourne-pm/attachments/20110801/d6ed9def/attachment.html>


More information about the Melbourne-pm mailing list