Win32 Perl - определение разницы между файлами и папками с использованием переданного аргумента каталога - PullRequest
4 голосов
/ 25 августа 2010

Я пишу сценарий на Perl клубника.Первое, что нужно сделать, это взять аргумент пути и получить список каталогов для этого пути, и он должен уметь различать файлы и папки.Я прочитал несколько учебников по этой теме и написал скрипт ниже, но он работает только тогда, когда я даю ему путь, в котором находится скрипт в данный момент. Если я даю ему любой другой путь, тесты -f и -d не работают,

РЕДАКТИРОВАТЬ: Уточнение: сценарий помещает все файлы и папки в @thefiles, если я даю ему путь, отличный от его собственного, просто не работают тесты -f и -d.*

use Getopt::Long;

my $dir;

GetOptions('-d=s' => \$dir);

opendir(DIR, $dir) or die "BORKED";
@thefiles = readdir(DIR);
print DIR;
closedir(DIR);

@filez;
@dirz;

foreach $file (@thefiles){
 if (-f$file){
  push(@filez, $file);
 }
 if (-d$file){
  push(@dirz, $file);
 }
}

print "files: @filez \n";
print "Directories: @dirz \n";

Вот скриншот: http://i.stack.imgur.com/RMmFz.jpg

Надеюсь, что кто-то может помочь и большое спасибо за ваше время.:)

Ответы [ 2 ]

1 голос
/ 25 августа 2010

Мартин Клейтон рассказал вам причину, по которой ваш код не работает.

Вот способ исправить это, используя map и некоторые более современные конструкции Perl:

use strict; 
use warnings; 
use Getopt::Long; 

my $dir; 

GetOptions('-d=s' => \$dir); 

opendir my $dh, $dir or die "BORKED: $!";
my @thefiles = map { "$dir/$_" } readdir $dh;
closedir $dh;

my @filez; 
my @dirz; 

for my $file (@thefiles) { 
    push @filez, $file if -f $file;
    push @dirz , $file if -d $file;
} 

print "files: @filez \n"; 
print "Directories: @dirz \n"; 
1 голос
/ 25 августа 2010

Это потому, что операторы filetest -f и -d используют относительный путь, если вы не укажете абсолютный путь. Функция readdir возвращает имена файлов (и подкаталогов ...), найденные в каталоге, но не полные пути.

С Документы :

Если вы планируете подать вернуть значения из readdir, вы бы лучше подготовить каталог в вопрос. В противном случае, потому что мы не сделали чдыр там, было бы проверка неверного файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...