Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Переписать пару строк PHP в Perl


Автор: nIkTo 3.1.2009, 20:13
Здраствуйте.
Помогите переписать эти строчки на PHP в Perl
Код
<?
$dir = '/afs/***/***/';
echo view_perms($dir);
function view_perms($o) {
 if (!is_readable($o)) {return 0;}
 elseif (!is_writable($o)) {return 0;}
 else {return 1;}
}
?>


Что то типа этого, не верно :
Код
#!/usr/bin/perl -w
my $dir = '/afs/***/***/';
print view_perms($dir);
sub view_perms {
    my $path = shift;
    if (-r $path) {
        if (-w $path) {
            return 1;
        }
    }
    return 0;
}


Катологи находятся в AFS (глобальная сетевая файловая система)

Автор: gcc 3.1.2009, 20:32
Код

#!/usr/bin/perl

Автор: sir_nuf_nuf 4.1.2009, 02:23
эх.. пишем на перл
Код

#!/usr/bin/perl -w
my $dir = '/afs/***/***/';
print view_perms($dir);
sub view_perms {
    return -r $_[0] && -w $_[0];
}


Автор: tolkien 4.1.2009, 11:48
Цитата(sir_nuf_nuf @ 4.1.2009,  02:23)
эх.. пишем на перл
Код

#!/usr/bin/perl -w
my $dir = '/afs/***/***/';
print view_perms($dir);
sub view_perms {
    return -r $_[0] && -w $_[0];
}

ваш вариант ни чем не отличается от

Код

#!/usr/bin/perl -w
my $dir = '/afs/***/***/';
print view_perms($dir);
sub view_perms {
    my $path = shift;
    if (-r $path) {
        if (-w $path) {
            return 1;
        }
    }
    return 0;
}


И как написал автора этот вариант работает не так как код на php. 

Автор: nitr 7.1.2009, 04:49
если дословно:
Код

#!/usr/bin/perl -w

my $dir = '/afs/***/***/';
print view_perms($dir);
sub view_perms {
    my $path = shift;
    unless (-r $path or -w $path) {
        return 0;
    }
    return 1;
}

Автор: nIkTo 8.1.2009, 19:30
nitr, те же яйца, только в профиль.

Автор: nitr 9.1.2009, 01:13
nIkTo, я проверял данный скрипт на *nix'овых (4-х) машинах - всё работает на 100%.
Вы скажите, что вы вообще хотели от вашего скрипта?

В данном случае: проверяется есть ли возможность читать папку и писать в папку. Грубо атрибут -rw.

Для этого сделал так:
sudo mkdir /home/1
sudo chmod 711 /home/1

perl test.pl /home/1
Код

#!/usr/bin/perl -w

print view_perms($ARGV[0]), "\n";

sub view_perms {
    my $path = shift;
    unless (-r $path or -w $path) {
        return 0;
    }
    return 1;
}

Цитата

[nitr@SamsungQ210 ~]$ perl test.pl /home/1
0
[nitr@SamsungQ210 ~]$ chmod 755 /home/1
[nitr@SamsungQ210 ~]$ perl test.pl /home/1
1
[nitr@SamsungQ210 ~]$ 

Автор: nIkTo 9.1.2009, 14:42
nitr, Все верно, в обычной файловой системе это работает, поэтому я и уточнил что используется AFS.
Приведённый мной php скрипт правильно определяет права на возможность записи в AFS, а perl скрипт нет.
Возможно это связано с особенностью устройства функций is_readable и is_writable, я не вкурсе.


Немного о правах доступа в AFS :

Цитата

Пользователю также необходимо иметь представление о том, что в системе AFS специфическим образом определены права и группы доступа к файлам и каталогам. Права доступа: r — чтение, w — запись, l — право просмотра списка файлов в каталоге, i — создание новых файлов и подкаталогов, d — удаление файлов и подкаталогов, k — блокирование файлов, a — полномочия изменять права и группы доступа к файлу или каталогу. Наиболее часто используются следующие три группы доступа: это любые (отовсюду, где используется AFS) AFS-пользователи (system:anyuser), любые пользователи данной организации (system:authuser) и системные администраторы данной организации (system:administartors).

Вся информация по правам и группам доступа к файлам и каталогам хранится в специальных таблицах AFS, называемых ACL (Access Control List), где определены права доступа к файлам и каталогам. Ознакомиться с содержанием этих таблиц, т.е. получить информацию по состоянию доступа к файлу или каталогу, можно с помощью команды 

fs listacl <file_name> или <dir_name>

Автор: nitr 9.1.2009, 20:40
nIkTo, извиняюсь, не видел я про AFS. В доках Perl не нашел упоминанйи про эту FS.
Если не работают -r, -R, -w, -W (попробуйте с -R -W хотя это в другую степь, но всякое может ;) ), то можно попробовать через функцию stat + модули. Но это более громоздко.

Что выдает такой скрипт:
Код
#!/usr/bin/perl -w

printf "%04o\n", (stat $ARGV[0])[2] & 07777;

perl test.pl /ваш_путь/

Надо поискать пхпшные функции в исходном виде, не верится мне, что они так сильно отличаются, тут что-то другое.

Автор: Шуранов 10.1.2009, 10:13
С AFS сталкиваться не приходилось, возможно модули из этого набора пригодятся: http://search.cpan.org/~nog/AFS-2.6.1/pod/v2/afsperl.pod?

Автор: nitr 10.1.2009, 13:48
Шуранов, я тоже думал предложить модули, но представьте какой скрипт получается. Пока хочу увидеть реализацию пхп-шных функций smile

Автор: ginnie 11.1.2009, 19:46
nIkTo, попробуйте добавить

Код

use filetest 'access';


Добавлено @ 19:49
Дело в том, что для ускорения по-умолчанию используется упрощенный метод проверки, без использования ACL. Для активации нормального метода с вызово системных функций используется прагма filetest, которая задействует функцию POSIX::access().

Автор: nIkTo 17.1.2009, 20:09
ginnie, благодарю, действительно решением было использовать :
Код

use filetest 'access';


Спасибо!  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)