perl で、途中で、全ての変数を初期化(からっぽ)にする方法はありませんか。

一つ一つ、代入する方法ではなく。
例えば、
$first = "";
$second = "";
$third = "";
ではなく。

一気に全ての変数を初期化する方法。
変数名が分からなくても全て初期化できる方法。
もしくは、代替手段など。

あれば、教えてください。お願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

使用が推奨されていない関数ですが、resetという関数で、一度に多数の変数の値をクリアすることが出来ます。



書式は次の通りです。
    reset EXPR

ここでEXPRは文字を列挙したもの(ハイフンによる範囲指定も可)で、ここに含まれた文字で始まる全てのスカラー変数、配列、ハッシュのを初期状態に戻します。

例えば、小文字で始まる全ての変数を初期化するには、次のようにします。
    reset 'a-z';

ただし他の方もおっしゃられている通り、PerlにはARGV,INC,ENVなど、予め値が入っている変数もあるので、
    reset 'A-Z';
はやめましょう。

また補足ですが、my変数はresetの影響を受けません。グローバル変数とlocal変数のみに有効です。
    • good
    • 0

punchan_jp さんもおっしゃっていますが、


Perl には、かなりの数の「予約変数」があり
無作為に全変数の初期化ができてしまうと、
プログラムが「全く」動かなくなります。

ので、
「プログラム中で使用している
(非予約)変数全てに NULL値を代入する」
という操作を実現するには、bagyo さんのおっしゃるように

プログラム中で使用する(非予約)変数を全て
一つの(or 管理できる範囲の個数の)連想配列で定義し、
その連想配列を初期化する。

しかないと思います。
    • good
    • 0

こんにちわ。


変数全てを初期化する方法は無かったと思います。もし、そのような方法を希望されているのであれば、連想配列を利用することで実現できると思います。(最初は、確かundefで既に初期化されていると思いました)

$DAT{"first"},$DAT{"second"},$DAT{"third"}等

初期化したい場合には、
%DAT = ();
とすることで出来ると思います。
    • good
    • 0

Perlは起動時から値の入った変数や擬似変数があり、


それらに無理に変な値を入れると動作が変わってしまいます。
というわけで、そういう機能はないと思います。

でも、なんのために?

再起動というか自分自身を exec するとかしかないと思いますが、
それでも最初から値の入った変数は別ですが。

この回答への補足

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

補足日時:2001/04/20 11:21
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qcdの初期化

cdの初期化について質問です。

書き込むためのソフトにSonicStageVを使っているのですが音楽CDの作成ボタンを押すと、

「挿入されたディスクは書き込み済みです。CD-RWをご利用の場合は初期化ボタンから初期化することで書き込むことができます。」

と出てきます。
初期化しようと「初期化ボタン」探しているのですが見つかりません。

初期化ボタンとはどこにあるのでしょうか。
またこれ以外の方法で初期化することは不可能なのでしょうか。

Aベストアンサー

CD-Rはフォーマット(初期化)は出来ません、1回きりの書き込みです。
CD-RWをお使いなら、前の分は消去出来ます。
消去は書き込みソフトで出来ます、ソフトにより方法は違いがありますが、ソフトのツールバーのボタンを探して下さい。
上でもないソフトもありますが、何処かにありますので探す事です。

Q変数まとめて0に初期化する方法は無いのでしょうか?

my($a, $b, $c) = 0;
print "$a, $b, $c";

まとめて 0にしてくれる方法は無いのでしょうか?
’’空ではなく、数値0です。

Aベストアンサー

my($a, $b, $c) = (0) x 3;
とするとまとめて0にできます。

QPCの初期化(リカバリ?)CDを失くした場合

こんにちわ。
PCの初期化をしたいのですが、
購入時に付属してくるリカバリのCDを
紛失してしまいました。

日立のデスクトップPCなのですが、
日立に問い合わせても常に混雑していて、
全くつながりません。

CDがないとムリだと思いますが、
家電量販店などに取り寄せてもらうこととかも
可能なのでしょうか?

