Forum Webscript.Ru
Программирование => Perl => Тема начата: SteelRat от 10 Сентября 2002, 21:40:32
-
В главном index.cgi идёт:
use strict; use vars \'xxx\';
#.....
require "$way{\'binaries\'}".\'/\'.\'subprograms.pl\';
В файле subprograms.pl:
#.......
use strict;
#.......
29:#_________________________________________________________________
30:sub fopen ($$;$) {
31: my ($filemodeB, $fileopenstring);
32: my ($filehandle, $filename, $filemodeA) = @_;
33: if ($filename =~ m~/\\.\\./~) { &process_crash("$locale{\'6\'} \\\'$filename\\\'. $locale{\'7\'}"); }
34: $filename =~ tr~\\\\~/~;
35: $filename =~ s~[^/0-9A-Za-z#%+\\,\\-\\ \\.@^_]~~g;
36: if ($filemodeA eq \'towrite\') {$filemodeB = \'>\';}
37: elsif ($filemodeA eq \'toadd\') {$filemodeB = \'>>\';}
38: else {$filemodeB = \'<\';}
39: $fileopenstring = "$filemodeB"."$filename";
40: CORE::open($filehandle, $fileopenstring) || die("$locale{\'5\'}: $filename. \\n $locale{\'259\'}: $!");
41: if ($sysvar{\'use_flocking\'} eq \'yes\') {flock $filehandle, 2;}
42: return 1;
43:}
далее идёт вызов:
fopen(\'USERDATA\', "$way{\'users_home\'}/$checkusername/userdata");
Это даёт ошибку апача:
Software error:
Can\'t use string ("USERDATA") as a symbol ref while "strict refs" in use at bin/subprograms.pl line 40.
For help, please send mail to the webmaster (webmaster@SteelRatS), giving this error message and the time and date of the error.
Что делать?
-
Я бы делал проще...
-
Хм, в угоду чему ты бы добился простоты?
Можно и сразу open(SOME, Но так мне удобнее.
и проверяю всё сразу и ошибку выкидываю единожды после плохого open и флочу когда надо - экономия места в коде....
вопрос в том, как это завести при use strict.
-
Ну во-первых, я бы использовал модули(я не файл программы с подпрограмамми). А во-вторых можна и так:
#!/usr/bin/perl -w
use strict;
my %sysvar;
$sysvar{use_flocking} = 0;
unless(fopen(\'dns.rev\',\'d:/Scripts/x\',\'to_write\')){
print "All OK!\\n";
} else {
print "Thomething wrang with opening file!\\n";
}
sub fopen {
my $file = shift;
my $path = shift;
my $mode = shift;
my $flock_mode = $mode eq \'to_read\'?\'1\':\'2\';
$path =~ s/(\\\\|\\/)$//;
$path.="/";
return 1 unless -e $path;
$file =~ s/(\\.\\.|\\/|[^A-Za-z0-9_\\-\\.])//g;
return 2 if !(-e "$path$file") && $mode ne \'to_write\' && $mode ne \'to_append\';
my $modes = {to_read=>\'\',to_write=>\'>\',to_append=>\'>>\',to_update=>\'+<\'};
$path = $modes->{$mode}.$path;
open(X,"$path$file") || return 3;
binmode(X);
flock(X,$flock_mode) if $sysvar{use_flocking};
return 0;
}
-
To previus message: discover the difference!
-
Serchey классный у тебя стиль кодинга. Я до такого ещё не дорос.
Читать можно, но самому такое сочинять.. ;-) Пока не удаётся.
Но интересно: в чём неверность прежнего вариата всё-таки?
А то вроде всё ОК. perldoc perlref и perldoc strict мне ответа не дали.. Или я криво смотрел...
-
У тебя нельзя задать дискриптор. Я сделал дискриптор не переменной, а просто \'X\' и всё заработало.
CORE::open(\'X\', $fileopenstring) || die("$locale{\'5\'}: $filename. \\n $locale{\'259\'}: $!");
В чём фигня?
-
Думаю, неверноя постановка вопроса, т.е. надуманноя ситуация.
-
Но в крайнем случае, можно и так(приблизительно):
#!/usr/bin/perl -w
use strict;
sub fopen {
open(X,"./x.cgi");
return \\*X;
}
my $fh = fopen();
while(<$fh>){
print;
}
-
В каком смысле надуманная?
-
В каком смысле надуманная?
- Указывать дескриптор для открытия файла с помощю подпрограммы.
Да, еще попробуй вот так:
eval \'open($filehandle, $fileopenstring);\';
die("$locale{\'5\'}: $filename. \\n $locale{\'259\'}: $@") if $@;