- ベストアンサー
@{$protocol_name}
usr strict; をつかって、 $protocol_name = "pppoe"; @{$protocol_name} のような使い方をしたいと思っていますが、 Can't use string ("pppoe") as an ARRAY ref while "strict refs" in use at ./ctest.pl line 152, <RCFG2> line 7 のようにエラー表示がでてしまいます。 どうしたら回避できるでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
@pppoe という配列を生成する段階でハッシュ等扱いやすい変数に格納しておくのが定石だと思います。 ・ハッシュにハードリファレンスで格納する方法 $protocol{pppoe} = \@pppoe; # 代入 @{$protocol{$protocol_name}} # 参照 # @pppoeとしましたがもちろん無名配列でかまいません。 ・分岐させる方法 if($protocol_name eq "pppoe"){ ... = @pppoe; }elsif ... ・シンボリックリファレンスだけ許可させる方法 no strict 'refs'; ・%main::から引く方法 @{$main::{$protocol_name}}
その他の回答 (2)
- rafysta
- ベストアンサー率45% (24/53)
できないというか、ちょっと使い方の意味が違う気がします。 @{$protocol_name}は、配列のリファレンスである$protocol_nameをデリファレンスするという意味になると思いますが、例文では、$protocol_name = "ppoe"とスカラーを入れてしまっているので、怒られています。ある意味当然で、strictどうこうという問題ではないと思いますが? したがって、あえて例文と同じような形で書くとすれば use strict; my $protocol_name = [("pppoe")]; print "@{$protocol_name}\n"; ならば大丈夫です。これは、内容が"pppoe"1つだけの配列のリファレンスを$protocol_nameに入れて、@{$protocol_name}でデリファレンスしています。
- twinkleluz
- ベストアンサー率52% (98/185)
回避できません。 strictプラグマはそのような危険なプログラミングを禁止するためのものです。 どうしてもこのような書き方をしたければstrictをなくすしかありません。 ただし抜け道はあります。 ------------------------------------------------- no strictが含まれているブロック部分では上記のようなシンボリックリファレンスが可能となるので、 { no strict; $protocol_name = "pppoe"; @{$protocol_name} } という書き方はできますがnoしたブロック外でmyで宣言した変数にはアクセスできません。 @pppoeをnoしたブロック外で定義している場合は、ourで宣言しなければならないでしょう。 ------------------------------------------------- -----でくくった部分に理解できない部分があれば、用語を検索して理解してください。 理解できないうちはこの抜け道を使うべきではありません。(実用的でもないですし) 回避できないと思っていたほうがいいです。
お礼
ありがとうございました。 ・%main::から引く方法 @{$main::{$protocol_name}} でうまくいきました。