sortみたいに$aや$bで引数を渡したい

30分プログラム、その609。sortみたいに$aや$bで引数を渡したい。
Perlのsort関数は変った仕様になっていて、引数を$aと$bで受け取ります。

@articles = sort {$a cmp $b} @files;

でも普通に定義したら、こんなことできない。
どうやったら、こんなことができるか気になるよね。
というわけで、$aや$bで引数を渡せるようにがんばってみた。最終的に、グローバル変数まで持ち出すはめになってしまった。


と、ここまで書いて思ったんだけど、"歴史的理由"とかでsort関数だけが特別扱いされてるだけだったら、どうしよう。Perlならやりかない・・・。

使い方

# 引数が$valueになってるよ
my_map { $value+1 } (1,2,3);

ソースコード

#! /usr/bin/perl
# -*- mode:perl; coding:utf-8 -*-
#
# map.pl -
#
# Copyright(C) 2009 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2009/06/24 21:22:02
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#
use strict;
use warnings;
use Data::Dumper;

our $value;
sub my_map(&@){
    my ($f,@xs) = @_;
    my @ys = ();
    foreach my $x (@xs) {
	local $value = $x;
	push @ys,$f->();
    }
    @ys;
}

print Dumper(my_map { $value+1 } (1,2,3));