• ベストアンサー

全ての変数を初期化する方法はありませんか。

perl で、途中で、全ての変数を初期化(からっぽ)にする方法はありませんか。 一つ一つ、代入する方法ではなく。 例えば、 $first = ""; $second = ""; $third = ""; ではなく。 一気に全ての変数を初期化する方法。 変数名が分からなくても全て初期化できる方法。 もしくは、代替手段など。 あれば、教えてください。お願いします。

  • defd
  • お礼率19% (11/56)
  • Perl
  • 回答数4
  • ありがとう数0

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

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

使用が推奨されていない関数ですが、resetという関数で、一度に多数の変数の値をクリアすることが出来ます。 書式は次の通りです。     reset EXPR ここでEXPRは文字を列挙したもの(ハイフンによる範囲指定も可)で、ここに含まれた文字で始まる全てのスカラー変数、配列、ハッシュのを初期状態に戻します。 例えば、小文字で始まる全ての変数を初期化するには、次のようにします。     reset 'a-z'; ただし他の方もおっしゃられている通り、PerlにはARGV,INC,ENVなど、予め値が入っている変数もあるので、     reset 'A-Z'; はやめましょう。 また補足ですが、my変数はresetの影響を受けません。グローバル変数とlocal変数のみに有効です。

その他の回答 (3)

  • 2nd
  • ベストアンサー率30% (19/63)
回答No.3

punchan_jp さんもおっしゃっていますが、 Perl には、かなりの数の「予約変数」があり 無作為に全変数の初期化ができてしまうと、 プログラムが「全く」動かなくなります。 ので、 「プログラム中で使用している (非予約)変数全てに NULL値を代入する」 という操作を実現するには、bagyo さんのおっしゃるように プログラム中で使用する(非予約)変数を全て 一つの(or 管理できる範囲の個数の)連想配列で定義し、 その連想配列を初期化する。 しかないと思います。

  • bagyo
  • ベストアンサー率40% (16/40)
回答No.2

こんにちわ。 変数全てを初期化する方法は無かったと思います。もし、そのような方法を希望されているのであれば、連想配列を利用することで実現できると思います。(最初は、確かundefで既に初期化されていると思いました) $DAT{"first"},$DAT{"second"},$DAT{"third"}等 初期化したい場合には、 %DAT = (); とすることで出来ると思います。

回答No.1

Perlは起動時から値の入った変数や擬似変数があり、 それらに無理に変な値を入れると動作が変わってしまいます。 というわけで、そういう機能はないと思います。 でも、なんのために? 再起動というか自分自身を exec するとかしかないと思いますが、 それでも最初から値の入った変数は別ですが。

defd
質問者

補足

変数を全部、からっぽにした後に、再定義したいのですけど、 それ以外(再定義しない変数)については、からっぽ($hoge = "";)にしたいのです。

