URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9855
[ Назад ]

Исходное сообщение
"запись в память вместо файла"

Отправлено erl500 , 15-Апр-14 12:57 
Есть shell-скрипт который создает .txt файл в заданном формате.
Далее перл скрипт скачивает файлы по ссылкам из этого .txt файла.
Данные в .txt файле выглядят как:

<name> <date> <url1> <url2>

Perl-скрипт начинается так:

...
my $file = "url_file";

open FH, $file or die "can't open $file: $!";

for (;;) {
    exit if (stat(FH))[3] == 0;

    while (<FH>) {
        chomp;

        # razbivaem stroky splitom
        my @str = split(" ", $_);

        $usr = $str[0]; #name
        $dir = $str[1]; #date
        $url = $str[2]; #link1
        $url2= $str[3]; #link2
...

Возможно ли вместо
my $file = "url_file";
вставить сразу вызов шелл-скрипта, чтобы _не_использовать .txt файл вообще, а сразу обрабатывать вывод перлом?


Содержание

Сообщения в этом обсуждении
"запись в память вместо файла"
Отправлено Pahanivo , 15-Апр-14 13:42 
> Возможно ли вместо
> my $file = "url_file";
> вставить сразу вызов шелл-скрипта, чтобы _не_использовать .txt файл вообще, а сразу обрабатывать
> вывод перлом?

my $file = `man man`;
вы хотябы первые 10 страниц из любой книжки по перлу прочитайте чтоле ...


"запись в память вместо файла"
Отправлено XAnder , 15-Апр-14 13:59 
> Возможно ли вместо
> my $file = "url_file";
> вставить сразу вызов шелл-скрипта, чтобы _не_использовать .txt файл вообще, а сразу обрабатывать
> вывод перлом?

Если этот шелл-скрипт может выводить в STDOUT, то как-то так:

my $file = "script.sh|";

В документации к функции open это хорошо описано.

Кстати, почему бы там дальше не писать так:

my ($usr, $dir, $url, $url2) = split;


"запись в память вместо файла"
Отправлено upf , 15-Апр-14 15:02 
>
my $file = "script.sh|";

простите, а классически через косой апостроф`/path/script` нынче уже не модно?


"запись в память вместо файла"
Отправлено XAnder , 15-Апр-14 15:57 
>>
my $file = "script.sh|";

> простите, а классически через косой апостроф`/path/script` нынче уже не модно?

Это разные вещи. "Косой апостроф" вернёт вывод программы как строку. А open FH, "proga|" откроет конвейер (pipe), из которого можно читать, как из файла. Первый способ хорош, если вывода немного, и выводится он быстро. Второй - более универсальный.


"запись в память вместо файла"
Отправлено upf , 15-Апр-14 16:33 
> Первый способ хорош, если вывода немного, и выводится он быстро.
> Второй - более универсальный.

нууу у автору тут вариантов масса просто:
http://perldoc.perl.org/perlop.html#I%2fO-Operators
перл всетаки )) и первый и второй способ описаны, и сотый, и стопервый )))


"запись в память вместо файла"
Отправлено XAnder , 15-Апр-14 17:04 
>> Первый способ хорош, если вывода немного, и выводится он быстро.
>> Второй - более универсальный.
> нууу у автору тут вариантов масса просто:
> http://perldoc.perl.org/perlop.html#I%2fO-Operators
> перл всетаки )) и первый и второй способ описаны, и сотый, и
> стопервый )))

Это верно, за что и любим Перл :-) Слово "способ" было не очень удачным, скорее "подход" - взять всё сразу или кусочками. А из способов ещё можно отметить IPC::Open2/3 и довольно удобный IPC::Run.


"запись в память вместо файла"
Отправлено Pahanivo , 15-Апр-14 20:14 
> Это верно, за что и любим Перл :-) Слово "способ" было не
> очень удачным, скорее "подход" - взять всё сразу или кусочками. А
> из способов ещё можно отметить IPC::Open2/3 и довольно удобный IPC::Run.

упрекну лишь в том что подход и способ это синонимы ...


"запись в память вместо файла"
Отправлено михалыч , 15-Апр-14 14:26 
Объединить и переписать.
1. всё на sh, переписав perl скрипт, скачивать файлы через wget
2. всё на perl, переписав sh скрипт, скачивать файлы через wget, curl

"запись в память вместо файла"
Отправлено pavlinux , 16-Апр-14 15:46 
> 2. всё на perl, ... скачивать файлы через wget, curl

Неувязочка.

use File::Fetch;
my $url = 'http://www.example.com/file.txt';
my $ff = File::Fetch->new(uri => $url);
my $file = $ff->fetch() or die $ff->error;

иль

use LWP::Simple;

getstore("http://www.example.com/file.txt", "/tmp/file.txt");