• 締切済み

Perl 内で実行される Perlで使用した変数を受け取りたい

No.908814の質問と類似しています。 source.plとdest.plという2つのソースがあったときに、 source.pl側では複数個の引数と共にdest.plを呼び出します。dest.pl側で引数を受け取り、その値を変更します。 変更した引数を再度、source.pl側で利用するというようなことを行いたいです。 Cでいう関数の引数にポインタを渡して、受け側で値を変更するようなイメージです。 条件として戻り値は正常/異常のstatusに利用することと、 dest.plはサブルーチンにはしないということがあります。 ご回答、よろしくお願いします。 -------------------------○ source.pl my $arg = 1; $argを引数にしてdest.plの呼び出し ・ ・ dest.plで変更された$argを使用 -------------------------○ dest.pl $argを受け取り、値を変更する。 いくつかの print ""; ・ ・ $argを戻す。 No.908814で回答を頂いていますが、 違うのは、dest.plでのprint文はまま標準出力として表示し、 最後に結果だけを戻すというように処理したいのです。

  • Perl
  • 回答数3
  • ありがとう数0

みんなの回答

  • www15
  • ベストアンサー率54% (6/11)
回答No.3

「参照渡し」のことでしょうか? 例: @x=(1, 5, -2, 8); &change(*x); foreach(@x){ print "$_\n"; } # 配列の値をそれぞれ2乗にする関数 sub change{ local (*arg) = @_; # my ではダメ。 my $i; # 値を2乗する for($i=0; $i<=$#arg; $i++){ $arg[$i]**=2; } } 下のURLも参考にして下さい。

参考URL:
http://tohoho.wakusei.ne.jp/wwwperl1.htm#CallByRef
  • iichiho
  • ベストアンサー率37% (416/1114)
回答No.2

myではなくrequireで呼び出せば、dest.pl内で(local)を使っていない限りはグローバル変数として取り扱えるはずです。

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.1

最初の大元の呼び出しのときに my $arg で呼び出すとローカルの変数になるので、 my はつけないで呼び出せば普通にグローバル変数として使用できます。 あとは なんとか.plを呼び出して変数の値を変更すればそのままその変更された値で変数を使用できるかと思います。

