dポイントプレゼントキャンペーン実施中!

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

のようにエラー表示がでてしまいます。
どうしたら回避できるでしょうか。

A 回答 (3件)

回避できません。


strictプラグマはそのような危険なプログラミングを禁止するためのものです。

どうしてもこのような書き方をしたければstrictをなくすしかありません。

ただし抜け道はあります。

-------------------------------------------------
no strictが含まれているブロック部分では上記のようなシンボリックリファレンスが可能となるので、

{
no strict;
$protocol_name = "pppoe";
@{$protocol_name}
}

という書き方はできますがnoしたブロック外でmyで宣言した変数にはアクセスできません。
@pppoeをnoしたブロック外で定義している場合は、ourで宣言しなければならないでしょう。
-------------------------------------------------

-----でくくった部分に理解できない部分があれば、用語を検索して理解してください。
理解できないうちはこの抜け道を使うべきではありません。(実用的でもないですし)
回避できないと思っていたほうがいいです。

参考URL:http://www.att.or.jp/perl/man/perlref.1.html
    • good
    • 0

できないというか、ちょっと使い方の意味が違う気がします。


@{$protocol_name}は、配列のリファレンスである$protocol_nameをデリファレンスするという意味になると思いますが、例文では、$protocol_name = "ppoe"とスカラーを入れてしまっているので、怒られています。ある意味当然で、strictどうこうという問題ではないと思いますが?
したがって、あえて例文と同じような形で書くとすれば

use strict;

my $protocol_name = [("pppoe")];
print "@{$protocol_name}\n";

ならば大丈夫です。これは、内容が"pppoe"1つだけの配列のリファレンスを$protocol_nameに入れて、@{$protocol_name}でデリファレンスしています。
    • good
    • 0

@pppoe という配列を生成する段階でハッシュ等扱いやすい変数に格納しておくのが定石だと思います。



・ハッシュにハードリファレンスで格納する方法
$protocol{pppoe} = \@pppoe; # 代入
@{$protocol{$protocol_name}} # 参照
# @pppoeとしましたがもちろん無名配列でかまいません。

・分岐させる方法
if($protocol_name eq "pppoe"){
... = @pppoe;
}elsif ...

・シンボリックリファレンスだけ許可させる方法
no strict 'refs';

・%main::から引く方法
@{$main::{$protocol_name}}
    • good
    • 0
この回答へのお礼

ありがとうございました。
・%main::から引く方法
@{$main::{$protocol_name}}
でうまくいきました。

お礼日時:2006/02/03 11:26

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