関連するQ&A

  • 変数に代入

    はじめまして。早速なのですが、 a0からa9までのMCがステージ上にあります。 10個のmcの(_xと_y)の初期値を一気に変数に代入するにはどうしたらいいでしょうか?

  • C言語で変数を初期化するにはどうすればよいでしょうか。

    こんにちは。 C言語で、一度文字列を入力した変数(ポインタとか配列のことを含めてます)を再度初期化することは可能でしょうか。「初期化」という表現が合っているのか自信はないのですが、要は一度変数に入れた文字列を消去して、再利用する方法を探しています。 目標は、 1.ファイルに変数の文字列を出力する FILE *fp = fopen("file.txt","w") char *str = "text" fprintf(fp,"%s",str) ↓ 2.その変数は初期化し、初期化した変数にまた文字列を代入する *str = 初期化 *str = "text2"; ↓ 3.それをまたファイルに出力する(以下エンドレス) fprintf(fp,"%s",str) という流れにしたいのですが、2.の「初期化」がわからないので、文字列を代入すると、最初にいれた"text"のあとに"text2"がくっついてくる形になってしまい困っています。 これだとstrの容量が大きくなってしょうがないですし、ファイルに出力される文字列も重複したものになってしまうので、いったんstrに入っている文字列を消去してしまって、また新たにstrに文字列を入れようと思っているのですが可能でしょうか。 1~3の動作をほぼエンドレスでやりたいので、新たに変数を作るというやり方意外に何か良い方法があれば教えて頂けないでしょうか。どうぞ宜しくお願いします。

  • 変数について

    Perlを勉強し始めました。 いままでプログラミングを組むことがなかったので、全くの素人 なんですが、いきなり壁に当たりました。 変数のところを勉強してるんですが、 $a=1; $a +=2; print $a みたいな感じで書かれてるのをみて、ふと疑問が。 $aに1を代入する。 $aに、$a+2を代入して、$aを表示ってことですよね。 $b +=2;にして、print $bにしないで、なんで $aに、$a+2を代入するんでしょうか?? $aは、すでに1を代入していて、$aは『1』としてるわけじゃないですか。 その$aに、また$a+2を代入するという発想がさっぱり理解できません。 普通に、$bにすればいいじゃん、その方がすっきりするじゃん、って思うんですが、なんでこんな記述方法にするのかわかりやすく教えていただけたら助かります。

    • ベストアンサー
    • Perl
  • 【Flash8】時間処理、初期化

    getTimer() を使って 時間を変数にいれて1000分の1とかで 割って、ダイナミックテキストで表示させてるのですが それをリセットする方法ありますか? http://fpower.org/old/f4timer.htm こっちは初期化する方法がなくて、 自分の探し方が悪いかもしれませんが 0秒にする方法が見つからなくて。 自分で試した方法が↓ 初期化したい時間を代入している変数 = null; 初期化したい時間を代入している変数 = 0; これでも駄目で。。。 方法知っている方がいらっしゃいましたら 教えてください! お願いします。

    • ベストアンサー
    • Flash
  • 全ての変数を一気にリセットする方法はありますか?

    全ての変数を一気にリセットする方法はありますか? Sub test() Dim i As Integer Dim int1 As Integer Dim int2 As Integer int1 = 1 int2 = 2 For i = 1 To 100 'プロシージャー int1 = 0 'リセット int2 = 0 'リセット Next End Sub みたいなコードがあり、 ループが終わる度に変数をリセットしたい場合 int1 = 0 'リセット int2 = 0 'リセット のように一つ一つ変数に値を入れてリセットするしかないですか? 例のコードは二つしか変数が有りますが 実際100個くらいの変数が有る場合も、 一個一個リセットするしかないのでしょうか? 理想としては、VBAを中断したら全ての変数がリセットされますが それと同じようなコードが有れば、楽だなと思います。

  • ハッシュ変数の怪

    お世話になります。 ハッシュ変数の扱い方について教えて下さい。 <最終的にヤリタイコト> ブログのRSSを読み込み、そのブログ自体のタイトル(1つ)を表示するプログラムを作成したい。 その為に、以下の様なプログラムを作成しています。 ------------------------------------ # 頻繁にRSSを読みに行くのを避けるため、 一時的に$blogfileにRSSファイルを保存しています。 $blogfile="./save/blog.rss"; use XML::RSS; use LWP::Simple; # 保存しているRSSデータを解析 $rss = new XML::RSS; $rss->parsefile($blogfile); # サイト情報を取得 $bigtitle = $rss->{channel}; # そして、これにつづけて、 print $bigtitle->{title}; とすると、ブログ名がキチンと印刷されます。 しかし、この場ではブログ名を表示させたくはなく、一旦、スカラー変数に、このブログ名を代入しておき、後になってから、スカラー変数に代入されたブログ名をprint文で表示させたいのです。 この場合、例えば、 print $bigtitle->{title}; の代わりに $blogtitle=$bigtitle->{title}; とやっても、$blogtitleにブログ名は代入されません。 また、$blogtitleをprint文で表示させてみると、 HASH(0x8ddb5d4) と、いつかどこかで見たような表示になってしまいます。 ●ブログ名をスカラー変数に代入する方法をご教授、よろしくお願い致します。(または、上記の方法以外で、とてもカンタンにブログのRSS情報を元に、そのブログ自体のタイトルのみをスカラー変数に代入するperlプログラムがありましたら、教えて下さい) よろしくお願い致します。

    • ベストアンサー
    • Perl
  • stdpicture型の変数に、、

    stdpicture型の変数に、ファイル名で指定した画像を代入することってできますか? いろいろやってみましたが stdpicture型の変数"pict"にCommonDialog1.FileNameを代入しようと、 pict = CommonDialog1.FileNamepict = LoadPicture(CommonDialog1.FileName) pict = CommonDialog1.FileName などとやってみましたが、やっぱりだめでした。 できるなら、方法を教えてください。 お願いします。

  • binファイルが軽くなる変数への代入処理について

    変数に値を代入する方法はいろいろあるかと思いますが、 コンパイル後に最もバイナリファイルが軽くなる処理はどのような処理でしょうか。 例として、1000バイトのデータを変数に代入する際、 (1)直接一つずつ代入する。 data[0] = 0x00; data[1] = 0x00; ・・・ data[999] = 0x00 (2)変数の定義時に代入(初期化)を行う。 unsigned char data[1000] = {0x00,0x00,・・・・0x00} 等ありますが、どちらの処理が有効でしょうか。 また、その他有効な処理方法等がありましたら、ご教授願います。 グローバル変数として定義するか、かローカル変数として定義するか、 defineで代入値を持つ等、定義時の方法でも違いがありましたら、 教えて頂けると助かります。

  • この変数はどういう扱い?

    とある書籍で簡単なアクセスログの作り方について勉強しているperl初心者です。 下記のコードで2行目までは理解できるのですが、3行目の++$freq[$hour];が理解できずに困っています。ここまでに $freq や@freq という変数や配列など出てきていないのですが、この場合のfreqはどのような命令実行になるのかが理解できずにいます。 while($ln = <FILE>) { ($hour,$min,$host,$refer,$agent) = split(/\t/, $ln); ++$freq[$hour]; } 1行目、ハンドル名FILEで開かれているファイルの1行目を読み込んで変数lnに代入。 2行目、split関数で、$lnの変数値を\t 区分毎に分解し、各変数に代入。 3行目を実行。 最初に戻る。 1行目2回目で、ハンドル名FILEで開かれているファイルの2行目を読み込んで変数lnに代入。 2行目で、split関数で・・・・・・・ ・ ・ 1行目?回目で、ハンドル名FILEで開かれているファイルの?行目から文字列がないので、whileを抜ける。 上記のような形で説明するとすると、3行目ではどのように何が実行されているのでしょうか? アドバイスやご教授をよろしくお願いします。

    • ベストアンサー
    • CGI
  • 変数に値を代入するのに、まずundef、次にNULL文字を足して、それから入れたい値を足すって回りくどくないですか?

    KENTさんの作ったメールフォームのコードをフォローしています。 Clip Mail v1.1です。 http://www.kent-web.com/data/clipmail.html その中で、メールフォームから送られてきたデータを取り入れるサブルーチンに関する質問です。  undef(%in); $in{$key}.="\0";  $in{$key}.=$val; 最初の  undef(%in); はサブルーチン中の冒頭にあり、残り2行とはかなり離れた位置にあります。 これまで私がこういうコードを書く場合、  %in;  $in{$key}=$val; と書いてきました。この他、変数の宣言にはourとかmyとか付けてますけど、KENTさんがこのプログラムを書いた当時はmyはともかくとして、ourを付けることはあまり普及していなかったのではないでしょうか。 さて、C言語などだと変数を用いる前に宣言だけでなく初期化も行っていないといけないわけですが、Perlの場合は初期化されていない変数はundefとして自動認識されます。  undef(%in); と、私がやっているような  %in; の違いは初期化もきちんとしているか、ただ宣言だけで初期化はPerlにお任せしているかの違いです。Perlの仕様上はどちらでもいいでしょう。 分からないのは残りの2行のコードです。  undef(%in); でキチンと初期化してある変数に対して、まず  $in{$key}.="\0"; とします。なんでNULL文字なんか入れないといけないのでしょう。それも単純に  $in{$key}="\0"; ではなくて、  $in{$key}=$in{$key}."\0"; です。 更に3行目で  $in{$key}.=$val; とするわけですが、こんな2行かけた代入を行わなくても、私がこれまでやってきたように  $in{$key}=$val; で実用上の用は足りると思うのですが・・・ 1行目は何となく分かるんです。変数の初期化は、Perlに自動認識の機能があるのを知っていても、他の言語を知っている方は、やはり言語任せに出来ないのではないでしょうか。 残りの2行のコードも多分そんなところだと思います。実用上は私のやり方で足りると思うので。ただC言語なんかでもこんな代入の仕方をしているのを私は見たことがないし、まあ、こんな代入の仕方をしないといけない言語もあるのでしょうが、ではその言語でこのやり方をせずに私がやるような方法を取った場合、どんなエラーが出るのでしょう。 どなたか分かる方、教えていただけないでしょうか。