トップページ⇒php
1001コメント296KB

Perlコーディング初心者質問スレ Part 58

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2008/08/06(水) 22:54:32ID:???
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >2 以降

前スレ http://pc11.2ch.net/test/read.cgi/php/1203935151/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0376nobodyさん2008/11/06(木) 11:15:22ID:???
そこじゃなくて、モジュールインストールできんのかっつーとこじゃねーの?
0377nobodyさん2008/11/06(木) 12:29:12ID:???
入ってるサーバ使えばいいじゃん。
今時mysqlとSQLiteくらいは使えるとこ結構あるよ
http://atpages.jp/

てかめんどくさいから好きなの使いなよ
http://atbb.jp/
http://atbbs.jp/
http://atchs.jp/
http://atpaint.jp/
http://rentalbbs.livedoor.com/
0378nobodyさん2008/11/07(金) 00:12:30ID:???
>>376
適当な場所に置いてuse libで良くね?
0379nobodyさん2008/11/07(金) 00:27:13ID:???
DBD::SQLiteはSQLiteはいってないとダメじゃ?
0380nobodyさん2008/11/07(金) 00:35:54ID:???
Cのコンパイラだけあればファイル揃ってなかったっけ?
あとDBD::SQLiteよりDBD::SQLite::Amalgamation使ったほうがよくないか
それにしてもパッチあてないといけなかった気がするけど。
0381nobodyさん2008/11/07(金) 00:52:40ID:???
>>379
要りません。ていうかDBD::SQLiteはperl用SQLite込です。
0382nobodyさん2008/11/07(金) 11:15:39ID:???
仕事だと、既にレンタル鯖借りちゃってるんでここで、みたいなクライアントがたまにいる
鯖変更の交渉も含め、金額に見合った仕事をするようにしないとなぁ、と思う。
0383nobodyさん2008/11/07(金) 23:46:31ID:???
ロリぽやさくらでもSQLiteくらい入ってるぜ?
0384nobodyさん2008/11/08(土) 00:04:00ID:???
小さい会社でドメイン取得が流行ったころに借りてるところって、
Perlのverが5.6以下だったりするところけっこうあるんだよなぁ。
どちらにしても会社のサイトがロリポはないよね。名前的にw
0385nobodyさん2008/11/08(土) 00:28:47ID:???
5.6以下って5.6ならいいじゃん。

まーPerl5ならなんとかなる。5未満は死んでくれ・・・
0386nobodyさん2008/11/08(土) 00:48:56ID:???
SQLite の話が出てたので試しに使ってみた。
WindowsXP, ActivePerl 5.6.1

create table で失敗してるようなんだけど、どうやって調べればいいんだろう?

my $sql = <<'_SQL_';
CREATE TABLE test (
id integer primary key,
name
)
_SQL_
my $sth = $dbh->do($sql);

の実行後に

my $sql = sprintf "INSERT INTO %s (%s) VALUES(%s)", $table, keys %{$hashref}, (join ',', '?' x scalar(values %{$hashref}));
my $sth = $dbh->prepare($sql);
$sth->execute(values %{$hashref});

を実行すると、

DBD::SQLite::db prepare failed: no such column: name(1) at dbdimp.c line 268 at sqlite.pl line 41.
Can't call method "execute" on an undefined value at sqlite.pl line 42.

ってエラーがでる。
$hashref = {id => 1, name => "hoge"};
です。
0387nobodyさん2008/11/08(土) 00:56:12ID:???
成形した$sqlを表示してみそ
03883862008/11/08(土) 01:05:43ID:???
ゴメン、 上のはなかったことにしてください。
keys %{$hashref} と (join ',', '?' x scalar(values %{$hashref})) は間違い。
03893862008/11/08(土) 01:22:05ID:???
これで出来た。
my $sql = sprintf "INSERT INTO %s (%s) VALUES(%s)",
$table, join(',', keys %{$hashref}) ,join(',', ('?') x scalar(values %{$hashref}));

ところで、データベースはどこに作成されるのですか?
スクリプトのあるディレクトリに dbname というファイルが作成されますが、サイズは 0 バイトです。
03903872008/11/08(土) 01:28:36ID:???
ハッシュの順番は保証されてないっしょ
03913862008/11/08(土) 01:43:51ID:???
>>387
keys で返ってくるキーの順番は保証されないけど、keys と values が同じ順番で返ってくるのことは保証されているのでは?
0392nobodyさん2008/11/08(土) 01:56:38ID:???
keys, values, eachは同じ順番で返ってくるのが保証されてるから大丈夫
0393nobodyさん2008/11/08(土) 06:41:27ID:???
しかし、>>386 とかみたら疲れるよなぁ。
複雑な演算をしないなら >>371 みたいに原始的なほうが扱いやすい。
03943862008/11/08(土) 16:02:05ID:???
DBはまだ使い慣れていないので、今はテキストファイルを >>371 のやり方か、
↓のやり方で扱ってます。

