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