電子書籍の厳選無料作品が豊富!

DBI.pmのメソッドで、
selectall_arrayref()は配列の配列形式、
selectall_hashref()はハッシュのハッシュ形式でレコードセットを返しますが、
配列のハッシュ形式で返すメソッドは存在するのでしょうか。
ハッシュのキーは列名として、
ハッシュの値はORDER BY句で指定したとおりに整列された配列へのリファレンスとなるような、ハッシュを生成しようとしています

A 回答 (2件)

my $arrayref = $dbh->selectall_arrayref('select * from user_info', {Slice => +{}});


print Dumper($arrayref);

---
$VAR1 = [
     {
      'name' => 'Alice',
      'id' => '1'
     },
     {
      'name' => 'Bob',
      'id' => '2'
     }
    ];
    • good
    • 0
この回答へのお礼

こんにちは!

なんとselectall_arrayref()でハッシュの配列を受け取ることができたのですね。
selectall_arrayref()の柔軟な用法を知らずに格好悪い質問をしてしまいました。

selectall_arrayref()の第二引数に戻り値の形式を指定できるのですね!
ハッシュの配列がほしいときは{Slice => {}}とするのですね。
このとき{}ではなく+{}とすると、どうなるか試してみたのですが違いは分かりませんでした。
{}の前に+を付けるとどうなるのでしょうか???

また便利な関数Data::Dumper()を覚えました(^_^)b

お礼日時:2011/11/26 20:23

> このとき{}ではなく+{}とすると、どうなるか試してみたのですが違いは分かりませんでした。


> {}の前に+を付けるとどうなるのでしょうか???

+{}と書くとハッシュリファレンスであると明示できます。
数は多くないですが、{}がハッシュリファレンスなのか、そうでないのか曖昧になることがあります。他人が書いたコードを見てビックリしないぐらいには理解したほうがよいでしょう。

use strict;
use warnings;
use Data::Dumper;
use feature 'say';

sub proto_func ($) {
say 'proto_func($)';
}

proto_func {say 'hoge'};
# Odd number of elements in anonymous hash at foo.pl line 11.

proto_func +{a => 1};

sub hashref_ambiguous { {@_} } # return {@_}
sub hashref_strict { +{@_} } # return +{@_}

my $ambiguous = hashref_ambiguous( 'a', 'b' );
my $strict = hashref_strict( 'a', 'b' );

print Dumper($ambiguous);
# $VAR1 = 2;

print Dumper($strict);
# $VAR1 = {
#      'a' => 'b'
#     };
    • good
    • 0
この回答へのお礼

{}や+{}はselectall_arrayref()の引数専用の書き方ではなくPerl全体としての書き方だったのですね。
{}は空ハッシュ、+{}は空ハッシュへのリファレンスを意味していたのですね。

ご紹介のコードは+の有無によって違いが発生する例ですね。
このコードを解読するのもいささか時間がかかりました^^;
新しく覚えたワードはfeatureプラグマ、say関数です。

しかしながら配列の各要素はスカラー値と決まっているのでselectall_arrayref()の第二引数に書くときは+を省略して{}と書けるといったところでしょうか。

お礼日時:2011/11/26 22:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!