my @column = qw(id name);
my %data;
@data{@column} = split /\t/;
my $id = $data{id};
0395nobodyさん2008/11/08(土) 23:58:41ID:???
細かいツッコミしちゃうと>>371だとぅまく扱えないんだけどねw
0396nobodyさん2008/11/09(日) 01:11:14ID:tiuPBzgU
すいません。perlと直接関係ないんだと思うのですが、hotmialのアドレス帳のexportする際のcsvファイルを自動で取得したいのですが、
これはどうやったらできるのでしょうか?
mailaddressとパスワードが20セットあり、それのアドレス帳をPGで自動取得したいんです。

同じ事を経験された方いらっしゃいますか?
0397nobodyさん2008/11/09(日) 14:12:58ID:???
>>395
何がうまく扱えないの?
03983862008/11/11(火) 11:21:11ID:???
再度質問なのですが、DBD::SQLite を使って作成したベータベースは、どこに存在するのでしょうか?
よろしくお願いします。
0399nobodyさん2008/11/11(火) 12:05:41ID:???
connect 時のdbnameがファイル名
04003862008/11/11(火) 12:18:50ID:???
そんなん聞いてません
PATHがどこか聞いているのだよ
0401nobodyさん2008/11/11(火) 12:20:57ID:???
だから自分で設定したとこだよ
書かなきゃカレントだろーが
0402nobodyさん2008/11/11(火) 12:21:59ID:???
386はファイル名にはPATHも含まれていることがわからないバカか
0403nobodyさん2008/11/11(火) 13:37:01ID:???
まあ386では処理能力の限界かもしれないw
04043862008/11/11(火) 14:04:05ID:???
カレントってどこから見てのカレントだよバカチン
それぐらいも書けないなら解答すんなチンカス
0405nobodyさん2008/11/11(火) 14:27:24ID:???
もう放置の方向で
ここで答えたら「チンチン言ってたら答えてもらえた」と思ってまたそうするだろう。
0406nobodyさん2008/11/11(火) 14:54:42ID:???
いきなり>>403を読んだのでCPUの話かと思ったw
04073862008/11/11(火) 14:56:38ID:???
簡単に偽者に踊らされるお前らがかわいいw
04084862008/11/11(火) 20:48:30ID:???
本物の386です。
>> 399 レスありがとうございます。

DB接続時のファイル名指定を間違ってました。
my $dbh = DBI->connect("dbi:SQLite:dbname:$mydb","","");

下のように修正したら、スクリプトと同じディレクトリに指定した名称のファイルが作成されました。
my $dbh = DBI->connect("dbi:SQLite:dbname=$mydb","","");
作成されたファイルをバイナリエディタで見るとテーブルの情報やINSERTしたデータも入ってました。
お騒がせしました。

ただ、最初の方法でもデータをINSERTできるし、SELECTするとそれまで入力したデータ(約10件)を取り出せます。
>>389 で書いたように dbname という名称のファイルが作成されているのですが、あいかわらず 0 バイトです。
このファイルはスクリプトを実行してデータをINSERTするたびにタイムスタンプが更新されます。
これは、どうなっているのでしょうか?
0409V302008/11/11(火) 22:03:12ID:???
頭の回転が遅すぎて、何言ってるか理解できないです><
0410nobodyさん2008/11/12(水) 09:47:34ID:???
>>408
環境は?
実体は別のとこにあるのかもね
0411nobodyさん2008/11/12(水) 09:49:46ID:???
ってWindowsXPか。
リンクでもVirtualStoreでもないな。
0412r2008/11/12(水) 12:10:00ID:DKrfzJ/y
内容をフラッシュして閉じてください
0413s2008/11/12(水) 12:10:26ID:DKrfzJ/y
そうすればたぶん
0414k2008/11/12(水) 12:10:49ID:DKrfzJ/y
データが書き込まれると思う
0415nobodyさん2008/11/12(水) 12:41:44ID:???
Winじゃないけど同じようにやったらdbname:mydbみたいなファイルになったぞ
Winだと:はドライブ名の指定にしか使えないんじゃなかったっけ。
Eドライブにもファイルできてるかもな
0416nobodyさん2008/11/12(水) 13:23:26ID:???
ヒント:NTFS ストリーム名
0417nobodyさん2008/11/12(水) 14:31:59ID:???
ああ、確かに副次ストリームなら見えてるファイルの容量は変わらんわw
0418nobodyさん2008/11/12(水) 14:51:00ID:???
そういうことかw
0419Pentium2008/11/12(水) 21:28:24ID:???
386 です。

