push @{ $foo{bar} }, 3; vs $foo{bar}-push(3)

schwern on 2007-09-23T22:30:40

A few weeks ago a friend of mine, who is a Ruby programmer that has to write Perl for $job, said "Perl makes me cry". He gave specific examples, one was...

Perl: my ($self) = @_; push @{ $test_files{ident $self} } , @failure_files;

Ruby: @test_files.push(*failure_files)

I feel like perl is actively resisting me here.


And he's right, it is. The dereferencing syntax has nasty, sharp edges.

I thought autobox would solve this, but it doesn't add in the core functions. Then I discovered autobox::Core which does!

    use autobox;
    use autobox::Core;

$test_files{ident $self}->push(@failure_files);


It's shorter, it involves less #*@(}, and it gets the subjects and verbs in the right order.


Moose::Autobox

Stevan on 2007-09-24T03:35:51

You might also want to take a look at Moose::Autobox. It has a different goal from autobox::Core, which is to be more like the proposed core types and methods for Perl 6 (mostly found in Syn 29). And as far as your ruby-friend is concerned, you might want to show him Moose itself, he might not miss ruby as much.

- Stevan

Class:Std

perrin on 2007-10-15T21:37:40

It seems like this would be less difficult if he didn't use Class::Std. A normal hash-based object makes it look simpler to me anyway:

push @{ $self->{'files'} }, @more_files;

Re:Class:Std

Aristotle on 2007-10-16T00:30:45

Throwing in an extra arrow makes it look simpler? Strange definition of simpler. :-)

I like to preface my inside-out object methods with “my $this = ident my $self = shift;”, btw, which makes that code into this:

push @{ $test_files{ $this } } , @failure_files;

Of course Hash::Util::FieldHash’s idhash function will make that separate $this unnecessary in 5.10 and you’ll be able to just write this:

push @{ $test_files{ $self } } , @failure_files;

The real problem persists through all of these, though: that extra @{} bracket.

Re:Class:Std

perrin on 2007-10-16T01:05:08

To each their own, I guess. The @{} doesn't bother me at all, but the way instance variables are referenced in Class::Std does.

Re:Class:Std

Aristotle on 2007-10-16T02:04:41

My reply swelled into a post of its own.