• ベストアンサー

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

&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>"}

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

  • ベストアンサー
  • ysk6406
  • ベストアンサー率40% (237/589)
回答No.1

こんにちは。 > @z という名前の配列に > 引数を渡したい場合はどういうソースになるんですか? 単に sub xxx の中で my (@z) を宣言し、それに @_ をコピーするのではダメですか? つまり、次のようになります。   sub xxx   {     my (@z) = @_;     print @z;   } > セミコロンを省略して問題があったりしますか? セミコロンが無くても動くし perl -cw でも文句は言われませんが、習慣として付けておくことを強くお勧めします。 たった1文字のタイプを節約することが余程重要な特殊事情でもなければ… perl では、「文はセミコロンで終わる」のが基本文法だからであり、動くからといって変な省略をすると、あとでもっとコードが複雑になった時に必ず混乱を来します。 foreach の件は、単に foreach $z (keys %xx) { } として、{ } の中の $_ を $z にすれば動きます。

A__
質問者

補足

ありがとうございます。 foreach で好きな名前の変数名が使えました。 1行の { } の中ならセミコロンは無くても やっぱり問題無いんですね。 sub については、 my (@z) = @_; でできました。 でも、sub には sub xxx(引数を入れる変数名) のような書式は用意されていないんですか? sub の中では $_ に引数を入れて使うのが 普通なんですか?

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • kokucho81
  • ベストアンサー率61% (157/255)
回答No.2

>sub xxx(引数を入れる変数名) >のような書式は用意されていないんですか? >sub の中では $_ に引数を入れて使うのが >普通なんですか? おきもちお察しします。特にC/C++言語 や Java言語などをやってきた人にとっては、Perl言語のサブルーチンの使い方は、かなりブルーはいっちゃうと思います。 (私も、C/C++系から流れた口なので、当初は正規表現に感動しつつも、サブルーチン(等のいわゆる、引数のスコープやスタックの意味不明さ)はかなりブルー入りました。。。。) まぁ、引数は常に特殊変数@_に入るのだ、そして、これを介して、関数とやり取りするのだと覚えておいた方が良いと思います。 基本的にPerl言語は、あまり「深く考えない」、正しく書くよりも、結果オーライOK!な色合いが(C/C++やJavaなどにくらべると)濃い~言語なので、気軽に構えた方が良いと思います。

A__
質問者

お礼

