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

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

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

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

Q&A

解決済

3回答

220閲覧

CODE(....)という出力で返ってくることの対処法

wkbiz

総合スコア152

Perl

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

0グッド

1クリップ

投稿2018/05/08 21:51

編集2018/05/14 20:16

よろしくお願いいたします。

  open(IN, "file.txt"); ..... $hensu = sub { if ($letter =~ /0/) { return "OK"; } elsif ($letter =~ /1/) { return "warn"; } elsif ($letter =~ /2/) { return "error"; } else { return "nothning"; } },

と記すと、$hensuに帰ってくるのが「CODE(0x....)」になってしまいます。

CODEで出力させたくない、上記例だとOKやERRORという文字列で返したい場合はどうすれば良いのでしょうか。
ご教授いただけると幸いです。

<追記 5/15>
返事が大変遅くなり申し訳ございませんでした。
いただいたご回答、すべてベストに選びたいのですが1つしか選べず心苦しいです。
本当にありがとうございました。

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

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

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

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

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

m.ts10806

2018/05/09 00:06

プログラムコード(およびエラーメッセージ)は```で囲ってください。(わからなければ質問編集画面でコード部分を選択し<code>ボタンを押してください)正しく反映されているかどうかは質問編集画面のプレビューを見ながら編集していってください。
KojiDoi

2018/05/09 03:51

mt10806さんのコメントに補足。https://teratail.com/questions/123033 この質問の中で、LouiS0616さんが図で分かりやすく説明されているので参考にしてください。 これにより、コード部分が視覚的に区別しやすくなり、インデントも再現され、なにより、回答者が自分の環境でコードを実行しようとするときにコピペが大変簡単になります。
wkbiz

2018/05/14 20:09

コメント有難うございました。
guest

回答3

0

ベストアンサー

なぜcode何タラと返ってくるのかというと、$hensuの中身はそのオブジェクト(無名関数)そのものであって、それを関数として実行した結果ではないからですね。

質問文に寄り添ったコードを書くとすれば、次のような感じになるでしょう。

perl

1#!/usr/bin/perl -w 2use strict; 3 4my $hensu = sub { 5 my($letter)=@_; 6 if ($letter =~ /0/) { return "OK"; } 7 elsif ($letter =~ /1/) { return "warn"; } 8 elsif ($letter =~ /2/) { return "error"; } 9 else { return "nothing"; } 10}; 11 12for my $i (0, 1, 2, 3){ 13 printf "$i %s\n", $hensu->($i); 14} 15

投稿2018/05/09 03:45

KojiDoi

総合スコア13671

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

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

wkbiz

2018/05/14 20:21

ご回答ありがとうございました。 なぜそうなるのか、についてご説明いただきとても嬉しかったです。
guest

0

ご提示のコードを極力生かすのであればeval でしょうか。

perl

1#!/usr/bin/perl 2 3$letter = "1"; 4 5$hensu = eval { 6 if ($letter =~ /0/) { 7 return "OK"; 8 } elsif ($letter =~ /1/) { 9 return "warn"; 10 } elsif ($letter =~ /2/) { 11 return "error"; 12 } else { 13 return "nothing"; 14 } 15}; 16 17print($hensu . "\n");

実行結果

$ ./do01.pl warn

ですが、普通にサブルーチン形式で定義した方が使い易いと思います。

perl

1#!/usr/bin/perl 2 3sub func1 { 4 if ($_[0] =~ /0/) { 5 return "OK"; 6 } elsif ($_[0] =~ /1/) { 7 return "warn"; 8 } elsif ($_[0] =~ /2/) { 9 return "error"; 10 } else { 11 return "nothing"; 12 } 13}; 14 15$letter = "0"; 16$hensu = func1($letter); 17printf("letter=%s, %s\n", $letter, $hensu); 18 19$letter = "2"; 20$hensu = func1($letter); 21printf("letter=%s, %s\n", $letter, $hensu); 22 23$letter = "9"; 24$hensu = func1($letter); 25printf("letter=%s, %s\n", $letter, $hensu);

実行結果

$ ./do02.pl letter=0, OK letter=2, error letter=9, nothing

投稿2018/05/09 00:03

編集2018/05/09 00:16
dodox86

総合スコア9183

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

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

wkbiz

2018/05/14 20:22

ご回答いただき有難うございました。 evalはちょっと考えたんですけど、やっぱり勉強不足ですね。精進します。
guest

0

質問の意図が、「条件式の結果を変数に入れたい」と言う事なら

$hensu = sub { if ($letter =~ /0/) { return "OK"; } elsif ($letter =~ /1/) { return "warn"; } elsif ($letter =~ /2/) { return "error"; } else { return "nothning"; } }->() ;

で、無名サブルーチンをその場で実行すればいい。

ただ、これをするなら、通常は do{} や三項演算子など、
他にもっと方法がある。

# do{} $hensu = do{ if ($letter =~ /0/) { "OK"; } elsif ($letter =~ /1/) { "warn"; } elsif ($letter =~ /2/) { "error"; } else { "nothning"; } } ;
# 三項演算子 $hensu = $letter =~ /0/ ? "OK" : $letter =~ /1/ ? "warn" : $letter =~ /2/ ? "error" : "nothning" ;

投稿2018/05/10 14:12

bunzaemon

総合スコア118

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

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

wkbiz

2018/05/14 20:18

ご回答ありがとうございました。 勉強不足でしかないですが、無名や三項は思いつかなかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問