Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функия glob рботает не правильно 
:(
    Опции темы
Logo
Дата 11.7.2009, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Почему-то функция glob выводит путь только до первого пробела, а если указывать в шаблоне виндовые \, то их тоже не выводит. Поместить шаблон в <> тоже не спасает. Что делать?
PM MAIL   Вверх
arto
Дата 11.7.2009, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



# perl -le 'print glob ("*"); print glob ("aa\\ bb/*"); print glob ("aa\\ bb/cc\\ dd/*")'
aa bb
aa bb/cc dd
aa bb/cc dd/ee ff
#
PM MAIL ICQ   Вверх
Logo
Дата 12.7.2009, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Код

#!/usr/bin/perl

print "$_\n" for glob ('D:\Папка Папка\*');
print "$_\n" for glob ('D:/Папка Папка/*');


Выводит:
D:./Папка
D:/Папка
PM MAIL   Вверх
arto
Дата 12.7.2009, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



windows у меня нет.

вы заметили отличие моего примера от своего?
PM MAIL ICQ   Вверх
DaemonSuw
Дата 12.7.2009, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 11.3.2008

Репутация: 3
Всего: 3



Logo, да у меня тоже самое(((
юзайте File::Glob::glob

Код

#!/usr/bin/perl
use File::Glob qw( glob );
print "$_\n" for glob ("C:\\test dir\\*");



Цитата

C:\>test_script.pl
C:\test dir\New Folder
C:\test dir\New Folder (2)
C:\test dir\New Folder (3)


Это сообщение отредактировал(а) DaemonSuw - 12.7.2009, 22:18
PM MAIL ICQ   Вверх
Logo
Дата 13.7.2009, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



А эта почему-то с while не работает... странные глюки однако.
PM MAIL   Вверх
KSURi
Дата 13.7.2009, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



А почему оно должно работать с while?


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
Logo
Дата 14.7.2009, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



KSURi потому что в принципе функция glob должна работать с while. Стандартная работает, а эта нет, у стандартной другой глюк однако, см выше.
PM MAIL   Вверх
DaemonSuw
Дата 16.7.2009, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 11.3.2008

Репутация: 3
Всего: 3



Logo, а так?
Код

#!/usr/bin/perl
use File::Glob qw( glob );
@array_dir = glob ("C:\\repo\\*");
print pop (@array_dir)."\n" while( scalar (@array_dir) > 0 );


glob - возвращает массив строк, а как их обрабатывать это уже не принципиально: for, while, foreach 

Это сообщение отредактировал(а) DaemonSuw - 16.7.2009, 19:21
PM MAIL ICQ   Вверх
Logo
Дата 17.7.2009, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



DaemonSuw
glob (встроенная) возвращает массив в списковом контексте, а в скалярном она при следующем вызове  возвращает следующий файл. Если файлов много, то считывать все сразу в массив будет не эффективно.
PM MAIL   Вверх
Logo
Дата 17.7.2009, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Еще одна похожая проблема(( $image->Read из Image::Magick не работает, если в пути есть русские буквы и с пробелы. Perl вобще способен работать на чем нибудь, кроме *nix(((((
PM MAIL   Вверх
Logo
Дата 27.7.2009, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Возможно кому-то понадобится, проблема с glob решается взятием пути в кавычки ", или расстановкой экранирующего слеша перед пробелами. Эта функция ведет себя, так как будто использует системный вызов, хотя вроде кемелбуке про перл 5.6 говорится, что от этого отказались давно.
PM MAIL   Вверх
amg
Дата 27.7.2009, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(Logo @  13.7.2009,  21:39 Найти цитируемый пост)
странные глюки однако
Это не глюки, а фичи, поскольку о них написано в документации. Например: "CORE::glob() only accepts a single argument.  Due to historical reasons, CORE::glob() will also split its argument on whitespace, treating it as multiple patterns". Так что Вы совершенно правы, проблема с glob решается взятием аргумента в дополнительные кавычки " или расстановкой экранирующего слеша перед пробелами.

Цитата(Logo @  27.7.2009,  15:45 Найти цитируемый пост)
Эта функция ведет себя, так как будто использует системный вызов
Какой там системный вызов! Стандартный шелл винды (cmd) масок в принципе не понимает.

PM MAIL   Вверх
Logo
Дата 27.7.2009, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Понятно, пробел используется чтобы задать несколько масок, оставили это для совместимости.
Цитата

Какой там системный вызов! Стандартный шелл винды (cmd) масок в принципе не понимает.

Понимает, и * и ?, и пробелы также надо в кавычки брать.
PM MAIL   Вверх
amg
Дата 28.7.2009, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(Logo @  27.7.2009,  22:18 Найти цитируемый пост)
Понимает, и * и ? 
Это любопытно. Возможно, Вы пришли к такому выводу на основании работы команд типа dir *.*  Но в этом случае маску раскрывает не cmd, а сама dir.
Проверьте
perl -le "print $_ for @ARGV" *.*

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0530 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.