Perlコーディング初心者質問スレ Part 58
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2008/08/06(水) 22:54:32ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ http://pc11.2ch.net/test/read.cgi/php/1203935151/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0413s
2008/11/12(水) 12:10:26ID:DKrfzJ/y0414k
2008/11/12(水) 12:10:49ID:DKrfzJ/y0415nobodyさん
2008/11/12(水) 12:41:44ID:???Winだと:はドライブ名の指定にしか使えないんじゃなかったっけ。
Eドライブにもファイルできてるかもな
0416nobodyさん
2008/11/12(水) 13:23:26ID:???0417nobodyさん
2008/11/12(水) 14:31:59ID:???0418nobodyさん
2008/11/12(水) 14:51:00ID:???0419Pentium
2008/11/12(水) 21:28:24ID:???ストリームって初めて知りました。
lfnutils というのを使って調べてみたら、確かにストリームにデータが記録されていました。
バイナリデータのため、文字化けしている部分がありますが >>408 と同様のデータでした。
http://www.monyo.com/technical/products/lfnutils/
すっごく、スッキリしました。
みなさん、ありがとうございました。
0420nobodyさん
2008/11/19(水) 17:11:01ID:???TripletaiLを使用して、CSVにデータを追加出力がしたいです。
Tripletail::CSVとTripletail::Filter::CSVが有るようですが、
画面上には何も表示なく保存又は上書き保存がしたいです。
良い方法はありますでしょうか?
ご教授御願いいたします。
0421nobodyさん
2008/11/19(水) 18:35:04ID:???0422nobodyさん
2008/11/22(土) 20:18:49ID:???0423nobodyさん
2008/11/23(日) 20:39:20ID:bs2lqy3Vと
my $hoge = Hoge->new;
は同じですか?同じだとしたら何故二つの呼び方があるのですか?
0424nobodyさん
2008/11/23(日) 20:41:59ID:???で、何故かについてはLarry Wallに聞いてくれ。
0425nobodyさん
2008/11/23(日) 20:47:43ID:???確かにこうやっても値渡らないね
0426nobodyさん
2008/11/23(日) 21:03:39ID:???なら行けなかったっけ? 最近この書き方していないからうろ覚えだが。
0427nobodyさん
2008/11/23(日) 22:14:26ID:???$obj = new Hoge
ってして、メソッド実行するときは
$obj->something();
ってしてるな。
0428nobodyさん
2008/11/23(日) 22:18:28ID:???0429nobodyさん
2008/11/24(月) 18:20:18ID:???ウォール(笑)
0430nobodyさん
2008/11/24(月) 21:27:28ID:???0431nobodyさん
2008/11/24(月) 21:35:16ID:???$obj= Hoge::new('Hoge');にすればいいかもな
0432nobodyさん
2008/11/25(火) 00:44:42ID:???確かめちゃったじゃんか。
ex.1)
use Data::Dumper ;
my $obj = new Data::Dumper [qw( hoge foo )];
print $obj->Dump ;
ex.2)
{
package Hoge ;
use Data::Dumper ;
sub new{ return bless { dat => \@_ }, shift ; }
sub echo{ print Dumper shift->{dat} ; }
}
my $obj1 = new Hoge q{hoge}, q{foo} ; $obj1->echo ;
0434nobodyさん
2008/11/26(水) 12:05:49ID:???特に、言語はPerlに限ったことではないんですが、CGIでソケットを使いた
いのです。
そこで質問ですが、レンタル・サーバーで、独自にポートを開くことは
可能でしょうか? 禁止されていて開けない可能性はありますか?
レンタルサーバー上で、CGIで独自にソケット/ポートを利用したプログ
ラミングの例はあるでしょうか?
0435nobodyさん
2008/11/26(水) 12:08:28ID:???0437nobodyさん
2008/11/26(水) 12:10:58ID:???0438nobodyさん
2008/11/26(水) 12:35:57ID:y5MzewIk1台まるごと借りるサーバーなら大丈夫だとは思うけど、そんなんだったら自鯖立てたほうがいいよ
(ちゃんと管理できるならね)
0439nobodyさん
2008/11/27(木) 04:12:01ID:???1: 自分はこういう事がしたい。
動的に作成されるpngの画像(具体的には株価チャート)をgifに変換したい
2: それでこんな風にやってみたが・・・
socketで画像を取得→imagemagickでgifに変換
3: こんなエラーが出て上手く行かなかった。
socketで取得した画像をimagemagickにどうやって渡せばいいか分からない
補足:
socketでの画像取得はできています(表示文を付けたらブラウザで見れました)
png→gif 変換はできています(テストイメージでできました)
tempイメージをサーバに作成しない方法で実現したいです(メモリ上で完結)
use Socket;
(省略)
画像取得処理
print "Content-type: image/gif\n\n";
while (<SOCKET>){print $_;}
↑テスト用表示文
(省略)
use Image::Magick;
$tempimage = Image::Magick->new();
$tempimage->Read($inimage);
↑ここでsocketのデータを渡したい
$tempimage->Write($putsam);
(終了)
0440nobodyさん
2008/11/27(木) 07:58:39ID:???open(IMAGE, 'image.gif');
$image->Read(file=>\*IMAGE);
close(IMAGE);
って公式にあるだろ…、それとファイルハンドルのなんたるかが
きちんと扱えればどうにかならないか?
0441nobodyさん
2008/11/27(木) 23:22:00ID:cBVqxC3+0442nobodyさん
2008/11/27(木) 23:33:30ID:???0443nobodyさん
2008/11/28(金) 00:37:03ID:???おっしゃるとおり、ファイルハンドルの何たるかを知りません。
socketに格納されてるバイナリデータをどうやって変数に代入すればいいのか
わかりません。変数に代入できれば先に進めそうなのですが。
バイナリデータをBlob形式に変換できればBlobToImageでできそうですね。
今日、調べてみます。
0444nobodyさん
2008/11/28(金) 02:13:22ID:???BlobToImageが一番安全っぽい。
0445nobodyさん
2008/11/28(金) 02:54:47ID:???$image->Read(file=>\*SOCKET);
メモリだけで完結するじゃん(落るらしいから意味ないけど)
0446nobodyさん
2008/11/28(金) 02:59:50ID:???一旦ファイル作っちゃった方がサーバーに優しくない?って気もするけどなんでオンメモリ何だろ?
ファイルハンドルになっちゃえばImageMagickで処理出来るよね?
こんな感じのできなかったけ?
my $buff;
open my $fh,'+>',\$buff;
print $fh <SOCKET>;
seek($fh,0,0);#fseekだっけ?
0447nobodyさん
2008/11/28(金) 08:12:17ID:???方がサーバに不可が掛らんと主張してるんだぞ君は。
0448nobodyさん
2008/11/28(金) 10:49:59ID:f7u8ti6kいつの時代からメインメモリより DISK および DISK I/O の方が処理コスト安くなったの?
0449nobodyさん
2008/11/28(金) 11:32:22ID:???0450nobodyさん
2008/11/28(金) 12:22:28ID:???それで問題あるなら、Image::Magickを使用することから見直した方がいい。
0451nobodyさん
2008/11/28(金) 13:23:12ID:???ReadもBlobToImageもだめみたいだったので
SOCKETから一回取り出してperlでバッファリングして
imagemagickの中でもバッファリングして
と無駄が多いなと感じて書きましたが
言われてみてればたしかにたいしたサイズでもないですね
0452nobodyさん
2008/11/28(金) 17:30:25ID:f7u8ti6kuse strict;
use CGI::Carp qw(fatalsToBrowser);
use warnings;
use CGI;
use LWP::UserAgent;
use Image::Magick;
my $ua = new LWP::UserAgent;
$ua->agent('IE5');
$ua->timeout(10);
my $response = $ua->get("http://i.yimg.jp/images/evt/ramen2008/shop/2/shop_il01.gif");
my $data = $response->is_success ? $response->content : undef;
#if(defined($data)){
# print "Content-Type: image/gif\n\n";
# print $data;
#}
my $image = new Image::Magick;
$image->BlobToImage($data);
print "Content-Type: image/png\n\n";
print $image->ImageToBlob(magick => 'png');
0453nobodyさん
2008/11/28(金) 19:56:27ID:???452さんの回答で出来てしまいましたね…。すごいです。
my $data = $response->is_success ? $response->content : undef;
↑の部分をSOCKETで実現する方法を実装できなくて悩みまくりました。
(SOCKET画像取得処理)
my $data = SOCKETで取得した画像
↑を実装する方法は引き続き勉強します。
0454nobodyさん
2008/11/28(金) 19:59:50ID:???0455nobodyさん
2008/11/28(金) 20:16:09ID:???まあ、そうなんですよね。
SOCKET使える環境で必ずLWPを使えるのであれば(よく知りませんが…)、
ほとんど意味ないですね。処理性能面でSOCKET優位等の理由がない限り。
みなさまのおかげでやっと実現できました。ありがとうございます。
0456nobodyさん
2008/11/29(土) 22:46:07ID:???0457nobodyさん
2008/11/30(日) 01:47:08ID:???設置方法で分からないことがあります。
今回作成したPerlのCGIをpng2gif.cgiとして、
urlをパラメータとし、以下のように出力します。
print "Content-Type: image/gif\n\n";
print $image->ImageToBlob(magick => 'gif');
htmlに
�@<img src="png2gif.cgi?http://chart.cn.yahoo.com/t?s=000001.SS">
と記述すれば問題なく動きます。
が、SSIとして記述する場合、どうすればよいのでしょうか?
�A<img src="<!----#include virtual="png2gif.cgi?http://chart.cn.yahoo.com/t?s=000001.SS"-->">
�B<!--#include virtual="png2gif.cgi?http://chart.cn.yahoo.com/t?s=000001.SS"-->
�Aは<img src ="">となりNG
�Bはバイナリデータがそのまま出力(GIF89a〜文字化けの羅列)されてNG
�Bはcgi側でgif形式で出力しているので理解できるのですが、�@と�Aで動きが違うのはどうしてなのでしょう?
SSIとしてこのcgiを動かすにはどうすればよいのか分かりません…。
0458nobodyさん
2008/11/30(日) 02:09:05ID:o6oyERaL(3) は src には PATH であったり URL を指定すべきところにバイナリを出力してるから
(2) は t?s の部分をエスケープしてみたり、<!---- をちゃんと書き直してみたりしたらどうでしょう?
0459nobodyさん
2008/11/30(日) 02:54:50ID:???(0)<img src="png2gif.cgi?http://chart.cn.yahoo.com/t?s=000001.SS"><br>
(1)<img src="<!--#include virtual="png2gif.cgi?http://chart.cn.yahoo.com/t?s=000001.SS"-->"><br>
(2)<img src="<!--#include virtual="png2gif.cgi\?http://chart.cn.yahoo.com/t?s=000001.SS"-->"><br>
(3)<img src="<!--#include virtual="png2gif.cgi?http://chart.cn.yahoo.com/t\?s=000001.SS"-->"><br>
(4)<img src="<!--#include virtual="png2gif.cgi\?http://chart.cn.yahoo.com/t\?s=000001.SS"-->"><br>
(5)<!--#include virtual="png2gif.cgi?http://chart.cn.yahoo.com/t?s=000001.SS"--><br>
(6)<!--#include virtual="png2gif.cgi\?http://chart.cn.yahoo.com/t?s=000001.SS"--><br>
(7)<!--#include virtual="png2gif.cgi?http://chart.cn.yahoo.com/t\?s=000001.SS"--><br>
(8)<!--#include virtual="png2gif.cgi\?http://chart.cn.yahoo.com/t\?s=000001.SS"--><br>
結果
(0)正しい画像が出力される
(1)<img src="GIF89a〜文字化け〜"><br>
(2)<img src="[an error occurred while processing this directive]"><br>
(3)<img src=""><br>
(4)<img src="[an error occurred while processing this directive]"><br>
(5)GIF89a〜文字化け〜<br>
(6)[an error occurred while processing this directive]<br>
(7)<br>
(8)[an error occurred while processing this directive]<br>
タグ内にSSIを埋め込むことができないのでは?と思いましたが、結果を見ると問題なさそうです。
img srcのパラメータにバイナリデータをそのまま書いてしまっているように見えます。
img srcへの渡し方(ファイルを示すURL?)に問題がありそうです。難しい…。
0460nobodyさん
2008/11/30(日) 12:17:00ID:???img要素などを経由させるしかない。
つか、(0)をSSIに書いとけばいいんじゃないのか?
0461nobodyさん
2008/11/30(日) 12:33:15ID:???#!/usr/bin/perl
print "Content-Type: text/html\n\n";
print "<img src=\"png2gif.cgi\?http://chart.cn.yahoo.com/t\?s=000001.SS\">";
で、htmlに
<!--#include virtual="test.cgi"--><br>
で表示できました。
後だしで申し訳ないのですが、ssiでやりたかったのはhtmlソース上にcgi名を
表示させたくなかったという理由があります。
png2gif.cgiの方をいじらないとだめそうですね。ありがとうございます。
0462nobodyさん
2008/12/05(金) 20:58:52ID:???なんで?
0464nobodyさん
2008/12/06(土) 00:31:10ID:???newのみがクラスメソッドで、それ以外のメソッドがインスタンスメソッドだと思って間違いないでしょうか?
0465nobodyさん
2008/12/06(土) 01:12:27ID:???0466nobodyさん
2008/12/06(土) 14:04:47ID:nchXLVyQと呼び出した時 aaa のなんのメソッドが呼ばれるの?
aaa->new は new が呼ばれてるのは分かるけど …
0467nobodyさん
2008/12/06(土) 14:19:58ID:???package aaa;
use strict;
use warnings;
sub aaa {
warn "aaa::aaa";
bless {}, shift;
}
sub new {
warn "aaa::new";
bless {}, shift;
}
package main;
use strict;
use warnings;
aaa aaa;
0468nobodyさん
2008/12/06(土) 14:26:33ID:???書き方が違うだけでnewを呼んでる。
new aaa ; # 間接オブジェクト記法
aaa->new ; # 直接オブジェクト記法
{ package Foo ; sub new { bless {}, shift } sub get { "hoge\n" } }
print Foo->new->get ; # 直接
これを間接で書くと
print +( get { new Foo } ) ;
0469nobodyさん
2008/12/06(土) 14:55:41ID:???http://www.nicovideo.jp/watch/sm5377306
0470nobodyさん
2008/12/07(日) 00:51:48ID:5kiTreoU明示的に書いてやるかどうかの違いなワケっすね
0471nobodyさん
2008/12/08(月) 22:17:51ID:H0AbHxek$mail = "[email protected]"
$mailから文字列 foo と @mail.com を抜きだすにはどうしたらいいでしょうか?
0472nobodyさん
2008/12/08(月) 22:26:41ID:???0473nobodyさん
2008/12/09(火) 00:53:33ID:1e6/3LhQ0474nobodyさん
2008/12/09(火) 01:59:53ID:???0475nobodyさん
2008/12/09(火) 06:21:12ID:???$mail = '[email protected]';
と書かないとダメだろ。俺も前に嵌ったことあるw
0476nobodyさん
2008/12/09(火) 11:16:40ID:1e6/3LhQ分離後の後者側には @ はいらないでしょ
それに分離するってことはホスト名が欲しいワケだよね?
だったら @ は邪魔なゴミじやない?
0477nobodyさん
2008/12/09(火) 11:18:20ID:???0478nobodyさん
2008/12/09(火) 14:29:32ID:D4e6X4gIできました!
ありがとうございます
@も含めて抜きだしたかったんです。
0479nobodyさん
2008/12/09(火) 23:43:03ID:ope7KV64本や入門サイトをあちこち見ても書き方が違うのです。
こちらの常連様方はどのように書いてますか?
0480nobodyさん
2008/12/09(火) 23:52:30ID:???0481nobodyさん
2008/12/10(水) 00:34:49ID:???echo content-type: text/plain
echo.
echo Hello World
これで出る
0483nobodyさん
2008/12/10(水) 11:51:10ID:???0484nobodyさん
2008/12/10(水) 12:11:54ID:???この . 忘れると、echoはoffです。が出るんだよなw
0485nobodyさん
2008/12/11(木) 01:03:04ID:???IO::Fileみたいなオブジェクトで$fh->getlineとしても$_に代入されません。
暗黙的に$_に代入させる方法はないでしょうか
0486nobodyさん
2008/12/11(木) 02:02:51ID:???で、お前さんの言ってる事がやりたくて、先人様がIO::Fileと言うラッパを生みだしたんだ。
use IO::File ;
my $fh = new IO::File;
if ($fh->open("< file")) {
while ( <$fh> ){ print ; }
$fh->close;
}
0487nobodyさん
2008/12/11(木) 02:10:00ID:???失敬。
0488nobodyさん
2008/12/11(木) 02:22:01ID:???0489nobodyさん
2008/12/11(木) 09:11:50ID:???0490nobodyさん
2008/12/11(木) 11:02:32ID:???文字数制限があったBASICの時代ならいざ知らず
0491nobodyさん
2008/12/11(木) 12:04:21ID:???シュワルツ変換とかで↓みたいなコードを曝されたらねえ、、、
my @foo
= map { my $ref = $_ ; $ref->[0] }
sort{ $a->[1] <=> $b->[1] }
map { my $val = $_ ; my $ref = [ $val , length $val ] ; $ref ; }
@bar
;
必要に応じて、適宜採用するのが良いと思うよ。
my @foo
= map{ $_->[0] }
sort { $a->[1] <=> $b->[1] }
map { [ $_, length $_ ] }
@bar
;
0492nobodyさん
2008/12/11(木) 14:21:39ID:???貴様、ラリー先生ですね!
0494nobodyさん
2008/12/12(金) 18:35:52ID:???0495nobodyさん
2008/12/12(金) 20:03:18ID:???0496nobodyさん
2008/12/12(金) 22:19:56ID:???0497nobodyさん
2008/12/12(金) 23:14:49ID:???http://search.cpan.org/search?q=speech&m=all&n=100
http://search.cpan.org/search?q=speak&m=all&n=100
0498nobodyさん
2008/12/12(金) 23:59:34ID:t4dUYMwZたとえばABCという文字の1番目と3番目を替える場合
$hoge = "ABC";
$s1 = substr($hoge,1,1)
$s2 = substr($hoge,3,1)
0499nobodyさん
2008/12/13(土) 00:01:31ID:???$hoge = "ABC";
$s1 = substr($hoge,1,1);
$s2 = substr($hoge,3,1);
substr($hoge,3,1) = $s1;
substr($hoge,1,1) = $s2;
で、できると思いますが、もっとスマートなやり方はないでしょうか?
0500nobodyさん
2008/12/13(土) 00:20:33ID:???$hoge = "ABC";
$s1 = substr($hoge,1,1);
substr($hoge,1,1) = substr($hoge,3,1,$s1);
0501nobodyさん
2008/12/13(土) 00:24:19ID:???0502nobodyさん
2008/12/13(土) 00:29:52ID:???ちなみに君の書いたコードだとACB
0503nobodyさん
2008/12/13(土) 00:42:46ID:???$hoge = reverse $hoge ;
じゃなきゃ
substr $hoge, 0, 3, reverse substr $hoge, 0, 3;
ちゅー手も。
0504nobodyさん
2008/12/13(土) 00:51:10ID:???深夜ありがとうございます。
文字数は非固定で、入替える文字もランダムですので、正規表現は無理そうです。
>>ちなみに君の書いたコードだとACB
確認せず書いてすみませんでした。
$hoge = "ABC";
$s1 = substr($hoge,0,1);
substr($hoge,0,1) = substr($hoge,2,1,$s1);
ですね。
もうちょっと考えてみます。
0505nobodyさん
2008/12/13(土) 01:01:23ID:???0506nobodyさん
2008/12/13(土) 15:58:49ID:???Perl が来た時代なんてあったのか?
0507nobodyさん
2008/12/13(土) 19:27:09ID:???ttp://www.hamakin.net/search/my_page_rank.html
このツールみたいに演算中に「演算中」と出しておいて終わったら
結果を表示したいのですがわかりません。。
これみたいなキーワードチェックツールを作っていてツール自体は
作れそうなのですが、「演算中」表示が解決できず困っています。
本当は、「演算中」ではなく、「10位まで終了」「20位まで終了」
としたいのですが、どちらもさっぱりで。。
0508nobodyさん
2008/12/13(土) 19:36:16ID:???だいたい、本当にそんな時間かかってるなら鯖の負担が大変だw
0509nobodyさん
2008/12/13(土) 20:08:28ID:???substr($hoge, 0, 1, substr($hoge, 2, 1, substr($hoge, 0 , 1)));
無理に文字列で操作しなくても、配列で操作してもいいんじゃないか。
my @hoge = split //, $hoge;
@hoge[0, 2] = @hoge[2, 0];
$hoge = join('', @hoge);
実際の操作が一回ならアレだけど、複数回適用するなら配列の方が楽。
0510nobodyさん
2008/12/13(土) 20:44:38ID:???すごいの?
レンタルサーバでやろうとしてたんだけど、迷惑かな。。
0511nobodyさん
2008/12/13(土) 21:10:00ID:???どうでもいいが
0512495-500
2008/12/13(土) 21:25:19ID:???配列の案までありがとうございます。
substr($hoge,0,1) = substr($hoge,2,1,substr($hoge,0,1));
で一行にまとめたのですが、
substr($hoge, 0, 1, substr($hoge, 2, 1, substr($hoge, 0 , 1)));
なんて事までできるのですね。
どれが一番よいかベンチとって、使用したいと思います。
■ このスレッドは過去ログ倉庫に格納されています