Perl-使用相对路径Apache打开

Perl-使用相对路径Apache打开,apache,perl,Apache,Perl,我们最近继承了一个遗留的perl应用程序,我们正在努力迁移到一个新的服务器,并设置一个沙箱环境,以便开始对应用程序进行分类。我们遇到的问题是,代码当前使用了open方法的一些相对路径。并且目前在他们的共享托管环境中工作(我们几乎无法访问) open(HANDLE),相对路径是相对于进程的当前工作目录的,它不一定与包含程序的目录相同。事实上,对于守护进程(以及它们的子进程),它通常是/ 对于相对于程序位置的路径,请使用 use FindBin qw( $RealBin ); my $qfn =

我们最近继承了一个遗留的perl应用程序,我们正在努力迁移到一个新的服务器,并设置一个沙箱环境,以便开始对应用程序进行分类。我们遇到的问题是,代码当前使用了
open
方法的一些相对路径。并且目前在他们的共享托管环境中工作(我们几乎无法访问)


open(HANDLE),相对路径是相对于进程的当前工作目录的,它不一定与包含程序的目录相同。事实上,对于守护进程(以及它们的子进程),它通常是
/

对于相对于程序位置的路径,请使用

use FindBin qw( $RealBin );

my $qfn = "$RealBin/relative/path/to/file.txt";
open(my $HANDLE, "<", $qfn)
使用FindBin qw($RealBin);
my$qfn=“$RealBin/relative/path/to/file.txt”;

open(my$HANDLE,“相对路径是相对于进程的当前工作目录的,它不一定与包含程序的目录相同。事实上,对于守护进程(以及它们的子进程),它通常是
/

对于相对于程序位置的路径,请使用

use FindBin qw( $RealBin );

my $qfn = "$RealBin/relative/path/to/file.txt";
open(my $HANDLE, "<", $qfn)
使用FindBin qw($RealBin);
my$qfn=“$RealBin/relative/path/to/file.txt”;

open(my$HANDLE,“在open中使用固定字符串指定文件路径是一种不好的做法,除非路径是预定义的,并且永远不会更改,例如linux中的/etc/fstab

您应该将代码改为使用变量

在脚本顶部定义变量——如果您需要更改base和path,您将知道在代码的前几行就可以找到它

在这种情况下,在代码中添加临时内容

use strict;
use warnings;

open( my $fh, '>', 'my_uniq_file.txt')
    or die 'Couldn\'t open my_uniq_file.txt';

print $fh 'This directory is default base for path location';

close $fh;
从web服务器运行脚本后,您应该查找文件my_uniq_tile.txt——它的位置将是文件位置的web服务器的默认基础

现在,使用相应的文件路径调整变量

use strict;
use warnings;

my $dir_project = './project_1/';
my $audio_data = 'audio_data.dat';
my $video_data = 'video_data.dat';
my $descr_data = 'descr_data.dat';

my $qfn = $dir_project . $audio_data;

open(my $fh, '<', $qfn)
    or die "Couldn't open $qfn";

while( <$fh> ) {
     chomp;
    [do something with data]
}

close $fh;
使用严格;
使用警告;
我的$dir_project='./project_1/';
my$audio_data='audio_data.dat';
my$video_data='video_data.dat';
my$descr_data='descr_data.dat';
我的$qfn=$dir_项目。$audio_数据;

open(my$fh,在open中使用固定字符串指定文件路径是一种不好的做法,除非路径是预定义的并且永远不会更改-例如在linux中使用/etc/fstab

您应该将代码改为使用变量

在脚本顶部定义变量——如果您需要更改base和path,您将知道在代码的前几行就可以找到它

在这种情况下,在代码中添加临时内容

use strict;
use warnings;

open( my $fh, '>', 'my_uniq_file.txt')
    or die 'Couldn\'t open my_uniq_file.txt';

print $fh 'This directory is default base for path location';

close $fh;
从web服务器运行脚本后,您应该查找文件my_uniq_tile.txt——它的位置将是文件位置的web服务器的默认基础

现在,使用相应的文件路径调整变量

use strict;
use warnings;

my $dir_project = './project_1/';
my $audio_data = 'audio_data.dat';
my $video_data = 'video_data.dat';
my $descr_data = 'descr_data.dat';

my $qfn = $dir_project . $audio_data;

open(my $fh, '<', $qfn)
    or die "Couldn't open $qfn";

while( <$fh> ) {
     chomp;
    [do something with data]
}

close $fh;
使用严格;
使用警告;
我的$dir_project='./project_1/';
my$audio_data='audio_data.dat';
my$video_data='video_data.dat';
my$descr_data='descr_data.dat';
我的$qfn=$dir_项目。$audio_数据;

打开(my$fh,”,如上述评论所述。我们的最终解决方案是使用:

File::Basename qw( dirname ); 
chdir(dirname($0));

这使我们能够使代码正常工作,同时将额外的代码修改保持在最低限度。

如上述评论所述。我们的最终解决方案是使用:

File::Basename qw( dirname ); 
chdir(dirname($0));

这使我们能够使代码正常工作,同时将额外的代码修改保持在最低限度。

它会引发什么错误?这不是权限问题,而是路径错误吗?它似乎不是权限问题(777是否曾在某一点上修改过文件)如果我们使用文件的完整路径,而不是相对路径,这是可行的。我们得到的是“没有这样的文件或目录”,尽管事实上我可以在我所在的路径中退出vi,并对有问题的文件进行cat。如果我用脚本将文件移动到目录中,并尝试通过./file.txt访问它,也会出现同样的情况。仍然看不到文件。另一个快速注意事项是,如果我们通过命令行…perl script.pl运行脚本,相对路径确实有效。这似乎是一个问题,仅通过Apache请求访问脚本。还有一个小贴士。我现在让perl脚本打印
pwd
;它显示当前目录为“/”,尽管如此作为/srv/www/site/scripts/script.pl。不知道为什么脚本在通过访问文件时会认为其cwd为“/”。再次感谢您的帮助。可能Apache运行在
chroot
监狱中?它会抛出什么错误?这不是权限问题而不是错误路径吗?它似乎不是权限问题(777在某一点上删除了该文件)如果我们使用文件的完整路径,而不是相对路径,这是可行的。我们得到的是“没有这样的文件或目录”,尽管事实上我可以在我所在的路径中退出vi,并对有问题的文件进行cat。如果我用脚本将文件移动到目录中,并尝试通过./file.txt访问它,也会出现同样的情况。仍然看不到文件。另一个快速注意事项是,如果我们通过命令行…perl script.pl运行脚本,相对路径确实有效。这似乎是一个问题,仅通过Apache请求访问脚本。还有一个小贴士。我现在让perl脚本打印
pwd
;它显示当前目录为“/”,尽管如此作为/srv/www/site/scripts/script.pl。不知道为什么脚本在通过访问文件时会认为其cwd为“/”。再次感谢您的帮助。也许Apache在
chroot
监狱中运行?感谢您的回复。我想这是好奇的地方。我们已经删除了使用上述相对路径的遗留代码。但是,在新服务器上,脚本将路径显示为“/”。与其修改代码,我们如何才能设置我们的环境,使脚本能够正确地看到其路径?我们当前的修复方法只是添加使用中的文件::Basename qw(dirname);chdir(dirname($0