ありがとうございます。 好きな変数名を付けられるようには定義されていなかったんですね。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 変数名の連結

    以下のような配列があるとします。 $str[0] = aaa; $str[1] = bbb; $str[2] = ccc; foreachでまわし変数名を連結し代入するというような事は可能なの でしょうか? foreach ($str as $key => $val) { //$keyをechoすると012と表示 //ここで変数名を$data0,$data1のようにしたいがうまくいかない $data . $key = $val; //配列にするぶんには正常に動作しました $data[$key] = $val; }

    • ベストアンサー
    • PHP
  • array_randで要素が数字の場合の処理方法

    PHPのarray_randについて教えて下さい。 下記のようなソースを作りましたが思った通りの結果になりません。 //(A) $test=array(3,5,8,11,14,24,26,28); print_r($test); foreach ($test as $val) { echo $val.'<br>'; } //(B) $keys = array_rand($test, 5);//決められた数を抽出 print_r($keys).'<br><br>'; foreach ($keys as $val) { echo $val.'<br>'; } Aの部分の結果は Array ( [0] => 3 [1] => 5 [2] => 8 [3] => 11 [4] => 14 [5] => 24 [6] => 26 [7] => 28 ) foreachの部分の出力↓ 3 5 8 11 14 24 26 28 となりこれは特に問題ありません。 Bの部分でAの配列から5つランダムで取り出したいのですが、結果は Array ( [0] => 0 [1] => 3 [2] => 5 [3] => 6 [4] => 7 ) 0 foreachの部分の出力↓ 0 3 5 6 7 となってしまい、Aの配列の添え字の中から5つの数字が選ばれるようになってしまいます。 Aの添え字ではなく「3,5,8,11,14,24,26,28」の数字から5つランダムで取り出すにはどのような書き方をすればよいのでしょうか? ご回答よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 多次元配列?配列のキー?変数の型?

    PHP勉強中のものです。 予定通りの動作にならんく四苦八苦しています。 どのように修正すれば予定通りになるのか考え方のアドバイスなどお願いします。 処理したいこと 変数$xxxの先頭の文字と最後の文字をsubstr()で取り出し$aaaと$bbbに別けそれぞれ代入しキーとして多次元配列に代入した配列要素を指定してechoで出力したい 試してみたこと $aaa1と$bbb1に直接整数を代入してみたところ、echoで出力された キーになる変数を整数型として変数に代入してみたが希望通りの動作にならなかった。 なにかアドバイス頂けると助かります。 $array = array( "0" =>array("あいうえお","かきくけこ"), "1" =>array("さしすせそ") ); $xxx = "0-1"; $aaa = substr($xxx,0,1); $bbb = substr($xxx,2); $aaa = (int)$aaa; $bbb = (int)$bbb; echo $array[$aaa][$bbb]; //出力されない $aaa1 = 0; $bbb1 = 1; echo $array[$aaa1][$bbb1]; //出力された $aaa = (int)$aaa; $bbb = (int)$bbb; echo $array[$aaa][$bbb]; //出力されない

    • ベストアンサー
    • PHP
  • 正規表現のパターンマッチ

    配列の中から特定の文字を取り出す処理がうまくできません @test = ("aaa","bbb","t=1","v=3"," test:", " test:") 上記のような配列があったとして 一文字目がaからzで二文字目が=のものを取り出す処理と 一文字以上の空白の後ろにtest:があるものを取り出す処理は どのようにすればいいのでしょうか? 下記のような感じで書いたのですがうまくいきません @test = ("aaa","bbb","t=1","v=3"," test:", " test:") my $test = "test:"; foreach( @test ) { if( $_ =~/^[a-z]+k/) { print $_; } if( $_ =~/^\s+$test/) { print $_; } } よろしくお願いします

  • バッチファイル、変数について

    windows2012R2で下記のようなバッチファイルを作成しました。 --------------- Set YYYY=%Date:~0,4% Set MM=%Date:~5,2% Set DD=%Date:~8,2% Set File=%YYYY%%MM%%DD% mkdir G:\bbb\xx1_%File% move G:\aaa\xxx* G:\bbb\xx1_%File% --------------- としてもフォルダは作成されておりましたが、xxxフォルダの中身が移動されておりませんでした。 どなたかお分かりの方がおりましたら、お願い致します。

  • You don't have permission

    自宅サーバ Fedora 11です。 IEにhttp://XXX.XXX.X.XX/~master/aaa/bbb/ccc/ と打ち込んだら Forbidden You don't have permission to access /~master/aaa/bbb/ccc/ on this server. このようなエラーメッセージででました。 cccフォルダ中身が見えるようにしたいですが、どうしたらいいですか? cccフォルダのファイルは大丈夫です。例え http://XXX.XXX.X.XX/~master/aaa/bbb/ccc/dog1.gif しても問題ないです。ただ、 http://XXX.XXX.X.XX/~master/aaa/bbb/ccc/ だと、、、上記のようなエラーがでるし、中身を確認できません。 cccフォルダの中を確認できるようにするにはどうしたらいいですか? よろしくお願いします。 http://XXX.XXX.X.XX/~master/aaa/bbb/ccc/

  • ある条件で一致した場合、配列に代入したい

    foreach(0..$#DataLines){ my@aaa= split(/<>/,$DataLines[$_]); if($FORM{No} eq @aaa[1]){ unshift(@bbb,"$DataLines[$_]"); } } print F "@bbb"; した時に配列@bbbにif($FORM{No} eq @aaa[1]){ で一致した場合、その時の配列を全部@bbbに代入したいのですが、最後のしか入らないようなので、これを全部入れるにはどうすれば良いかご教授願えませんでしょうか。 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • 受信できるアドレスと送信したときの自分のアドレスが違う

    以前業者さんが来たときに、 aaa@xxx.xx.xx というメアドのみだったのを、家にあるパソコンそれぞれに bbb@xxx.xx.xx ccc@xxx.xx.xx と割り当ててもらいました。 しかしパソコンの1つを再セットアップして、データがまっさらな状態になった後メールを使うと、受信できるのははじめのメアドのaaa@xxx.xx.xxで、送信したときにはbbb@xxx.xx.xxが相手に表示されてしまいます。 環境はWindowsXPのOutlook Expressです。 送信するアドレスもaaa@xxx.xx.xxにするか、受信するアドレスを、またbbb@xxx.xx.xxにするかして、まともに使えるようにしたいのですが、Outlook Expressの設定変更で簡単にできますか? それともルータの設定をしないとだめなのでしょうか?

  • 配列変数を引数として(参照)値渡しをしたいのですが

    プロシージャ間で配列変数を引数として(参照)値渡ししたいのですが、例えば以下のような場合、2箇所のXXX部分はどのように記述したらよいのでしょうか。 よろしくお願いします(Excel2000使用) Public Sub give()   Dim a(2) As Byte   a(0) = 3   a(1) = 15   take XXX End Sub Public Sub take(XXX)   (処理省略。受け取り側でも配列変数で処理したい) End Sub ※上記の例では配列の要素数が2ですが、実際はもっと多いので、例えば「take a(0),a(1),・・・」というふうな記述は(仮に適切なものであったとしても)記述しきれません。

  • foreachの実行結果について

    お世話になります。 以下のソースの実行結果が自分のトレースしたのと何故違うのか頭を抱えています。 ご指導よろしくお願いします。 <?php $arr=array(array(100,200),array('aaa','bbb','ccc')); foreach($arr as $foo){ print "*****\n"; foreach($foo as $var){ print $var ."\n"; } } ?> <自分の答え> ***** 100 ***** 200 ***** aaa ***** bbb ***** ccc <正解> ***** 100 200 ***** aaa bbb ccc 正解の回答に納得が行かないのです… foreach文がネストしてて内側のforeachの処理が一回終了してから 外側のforeachにいくものだと自分は思っています。 違うのでしょうか?

    • ベストアンサー
    • PHP
このQ&Aのポイント
  • LP-S6160を使用している際に、印刷時に文字が余計な場所にも印刷される問題が発生しています。片面印刷の場合、裏面にも部分的に薄く文字が出てきます。数枚印刷すると改善され、キレイに印刷されます。おそらくインクがどこかに残ってしまい、二重に写されていると考えられますが、どこをクリーニングすればよいかわかりません。
  • LP-S6160で印刷する際に、文字が余計な場所にも印刷される問題が発生しています。特に片面印刷の場合、裏面にも部分的に薄く文字が出てきます。複数枚印刷すると症状は改善し、キレイに印刷されます。おそらくどこかにインクが残ってしまい、それが原因で二重に印刷されていると考えられます。しかし、具体的なクリーニング方法がわかりません。
  • LP-S6160を使っていると、印刷時に文字が余計な場所にも印刷される問題が発生しています。片面印刷の場合、裏面にも部分的に薄く文字が出てきます。数枚印刷すると問題は改善され、キレイに印刷されます。おそらくどこかにインクが残ってしまい、それが原因で二重に印刷されていると考えられますが、具体的なクリーニング方法がわかりません。
回答を見る

専門家に質問してみよう