http://www.perlmonks.org?node_id=554322


in reply to Carp::Clan

I don't get it. Can you demonstrate the problem that this solves?

⠤⠤ ⠙⠊⠕⠞⠁⠇⠑⠧⠊

Replies are listed 'Best First'.
Re^2: Carp::Clan
by Aristotle (Chancellor) on Jun 08, 2006 at 20:50 UTC
    my %handler; BEGIN { %handler = ( foo => sub { ref $_[0] eq 'ARRAY' or croak "foo key takes a hashre +f"; ... }, bar => sub { $_[0] =~ /wibble$/ or croak "bar key must end with 'w +ibble'"; ... }, ) } sub process_something { my %arg = @_; my @results; while( my ( $elem, $param ) = each %arg ) { push @results, $handler->{ $elem }->( $param ); } }

    croak will say the error was in process_something, when you really want it to be thrown for the where the call to process_something was.

    Makeshifts last the longest.

      croak will say the error was in process_something's caller if process_something was called from another package. For example,
      use strict; use warnings; package Module; use Carp qw( croak ); my %handler = ( foo => sub { ref $_[0] eq 'ARRAY' or croak "foo key takes a hashref +"; 1 }, bar => sub { $_[0] =~ /wibble$/ or croak "bar key must end with 'wi +bble'"; 1 }, ); sub process_something { my %arg = @_; my @results; while( my ( $elem, $param ) = each %arg ) { push @results, $handler{ $elem }( $param ); } } package main; Module::process_something( foo => 'a' ); # <-- line 27.

      outputs

      foo key takes a hashref at 554371.pl line 27