質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

1回答

5170閲覧

検索した結果をhashで受け取るが消えてしまう

退会済みユーザー

退会済みユーザー

総合スコア0

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2016/12/20 10:40

編集2016/12/20 13:25

躓いているところ

dbを検索した結果をhashで受け取れはするのですが、中の2つの値を別々の変数に格納する際に、2つめを変数に格納しようとすると、undefを扱っているよ?の様なエラーが起きております。

Can't use an undefined value as a HASH reference at /home/lazyarea/import_csv/bin/../lib/ImportCsv/CLI/Product.pm line 40.

やったこと等

Mojo::Pg

dbの結果

$res = $pg->db->query("Select s.a_id,s.a_sub_id from t1 as a
LEFT JOIN t2 AS s ON a.id =s.a_id
WHERE a.name='abc'");

warn Dumper $res->hash;
{
"a_id"=>"123",
"a_sub_id"=>"456"
}

my $a = $res->hash->{'a_id'};
my $b = $res->hash->{'a_sub_id'}; ここでエラー!line 40.

ちなみに
my($a,$b) = $res->hash;としてはみたのですがダメでした。

上記のコードのように結果の値を2つの変数に格納したいのです。どなたかご教示いただけますでしょうか。
お願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikedas

2016/12/20 12:32

出たエラーメッセージを具体的に記していただけますか。なお、コマンドラインからプログラムを実行しているのでしたら「perl -w プログラム」のように実行してみて下さい。
退会済みユーザー

退会済みユーザー

2016/12/20 13:20

情報不足失礼しました。以下が実行時のメッセージとなります。Can't use an undefined value as a HASH reference at /home/lazyarea/import_csv/bin/../lib/ImportCsv/CLI/Product.pm line 40.
guest

回答1

0

ベストアンサー

Mojo::Pgのマニュアルによると$pg->db->query()はMojo::Pg::Resultsクラスのオブジェクトを返します。

そこでMojo::Pg::Resultsのマニュアルでhash()の説明を見ると

hash

my $hash = $results->hash;

Fetch next row from "sth" and return it as a hash reference. Note that "finish" needs to be called if you are not fetching all the possible rows.

となっています。つまり、hash()を実行するたびに結果から1行を取り出してハッシュとして返すのですね。全て取り出してしまった後は返すものがありません。ご提示のソースではhash()を合計3回実行しています。結果が2行以下しかなければ3回目はエラーになります。

ですから、query()を実行した直後にhash()の結果を変数に保存し、そこから各列の値を取り出せばいいでしょう。

$res = $pg->db->query( 略 ); my $hash = $res->hash; my($a,$b) = ($hash->{'a_id'}, $hash->{'a_sub_id'});

投稿2016/12/20 13:05

編集2016/12/20 13:19
ikedas

総合スコア4227

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/12/20 13:34

ありがとうございました。 勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問