Higher-Order Perl P.333-334

android - acrobat reader

# vim:set ts=2:
use strict;
use warnings;
use YAML;

sub cmap (&) {
  my $f = shift;
  my $r = sub {
    my @result;
    for (@_) {
      push @result, $f->($_);
    }
    @result;
  };
  return $r;
}

sub cgrep(&) {
  my $f = shift;
  my $r = sub {
    my @result;
    for (@_) {
      push @result, $_ if $f->($_);
    }
    @result;
  };
  return $r;
}

sub weblog {
  return (
    +{referer => "slashdot.jp" },
    +{referer => "slashdot.com" },
    +{referer => "google.jp"   },
    +{referer => "yahoo.jp"    },
    +{referer => "hatena.ne.jp"},
  );
}

my $double = cmap { $_ * 2 };
my @aa = $double->(1..5);
print "\@aa=@aa\n";

my $find_slashdot = cgrep { $_->{referer} =~ /slashdot/i };
my @bb = $find_slashdot->(weblog());
print "\@bb=\n";
print Dump \@bb;

__END__
@aa=2 4 6 8 10
@bb=
---
- referer: slashdot.jp
- referer: slashdot.com

+{...} の意味

  • 検索しにくくてこれが何だったのか悩んでたけれどようやく再発見

たとえば、新しいハッシュを作って、それへのリファレンスを返す関数が欲しければ、 以下のような選択肢があります:

    sub hashem {        { @_ } }   # silently wrong
    sub hashem {       +{ @_ } }   # ok
    sub hashem { return { @_ } }   # ok

その一方で、以下のようにすることもできます:

    sub showem {        { @_ } }   # ambiguous (currently ok, but may change)
    sub showem {       {; @_ } }   # ok
    sub showem { { return @_ } }   # ok

先頭にある +{ や {; が、その式が実際には ハッシュのリファレンスなのかブロックなのかの 曖昧さを除去するためにあります。

http://perldoc.jp/docs/perl/5.8.8/perlref.pod

なんかネットワークが繋がらない・・・

"Bringing up interface eth0: Device eth0 does not seem to be present, delaying initialization"