Forum Webscript.Ru

Программирование => Perl => Тема начата: SteelRat от 10 Сентября 2002, 21:40:32

Название: Фигня с use strict;
Отправлено: 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.

Что делать?
Название: Фигня с use strict;
Отправлено: Serchey от 11 Сентября 2002, 00:35:19
Я бы делал проще...
Название: Фигня с use strict;
Отправлено: SteelRat от 11 Сентября 2002, 00:41:03
Хм, в угоду чему ты бы добился простоты?
Можно и сразу open(SOME,  Но так мне удобнее.
и проверяю всё сразу и ошибку выкидываю единожды после плохого open и  флочу когда надо - экономия места в коде....

вопрос в том, как это завести при use strict.
Название: Фигня с use strict;
Отправлено: Serchey от 11 Сентября 2002, 13:42:22
Ну во-первых, я бы использовал модули(я не файл программы с подпрограмамми). А во-вторых можна и так:

#!/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;
}

Название: Фигня с use strict;
Отправлено: Serchey от 11 Сентября 2002, 13:44:35
To previus message: discover the difference!
Название: Фигня с use strict;
Отправлено: SteelRat от 11 Сентября 2002, 19:13:03
Serchey классный у тебя стиль кодинга. Я до такого ещё не дорос.
Читать можно, но самому такое сочинять.. ;-) Пока не удаётся.

Но интересно: в чём неверность прежнего вариата всё-таки?
А то вроде всё ОК. perldoc perlref и perldoc strict мне ответа не дали.. Или я криво смотрел...
Название: Фигня с use strict;
Отправлено: SteelRat от 11 Сентября 2002, 19:22:50
У тебя нельзя задать дискриптор. Я сделал дискриптор не переменной, а просто \'X\' и всё заработало.

CORE::open(\'X\', $fileopenstring) || die("$locale{\'5\'}: $filename. \\n $locale{\'259\'}: $!");

В чём фигня?
Название: Фигня с use strict;
Отправлено: Serchey от 12 Сентября 2002, 11:22:30
Думаю, неверноя постановка вопроса, т.е. надуманноя ситуация.
Название: Фигня с use strict;
Отправлено: Serchey от 12 Сентября 2002, 11:28:01
Но в крайнем случае, можно и так(приблизительно):

#!/usr/bin/perl -w
use strict;

sub fopen {
 open(X,"./x.cgi");
 return \\*X;
}

my $fh = fopen();
while(<$fh>){
 print;
}
Название: Фигня с use strict;
Отправлено: SteelRat от 12 Сентября 2002, 16:04:38
В каком смысле надуманная?
Название: Фигня с use strict;
Отправлено: Serchey от 12 Сентября 2002, 18:34:38
Цитировать
В каком смысле надуманная?
- Указывать дескриптор для открытия файла с помощю подпрограммы.

Да, еще попробуй вот так:
eval \'open($filehandle, $fileopenstring);\';

die("$locale{\'5\'}: $filename. \\n $locale{\'259\'}: $@") if $@;