2010-11-26 3 views
2

У меня есть программа, которую я хочу очистить от текстовых файлов. Программа просит пользователя ввести полный путь к каталогу, содержащему эти текстовые файлы. Оттуда я хочу прочитать файлы в каталоге, распечатать их до нового файла (который указан пользователем), а затем очистить их так, как мне нужно. Я уже написал скрипт для очистки текстовых файлов.Программа поддержки Perl на opendir и readdir

Я прошу у пользователя директории использовать:

chomp ($user_supplied_directory = <STDIN>); 
opendir (DIR, $user_supplied_directory); 

Тогда мне нужно прочитать каталог.

my @dir = readdir DIR; 

foreach (@dir) { 

Теперь я потерян.

Любая помощь пожалуйста?

+0

Как указать новый файл (особенно учитывая, что будет несколько новых файлов) – ysth

ответ

1

Я не уверен, что вы хотите. Таким образом, я сделал некоторые предположения:

  • Когда вы говорите, очистить текстовый файл, вы имели в виду удалить этот текстовый файл
  • Имена файлов, которые вы хотите записать в формируются рисунком.

Так что, если я прав, попробовать что-то вроде этого:

chomp ($user_supplied_directory = <STDIN>); 

opendir (DIR, $user_supplied_directory); 
my @dir = readdir DIR; 

foreach (@dir) { 
    next if (($_ eq '.') || ($_ eq '..')); 

    # Reads the content of the original file 
    open FILE, $_; 
    $contents = <FILE>; 
    close FILE; 

    # Here you supply the new filename 
    $new_filename = $_ . ".new"; 

    # Writes the content to the new file 
    open FILE, '>'.$new_filename; 
    print FILE $content; 
    close FILE; 

    # Deletes the old file 
    unlink $_; 
} 
+1

Вы должны проверить результаты своих вызовов 'opendir' и' open', или иначе 'use autodie;' – friedo

1

Я хотел бы предложить вам перейти к File :: Find. Вначале это может быть немного сложной задачей, но она мощная и кросс-платформенная.

Но, чтобы ответить на ваш вопрос, попробовать что-то вроде:

my @files = readdir DIR; 
foreach $file (@files) { 
    foo($user_supplied_directory/$file); 
} 

, где «Foo» является то, что вам нужно сделать, чтобы файлы. Несколько замечаний может помочь:

  • с использованием «@dir» как массив файлов был немного вводит в заблуждение
  • имя папки должно быть перед именем файла, чтобы получить нужный файл
  • это может удобно использовать grep выбрасывать ненужные файлы и вложенные папки, особенно «..»
+0

Файл :: Найти ? ничто в вопросе не заставляет меня думать, что вложенные каталоги нужно искать. – ysth

+0

Использование * «кросс-платформенный» * для обозначения * «даже работает на Microsoft» * - это ласковый эвфемизм, приглушающий политическую корректность сошел с ума. – tchrist

+0

@tchrist Мне нравится код, который работает на разных платформах без особых усилий с моей стороны. Это просто удобно, а не политически правильно. В этом случае я не мог определить, какая ОС была использована ...и, откровенно говоря, все равно. – igelkott

1

Я сегодня использовал readdir написал что-то. Может быть, вы можете чему-то научиться. Это лишь часть (несколько) более крупной программы:

our @Perls =(); 

{ 
    my $perl_rx = qr {^perl [\d.] + $ }x; 
    for my $dir (split(/:/, $ENV{PATH})) { 
     ### scanning: $dir 
     my $relative = ($dir =~ m{^/}); 
     my $dirpath = $relative ? $dir : "$cwd/$dir"; 
     unless (chdir($dirpath)) { 
      warn "can't cd to $dirpath: $!\n"; 
      next; 
     } 
     opendir(my $dot, ".") || next; 
     while ($_ = readdir($dot)) { 
      next unless /$perl_rx/o; 
      ### considering: $_ 
      next unless -f; 
      next unless -x _; 
      ### saving: $_ 
      push @Perls, "$dir/$_"; 
     } 
    } 
} 

{ 
    my $two_dots = qr{ [.] .* [.] }x; 
    if (grep /$two_dots/, @Perls) { 
     @Perls = grep /$two_dots/, @Perls; 
    } 
} 

{ 
    my (%seen, $dev, $ino); 
    @Perls = grep { 
     ($dev, $ino) = stat $_; 
     ! $seen{$dev, $ino}++; 
    } @Perls; 
} 

Затруднение является push(@Perls, "$dir/$_"): имена файлов, прочитанные readdir только basenames; они не являются полными путями.

+0

Спасибо за ответы ребята. Я думаю, что с этой должности я могу выполнить свою работу. Чтобы уточнить, что я хочу сделать. Я студент PhD биологии, и я работаю с файлами Fasta. У них довольно простой формат, но когда вы копируете и вставляете файлы из Интернета, вы получаете больше разрывов строк, чем хотите. Я написал сценарий, который откроет файл, удалит лишнее пробел и разрывы строк, а затем сохранит файл в предоставленном пользователем месте. – AlphaA

+0

Теперь я хочу добавить функцию к скрипту, чтобы он открыл каталог, полный файлов fasta, открыл все файлы fasta и скопировал их в один файл (в местоположении, предоставленном пользователями). а затем выполните очистку. Спасибо – AlphaA

+1

@ user520742, вы можете найти 'glob (" $ dir/* ")' проще в использовании, чем 'readdir'. Вы [попробовали Googling для Perl и Fasta] (http://tinyurl.com/2agpbv4)? Я заметил, что одна из первых ссылок - [на Perlmonks] (http://www.perlmonks.org/?node_id=833644). Похоже, есть [Bio :: SeqIO :: fasta] (http://search.cpan.org/search?query=Bio::SeqIO::fasta), который является частью Bio Perl. Еще один совет: если вы отредактируете свой профиль пользователя, вы можете иметь настоящее имя. – tchrist

Смежные вопросы