Автор Тема: Фигня с use strict;  (Прочитано 4528 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн SteelRat

  • Funk U!
  • Старожил
  • ****
  • Сообщений: 290
  • +0/-0
  • 2
    • Просмотр профиля
    • http://thewebfactory.fatal.ru
Фигня с use strict;
« : 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.

Что делать?
Debian/GNU Linux is rulezz...

Оффлайн Serchey

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 216
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.rivne.ukrtelecom.ua
Фигня с use strict;
« Ответ #1 : 11 Сентября 2002, 00:35:19 »
Я бы делал проще...

Оффлайн SteelRat

  • Funk U!
  • Старожил
  • ****
  • Сообщений: 290
  • +0/-0
  • 2
    • Просмотр профиля
    • http://thewebfactory.fatal.ru
Фигня с use strict;
« Ответ #2 : 11 Сентября 2002, 00:41:03 »
Хм, в угоду чему ты бы добился простоты?
Можно и сразу open(SOME,  Но так мне удобнее.
и проверяю всё сразу и ошибку выкидываю единожды после плохого open и  флочу когда надо - экономия места в коде....

вопрос в том, как это завести при use strict.
Debian/GNU Linux is rulezz...

Оффлайн Serchey

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 216
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.rivne.ukrtelecom.ua
Фигня с use strict;
« Ответ #3 : 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;
}


Оффлайн Serchey

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 216
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.rivne.ukrtelecom.ua
Фигня с use strict;
« Ответ #4 : 11 Сентября 2002, 13:44:35 »
To previus message: discover the difference!

Оффлайн SteelRat

  • Funk U!
  • Старожил
  • ****
  • Сообщений: 290
  • +0/-0
  • 2
    • Просмотр профиля
    • http://thewebfactory.fatal.ru
Фигня с use strict;
« Ответ #5 : 11 Сентября 2002, 19:13:03 »
Serchey классный у тебя стиль кодинга. Я до такого ещё не дорос.
Читать можно, но самому такое сочинять.. ;-) Пока не удаётся.

Но интересно: в чём неверность прежнего вариата всё-таки?
А то вроде всё ОК. perldoc perlref и perldoc strict мне ответа не дали.. Или я криво смотрел...
Debian/GNU Linux is rulezz...

Оффлайн SteelRat

  • Funk U!
  • Старожил
  • ****
  • Сообщений: 290
  • +0/-0
  • 2
    • Просмотр профиля
    • http://thewebfactory.fatal.ru
Фигня с use strict;
« Ответ #6 : 11 Сентября 2002, 19:22:50 »
У тебя нельзя задать дискриптор. Я сделал дискриптор не переменной, а просто \'X\' и всё заработало.

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

В чём фигня?
Debian/GNU Linux is rulezz...

Оффлайн Serchey

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 216
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.rivne.ukrtelecom.ua
Фигня с use strict;
« Ответ #7 : 12 Сентября 2002, 11:22:30 »
Думаю, неверноя постановка вопроса, т.е. надуманноя ситуация.

Оффлайн Serchey

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 216
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.rivne.ukrtelecom.ua
Фигня с use strict;
« Ответ #8 : 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;
}

Оффлайн SteelRat

  • Funk U!
  • Старожил
  • ****
  • Сообщений: 290
  • +0/-0
  • 2
    • Просмотр профиля
    • http://thewebfactory.fatal.ru
Фигня с use strict;
« Ответ #9 : 12 Сентября 2002, 16:04:38 »
В каком смысле надуманная?
Debian/GNU Linux is rulezz...

Оффлайн Serchey

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 216
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.rivne.ukrtelecom.ua
Фигня с use strict;
« Ответ #10 : 12 Сентября 2002, 18:34:38 »
Цитировать
В каком смысле надуманная?
- Указывать дескриптор для открытия файла с помощю подпрограммы.

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

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

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28