• 締切済み

変数の宣言を省略する

 sub main {    local %ren = ("suzuki","30","satou","25","tanaka","50");    &func(\%ren);    print "Test ".$ren{satou}." Test";########「Test 44 Test」  }  sub func {    my ($hashref) = @_;    $hashref->{satou} = "44";  }  &main; このソースは sub func の中で「my ($hashref)」を宣言していますが 変数を用意せずに   (@_)->{satou} = "44"; のようにできるならその方法を教えてください。  sub func {    local (*hash) = @_;    $hash{satou} = "44";  } だった場合についても教えてください。

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

みんなの回答

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

> {$_[0]}{satou} = "44"; > でもできてしまったんですが、このようにすることはPerlの規約外になるんでしょうか? それはおかしいですね。 普通なら構文エラーで実行すらできないはずです。 できれば最新版のPerl(5.8.x)を入れたほうが良いと思いますよ。

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.1

> 変数を用意せずに >   (@_)->{satou} = "44"; > のようにできるならその方法を教えてください。  my ($hashref) = @_; では、引数の配列である @_ の最初のデータを $hashref に入れているだけなので、直接 $_[0] を使えばできます。 つまり、  $_[0]->{satou} = "44"; また、 >  local (*hash) = @_; >  $hash{satou} = "44"; こちらの場合でも同じ方法でできるはずです。 ちなみに、   ${$_[0]}{satou} = "44"; と書くこともできます。

nwycuar
質問者

補足

ありがとうございます。どちらもできました。 ${$_[0]}{satou} = "44"; が {$_[0]}{satou} = "44"; でもできてしまったんですが、このようにすることはPerlの規約外になるんでしょうか?

関連するQ&A

  • 自作関数への値の渡し方@_

    Perlで $ren{satou} = "25"; ↓ $ren{satou} = "44"; にする処理をsubで書きます。  %ren = ( "suzuki","30","satou","25","tanaka","50" );  sub func {    $ren{satou} = "44";  }  &func; これを、%renを渡してsub内で書換えるように変更します。 そのためにはどのようにすればよいですか?  sub main {    local %ren = ("suzuki","30","satou","25","tanaka","50");    &func(%ren);    print "Test ".$ren{satou}." Test";########「Test 44 Test」  }  sub func {    @_?    @_?{satou} = "44";  }  &main; @_?のところをどう変更すればよいか教えてください。 連想配列を渡しています。 考え方ではなくて、この場合のソースを教えてください。

    • ベストアンサー
    • Perl
  • Perlの変数宣言について

    PHPを毎日書いている者ですが、たまたまPerlのメールフォームをカスタマイズ しなければならなくなりました。 use strict宣言がある場合、変数はmyまたはlocalで宣言しなければいけないようですが、 サブルーチン内に sub form { ・・・ my ($form_value,$error_list) = @_; ・・・ print $error_list{'inquiry_type1'} としたところ、 Global symbol "%error_list" requires explicit package name at ・・・ と、宣言が無い場合に出るというエラーが出ました。 $error_listには、inquiry_type1は入っているはずなのですが、どのような 宣言をすればよいのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • ハッシュリファレンスの無名変数

    サブルーチンにハッシュリファレンスを渡すために、 以下のようにすると上手く実行されます。 %hash = ( baa => 1, boo => 2 ); test(\%hash); sub test { my %hash = %{shift}; print $hash{baa}; } これを、%hashに格納せずに、 直接渡そうとすると上手くいきません。 test(\( baa => 1, boo => 2 )); 考え方が間違っているのでしょうか。

    • ベストアンサー
    • Perl
  • hashをスカラー変数に渡す

    最近、perlを勉強し始めたのですが下記のようなサンプルコードを 見たことがあります。 hashをスカラー変数「$test」に渡している。そして「%$test」でhashに変換してeachで回している。最初から「%test」のようにしてeachで回せばよいと思うのですが実際の業務とかでhashをスカラー変数で受け取るようなことってありえるのでしょうか? my $test = { a=>'test_a', b=>'test_b', c=>'test_c' }; while( my ($key, $value) = each %$test ) { print $key ." : " . $value . "\n"; }

    • ベストアンサー
    • Perl
  • vbaの 変数の宣言 記号は使えない?

    vbaの 変数の宣言 記号は使えない? Sub test1() dim st @ End Sub みたいに変数の型を As String ではなく記号で表現ってできないんでしたっけ? エラーになってしまいます。

  • 動的ライブラリ中のグローバル変数

    以下の3行を前提条件とします。 メインのプログラムmainと動的ライブラリsub1.soとsub2.soがあります。 sub1.cとsub2.cにはsub.hというヘッダをインクルードしています。 mainはsub1.soおよびsub2.soを実行時に動的にリンクします。 ここでsub1.c中で int TEST=10;と変数を定義しました。 さらにsub.h中にextern int TEST;と変数を宣言しました。 そしてsub2.h中で if(TEST){…}と記述しました。 この状態でコンパイルを実行しました。 ここでmainを実行すると動きません。 調べてみるとsub2.soがTESTがundefined symbolとなっていました。 動的ライブラリ間での変数の共有の仕方は上の書き方では不正確なのでしょうか?

  • phpでの局所変数

    phpで、perlでいうlocalやmyのような宣言はできないのでしょうか? function a() {  if(1){   $a=2;   print "$a<br>";  }  print "$a<br>"; } としても2が2つ表示されてしまいます。 ある関数内で場所を問わず宣言したグローバル変数でない変数のスコープは、宣言場所がどこであれ、「関数内」となるのでしょうか?

    • ベストアンサー
    • PHP
  • use strictを宣言してlocal変数を使うには?

    Perl初心者です。初歩的な質問ですが、 サブルーチンの中で my だと、その下の{ } ブロックではmyで宣言したローカル変数がスコープされないので  localを使うのではないかと思いますが、 それだと、use strictではエラーになります。 こんなときどう処理したらよいのでしょうか。

    • ベストアンサー
    • Perl
  • Perlで use strict して our変数

    Perl 初心者です。初めて質問します。 test_sub.pl で宣言した変数を test_main.pl から参照したくて悩んでいます。 環境 : WindowsXP / ActivePerl 5.14.2 -------------------- * test_sub.pl -------------------- #!/usr/bin/perl use strict; our $hoge = 'HOGE'; 1; -------------------- * test_main.pl -------------------- #!/usr/bin/perl use strict; require 'test_sub.pl'; print "Content-type: text/html\n\n"; print $hoge; -------------------- これを実行すると、 Global symbol "$hoge" requires explicit package name at C:/public_html/cgi-bin/test_main.pl line 7.\r というエラーが出ます。 require する前に、test_main.pl のほうで our($hoge); と宣言したり 参照する際に print $main::hoge; とパッケージを指定したりすればいけるのですが、 これらをしないとできないものなのでしょうか。 use strict; を書かなければ最初のソースでも動くのですが use strict は書きたい… 継承のようなことをしたいのです。 ちなみに以下試してみたソースです。 -------------------- * test_main.pl -------------------- #!/usr/bin/perl ######################################## # NG use strict; require 'test_sub.pl'; print "Content-type: text/html\n\n"; print $hoge; ######################################## # OK our変数を宣言しておくといける =pod use strict; our ($hoge); require 'test_sub.pl'; print "Content-type: text/html\n\n"; print $hoge; =cut ######################################## # OK 参照する際にパッケージ名を指定すればいける =pod use strict; require 'test_sub.pl'; print "Content-type: text/html\n\n"; print $main::hoge; =cut ######################################## ######################################## # NG =pod use strict; use base qw(test_sub); print "Content-type: text/html\n\n"; print $hoge; =cut ######################################## -------------------- * test_sub.pm -------------------- #!/usr/bin/perl package test_sub; use strict; our $hoge = 'HOGE'; 1; -------------------- NG パタンはどちらも Global symbol "$hoge" requires explicit package name のエラーとなります。 もしご存じの方がいらっしゃいましたら教えてください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 引数(配列)について

    呼ぶ側: Sub main()  Call func(test(),test_id) end Sub 呼ばれる側:  Private Sub func(Byref test() as string, Byval test_id as long) と言う関係がある場合で 引数(1)test() の値がなく渡したくない場合は、どのように記述すればいいのでしょうか? 引数(2)test_id の値がなく渡したくない場合は、0を渡しています  また、呼ぶ側で test() を宣言し、tast()=""を代入すれば問題ないことは分かっているのですが、test()の変数宣言せずに何とかなりませんでしょうか? 宜しくお願いいたします

専門家に質問してみよう