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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> нужна функция аналогичная implode из php 
:(
    Опции темы
Alximik
Дата 27.7.2005, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



чтоб сильно вас не напрягать поясню что она делает и для чего мне нужна такяже в perl возможно вам проще будет чтото мне подсказать.
и так функция implode в php помогает загрузить текстовый файл.

теперь объясняю что я хочу и для чего мне такая функция нужна:
есть каталог с файлами в формате *.txt скрипт должен загружать эти файлы. так вот какой функцией это можно сделать?
PM MAIL   Вверх
Anarki
Дата 27.7.2005, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



join("string_glue", @array);
Параметры: строка клей, то бишь разделитель в новой строке, и массив

Код:
Код

#use strict;
use Tie::File;
use Fcntl;
my $path = "."; # текущая папка
my $dir = undef;
opendir($dir,$path);
while (defined(my $file = readdir($dir))) {
    next if (($file eq '.') || ($file eq '..')); # пропускаем не-файлы
    # работаем с каждым файлом, загружаем в массив
    my @data = (); # массив
    tie (@data, Tie::File, $file,mode => O_RDONLY) or die("File error :$!\n"); # загружаем файл в массив, файл открылся только для чтения
    my $str = join("\r\n",@data); # переводим массив в строку, где \r\n - разделитель строк файла(MS Windows)
    print "$str\n\n";
}



--------------------
PM WWW   Вверх
korob2001
Дата 31.7.2005, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Так мож но загружать их сразу в строку.
Код

open(F, "file.txt") or die $!;
my $full_file = <F>;
close(F);
#Здесь делаем что-то с переменной $full_file



--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Anarki
Дата 27.8.2005, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Написал аналог функции smile


--------------------
PM WWW   Вверх
Usya
Дата 27.8.2005, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



korob2001

Если я не путаю, то кажется в коде вместо

Код

my $full_file = <F>;


надо

Код

my @full_file = <F>;


иначе получим только одну строчку из файла. А дальше работаем с массивом @full_file.
Хотя, если в файле нет разделителей строк, то вполне пойдет и твой вариант smile
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
korob2001
Дата 27.8.2005, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Опс... Sorry, перепутал с <>.

Это сообщение отредактировал(а) korob2001 - 27.8.2005, 13:16


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Usya
Дата 27.8.2005, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Alximik

Возможно и это тебе пригодится

Определить файлы в каталоге можно по крайней мере двумя способами:

@files=glob('.../dfsd/*.txt');

Иногда я им пользуюсь, однако

Цитата
Такой способ вызывает внешнюю программу glob (также, как и способ
@files=glob("*")). Это неправильно не только потому, что на запуск внешней
программы уходит время и ресурсы, но и потому, что где-нибудь этой программы
может просто не оказаться. Более правильный способ - это:

opendir DIR,'/tmp';
@files=readdir DIR;
closedir DIR;

или

opendir DIR,'/tmp';
while $file (readdir DIR)
{
}
closedir DIR;

Заметьте, что в $file будут подставляться как имена файлов, так и имена
подкаталогов.
Несколько подсказок. Чтобы прочесть список файлов, в котором не содержалось
бы '.' и '..', можно написать следующее:

opendir DIR,'/tmp';
@files=grep !/^\.+$/,readdir DIR;
closedir DIR;

Таким же способом,- с помощью regexp,- можно задавать любые другие маски
файлов.
Если вы хотите прочесть список каталогов, не трогая файлы:

opendir DIR,/tmp';
@dirs=grep {!/^\.+$/ and -d "/tmp/$_"} readdir DIR;
closedir DIR;


Тебе может подойти еще и такой вариант

Код

opendir DIR,'d:/';
@files=grep /\.txt$/,readdir DIR; # $ - означает, что .txt должно быть в конце строки
closedir DIR;


Раньше я так не делал, но вроде работает.
Если что неправильно, думаю меня подправят smile
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
korob2001
Дата 27.8.2005, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Цитата

Такой способ вызывает внешнюю программу glob (также, как и способ
@files=glob("*")). Это неправильно не только потому, что на запуск внешней
программы уходит время и ресурсы, но и потому, что где-нибудь этой программы
может просто не оказаться.

Usya - ты где это взял? smile


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Usya
Дата 27.8.2005, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



По крайней мере здесь точно есть:

http://www.sedinko.ru/perl/doc6.php


--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
korob2001
Дата 28.8.2005, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Вообще-то glob это внутренняя функция. Только до версии 5.6 она использовала внешний процесс, начиная с версии 5.6 она использует внутренний поиск файлов по шаблону.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Usya
Дата 29.8.2005, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Возможно и так.

То, что

Цитата
начиная с версии 5.6 она использует внутренний поиск файлов


это я увидел, а на счет

Цитата
до версии 5.6 она использовала внешний процесс


может быть и так, хотя в доках что-то не нашел. Может плохо искал, может не совсем точно перевел.
Хотя, по большому счету, какая разница. Это важно когда что-то оптимизируешь, но тогда пробуешь все возможные варианты и потом выбираешь с учетом того, какая версия будет на серваке.
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
korob2001
Дата 29.8.2005, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Цитата

Возможно и так

Да не возможно, а так оно и есть. Перед тем как отвечать, я сам ещё раз открыл книгу "Программирование на Perl" Ларри Уолл, Том Кристиансен, Джон Орвант. Кому же как не создателю языка, лучше знать как работает та или иная функция?
Цитата

Это важно когда что-то оптимизируешь, но тогда пробуешь все возможные варианты и потом выбираешь с учетом того, какая версия будет на серваке.

Ну от серваков, где версия Perl ниже 5.6, нужно избавляться, как можно быстрее. smile

Это сообщение отредактировал(а) korob2001 - 29.8.2005, 15:19


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Usya
Дата 29.8.2005, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Теперь Верю! smile

Просто в таких вещах, как ты мне только что сам показал на ошибке в том FAQ-e, можно верить, по большому счету, только первоисточникам!!!
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
Player47
Дата 25.6.2006, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте,

Простите, что поднимаю из пыли старую тему, но вот почему-то не работает ни один из выше приведенных способов.

НО:

Я нашел очень толковый скрипт:

Код

#!/usr/bin/perl -w
use strict;
use diagnostics;
use File::Find;
sleep(5);
# Get the pattern from the input list
my $pattern = shift @ARGV;
# Slurp up the entire contents of a file
$/ = undef;
print qq{Searching for "$pattern".\n};
sleep(5);
# Invoke "find" with a reference to our subroutine,
# with the directories passed as arguments
find(\&find_matches, @ARGV);
sub find_matches
{
my $filename = $_;
# Open the file, and search through its
# contents
sleep(5);
if (open FILE, $filename)
{
# Get the file
my $contents = (<FILE>);
# If there aren't any contents, then return
# right away
return unless $contents;
# Print the filename, with the directory
print qq{$File::Find::dir/$filename\n}
if ($contents =~ m|\b$pattern\b|is);
close FILE;
}
else
{
warn qq{Unable to open
"$File::Find::dir/$filename": $! };
return;
}
}


А вот собственно сам поиск:

Код

#!/usr/bin/perl -w
use strict;
use diagnostics;
use File::Find;
# Invoke "find" with a reference to our
# subroutine, and the initial directory name
my @nested = ("sleep", "shit", "shell");
find(\&print_name, "worksongs");
sub print_name { print "$File::Find::name\n"; }


Проблемка в том, чтобы все это богатство не просто выводилось на экран,
а попадало в массив, с помощью которого потом можно будет работать...
Выручите, а?

 smile 

Заранее благодарен. 
PM MAIL   Вверх
sharq
Дата 27.6.2006, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

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



Player47, в чем проблема? 
Вместо print сделай занесение в массив и в функции возвращай этот массив.

 smile  


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


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

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


 




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


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

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