ストリームって初めて知りました。
lfnutils というのを使って調べてみたら、確かにストリームにデータが記録されていました。
バイナリデータのため、文字化けしている部分がありますが >>408 と同様のデータでした。
http://www.monyo.com/technical/products/lfnutils/

すっごく、スッキリしました。
みなさん、ありがとうございました。
0420nobodyさん2008/11/19(水) 17:11:01ID:???
Perl初心者です。

TripletaiLを使用して、CSVにデータを追加出力がしたいです。
Tripletail::CSVとTripletail::Filter::CSVが有るようですが、
画面上には何も表示なく保存又は上書き保存がしたいです。

良い方法はありますでしょうか?
ご教授御願いいたします。
0421nobodyさん2008/11/19(水) 18:35:04ID:???
Tripletail::CSVかTripletail::Filter::CSVを使えばいいんじゃないかとおもいます
0422nobodyさん2008/11/22(土) 20:18:49ID:???
TripletaiL ってどうなの
0423nobodyさん2008/11/23(日) 20:39:20ID:bs2lqy3V
my $hoge = new Hoge;
と
my $hoge = Hoge->new;

は同じですか?同じだとしたら何故二つの呼び方があるのですか?
0424nobodyさん2008/11/23(日) 20:41:59ID:???
その2つの例文に関して言えば同じ。引数を渡そうとすると後者になるが、まぁ趣味。
で、何故かについてはLarry Wallに聞いてくれ。
0425nobodyさん2008/11/23(日) 20:47:43ID:???
my $hoge= new Hoge, 1;

確かにこうやっても値渡らないね
0426nobodyさん2008/11/23(日) 21:03:39ID:???
my $hoge = new Hoge (引数);
なら行けなかったっけ? 最近この書き方していないからうろ覚えだが。
0427nobodyさん2008/11/23(日) 22:14:26ID:???
個人的にだけど、インスタンス実行するときは
$obj = new Hoge
ってして、メソッド実行するときは
$obj->something();
ってしてるな。
0428nobodyさん2008/11/23(日) 22:18:28ID:???
perl (笑)
0429nobodyさん2008/11/24(月) 18:20:18ID:???
>428
ウォール(笑)
0430nobodyさん2008/11/24(月) 21:27:28ID:???
$obj = Hoge::newは?
0431nobodyさん2008/11/24(月) 21:35:16ID:???
$obj= Hoge::newだと第一引数にHogeが渡らないから
$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 ;
0433nobodyさん2008/11/25(火) 00:54:37ID:???
>>432は、>>424と>>425に対するレスです。
0434nobodyさん2008/11/26(水) 12:05:49ID:???
はじめまして。
特に、言語はPerlに限ったことではないんですが、CGIでソケットを使いた
いのです。

そこで質問ですが、レンタル・サーバーで、独自にポートを開くことは
可能でしょうか? 禁止されていて開けない可能性はありますか?
レンタルサーバー上で、CGIで独自にソケット/ポートを利用したプログ
ラミングの例はあるでしょうか?
0435nobodyさん2008/11/26(水) 12:08:28ID:???
レンタルサーバでソケット通信許可してるところはまず無いと思ったほうがいいよ
0436nobodyさん2008/11/26(水) 12:09:40ID:???
>>435
そう言うものですか?
0437nobodyさん2008/11/26(水) 12:10:58ID:???
1人で占有するレンタルなら使えるかもしれん
0438nobodyさん2008/11/26(水) 12:35:57ID:y5MzewIk
共有鯖は駄目と思ったほうがいい
1台まるごと借りるサーバーなら大丈夫だとは思うけど、そんなんだったら自鯖立てたほうがいいよ
(ちゃんと管理できるならね)
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:???
$image = Image::Magick->new;
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:???
BlobToImageでぐぐれ
0443nobodyさん2008/11/28(金) 00:37:03ID:???
みなさまアドバイスありがとうございます。今帰ってきました。

おっしゃるとおり、ファイルハンドルの何たるかを知りません。
socketに格納されてるバイナリデータをどうやって変数に代入すればいいのか
わかりません。変数に代入できれば先に進めそうなのですが。

バイナリデータをBlob形式に変換できればBlobToImageでできそうですね。

