Apache fastcgi:有没有一种方法可以在子例程使用时动态检查ENV值?

Sea*_*ean 0 apache perl fastcgi internationalization mod-fcgid

如果问题定义有点脱节,我深表歉意。我们已经在许多不同的媒介上攻击了这个问题。

基本描述,我们有一个网站,我们正在尝试提供使用Locale :: TextDomain的翻译

我们有fastcgi脚本,该脚本调用了我们的perl模块本地库。Fastcgi和翻译是棘手的(因为我们正在使用它),因为语言是在脚本启动时设置的,并且会持续存在。

因此,在我们的perl模块库中,此方法有效。

package SR::Locale;
our $LOCALE_NAMESPACE = 'es';
use Locale::TextDomain::UTF8 qw( $LOCALE_NAMESPACE );
our $word = __("football");
Run Code Online (Sandbox Code Playgroud)

但是我们找不到在启动时动态设置变量$ LOCALE_NAMESPACE的方法。我们想基于request_uri或正在执行的脚本的dir路径或类似的东西进行设置。所以我们想做类似的事情,但是我们不能在快速的cgi设置中解决这个问题:

package SR::Locale;
$ENV{REQUEST_URI} =~ m{example.com/(..)/}
our $LOCALE_NAMESPACE = $1;
use Locale::TextDomain::UTF8 qw( $LOCALE_NAMESPACE );
our $word = __("football");
Run Code Online (Sandbox Code Playgroud)

在此示例中(对于fastcgi),$ ENV {REQUEST_URI}在脚本启动时模块中为空白。

任何帮助将非常感激。我无法在perl中找到任何有关翻译和fastcgi的参考。

zdi*_*dim 5

一个明显的问题是,运行时间分配$LOCALE_NAMESPACE,上使用捕获从正则表达式$ENV{REQUEST_URI},运行use那里变量使用,因为所有的语句使用的语句在编译时运行。

如果唯一的问题是如何设置$LOCALE_NAMESPACE的时候use,这样做在BEGIN阶段

package SR::Locale;

my $LOCALE_NAMESPACE;

BEGIN { 
    # Add a check that $ENV{REQUEST_URI} is indeed set by the environment
    ($LOCALE_NAMESPACE) = $ENV{REQUEST_URI} =~ m{example.com/(..)/};
}

use Locale::TextDomain::UTF8 qw( $LOCALE_NAMESPACE );
Run Code Online (Sandbox Code Playgroud)

不要忘记,它BEGIN必须在use依赖它的语句之前出现。所有同BEGIN相运行的代码均按其在源文件中的出现顺序执行(包括d模块中的任何其他use语句或BEGINuse)。