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と関連する良く見られている質問

QRay Cassin(レイカズン)のパンツ

レイカズンのパンツを探しています。
(8分丈センターステッチパンツ ¥6.900)
実ははじめは通販(丸井 ブォイ)で購入しようと思っていたのですが
売り切れてて、商品が手元の届くのは7月の下旬と言われてしまいました。

どこかレイカズンの商品が置いてあるショップを知りませんでしょうか。
私は千葉に住んでいます。 
私が検索したところでは、渋谷のパルコ3にショップがある
とのことでした。
しかし、7ヶ月の子供がいるのであまり、遠出も
出来ません。もう少し近いところで探しています。

是非、よろしくお願いします!

Aベストアンサー

こんにちは!レイカズンの洋服ってカジュアルだけどすっごくおしゃれ~ですよね!ホームページでオンラインショップも始めたそうです^^だけど、ancoさんのお目当てのものはなかったです・・ホームページの方から直接商品の通販を頼んでみてはどうでしょうか?URL書いておきますね!あと、レイカズンって雑誌に掲載した商品などもけっこう「通販可」としているので!電話番号は→03-3402-7510

参考URL:http://www.raycassin/com/

Qwhileの$_とforeachの$_の関係

以下のコードにおけるwhileとforeachでの$_の使いかたについて教えてください。

my @foos = qw( a b );

sub foo1 {
  open FH, "foo.txt";

  while (<FH>) {
    chomp;
    print "$_";
  }

#  while (my $x = <FH>) {
#    chomp $x;
#    print "$x";
#  }
  
  print "\n";
}

sub foo2 {
  foreach (@foos) {
    print "<$_>";
    foo1();
  }
  print "\n";
}

foo2();
foo2();

このコードと同じディレクトリに以下のような内容のfoo.txtをおいて実行します。

x
y

すると、以下のような結果が得られました。

<a>xy
<b>xy

<>xy
<>xy

一回目のfoo2で@foosの内容が消えてしまいます。一方、コメントアウトしてあるようにwhileに変数($x)を使うと期待したとおりの結果が出ます。なぜ、このような結果になるのでしょうか。ご存知の方がいらっしゃったら教えてください。宜しくお願いします。ちなみに、WinXP + ActivePerl(v5.8.6)で試しました。

以下のコードにおけるwhileとforeachでの$_の使いかたについて教えてください。

my @foos = qw( a b );

sub foo1 {
  open FH, "foo.txt";

  while (<FH>) {
    chomp;
    print "$_";
  }

#  while (my $x = <FH>) {
#    chomp $x;
#    print "$x";
#  }
  
  print "\n";
}

sub foo2 {
  foreach (@foos) {
    print "<$_>";
    foo1();
  }
  print "\n";
}

foo2();
foo2();

このコードと同じディレクトリに以下のような...続きを読む

Aベストアンサー

簡単に言うと
$_ をfoo1 とfoo2 で使っている為です。
こういうことがあるので
関数の中では使う変数はできるだけ局所的な使い方をするのがよろしいです。
最初の
foreach(@foos){
}
の中で$_ は、配列の中身のコピーではなくて、配列の要素そのものを指しているので、$_ への変更は直接@foosへの変更になってしまうので注意が必要です(この動作はこの動作で便利なものなんですが・)
なので、
foreach my $x (@foos) {
print "<$x>";
foo1();
}
のようにすれば良かったのかもしれません。
また、
sub foo1{
local $_;

}
のようにすれば、
foo1 で(foo2で使っていても)安心して$_ を使うことができます。

Qon the farm について

「農場で」は英語で on the farm と言いますが、これは in the farm では間違いなのでしょうか。またこの場合の on はどういう状況を示すon なのでしょうか。どなたかご存知の方でお教え頂けましたらと思います。

Aベストアンサー

"in"は3次元空間のようなものを意識する場合によく使われます。"on"は2次元平面の接触点を意識する場合によく使われます。
(例)
in the water=水中に
on the water=水面に、水上に

ただし"circle"というような円周という線を意識する場合には
in the circle=円の中に
というふうに使われます。

ですから、"in the farm"はどういうふうにして3次元空間として意識するか難しいのではないでしょうか?
"on the farm"は2次元平面として意識しているのだと思います。

Quse strictとグロブ?

cgi-lib.plのReadParseの引数でParamグロブを使った場合、
use strict;をすると、必ず以下のエラーが表示されます。

use strictはそのまま使いたく、他の部分も厳密にチェックしたいのですが
何かよい方法はありますか?


use strict;
require 'cgi-lib.pl';

&ReadParse(*Param);
my $MODE = $Param{'MODE'}; <----- errro Variable "%Param" is not imported at

Aベストアンサー

use vars qw/%Param/;

QRay-Ban(サングラス)のサイトにつてい

Ray-Ban(サングラス)のサイトを探しています。
「Ray-Ban」で検索すると相当数のヒットがあるのですが、
肝心の「Ray-Ban」自体のサイトを見つけることができません。
そこで、「Ray-Ban」のサイトのURLをご存知の方がおられましたら、
是非お教え下さい。
また、「Ray-Ban」自体のサイトでなくても、たくさんのサングラスの一覧の
ようなものを掲載しているサイトでも構いません。
更に、「Ray-Ban」以外のサングラスメーカーのサイトでも構いません。
色々書きましたが1つでもお心あたりのある方は是非よろしくお願いします。

