uzullaがブログ

uzullaがブログです。

file_get_contents的な事がやりてえんだよ!

前置き

メモです。
PHPでさくさくとファイル読み書きしていて、Perlだとなんでこんなクソ面倒くさいことをしないといけないんだ!って悩んでる人も参考になると思います。


情報提供makamakaさんです。

file_(get|put)_contents相当なのは

use File::Slurp;

#read
$res = read_file('path/to/file.ext');

#write
write_file("/path/to/file.ext", $some_data);

「俺はHTTPでゲットして保存したいんだよ!」

use File::Slurp;
use Furl;

$furl = new Furl();
$res = $furl->get('http://example.co.jp/file.jpg'); 
die $res->status_line unless $res->is_success;
write_file("/path/to/file.jpg", $res->content);

なげえよ糞が!もっとPHPみたいにかきてえんだ!

例えば

file_put_contents('/path/to/file.jpg', file_get_contents('http://example.co.jp/file.jpg') );

ってやりたいんだよ!

回答1

use File::Slurp;
use File::HTTP qw(:open);

open(my $fh, '<', 'http://example.co.jp/file.jpg') or die $!;
write_file("/path/to/file.jpg", <$fh>);

回答2

use PerlIO::http;
use File::Slurp;

open(my $fh, '<:http', 'http://example.co.jp/file.jpg') or die $!;
write_file("/path/to/file.jpg", <$fh>);

なげえよ糞が!1行でかかせろ!!PHPでもできるんだぞ!!!

use File::Slurp;
use Acme::URL;

write_file("/path/to/file.jpg", http://example.co.jp/file.jpg );

※上のコードはURLがBareword(文字列としてクオートされていない)ですが正しいです


ナニッ!?
*1


蛇足、まともな回答

tokuhiromさんに一番ただしい正解をもらってしまった。

mirror()の存在はPHPer脳では忘れやすいので、get()もいいですね。

use LWP::Simple;
use File::Slurp;

write_file("/path/to/file.jpg", get('http://example.co.jp/test.jpg'));

*1:あくまでAcme(ネタや、ウル技多用で常用はおすすめできない)モジュールです