in reply to how to get alias name of anonymous sub?

Why? Often if you provide a little context to your problem we can give better answers that are less distracted by the joy of doing technically tricky stuff for the pure joy of it.

True laziness is hard work
  • Comment on Re: how to get alias name of anonymous sub?

Replies are listed 'Best First'.
Re^2: how to get alias name of anonymous sub?
by gian (Novice) on Nov 29, 2010 at 05:37 UTC
    I want to create a module get info from different websites.And the other ones can calle my module'api just like this:
    my $n=new->new(); $n->get_from_bbc(#some param#) $n->get_from_voanews(#some param#)
    Now I implement it like this.
    package news; sub new { *get_from_bbc=sub{ #post GET request to www.bbc.com get www.bbc.com; #and do some process return res; }; *get_from_voanews=sub{ #post GET request to www.bbc.com get www.bbc.com; #and do some process return res; } #and more sub like above #and more sub like above #and more sub like above #and more sub like above }
    But it seem trivial ,I thought if i can do like this .It will be better
    package news; sub new { my %news_sites={ get_from_bbc=>'www.bbc.com', get_from_voanews=>'www.voanews.com', #more websites# } foreach (keys %news_sites) { *{$_}=sub{ #post GET request to www.bbc.com ############### #if i can get the name of Subroutine #I can do it like this. ############ get %news_sites{$name_of_Subroutine}; #and do some process return res; }; }
    But the problem is that inside anonymous sub I don't know the other call the anonymity by
    $n->get_from_bbc(#some param#)
    or
    $n->get_from_voanews(#some param#)
    !

      That sounds like a task for AUTOLOAD. Consider:

      use strict; use warnings; package news; my %news_sites = ( bbc => 'www.bbc.com', voanews => 'www.voanews.com', #more websites# ); sub new { ... } sub AUTOLOAD { my ($base, $site) = $news::AUTOLOAD =~ /::(\w+)_(\w+)/; return '' if $base ne 'get_from' || ! exists $news_sites{$site}; my $res = "got from $news_sites{$site}\n"; # or appropriate proces +sing return $res; } package main; print news::get_from_bbc();

      Prints:

      got from www.bbc.com
      True laziness is hard work