アレルギー対策、自宅でできる効果的な方法とは?

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

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

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

A 回答 (3件)

@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

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


@{$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

回避できません。


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

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

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

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

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

QCan't use string ("0") as an ARRAY ref の原因について

Perl 5.6を使っております。
Perlで原因不明なエラーに直面して困っております。
Can't use string ("0") as an ARRAY ref while "strict refs"
というエラーが発生しているのですが
これは良くあるミスとして何が原因でしょうか?

Aベストアンサー

No.2です。書き漏らしてましたが、エラーメッセージの内容がよくわからない時は

use diagnostics;

しましょう。


人気Q&Aランキング

おすすめ情報