電子書籍の厳選無料作品が豊富!

いつもお世話になっております。

コンストラクタへ引数を渡しsyntaxチェックを行うとエラーとなります。
ご教授願えないでしょうか。
※Perlは一昨日から初めてです。

[エラー内容]
sample.pm: Bareword "SAMPLE_LOG" not allowed while "strict subs" in use at sample.pm line 278.

[sample.pm]
package sample

lib ../common/
use Log.pm

my $log = Log->new(SAMPLE_LOG);

[Log.pm}
package main

use constant SAMPLE_LOG = 'sample.log';


定数を定義しているのですが・・・・

A 回答 (6件)

たとえば sample.pm の 1行目は


package sample
となっていますが, 本当にこれでいいのですか? あなたのところでは, セミコロンがなくても普通に動作しているのですか?

その次の
lib ../common/
でも, 「lib ってなんだ」とか「../common/ ってどんな式なんだ」とか疑問になりますよね.

「やりたい事は書いているので、問題はないかと思ってはいる」とのことですが, この例を使って試そうとすると「やりたいこと」にたどり着く前に細かなエラーをつぶしていく必要があります. 確かに細かいところなんだけど, それは逆にいえば「気を付けて質問するつもりはない」という意思表示のようにも取れてしまいます.

そして, その手間をかけても Perl 5.14.2 では
main に constract を定義すると Barewordとなり、
パッケージLog内で constant定義するとsyntax OKとなります。
とはならない.

この回答への補足

度々ご指摘有難う御座います。

すみません。
実際には
package sample → package sample;

lib ../common/ → use lib '../common/';

しかも一番肝心なバージョンが抜けていました。
バージョンは5.8.8です。

補足日時:2012/02/23 14:08
    • good
    • 0
この回答へのお礼

いろいろとご指摘有難う御座いました。

なんとか解決しました。

ローカルで色々試した所

パッケージ → パッケージで mainのconstantを使用する場合
my $log = Log->new(main::SAMPLE_LOG);

としなければならないと言う事が分かりました。
ありがとうございました。

お礼日時:2012/02/23 16:06

元の質問文に書かれているものもそうなんだけど, 今出ている「例」では bareword 以前に文法的におかしいです. これでは「例」として意味をなしません.



例を出すなら「問題としているところまでちゃんとたどりつく」ものを出してください.

この回答への補足

すみません。

こちら問題の出ているSample.pm の SAMPLE_LOGは
例に出している通りです。

処理はかなりはしょっていますが、
やりたい事は書いているので、問題はないかと思ってはいるのですが。

補足日時:2012/02/23 13:29
    • good
    • 0

そうなると状況が質問とは変わってきちゃうから, 具体的なスクリプトを (もちろん「使っているものをそのままで」とはいわないけど) 出してください.



なお, 実際に出すときには「こんな風に書き換えた」と変更点のみを書きだすと無用な混乱を招くことになるので, 面倒でも改めて全体を出すようにしてください.

この回答への補足

補足が足りずにすみません

package sample

lib ../common/
use Log.pm

my $log = Log->new(SAMPLE_LOG);

[Log.pm}
package main

use constant SAMPLE_LOG = 'sample.log';

package Log;

#コンストラクタ
sub new {
my $this = shft;
my ($name) = @_;

return 1;
}

パッケージsampleから
パッケージLogに引数を渡して、
sample.logの定義があるかを返す処理です。

main に constract を定義すると Barewordとなり、
パッケージLog内で constant定義するとsyntax OKとなります。

Log.pmは他のcgi等から呼ばれるため、
他の使用方法とあわせたいのが正直なところです。

宜しくお願いします。

補足日時:2012/02/23 11:46
    • good
    • 0

あ, #2 は #1 のように直してもダメだったときに意味を持ちます. 質問文のままだと, おそらく (コンパイルできたとしても)

期待した動作にはならないでしょう.

この回答への補足

有難う御座います。

sample::new::SAMPLE_LOG

と記述すればいいのでしょうか
よろしくおねがいします。

補足日時:2012/02/23 10:18
    • good
    • 0
この回答へのお礼

仰るように

$log = sample::SAMPLE_LOG;

だといけました。

しかし、Log.pm内にはもうひとつパッケージが存在し、
その中でコンストラクタをよんでいいます。

なので、$log = main;;SAMPLE_LOG
は問題ないのですが、

その後のコンストラクタを呼ぶ場合にはどうしたらいいのでしょうか

お礼日時:2012/02/23 11:24

1つ思い付くのは package がらみかな. ::SAMPLE_LOG でうまくいけるならそうだと思う.

    • good
    • 0

use constant SAMPLE_LOG => 'sample.log';

この回答への補足

ありがとうございます。

他のconstantにならって作成したのですが、
cgiファイルから呼ばれるのとpmファイルから呼ばれるのとでは
違いがあるのでしょうか。

補足日時:2012/02/22 18:42
    • good
    • 0

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