Comment by jstanley

2 days ago

> I don't miss perls halfarsed function args.

You mean you don't like writing things like...

    sub foo {
        my ($a, $b, $c) = shift;

?

Indeed!

It just grinds my gears that _I_ need to check to see if the caller has given me all the required bits. That seems like something the language should do.

I understand that it does give you a lot of flexibility, but Hnnnnnnnnn

(from what I recall object oriented perl doesn't give you this flexibility, but I'm not sure, as I never really did it. )

  • Object oriented perl gives you exactly the same flexibility.

    If you have a module called "My::Module", and you call "My::Module->some_method", then you'd implement that like:

        sub some_method {
            my ($pkg, @args) = @_;
    

    i.e. the module gets passed (as a string) as the first argument. You can then call

        $pkg->some_other_method;
    

    And similarly, if you have an object "$foo" you would call it like "$foo->some_other_method" and implement it as:

        sub some_method {
            my ($self, @args) = @_;
    

    i.e. the object gets passed as the first argument. And you can call "$self->some_other_method" with it.

    A minimal class is just:

        package My::Module;
    
        sub new {
            my ($pkg, %opts) = @_;
    
            my $self = bless \%opts, $pkg;
    
            return $self;
        }
    
        1;
    

    Don't let them tell you you need Moo or Moose or Mouse or fields.pm. Hand-rolled objects is the way :)

  Yes, I hate to write

  sub foo($$$) {
    my ($a, $b, $c) = @_;
  }

Where @_ is array of arguments, and ($$$) is function prototype (3 scalars are expected).

  • Perl has subroutine signatures now. You can write

    sub foo ($x, $y, $x) { ...}

    It's just syntactic sugar, so you still can't pass in multiple lists, and the list must be the final parameter.

Not sure if you've deliberately put in two bugs there haha

1. shift only shifts off the first element.

2. (if classify this as a bug) using $a and $b are frowned upon because they're the default variables when using sort.