一刻も早く初期化したいので、
詳しいかたいましたらご回答お願いいたします。

Aベストアンサー

kinsyoさんのはライセンス違反では?

リカバリディスクついてきたってことはHDDの隠しパーティションに入ってないですよね?
説明書読んでください。やり方がリカバリディスクからのみだったらメーカーに連絡。
リカバリ領域からもできるようならリカバリ領域からリカバリして、リカバリディスクの作成しとくといいです。

上記のことができなかった場合
一番安く済むのは、リカバリディスクをメーカーから取り寄せることです。1万くらいだと思います。何度も電話かけるしかないです。後はかけたまままってるのが一番いいです。順番なんで、30分もかからないとおもいますよ。
後はメーカーに送ってリカバリしてもらう。結構高いです。リカバリのみで2万くらいかかるかな?NECのPCでHDD交換とOSの再インストールいくらかかるか聞いたら7万かかるっていわれました。OSもパーツからIDとってますんで、HDDからとっていた場合はHDD交換するとリカバリディスク使えないです。その場合はメーカーで入れてもらうしかないです。
後はOS通常版買うとかドライバとかあればいいですが・・・これはやめたほうがいいです。

kinsyoさんのはライセンス違反では?

リカバリディスクついてきたってことはHDDの隠しパーティションに入ってないですよね?
説明書読んでください。やり方がリカバリディスクからのみだったらメーカーに連絡。
リカバリ領域からもできるようならリカバリ領域からリカバリして、リカバリディスクの作成しとくといいです。

上記のことができなかった場合
一番安く済むのは、リカバリディスクをメーカーから取り寄せることです。1万くらいだと思います。何度も電話かけるしかないです。後はかけたまま...続きを読む

Qperlで変数の中身を変数とみなす方法ってありますか?

perlで、変数の中身を変数とみなし、その中身を知る方法ってありますか?
具体的に言うと、

$abc = "$xyz";
$xyz = "test";

なる状況だったとして、$abc から "test" という文字列にたどりつく
方法ってあるのでしょうか?

何をしたいのかというと、テキストファイル上に "$xyz" と書かれてたと
します。そのテキストファイルを perl で解読したとき、その時点での
実行中の $xyz に何が入っているかを得たいのです。
もちろん、連想配列を使えば似たようなことができるのは知っていますが、
性質上、できればスタティック変数を使いたいのです。

そのような方法は、perl には用意されているのでしょうか?

Aベストアンサー

動的に式を評価する命令であるeval()を使えば、ご要望の機能は実現できると思いますよ

QiPhoneの下取りを出したのですが、iPhone4sで充電器を持っていないため、初期化できません。

iPhoneの下取りを出したのですが、iPhone4sで充電器を持っていないため、初期化できません。初期化するために充電器買うのも嫌だったのでそのまま出しました。初期化しなくても下取りしてもらえるのですか?

Aベストアンサー

iPhone4で対応できるかわかりませんが下記リンクに操作方法があります。
http://iphone.f-tools.net/QandA/Syokika.html

下取りの際に初期化ができてあるか確認すると思うのですが、特に何も言われなければ問題なかったのだと思います。

QPerlで定義されている関数名を全て取得する方法

Perlで定義されている関数名を全て取得する方法はあるのでしょうか?
ソースを見ればわかりますが、取得する方法があれば教えてください。

001.pl
sub aaa{
print "a";
}
002.pl
sub bbb{
print "b";
}

Aベストアンサー

$ perl -MData::Dumper -e 'print Dumper \%{main::}'

こんな感じ。

QExcel VBAで、セルに入ってるデータ型を調べる方法は?

現在、Excel VBAでプログラムを作成しています。

Do Until ~ Loop の終了条件を
アクティブセルに入っているデータの型が文字列型の時
としたいのですが、そのようなことは可能なのでしょうか?

可能だとしたら、どのように記述したらいいのでしょうか?

当方のPCは
Win XP、Excel2003
です。

よろしくお願いいたします。

Aベストアンサー

VarType 関数を使うとか。

