Hi Julian
On Sun, Sep 23, 2007 at 03:12:05PM +0000, Julian Mehnle wrote:
> Ola Lundqvist wrote:
> > On Sun, Sep 23, 2007 at 11:49:36AM +0000, Julian Mehnle wrote:
> > > So I think debarchiver should check $! and $@ rather than the result
> > > of do() ("unless ($t)"), which really says nothing about whether the
> > > file could be read and compiled successfully, UNLESS you require
> > > every configuration file to end with a true-valued statement (which
> > > the debarchiver man-page says nothing about). And I would not make
> > > such a requirement. Checking $! and $@ should do just fine.
> >
> > The problem here is that $! $@ can contain quite different values, as
> > you noticed... I do not know if perl actually requires the file to end
> > with a true statement or not. Maybe it does. I have not checked the
> > documentation for that.
>
> `perldoc -f do` says:
>
> | If "do" cannot read the file, it returns undef and sets $! to the error.
> | If "do" can read the file but cannot compile it, it returns undef and
> | sets an error message in [EMAIL PROTECTED] If the file is successfully
> compiled,
> | "do" returns the value of the last expression evaluated.
>
> Thus relying on $! and $@ is officially sanctioned.
I can not see that. It do not say anything about the $! or $@ when the
expression return true. It only tell that they are set when it returns
false.
The above statements formalized:
If X return undef and set $!
if Y return undef and set $@
if Z return $lastexpr
I can not see anything about
if return true, set $! = 0, set $@ = 0;
It may be so that it do that and I did some test code that verifies that.
However I do not want to rely on undocumented features too much if
there are documented features that I can rely on.
> I think the "check whether do() returns true" idiom is a remnant from old
> times when Perl didn't know exceptions ($@).
This is the result of the test code:
Condition return $! $@
--------------------------------------
Read error undef string ""
Syntax error undef "" string
No statements undef "" ""
last 0 0 "" ""
last 1 1 "" ""
The "" above could also be undef, but I did not have the time to check that
now.
But this is from my perl version. In your case for "No statements" the
value for $! and $@ was ^I. This means that if I would rely on that
$! and $@ is the empty string, it would have failed in your case
anyway.
I can provide some testing code to you if you want so we can determine
the table above for your perl version.
Best regards,
// Ola
--
--------------------- Ola Lundqvist ---------------------------
/ [EMAIL PROTECTED] Annebergsslingan 37 \
| [EMAIL PROTECTED] 654 65 KARLSTAD |
| http://opalsys.net/ +46 (0)70-332 1551 |
\ gpg/f.p.: 7090 A92B 18FE 7994 0C36 4FE4 18A1 B1CF 0FE5 3DD9 /
---------------------------------------------------------------
--
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]