Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine
 
PerlMonks  

Re: Re: Some suggestions on coding style - a chance to critique

by emilford (Friar)
on Jun 26, 2002 at 15:16 UTC ( #177399=note: print w/ replies, xml ) Need Help??


in reply to Re: Some suggestions on coding style - a chance to critique
in thread Some suggestions on coding style - a chance to critique

Thanks for the suggestions. First, I do use strict and -w, it just happened to get cut off when I was cutting and pasting my code.

Also, if scalar variables are passed by reference, does this mean that they can be modified from within a subroutine? I thought that I would have to pass a reference to the scalar in order to modify them (i.e. - \$variable). Is this not true?

About passing variables, I could push everything into a seperate data type, but wouldn't that make things a little less clear and require "not necessary" lines of code?

Thanks for the suggestions.


Comment on Re: Re: Some suggestions on coding style - a chance to critique
Re: Re: Re: Some suggestions on coding style - a chance to critique
by broquaint (Abbot) on Jun 26, 2002 at 15:57 UTC
    I thought that I would have to pass a reference to the scalar in order to modify them (i.e. - \$variable). Is this not true?
    You don't *have* to pass by reference to modify variables as @_ is just a list of aliases (it's magic you see) e.g
    sub foo { $_[0] = "modified in foo()"; print "in foo()\n"; } my $var = "a string"; print "\$var is $var\n"; foo($var); print "\$var is $var\n"; __output__ $var is a string in foo() $var is modified in foo()
    However passing by reference is more explicit, but that then introduces in the issue of 'dirtying' your arguments which is generally agreed to be avoided if possible. I believe the reasoning is that entering a function shouldn't modify the state of your program, although this can usually be ignored with more complex data e.g throwing around hashes is potentially pricey.
    I could push everything into a seperate data type, but wouldn't that make things a little less clear and require "not necessary" lines of code?
    At the worst it will require a line or two of code, but organising your data is far more likely to *reduce* your code. Let's take send_mail() for example. Currently you have 8 arguments, whereas I'd probably reduce that to 2 arguments with all the sendmail-related information in a hash or even a hash of hashes. But then again I think that all this throwing about of data is a symptom of a mis-organised program, to which I think part of the solution would be re-structuring the data as once you have well-defined data structures the program tends to follow.
    HTH

    _________
    broquaint

      I'm confused to what the purpose of passing a variable by reference is since you claim that you don't *have" to in order to modify it. Maybe my mind is stuck in C/C++ mode where you have to pass a parameter by reference (I believe) in order to modify it. I thought the purpose of not passing by reference is so that a subroutine will only be able to use the variable and not modify it. If the subroutine can modify this variable no matter how you pass it, what's the point of distinguishing between the two? See where I'm going with this?
        I'm confused to what the purpose of passing a variable by reference is since you claim that you don't *have" to in order to modify it
        A good reason for passing references is so you can pass distinct groups of aggregate data types e.g
        sub three_args { my($array, $scalar, $hash) = @_; print "three_args() got - $array, $scalar, $hash\n"; } my $scalar = 'a string'; my @array = qw(foo bar baz); my %hash = (key => 'value'); # with references three_args(\@array, $scalar, \%hash); # without references three_args(@array, $scalar, %hash); __output__ three_args() got - ARRAY(0x81089ac), a string, HASH(0x81089f4) three_args() got - foo, bar, baz
        As you can see, if you don't pass an array by reference it flattens out (the same goes for hashes) because it's in list context (the default context when passing arguments to user-defined functions). However I can't think of any particularly compelling reason off the top of my head for passing simple scalars by reference. It's generally a much better idea to return the desired values from the function.
        If the subroutine can modify this variable no matter how you pass it, what's the point of distinguishing between the two?
        For the clarity and simplicity of code. You're more than welcome to access the variables that were passed to you through @_, but you're doing so at your own risk (and anyone else that has to maintain your code). To draw a similarity between with C++ - @_ is sort of like having all your arguments as references (i.e foo(int& x) where as passing by reference is more like passing pointers.
        HTH

        _________
        broquaint

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://177399]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (17)
As of 2014-08-22 16:42 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The best computer themed movie is:











    Results (161 votes), past polls