目录名和文件名可以是cgi perl脚本中的变量吗

目录名和文件名可以是cgi perl脚本中的变量吗,perl,file,cgi,Perl,File,Cgi,我知道文件名在perl脚本中可以是可变的。这同样适用于cgi perl脚本。因为当我在open语句中使用变量时,我得到的错误是没有这样的文件或目录。但是当我直接提到文件打开读取的路径时,这些变量是从表单传递的。值传递正确,但它们不是空的(通过打印变量进行检查) 示例: $dir=abc; $file=file1; open (FILE, '/var/www/cgi-bin/$dir/$file') or print "file cannot be opened $!\n"; 错误:

我知道文件名在perl脚本中可以是可变的。这同样适用于cgi perl脚本。因为当我在open语句中使用变量时,我得到的错误是没有这样的文件或目录。但是当我直接提到文件打开读取的路径时,这些变量是从表单传递的。值传递正确,但它们不是空的(通过打印变量进行检查)

示例:

$dir=abc;
$file=file1;

open (FILE, '/var/www/cgi-bin/$dir/$file')
    or print "file cannot be opened $!\n";
错误:

$dir=abc;
$file=file1;

open (FILE, '/var/www/cgi-bin/$dir/$file')
    or print "file cannot be opened $!\n";

文件无法打开没有这样的文件或目录

使用双引号插入变量:

open (FILE, "/var/www/cgi-bin/$dir/$file")
#    here __^                and here __^
    or print "file cannot be opened $!\n";
而且,总是

use strict;
use warnings;

通过使用单引号,变量不会被插值,因此您尝试打开的是字面意义上的
/var/www/cgi-bin/$dir/$file
,它不存在。

使用双引号插值变量:

open (FILE, "/var/www/cgi-bin/$dir/$file")
#    here __^                and here __^
    or print "file cannot be opened $!\n";
而且,总是

use strict;
use warnings;
通过使用单引号,变量是t插值的,因此您试图按字面意思打开
/var/www/cgi-bin/$dir/$file
,但它并不存在。

您得到(并接受)了一个好答案。我只是想补充一点,如果在字符串中包含
$file
的值,则可以使错误消息变得更有帮助

my $file_path = '/var/www/cgi-bin/$dir/$file';
open (FILE, $file_path)
    or print "file [$file_path] cannot be opened: $!\n";
然后错误是“文件[/var/www/cgi-bin/$dir/$file]无法打开:没有这样的文件或目录”,这显然表明变量没有展开

更新:我在胡说八道。新版本更好。

你得到(并接受)了一个好答案。我只是想补充一点,如果在字符串中包含
$file
的值,则可以使错误消息变得更有帮助

my $file_path = '/var/www/cgi-bin/$dir/$file';
open (FILE, $file_path)
    or print "file [$file_path] cannot be opened: $!\n";
然后错误是“文件[/var/www/cgi-bin/$dir/$file]无法打开:没有这样的文件或目录”,这显然表明变量没有展开


更新:我在胡说八道。新版本更好。

@Raju:因为单引号内的变量不是插值变量。请参阅@Raju:因为单引号内的变量不是插值。看,你确定你会得到你提到的错误吗?在下面的部分中,[$file]将展开为它的双引号。是吗?你确定你会得到你提到的那个错误吗?在下面的部分中,[$file]将展开为它的双引号。不是吗?