0

そのため、Catalyst アプリ全体で利用できるようにしたい独自のサブルーチンをいくつか含む .lib ファイルがあります。現在、lib/myapp.pm にファイルが必要ですが、問題はありません。ただし、コントローラーでそのサブルーチンを呼び出そうとすると、次のエラーが発生します。

"Undefined subroutine &myapp::Controller::Root::my_sub called at 
/home/user/myapp/lib/myapp/Controller/Root.pm line 35, <DATA> line 1003."

コントローラーで必要なファイルを必要とする場合、問題はありません。ただし、可能であれば、アプリケーション全体で 1 つの場所にのみロードする必要があると思います。また、コントローラ内でファイルが必要な場合、リクエストが行われるたびにこのファイルがロードされるということですか? (それが違いを生む場合、私は mod_perl を使用しています)。アプリ全体とすべてのリクエストに対してファイルが一度に読み込まれるという点でこれを効率的にしたいと思いますが、コードをきれいにするために1か所にのみ読み込まれます。ありがとう!

4

2 に答える 2

2
use myapp;

基本的に

BEGIN {
   require myapp;
   import myapp;
}

require myapp;まだ実行myapp.pmされていない場合は実行されます。つまり、プロセス内で何回実行しuse myapp;ても、ファイルが実行 (「ロード」) されるのは 1 回だけです。

import myapp;myapp::import()ものをエクスポートするために存在する場合は呼び出します。myappexportsを想定するとmy_sub、これがコードが機能しない理由です。

2 つのオプションがあります。

  1. パッケージmysub内の を呼び出します: 。myappmyapp::my_sub(...)
  2. 呼び出すすべてのパッケージでuse myapp;のローカル名を作成するために使用して、だけで呼び出すことができるようにします。(これはエクスポートを想定しています。)my_submy_submy_sub(...)myappmy_sub
于 2013-01-25T08:18:32.997 に答える
-1

このコマンドuse myapp;は、複数回呼び出された場合でも、myapp.pm ファイルを 1 回だけロードします。ただし、インポート ルーチンを呼び出すたびに、myapp::my_sub() を記述する必要なく、my_sub() を使用できるようにします (Exporter などを使用してエクスポートすると仮定します)。

于 2013-01-25T07:59:05.720 に答える