Perlのmy宣言の方法について質問です。

変数名に変数を利用する場合に、myをつけて宣言するとエラーがおこります。

---
#!/usr/bin/perl

use strict;
use warnings;

my $date = "0215";
my $data = "hoge";
my ${'abc' . $date} = $data;

exit;
---

と記述すると、
Can't declare scalar dereference in my at test.cgi line 8, near "} ="

という具合です。
こちらの宣言の修正方法を教えてください。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/02/15 21:57:35
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:b-wind No.1

回答回数3344ベストアンサー獲得回数440

ポイント60pt

Can't declare scalar dereference in my at test.cgi line 8, near "} ="

読んで字の通り。

my ${'abc' . $date} = $data;

こんな変数の宣言の仕方は use strict 環境内では使えない。


よほどのことがない限りソフトリファレンスでないと困ることはないし、デメリットが大きすぎる。

書き直すことをお勧めする。

my %abc = ( $date => $data );

等。

id:kbkb

使えないんですね。了解です。

たしかにハッシュで全て代用がきくものですので、ハッシュに変えたいと思います。

ありがとうございました

2010/02/15 21:57:17
  • id:imo758
    【レキシカル変数はシンボルテーブルには登録されない】のが理由だけれど
    回答をみると誤解しそうな感じ…。

    myはレキシカル変数の宣言であり
    ${'abc' . $date}はシンボルテーブル(例えば%main::)の{'abc' . $date}のスカラーを参照している。

    よって作られないものを参照しようとしているので、エラーとなる。

    http://d.hatena.ne.jp/hideden/20080125/1201230065
  • id:b-wind
    >【レキシカル変数はシンボルテーブルには登録されない】のが理由だけれど
    間違っているなら間違っていると行ってもらって結構だが、
    対処も含めて書かないと混乱するだけだね。

    #!/usr/bin/perl
    use strict;
    use warnings;

    our $abc0215 = '';
    my $date = "0215";
    my $data = "hoge";
    ${'abc' . $date} = $data;
    print $abc0215;
    ちなみにこんなコードでも、「Can't use string ("abc0215") as a SCALAR ref while "strict refs"」
    なんてエラーが出るよ。

    #!/usr/bin/perl
    #use strict;
    use warnings;

    our $abc0215 = '';
    my $date = "0215";
    my $data = "hoge";
    ${'abc' . $date} = $data;
    print $abc0215;
    だと「hoge」が出力される。

    ソフトリファレンス「だけ」では無いのは確かにそうだが、突っ込みもちょっとはずれてるように思うよ。
  • id:imo758
    レキシカルであることを諦めればuse strict下でも新しいシンボリックリファレンスは

    use strict;
    use warnings; #Name "main::abc0215" used only once: possible typo at - line 8.という警告を食らうが、動作に問題はない

    my $date='0215';
    my $data='hoge';

    ${$main::{'abc'.$date}}=$data; #変数の所在がシンボルテーブル%main::内であると明言
    print "$main::abc0215\n"; #hoge

    のように作れるし、また

    #use strict; #use strictを外す
    use warnings;

    my $date = "0215";
    my $data = "hoge";
    my ${'abc' . $date} = $data;

    でもエラー
    Can't declare scalar dereference in my at test.cgi line n, near "} ="
    を食らうから、やはりuse strictは問題の核心とは無関係だと思うけれども。

    Can't use string ("abc0215") as a SCALAR ref while "strict refs"は
    Can't declare scalar dereference in my at test.cgi line n, near "} ="と
    全く違うエラーですし。

    それとも私がどこかずれてるのかな…。
  • id:b-wind
    >やはりuse strictは問題の核心とは無関係だと思うけれども。
    今のところ議論は平行線なのでそれを否定する気は無い。
    ただ、間違いを指摘するだけだとじゃあどうするべきかがわからない。

    結局のところどうなの?元の意図を実現するには、記述方法が間違っているという主張?
  • id:imo758
    >結局のところどうなの?

    >>やはりuse strictは問題の核心とは無関係だと思うけれども。
    >今のところ議論は平行線なのでそれを否定する気は無い。
    という答え(もしくは私の指摘の方に誤りがあったらどこか)を聞きたかった、というだけです。


    まず
    my %abc = ( $date => $data );
    を推奨した事には、異論はありません。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません