evalの使い方と引数に式を与える方法

このQ&Aのポイント
  • 引数に式を与える際にevalを使用する方法について解説します。
  • 引数に変数を入れることができないため、特定の式をプログラム中で計算する場合には、evalを使用する必要があります。
  • 将来的には、ファイルを開いて各ファイルごとの定数を式に代入することも可能です。
回答を見る
  • ベストアンサー

evalの使い方 引数として式を与える

引数として与えた式を、プログラム中で計算するようにしたいと思っています。 引数に変数を入れることはできないのでしょうか? 将来的には、ファイルを開いてそれぞれの、ファイルごとの定数を式に代入しようと考えています。 よろしくお願いします。 プログラム ################################### my $bb =2; my $str = $ARGV[0]; eval $str; print "$str\n"; 実行文 #################################### perl test.pl 2*3+\$bb 結果 #################################### 2*3+$bb 望んでいる結果 8

  • Perl
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.1

eval の機能を誤解されています。 eval $str; を $str = eval $str; に変えてください。 理解できたなら、もっと良い書き方に直す事もできますね。 my $result = eval $ARGV[0]; とか。

kenpanch7
質問者

お礼

ありがとうございます。 完全に誤解してました。 たいへん助かりました。

関連するQ&A

  • Ruby evalで代入

    #!/usr/bin/ruby str='hoge="abc"' eval(str) puts hoge 上記実行の結果エラーになってしまいますが、 evalを使って変数に代入するの方法ってあるのですか?

  • .forwardから呼び出すperlプログラムに引数を付ける事は可能ですか?

    はじめまして。Perlの初心者ものです。 よろしくお願い致します。 .forwardから呼び出すperlプログラムに引数をつけて プログラム内で引数とメール内容を処理に使用したいので すが、出来るのでしょうか? 例えば.forwardの中身を |/XXX/test.pl p1 と、記入して、 test1.pl内で引数によって、メールの内容を違ったファイルに保存したいです。 よろしくお願い致します。

  • コマンドライン引数で正規表現を指定したい

    Perlでgrep -Aのようなことがしたいです。 ---------------grep.pl------------------------------- use strict; use warnings; #コマンドライン引数の確認 if(@ARGV != 3){ die "USAGE: \0 [num] [regex] [file]"; } #数字の読み込み my $num = $ARGV[0]; #正規表現の読み込み my $regex = qr/$ARGV[1]/; #ファイル名の読み込み my $file = $ARGV[2]; #該当行を保存する配列 my @lines = (); open my $fh, '<', "$file" or die "$!"; my @file = <$fh>; close $fh; for(my $i=0; $i<@file; $i++){ if($file[$i] =~ /$regex/){ push @lines, $file[$i]; for(my $j=1; $j<=$num; $j++){ if($i+$j < @file){ if($file[$i+$j] !~ /$regex/){ push @lines, $file[$i+$j]; }else{ last; } }else{ last; } } } } foreach my $item (@lines){ print $item; } ------------------------------------------------- ところが、正規表現がうまく読み込めません。 perl grep.pl 2 \d{4}\/\d{2}\d{2} test.txt などとしても、\d{4}\/\d{2}\d{2}の部分が機能しません。 コマンドライン引数から正規表現を指定するにはどうしたらよいでしょうか。

    • ベストアンサー
    • Perl
  • 関数と変数と定数と式をまとめて [C言語]

    はじめまして。私はC言語初心者です。 C言語では、関数の引数や変数への代入や配列の添え字などに、変数や定数や、式や関数の値を利用できるじゃないですか。私は今C言語について勉強したことをファイルにまとめていっているのですが、上記のようなことを説明するたびに「関数と変数と定数と式」と書くと長ったらしくなってしまいます。そこで、これらをまとめていう言葉があったら教えて欲しいのです。 回答よろしくお願いします。

  • VBAでの戻り値と引数について

    最近VBAでプログラムを勉強しています。 引数と戻り値について教えてください。 定義としては、 引数:プロシージャに渡される定数、変数、および式。 戻り値:呼び出し元に処理の結果を戻す値。 となっているのですがいまいちピンときません。 SubプロシージャとFunctionプロシージャでその違いがあると思うのですが、具体的にどれが引数でどれが戻り値なのかわかりません。 他のプログラミングも全く経験がない初心者で初歩的な質問ですみませんがご教授お願いします。

  • Evalの有効桁数について

    Java内でEVALを使用する必要があり、その中で四則演算をするプログラムを書いています。少数点以下の少数桁数6桁までを正確に計算したいのですが、試してみたところたったの小数点1桁でも以下のように計算結果が合わず、困っています。 public class EvalTest { public static void main (String args[]) { javax.script.ScriptEngineManager manager = null; javax.script.ScriptEngine engine = null; if(engine == null) { manager = new javax.script.ScriptEngineManager(); engine = manager.getEngineByName("js"); } String str = ""; try { str = engine.eval("100.1*100.1").toString(); } catch (javax.script.ScriptException e) { e.printStackTrace(); } System.out.println(str); } } 出力結果:10020.009999999998 期待する結果:10020.01 なんとかEVALでもう少し正確な値を計算することは出来ないでしょうか。

    • ベストアンサー
    • Java
  • サブスクリプトとのファイルハンドル受け渡し

    メインの実行スクリプトの中から、 サブのスクリプトを実行し その結果をメインから与えたファイルハンドルへ出力したいのですが、 うまくいきません。 尚、サブスクリプトは適当な(下記例ですと./sub/)以下に 複数あります。 MAIN.pl --------- my @subs = glob "./sub/*.pl" ; open OUT, "> tmp.txt" ; my $fh = *OUT ; foreach my $sub ( @subs ){ $sub $fh 引数1 引数2; #ここの書き方が特にわかりません } close OUT ; サブスクリプト --------- my $fh = $ARGV[0] ; my $A = $ARGV[1] ; my $B = $ARGV[2] ; print $fh "結果\n" ; ---------

    • ベストアンサー
    • Perl
  • 関数の仮引数は宣言か式か

    ”関数の仮引数の宣言”は”変数の宣言・定義”と同じように”宣言”と明確に考えるべきなのか”関数の仮引数”を”式”と考えて良いのかという問題です。 私が迷ってしまったのは"配列を仮引数"にとった例です。 規則として ”int a[ ] が int *a と同じ意味になるのは、唯一、関数の仮引数の宣言のばあいだけである”という規則がありますが、これは”関数の仮引数の宣言”は変数の宣言・定義”と同じように”宣言”と明確に考えている例だとおもいます。 int a[ ] が int *a と型名 変数名(引数名)と宣言の形をとっているので当然だと思いますが、一方 配列は、式の中で「先頭へのポインタ」によみかえられる。               ↓ 関数の引数は式なので、配列は「先頭へのポインタ」に読み変えられる←引数部分を”宣言”ではなく”式”と捉えてる←ここが私の迷っているところ               ↓ よって、関数に渡ってくるのは、結局はつねにポインタだ。 という説明もあります。 私の今までの理解ではc言語では”宣言の部分”と”式”の部分は明確に区別されるものと考えていました。”宣言部分の初期化の="と”代入の=”とは明確に区別されていました。 それと同じように”関数の仮引数の宣言”は”宣言部分”と捕らえるのか”式”ととらえるのか ”宣言”と”式”が私の頭の中混乱しています。 宜しくお願いします。

  • 引数別の例外処理

    (1)コマンドラインの1つ目の引数を整数に変換して、int型の変数num1に代入。 (2)コマンドラインの2つ目の引数を整数に変換して、int型の変数num2に代入。 (3)num1とnum2の掛け算結果を標準出力。 (4)例外「NumberFormatException」が発生した場合は、“○(引数の例外発生した方の値)は整数に変換できません”の文字列を標準出力し、プログラム終了。 という問題で、NumberFormatException の○の部分の表示の仕方を教えて下さい。

    • ベストアンサー
    • Java
  • 渡された引数の型を判別する

    ブレークポイント用に以下のようなサブルーチンを作ってみました。  sub bp {  if(not defined $_[0]){return};     open(OUT,">>$bpfile") || err('ファイルが開けません。bp');  eval{flock(OUT,2)};     my $num=@_-1;  print OUT $_[0];   for my $i(1..$num) {   print OUT "\t".$_[$i];   }  print OUT "\n";     close(OUT);  } ただ  bp(); と記述すれば何もせず、本当にただのブレークポイントですが、引数に変数を持ってくれば、その位置での変数の値をファイルに記録してくれます。 ただ引数が連想配列だった場合、キーや値が表示される順番が毎回違うので使い勝手に難があります。変数の型をサブルーチン側で判別して、コードを書き分けることは出来ないでしょうか。

    • ベストアンサー
    • Perl

専門家に質問してみよう