Поиск файлов в Perl

Тема в разделе "WASM.UNIX", создана пользователем AndreyMust19, 5 авг 2010.

  1. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Нужно найти файлы, совпадающие с шаблоном, например
    .
    Можно ли это сделать без чтения каталога и использования внешних команд?
    Как foreach в shell:
    Код (Text):
    1. #!/bin/sh
    2. for f in /home/andrey/*; do
    3. echo $f
    4. done
     
  2. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Если использовать конструкции типа foreach, то нужно сперва создать список файлов, а это по любому чтение директории (пусть даже и скрытое, как в shell) . Так что, думаю вряд ли. А чем File::Find не устраивает?..
     
  3. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Придется читать каталог и использовать шаблоны?
    У меня работает вот это:
    Код (Text):
    1. print </home/andrey/*.las>;
    В книжке написано, возвращает первый попавшийся файл. Но работает не всегда.
     
  4. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Вообще вы правы, это работает. Правда я читаю в книжке, что такой записи лучше избегать. Предпочтительнее использовать вариант с glob:
    Код (Text):
    1. my @files = glob("/home/andrey/*.las");
    2.  
    3. for my $f (@files) {
    4.     print "$f\n";
    5. }
     
  5. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Странно, а раньше с glob не работало.
    Плохо что в <> нельзя подставить имя переменной.
    А почему такой записи нужно избегать (кстати, возвращает все файлы, если указать массив)?
     
  6. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Именно потому, что нельзя подставить имя переменной ;)
     
  7. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Почему вот так:
    Код (Text):
    1. $fd = '/home/andrey/[123,ssa2].las';
    Не работает (glob($fd); ничего не выводит)
    А вот так:
    Код (Text):
    1. $fd = '/home/andrey/sources/perl/*[pl,sh]';
    Работает? Все файлы, естественно, уже существуют.
     
  8. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Ну если честно, без понятия. В доке про glob есть замечание, что её поведение в отношении шаблонов как у /bin/csh. Может быть дело в этом.
     
  9. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Кстати, насчет glob и <>. Фактически эти ф-ии читают список файлов из каталога. После использования они, как и в работе с файлами, запоминают текущую позицию.
    Если вызывать <> или glob в одном блоке программы, записывая результат в $, то они обнуляют текущую позицию, то есть после каждого вызова снова возвращают первый элемент списка. А если вызывать <> или glob внутри процедуры, то после каждого ее вызова текущая позиция внутри каталога сохраняется, то есть, при следующем вызове <> или glob мы получим след. файл или 0. Решение - читать <> / glob в список, а потом извлекать из него первый элемент.
     
  10. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Ага, забавно :) Использовать список самое рациональное решение, а чтение списка файлов из каталога неизбежно.
     
  11. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Нашел, надо с фигурными скобками:
    Код (Text):
    1. $fd = '/home/andrey/{123,ssa2}.las';