今日、調べてみます。
0444nobodyさん2008/11/28(金) 02:13:22ID:???
Image::MagickのReadにソケット突っ込んだら、例外吐いて落ちた。ワラタ。
BlobToImageが一番安全っぽい。
0445nobodyさん2008/11/28(金) 02:54:47ID:???
>>441
$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 I/O 経由の処理を加えたほうが優しいのか?
いつの時代からメインメモリより DISK および DISK I/O の方が処理コスト安くなったの?
0449nobodyさん2008/11/28(金) 11:32:22ID:???
量の問題だろ
0450nobodyさん2008/11/28(金) 12:22:28ID:???
株式チャートのPNG画像なら、大きくても100kバイト程度だと思うが、
それで問題あるなら、Image::Magickを使用することから見直した方がいい。
0451nobodyさん2008/11/28(金) 13:23:12ID:???
まだreadしてないんだからkernelがメモリ使ってるかもしれないけどperl的にはオンメモリじゃないよね?

ReadもBlobToImageもだめみたいだったので
SOCKETから一回取り出してperlでバッファリングして
imagemagickの中でもバッファリングして
と無駄が多いなと感じて書きましたが
言われてみてればたしかにたいしたサイズでもないですね
0452nobodyさん2008/11/28(金) 17:30:25ID:f7u8ti6k
#!/usr/bin/perl -W

use 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:???
439です。

452さんの回答で出来てしまいましたね…。すごいです。

my $data = $response->is_success ? $response->content : undef;
↑の部分をSOCKETで実現する方法を実装できなくて悩みまくりました。

(SOCKET画像取得処理)
my $data = SOCKETで取得した画像
↑を実装する方法は引き続き勉強します。
0454nobodyさん2008/11/28(金) 19:59:50ID:???
無理にSOCKET使わなくても…
0455nobodyさん2008/11/28(金) 20:16:09ID:???
>無理にSOCKET使わなくても…
まあ、そうなんですよね。

SOCKET使える環境で必ずLWPを使えるのであれば(よく知りませんが…)、
ほとんど意味ないですね。処理性能面でSOCKET優位等の理由がない限り。

みなさまのおかげでやっと実現できました。ありがとうございます。
0456nobodyさん2008/11/29(土) 22:46:07ID:???
キチガイ回答者のグダグダがたまらんスレだなw
0457nobodyさん2008/11/30(日) 01:47:08ID:???
439です。みなさんのおかげでpng→gifはうまくいきましたが、
設置方法で分からないことがあります。

今回作成した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:???
HTMLは画像バイナリデータを解釈できないから、
img要素などを経由させるしかない。

つか、(0)をSSIに書いとけばいいんじゃないのか?
0461nobodyさん2008/11/30(日) 12:33:15ID:???
test.cgiを↓

#!/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:???
> まずね、○に数字の文字は使わないように

なんで?
0463nobodyさん2008/12/05(金) 21:29:37ID:???
>>462
バカにいちいち構わずほっといてやれよw
0464nobodyさん2008/12/06(土) 00:31:10ID:???
変なことをしていないかぎり、モジュール内のメソッドで、
newのみがクラスメソッドで、それ以外のメソッドがインスタンスメソッドだと思って間違いないでしょうか?
0465nobodyさん2008/12/06(土) 01:12:27ID:???
そんなルールはない
0466nobodyさん2008/12/06(土) 14:04:47ID:nchXLVyQ
new aaa

と呼び出した時 aaa のなんのメソッドが呼ばれるの?

aaa->new は new が呼ばれてるのは分かるけど …
0467nobodyさん2008/12/06(土) 14:19:58ID:???
#!/usr/bin/perl

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:???
>>466
書き方が違うだけで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:???
Perl OO入門
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:???
my ( $user, $addr ) = split /(?=@)/, $mail
0473nobodyさん2008/12/09(火) 00:53:33ID:1e6/3LhQ
\@ で大丈夫しゃない?
0474nobodyさん2008/12/09(火) 01:59:53ID:???
@mail.comじゃなくてmail.comでいいならね
0475nobodyさん2008/12/09(火) 06:21:12ID:???
そもそもこれ、
$mail = '[email protected]';
と書かないとダメだろ。俺も前に嵌ったことあるw
0476nobodyさん2008/12/09(火) 11:16:40ID:1e6/3LhQ
@ が1つしか存在しないであろう文字列を split してるんだから
分離後の後者側には @ はいらないでしょ

それに分離するってことはホスト名が欲しいワケだよね?
だったら @ は邪魔なゴミじやない?
■ このスレッドは過去ログ倉庫に格納されています