関連するQ&A

  • Perl 内で実行される Perl が STDOUT に吐いたものを変数で受け取りたい

     凄い不思議な質問タイトルになってしまいましたが……(笑)  下記のようなソースを実行したとします。 -------------------------○ source.pl open(IN, "<dest.pl"); foreach(<IN>){$s.=$_;} close(IN); eval($s);  このとき、source.pl で実行される dest.pl には別の Perl プログラムが入っています。  で、dest.pl の内部にはいくつかの print ""; があって、標準出力をおこなっているわけですが、この標準出力結果を画面には出さず、source.pl 側で受け取る事はできないもんでしょうか。   @r = `dest.pl`;  という方法もあるとは思うんですが、なんとか eval でやりたいのです。  なんかパイプとか繋ぎなおせば何とかなりそうな気もするんですが……。  何かご存知の方がいらっしゃいましたら、よろしくお願いします。

    • ベストアンサー
    • Perl
  • Perlです。サブルーチンについて

    以下の文はあっていますでしょうか。 # サブルーチンを呼び出して引数は 3 とする。 # そして返ってきた戻り値を変数$aに代入せよ。 $a=&a(3); # サブルーチン名aせよ。 sub a{ # $_[0]が引数 3 となりプラス1して変数$bに代入せよ。 $b=$_[0]+1; # 変数$bの内容を戻り値として返せ。 return $b; } # 変数$aの内容を表示せよ。 print "$a";

    • ベストアンサー
    • Perl
  • perlでサブルーチンへの複数の配列渡し

    perlでサブルーチンに配列を渡しているのですが、 引数としている配列が1個の場合は問題ないのですが、 複数渡すと、第2引数以降が渡りません。 どの様にすれば上手くできますか。 例1 #!/usr/bin/perl @x1 = (14, 11, 5, 12, 8, 15); @x2 = (12, 10, 8, 9); print "main : @x1 \n"; &test(@x1); sub test { my (@arg1) = @_; print "sub : @arg1 \n"; } 結果 main : 14 11 5 12 8 15 sub : 14 11 5 12 8 15 例2 #!/usr/bin/perl @x1 = (14, 11, 5, 12, 8, 15); @x2 = (12, 10, 8, 9); print "main : @x1 \n"; print "main : @x2 \n"; &test(@x1, @x2); sub test { my (@arg1, @arg2) = @_; print "sub : @arg1 \n"; print "sub : @arg2 \n"; } 結果 main : 14 11 5 12 8 15 main : 12 10 8 9 sub : 14 11 5 12 8 15 12 10 8 9 sub : 引数1に全てが設定されて、引数2に設定されていない。

    • ベストアンサー
    • Perl
  • PHP シェルスクリプト 引数

    失礼します。現在PHPからシェルスクリプトを引数を付けて実行し、戻り値で確認が出来るか試しているのですがなかなか参考になる記事がなく実現が出来ない状態です 調べたところ、 phpからhoge.shというシェルファイルをargという引数で実行したいとします。 引数を"'. .'"で囲う事で、引数を渡せるようです。 $output = shell_exec('/bin/sh /path/to/hoge.sh "'.$arg.'"') var_dump($output) 上記のような記事を見つけたのですがhoge.shはどのように$argを受け取り、戻り値を渡しているのでしょうか?また、$argの値の中身は渡す引数の内容という認識で正しいのでしょうか?サンプルコードなどがあるとうれしいです。 ご教授よろしくお願い致します。

  • C#による.NETストアドプロシージャ

    VisualStudio+ODT.netで、C#にて「.NETストアドプロシージャ」を製作しようとしています。 例えばNUMBER型の値を引数で渡してNUMBER型値を返す様なFUNCTIONを作りたいとして、 Oracle側で使う際にNUMBER型の値にはNULL値も有り得るわけですが、 C#側でメソッドの引数や戻り値に、NULL許容型(int?やdecimal?とか)を指定してビルドし、 それをVisualStudioからOracleデータベースへデプロイしようとすると、 ウィザード上のパラメータマッピングのところで、NULL許容型に指定した引数や戻り値に対して Oracle側の適切なデータ型を指定出来なくなってしまいます。 かと言って、C#側メソッドでNULL許容型ではない型を指定してしまいますと、引数へNULL値を 与えると例外が発生してしまいます。 この様な問題に直面されて、何らか解決された方はいらっしゃいますでしょうか?

  • 変数名を $_ にしたくない

    &xxx("AA","BB"); sub xxx{print @_} ↑のソースで sub に @_ という名前の配列に 引数を渡すことができたけど、@z という名前の配列に 引数を渡したい場合はどういうソースになるんですか? {print @_} は {print @_;} のようにセミコロンを 書いてあるのが普通だと思うけど、このような場合は セミコロンを省略して問題があったりしますか? 下の foreach についても $_ というのを $z にするには どういうソースにしたらいいか教えてください。 $xx{"A"}= "aaa"; $xx{"B"}= "bbb"; $xx{"C"}= "ccc"; foreach(keys %xx){print "添え字は$_で値は$xx{$_}<br>"}

    • ベストアンサー
    • CGI
  • サブルーチンの引数の、呼び出し側の呼称を得る

    サブルーチンの呼び出し、例えば sr($p); という呼び出しがあった場合、サブルーチンsb()の中で、引数は@_として扱われて、  $p の値などは  $_ で知ることが出来ます。 それではサブルーチンsb()の方から、  $_ が呼び出し側で何と呼ばれているか知ることは出来るのでしょうか? つまり、この場合、$_は呼び出し側で  $p と呼ばれているわけですが、この呼称をサブルーチン側で知ることは出来るでしょうか。

    • ベストアンサー
    • Perl
  • javaでのストアド呼び出し

    前の質問に似た質問があったのですが、 javaでのストアド呼び出しについて質問です 戻り値(Number型)を返すストアドを呼び出したいのですが ストアドは test で ストアド自体の引数は第1引数から第5引数までが IN で6番目がoutです。 String sql = "{ ? = call test(?,?,?,?,?)}" CallableStatement cstmt = con.prepareCall(sql); cstmt .registerOutParameter( 1, java.sql.Types.INTEGER );  //PL/SQLの戻り値 cstmt .setString( 2, "0" ); cstmt .setString( 3, "0" ); cstmt .setString( 4, "0" ); cstmt .setString( 5, "0" ); cstmt .setString( 6, "0" ); cstmt .execute(); try-catch内に上記ソースを記述し実行すると、エラーになってしまいます cstmt .registerOutParameter( 1, java.sql.Types.INTEGER );の部分が悪いと思うの出すが、PL/SQLのNUMBER型は java.sql.Types.INTEGER  ではいけないのでしょうか それとも書き方そのものがわるいのでしょうか? まわりにJavaが出来る人がいなく、困っています。 どなたか力を貸してください

    • ベストアンサー
    • Java
  • 引数について質問

    私プログラミング初心者ですので、できるだけ優しい解説をしていただければ幸いです! 引数について、以下のような解説がありました。 「引数には仮引数と実引数の2種類が存在する。仮引数は、関数を定義する際に変数で指定する引数である。また、実引数は、プログラムの実行時に関数に引き渡される値となる引数である。つまり、関数の実行時には、実引数の値が仮引数に代入されることになる。」 質問:1「関数を定義する際に変数で指定する引数である。」という記述の中で「関数を定義」とありますが、実際のソースコードにおいて何に対応するかわかりません。簡潔なソースコードを交えて解説していただければ幸いです。 質問2:「関数を定義」に限らず、プログラミングにおいて「定義」という言葉をよく見ますが、これは本質的にどういう意味をもっているのでしょうか?具体的なソースコースコードを交えて解説してくださると幸いです。 もしかして、その定義とは例えば「public static void main(String arg[]){」のような「メソッド宣言」のことですか? 質問3:「関数の実行時には、実引数の値が仮引数に代入されることになる。」と書いてありますが、 これはどういうことですか、僕が実際にソースコードで記述してみるので、その考えが正しいか判定してください package 第4章; public class A { public static void main(String arg[]){ double x; x=Math.sqrt(2.0); System.out.println("2.0の平方根は"+x); } } 僕の考え:String arg[]が仮引数で、実引数2.0がString arg[]に代入されるってことでしょうか? 「定義」といえば、上記のソースコードでは、public static void main(String arg[]){ 以外見当たらないので、、 僕の考え2:Mathクラスは、標準クラス(javaが最初から備えているクラス)だから、プログラマが「関数を定義」しなくても予め関数が定義されているから、関数を定義する必要がない、ということでしょうか?

    • ベストアンサー
    • Java
  • 受け取った変数がファイルに書き込めない

    Perlで質問があります。 Perlでフォームから受け取った変数の値($title = “333”)を別にCGI 投げます。Printでは問題なく変数の中身が表示されるのですが Txtに書き込もうとするとうまくいきません。 ちなみに行頭で$title = “333”;すると書き込めます。 うまく受け渡しができていないのでしょうか? 以下ソースです。 #!/usr/bin/perl -w require 'lib.pl'; #########i一応lib.plの中身######### $q = new CGI; $q->charset('EUC-JP'); print $q->header; $title = $q->param('title'); ################################## use CGI; my $fname = 'news.txt'; open(FILE, ">>$fname") or die; print FILE $title ; close(FILE);

専門家に質問してみよう