Aベストアンサー

下にRay-Banのサイトを書き忘れました。
英語です。

参考URL:http://www.rayban.com/html/sechome.html

Quse strict;

Global symbol "@exec_test_list" requires explicit package name at ./ctest.pl line 384.
Global symbol "@exec_test_no" requires explicit package name at ./ctest.pl line 384.
Global symbol "@protocol_list" requires explicit package name at ./ctest.pl line 397.
Global symbol "@protocol_list" requires explicit package name at ./ctest.pl line 406.
Global symbol "$name" requires explicit package name at ./ctest.pl line 413.

use strict;を書くと以上のようなエラーメッセージが
出力されます。どうしたら、以上のようなエラーを
回避できるでしょうか?教えてください。

Global symbol "@exec_test_list" requires explicit package name at ./ctest.pl line 384.
Global symbol "@exec_test_no" requires explicit package name at ./ctest.pl line 384.
Global symbol "@protocol_list" requires explicit package name at ./ctest.pl line 397.
Global symbol "@protocol_list" requires explicit package name at ./ctest.pl line 406.
Global symbol "$name" requires explicit package name at ./ctest.pl line 413.

use strict;を書くと以上のようなエラーメッセージが...続きを読む

Aベストアンサー

use strict;
を使うと、使用する変数は必ず宣言してから使わないといけなくなります。
例えば
my $name; #局所変数
our $name; #大域変数
あるいはパッケージ指定変数
$main::name;
のようにして扱う必要があります
おそらく、変数を宣言しないで使用しているために、そのようなエラーメッセージがでる(宣言しない場合は、パッケージ名による修飾がいるという意味)と思います。

Qray/BUMP OF CHICKEN

時間あるときに、回答してくださると助かります。

BUMP OF CHICKENのみのrayもいいんですけど、BUMP OF CHICKENが初音ミクとコラボ?一緒に歌ってる、rayも頭に引っ掛かってて、レンタル出来ないかなと思ってるんですけど、レンタルではないんでしょうか?
もしくは、購入しても初音ミクとのrayは入ってないのでしょうか?

くだらないことかもしれませんが、よろしくお願いします。

Aベストアンサー

BUMP OF CHICKEN feat. 初音ミクの「ray」は、現状だと配信のみのハズです。

(新曲「You were here」も配信限定シングルです)

なので、「レコチョク」「iTunes」などで配信されていますが、アルバムの「RAY」を購入しても、収録されていません。

Quse strictを宣言してlocal変数を使うには?

Perl初心者です。初歩的な質問ですが、
サブルーチンの中で my だと、その下の{ }
ブロックではmyで宣言したローカル変数がスコープされないので 
localを使うのではないかと思いますが、
それだと、use strictではエラーになります。
こんなときどう処理したらよいのでしょうか。

Aベストアンサー

> なんか、よい本などあればご紹介していただけたら、ありがたいなと、思います。

私は以前、文法が Perl とかなり似ている C/C++ で仕事をしていたので、覚える時にはリファレンス(「CGI&Perlポケットリファレンス」技術評論社)くらいしか必要ありませんでした。
そのため、入門書として推薦できる本を残念ながら知りません。

変わりに技術系書籍のレビュー(?)サイトを紹介しますので、そちらで良さそうな本にあたりをつけて、書店で実際に見ながら選ばれるとよいと思います。

参考URL:http://www.1point.jp/~book_2ch/webprog/perl.html

Qfarmscale trials ってどういうものでしょうか?

今"genetically modified foods"について学習しています。

文献の中に、"extensive farmscale trails of GM"というのが出てくるのですが、
これはどういうものを指しているのでしょうか?

"farmscale trials"は辞書にはのっていないので、新しい語だと思います。
何か実験をしているのでしょうか?

教えてください。

Aベストアンサー

自分の知っているものは"farm-scale trials"というスペルで、おっしゃる通り実験のことです。

フィールドの半分にGM(遺伝子組み換え)の穀物を、もう半分に通常の穀物を育てて、それぞれのフィールド周辺の生物の多様性をチェックすることで、GM穀物の生態系に与える効果の有意性を調査するもの、だったと思います。確かイギリスでかなり大規模なこの手の"farm-scale trials"が行われていたはずです。

もしかしたらただ単に"農場規模での実験"を表しているのかもしれませんが"genetically modified foods"の"farm-scale trials"ということで、参考までに。

Q"use strict" を使っての定数宣言

"use strict" プラグマを使ったスクリプト内で、

・定数(グローバルかつ不変)
・グローバル変数

を宣言するには、どのようにすればいいのでしょうか。

windows 2000, ActivePerl 5.6.1

Aベストアンサー

確か、perl は純粋な意味での定数を定義することができなかったような。

ただ、代入できなくするだけなら、

*var = \100;

のようにすれば、エラーは出してくれます。

あと、perl は my 等で宣言しなければ、全てグローバルだったはずです。
適当に代入した変数が、関数の中で適当に使えます。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報