Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much

Re: Use Strict

by dvergin (Monsignor)
on Jul 17, 2003 at 02:50 UTC ( [id://275092] : note . print w/replies, xml ) Need Help??

in reply to Add use strict to this?

I'll take a shot at the "why" part with an example.

Can you spot the error in the following snippet adapted from your code example?

my @cleanup = ('an', 'array', 'of', 'words'); for (my $i = 0; $i < scalar(@c1eanup); $i++) { $cleanup[$i] =~ s/oldserv001/newserv001/ig; }
If you look carefully you will see the flaw. But chances are strong that you would not notice it if you were staring at a whole page of code instead of just three lines. I've missed things much more obvious than this countless times.

'use strict' would find this error immediately and tell you exactly were it was.

Granted, a slip of the finger is not likely to produce this specific error. But many, many times I have had strict catch things I had looked at several times and missed. Once you become used to coding for strictness, you will find it an indespensable aid to accuracy in coding.

The problem with not using strict is that usually the code will run but it will behave strangely and you will have little clue where to start looking for the problem.

Think of strict as a way to say to Perl: "This is the name I intend to use for this variable. If I accidently spell it any other way, point out the exact line where I blundered."

You may feel that strict is too much bother in short programs. My advice: use it in short programs anyway until it becomes second nature. That way when you are writing longer programs, you won't hit a sudden learning curve.

Update: Another way strict-compliant coding often helps me can be illustrated by this snippet:

...lots of code here if ( $something ) { my $value = 'xyzzy'; ...more code here } ...lines and lines of more code
Scoping: when I see that "my $value" inside the brackets of the 'if' block I know immediately that the $value has not been messed with before this 'if' block. I also know that it is not doing any mischief after this block. It is only present inside this block. That is an enormous benefit in figuring out what code (even your own) is doing.

It can be a real frustration to be debugging or editing code and have no visual clue as to the scope of a variable. Can I safely mess with this variable? Did it have a value before we got here? Is something happening with it after this block that I need to be aware of? Who knows? ...unless the writer used strict and keep variable scope as narrow as possible.


"Perl is a mess and that's good because the
problem space is also a mess.
" - Larry Wall

Replies are listed 'Best First'.
Re: Re: Use Strict
by barbie (Deacon) on Jul 17, 2003 at 09:06 UTC
    'use strict' would find this error immediately and tell you exactly were it was.

    Okay I'll bite, what is wrong with the following?

    my @cleanup = ('an', 'array', 'of', 'words'); for (my $i = 0; $i < scalar(@c1eanup); $i++) { $cleanup[$i] =~ s/oldserv001/newserv001/ig; }

    I couldn't spot it and even plugging it into a script with -w and use strict gave no clues either. So if it works with strictures why is it wrong?

    Warnings and strictures are great during development, they are much like lint for C programs. However, it shouldn't be necessary for production code, and that is one thing that people forget. I would be wary of any code that didn't have use strict at the top, even if it was commented out, as the chances are it hasn't been run with strictures and as such, possibly not full tested.

    Warnings and strictures are there to help you spot glaring and subtle errors, which otherwise might show themselves in many weird and wonderful ways, and take a lot longer to figure out otherwise.

    Barbie | Birmingham Perl Mongers |

      Notice the scalar statement. The array 'cleanup' was spelled with a 1 instead of a lowercase L. At first I thought you were right but then I realized I copied the code and didn't put use strict at the top. After doing so, strict caught the error :). What Perl are you using that it didn't?

      Lobster Aliens Are attacking the world!
        Try a copy and paste from the example you posted. There is no '1' it's a lowercase 'L'.

        Barbie | Birmingham Perl Mongers |