Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@hirokidaichi

coffeescript/ harmonyのdestrucutring assignmentをperlでやる。

cpanizeはしてないけど、とりあえずgithubにはあげた。
https://github.com/hirokidaichi/p5-Data-Destructuring-Assignment

分割代入ってなにかというと"分割"して "代入"できるという機能です。

futurists =
  sculptor: "Umberto Boccioni"
  painter:  "Vladimir Burliuk"
  poet:
    name:   "F.T. Marinetti"
    address: [
      "Via Roma 42R"
      "Bellagio, Italy 22021"
    ]
// 1行で変数に構造を写像できる
{poet: {name, address: [street, city]}} = futurists

詳しくは
http://coffeescript.org/#destructuring
ここを参照

これが慣れてくると以外と便利なんだけど、
perlの黒魔術で実現したいなと言うことで、皆さん大好きlvalueとtieを使って、次のようなことができるモジュールを作ってみた。


destruct([\my $hoge,\my $fuga]) = [10,20];
print "hoge is $hoge";# hoge is 10
print "fuga is $fuga";# fuga is 20

こんな風に左辺に構造をもって、右辺の構造とマッチングして、代入することができます。

destruct( \my $hoge ) = 10;

変数はリファレンスで渡してください。

destruct( [\ $a ,\ $b] ) = [$b,$a];

swapもこんなに簡単。


destruct( { hash => \my $hash } ) = { hash => [1,2,3]};

hashrefもできます。

my @array =  map{ +{ hoge => "$_",fuga => $_ * 2}} (1..10);

while(destruct({ hoge => \my $hoge } ) = shift @array) {
    # $hoge..;
}

while句の中で。

my @array =  map{ +{ hoge => "$_",fuga => $_ * 2}} (1..10);
for my $elem (@array){
    destruct({ hoge => \my $hoge, fuga => \my $fuga}) = $elem;
}

for文とともに

my $template = { hoge => 1,fuga => 2};
if( destruct({ hoge => \my $hoge ,piyo => \my $fuga }) = $template ){
    ::pass 'matched any';
}else {
    # not come here
}

if文の中ではこう。一個でもmatchするとtrueです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
3
Help us understand the problem. What are the problem?