No.4ベストアンサー
- 回答日時:
そもそもサブルーチン内で
呼び出しもとの実引数の「変数名」を
「本当に必要」な状況そのものを想像できません.
質問の文面とものの言い方から初心者さんではないようなので
もしかするとものすごい状況にいるのかもしれませんが・・・
そうすると,以下に書くようなことは
とっくに検討済みの可能性もありますね
サブルーチンの中で呼び出しもとの変数をいじりたいのであれば
$a=10;
sub { $_[0]++ }->($a);
print $a;
とかすれば,可能ですね(Perlはcall by referenceだから).
もっともこれは,具体的な値そのものを渡せばエラーになります.
ただ「参照渡し」なので,$_[0]と呼び出し元の変数の
実体は同じ,つまり,\$_[0]と\$aは同じだから
\$_[0]と同じ値を持つものをシンボルテーブルから
無理やり探し出すことは可能だと思われます.
$a=10;
sub {foreach $val (values %main::){
*glob=$val;
$temp=$val;
if (\$_[0]==\$glob) {
$temp=~s/\*main:://;
print "argument: \$$temp\n"
}
}
} ->($a);
こんな感じ.
ただし,シンボルテーブルを読んでるわけだから,
レキシカルな変数は相手にできませんし,
この例だと引数はスカラであることが前提です.
けど,リファレンスを渡してあげれば,細工すれば
スカラ以外でも処理できるでしょう.
けど,シンボルテーブルで遊ぶ以外の意味はなさげです.
なお,これは具体的な値を渡すと何も出力されませんし,
レキシカルな変数を相手にするにはどうすればいいでしょうね?
「レキシカルな変数のシンボルテーブル」?
BモジュールとかPadWalkwerとかの「黒魔術の世界」に
浸ればできるのかもしれませんが,私レベルでは分かりません.
#use strictとの両立方法・・・わかりません.
いっそのこと,引数そのものに
もっと細かい情報を持たせるというのもありかもしれません.
Scalar::Utilのdualvar関数を使って
自分自身の情報を変数にもたせるというのもありかも.
もしかするとattributeを利用してもいいのかも
#この段落の内容は実験してない想像にすぎません.
そして,「変数名」を取得して,
サブルーチン内で「ソフトリファレンス」したいのでしょうか?
つまり,
$fred = 23;
$varname = "fred";
++$$varname;
というようなことをしたいということでしょうか?
これは,perldoc perfaq7で
How can I use a variable as a variable name?
の項目をよめば
「Beginners often think」で
「very bad idea」だと詳細な説明があります.
こんなことは先刻承知かもしれませんが.
まあ,なにはともかく
>人間的にみれば第1引数に第2引数の情報は全て入っているのに
これには私も同意しませんけどねえ.
仮に「人間的に入ってても」そもそもPerlは人間じゃないですし,
すべての情報が入っててもそれが渡されるわけではないですな.
それと
>このコーディングは私の無知を象徴することになってしまうので、
無知をさらけ出すよりも
メンテナンスや拡張が困難なコードを残すほうが
私はいやです.
#というか・・・Perlじゃないけど
#メンテナンス困難なコードのバグ取りを
#よくさせられるから・・・
メンテナンス不可の簡潔なコードよりも
メンテナンスが楽な可読性の高い冗長・饒舌なコードのほうが
ずっといいとおもうのは私だけではないと思います.
ご教授、ありがとうございます。
前回の私の態度には問題があったかもしれません。お詫びします。アラシのような行為(人を小馬鹿にしたような文面で、分かり切ったtypoの指摘をしたり関係ない質問をするけど、でも実質的な話は進まない。)にムカついていました。
今回はデバッグツールを自作しようと思った次第です。
プログラム中にデバッグ関数を書きいれて、その位置における変数の値を知るに際して、その関数がファイル名、行番号、変数名を自動で記述してくれたら助かると思いました。
ご教授いただいだPadWalkerモジュールを用いました。
peek_my()のrefをとってmy変数かour変数かを調べる。
our変数だったらpeek_our変数でオブジェクトを生成し直す。
生成したオブジェクトに対して、連想配列、配列、スカラーに場合分けして、値を書きだす。
この場合、値や式を引数に取れません。リファレンスも無理だと思います。そういったところが使い勝手が悪いですが、そういう特殊用途向けにはコメントを手動で記述する関数がありますので、そちらと併用しようと思います。
助かりました。
どうもありがとうございます。
No.5
- 回答日時:
いちおう #3 の時点で「シンボルテーブルを読む」のは想定したんですけど,
*b = \$a;
とされてしまうと「シンボルテーブルを読んでも $a と $b を区別することができない」のであきらめました>#4. っつ~か, この状況で $a と $b を区別する意味が私にはわかりませんが.
そういう意味で「変数名が必要な状況」がわからないというのは同意.
ALGOL ならよかったのにね.
No.3
- 回答日時:
では結論だけ: 1つの引数だけで知る方法はありません. リファレンスだろうとなんだろうと, できないものはできません.
「人間的にみれば第1引数に第2引数の情報は全て入っている」というのが既に間違っているので....
No.2
- 回答日時:
sr(7);
という呼び出しの場合には何を知ればよいということになるのでしょうか? そして
sr(4+3);
のときは?
この回答への補足
今問題にしているのは、変数を引数にした場合に、その変数の値ではなく呼称を得ることが出来るかという問題であって、値そのものを引数にした場合に、その呼称をどう扱うべきかは、次の問題です。そういう補足を求めてこられるということは、Tacosanさんの中で、当初の題意は解決済みということですが、それはどのような方法なのでしょうか。
引数に連想配列や配列をそのまま指定した場合、サブルーチン側ではそれは全て
@_
として扱われるから、引き渡された変数が連想配列であるか配列であるか分からなくなります。つまり引数の頭に「@」が付いているのか、「%」が付いているのかすら、サブルーチン側では判別できないということかと。
でもリファレンスで送ればこの問題は解決するわけです。さらにサブルーチンの引数を一つ増やして、例えば
sr(\@a,'a')
のようにしてあげればサブルーチン側で、引数が呼び出し側で「@a」と呼ばれていたのだと理解できます。
ただ人間的にみれば第1引数に第2引数の情報は全て入っているのに、あらためて第2引数でその情報を渡すというのは馬鹿らしく、もし第1引数だけで題意が適うならば、このコーディングは私の無知を象徴することになってしまうので、だから念のために、皆さんにご教授をお願いしている次第です。
やはりこれが最良の方法なのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 会社・職場 呼び出しが多い私…。 転職してからというもの私だけ呼び出しが多いんですよね…。 私には、何かあるので 4 2022/11/23 19:59
- その他(悩み相談・人生相談) 結婚相談所で知り合い二度会い三度目の予定が決まりました。LINEのやりとりで、私はあだ名で呼びたいと 2 2023/02/05 20:02
- 会社・職場 上司から急に呼び捨てされるようになりました 6 2022/12/07 13:01
- その他(暮らし・生活・行事) 風呂場から呼び出し音押して リビングにいる主人を呼んでも風呂場に来ませんでした。 それから何度も呼ん 3 2023/04/09 19:31
- 事件・犯罪 ガサ入れされても検察に呼ばれずに終わった人もいますがそれはなぜでしょうか? ガサ入れされたらほぼ検察 1 2023/05/19 16:38
- その他(悩み相談・人生相談) 今日凄く恥ずかしい体験をしました。 会社の同期と喋っている時に普段一人称私なのですが、今回うっかり家 4 2023/08/07 23:14
- 政治 先日、亡くなられたエリザベス女王ですが、テレビ等のマスコミの呼称は何故"女王陛下"なのでしょうか? 6 2022/09/17 08:49
- LINE LINEに詳しい方教えてください。 LINE電話で相手の呼び出しができる(呼び出し音が鳴っている)け 2 2023/04/08 18:22
- 訴訟・裁判 ガサ入れされても検察に呼ばれずに不起訴て終わった人もいますがそれはなぜでしょうか? ガサ入れされたら 4 2023/05/19 21:43
- 片思い・告白 既婚男性が独身女性を 下の名前で、呼び捨てで、呼ぶのは 誰でもできますか?? 出会いは1年半ほど前で 2 2022/12/12 02:04
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBのReturnの使い方
-
ExcelVBAでのデータ型変換、も...
-
サブルーチン(共通の処理)の...
-
画面を強制的に再描画させる方法
-
GIFアニメをループさせたくない
-
ListBox 複数選択 で オートフ...
-
文字列を変数名として扱う方法
-
VBAで3秒だけ時間を止めたい
-
エクセルの当番表を作っていま...
-
ハッシュ検索はなぜ速い
-
重複ファイルを削除したいので...
-
vb.netからエクセル関数書き込み
-
WinAPI「MsgWaitForMultipleObj...
-
どなたかこのプログラミングを...
-
VBA for i=1 to lastrow
-
ハッシュ値が一致したデータは...
-
データベースでユーザーのパス...
-
二次元配列のインデックスについて
-
Excel VBAで、アクティブシート...
-
アクティブセルから、A列最終行...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBのReturnの使い方
-
プロシージャとは
-
COBOLの日付操作
-
ExcelVBAでのデータ型変換、も...
-
環境変数リファラーの値をを最...
-
パターンマチングについて(CGI)
-
Perlのmyのサブルーチンの内外...
-
FORTRANのwarning
-
マイコンに詳しい方教えてくだ...
-
サブルーチン(共通の処理)の...
-
CGIのサブルーチンの呼び出...
-
Perl・DBIでの汎用selectサブル...
-
my($Str)とmy $Strの違い
-
渡された引数の型を判別する
-
${str}と$strの違いとは?
-
サブルーチンの引数の、呼び出...
-
19歳です 普段、動くことも人と...
-
画面を強制的に再描画させる方法
-
VBAでの一時停止と再開の方法
-
GIFアニメをループさせたくない
おすすめ情報