Sub SampleProc()

  Dim i As Long
  
  i = 1
  Do While Len(Cells(i, "A").Value) > 0
    If VarType(Cells(i, "A")) = vbString Then
      Exit Do
    Else
      ' // 処理
    End If
    i = i + 1
  Loop
  MsgBox CStr(i) & "行目で停止"

End Sub

QPerl 内で実行される 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 でやりたいのです。

 なんかパイプとか繋ぎなおせば何とかなりそうな気もするんですが……。
 何かご存知の方がいらっしゃいましたら、よろしくお願いします。

Aベストアンサー

子プロセスでevalし、その出力をpipeで読んではどうでしょうか。

if (open IN, "dest.pl") {
  local $/;
  $s = <IN>;
  close IN;
}

pipe RDP, WRP;

if (my $pid = fork) {  # 親
  close WRP;
  chomp(@r = <RDP>);
  close RDP;
  wait;
}
elsif (defined $pid) {  # 子
  close RDP;
  select WRP;  # 標準出力を WRP に変更
  $| = 1;      # バッファリングを止める
  eval($s);
  close WRP;
  exit;
}
else { die $! }  # fork失敗

foreach (@r) {
  print "$_\n";
}

QHBITMAPを初期化するとは?

CreateDIBitmap関数でfdwInit引数をCBM_INITにすると初期化し、0にすると初期化しないとありますが、これの意味がイマイチよくわかりません。

で、初期化しなかった場合、後でSetDIBits関数で初期化しるというようなことが書かれているのですが。

用は、初期化していない状態とは、ビットマップの大きさもろもろの情報のみがわかっている状態で、色情報のみ不明な状態であり、初期化するとはそれに加え色情報まで追加するということ、という考えであっていますか?

で、今の自分の考えが正しいことを前提にしての質問ですが、初期化してある状態としていない状態で、使用するメモリの量が大量に違うとか、CreateDIBitmapで初期化する作業は初期化しない作業に比べて計算時間がかなり違ってくるとかいうような大きな違いがあるのでしょうか。

それとも別になにかあるんですか?

Aベストアンサー

>初期化するとはそれに加え色情報まで追加するということ、という考えであっていますか?

それであっています。
初期化してもしなくてもDDBは作成します。この時点で新たに確保されるメモリは同じです。

DDBをDIBで初期化するという意味はわかりますか?
ディスプレイが16ビットカラーだとすると、DDBも16ビットカラーになります。DIBは8/16/24ビットなど何でもいいわけだから、結果としてフォーマットが変換されます。

SetDIBitsも含めて計算時間がかかるかどうかは重要ではありません。必要あれば呼び出すしかなくて、必要なければ呼び出さないだけの事です。

※MSDNによれば「fdwInit パラメータの CBM_CREATDIB フラグは、現在はもうサポートされていません。」とありますね・・・。

QPerlで環境変数を設定するには

あるPathを環境変数として設定したい場合、
例)TNS_ADMIN=D:\Test\exe

たとえばMS-DOSなら、
set TNS_ADMIN=D:\Test\exe
と設定しますよね。

これと同じことをPerlでどうやればいいのかというのが質問です。

ENVモジュールを使って、
$ENV{TNS_ADMIN}=D:\Test\exe
としてみたものの、Perlを実行した後に確認してみるとセットされていないようでした。
(確認方法はPerlを実行したDOSプロンプトにて"set"を実行)

よろしくお願いします。

Aベストアンサー

>>破棄された後に確認しても、わかりません。
>どうにかその環境変数がセットされていることを確認する方法ってないのでしょうか?

perlで子プロセスを起動すれば確認できます。

例えば、NT系のOSであれば...

次のスクリプトを用意。
#!c:\perl\bin\perl.exe
$ENV{"TNS_ADMIN"}="D:\\Test\\exe";
system("cmd");

それを実行すると、コマンドプロセッサが表示されるので、
set[return]
すれば、子プロセスの環境変数が確認できます。
確認後、exit[return]すると、子プロセスが終了するので、
親プロセスたるperlも終了する。


人気Q&Aランキング

おすすめ情報