[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 06/02 01:51 / Filesize : 211 KB / Number-of Response : 664
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:nobodyさん mailto:sage [2011/09/09(金) 18:11:49.71 ID:???]
Perlのコーディングで困ってる人のスレです。

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

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

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

お勧めサイトは >>2 以降

前スレ hibari.2ch.net/test/read.cgi/php/1295170172/

186 名前:nobodyさん mailto:sage [2011/10/06(木) 13:13:47.41 ID:???]
>>185
ありがとうございます。他のところがおかしいんじゃなくてよかったです。
これは入力がなければ出るものなんですね。

187 名前:nobodyさん mailto:sage [2011/10/06(木) 14:16:31.01 ID:???]
>>186
> これは入力がなければ出るものなんですね。
違う。$ENV{'CONTENT_LENGTH'} が未定義 (undef) だから出ている。
STDIN からの入力が無くとも $ENV{'CONTENT_LENGTH'} に 0 が入っていれば出ない。

> Use of uninitialized value%s
> (W uninitialized) 未定義値を、あたかも既に定義されているかのように使用しました。
> これは、"" か 0 と解釈されますが、間違いの可能性があります。
> この警告を止めるには、変数に定義された値を代入してください。

188 名前:nobodyさん mailto:sage [2011/10/06(木) 15:00:33.35 ID:???]
>>184
この「だけのスクリプト」ってのは嘘だな。
CGIとしてだったらこの2行だけでは動かない。

189 名前:nobodyさん mailto:sage [2011/10/07(金) 00:00:35.18 ID:???]
SSI使わずにHTML上にCGI呼び出す方法って<script>タグ以外にありますか?

190 名前:nobodyさん mailto:sage [2011/10/07(金) 01:23:00.44 ID:???]
>>189
<script>タグ勘違いしてる。それはクライアント側での処理だから。
ttかHTML::Templateなどのテンプレートエンジンを考えてみたら。

191 名前:nobodyさん mailto:sage [2011/10/07(金) 03:51:57.20 ID:???]
>>189
img、iframe、cssのimport

192 名前:nobodyさん mailto:sage [2011/10/08(土) 14:37:18.51 ID:???]
https://github.com/motemen/WWW-BBS-2ch
の make test は Result: PASS になり、
SYNOPSIS にあるコードを動かしてみたところ、

Can't call method "add_handler" on an undefined value at /usr/lib/perl5/site_perl/5.10/WWW/BBS/2ch.pm line 39.

と出ました。なので 2ch.pm:39 を見ると、

https://github.com/motemen/WWW-BBS-2ch/blob/master/lib/WWW/BBS/2ch.pm
my $class = shift;
my $self = bless {
ua => LWP::UserAgent->new(agent => "Monazilla/1.00 WWW::BBS::2ch/$VERSION"),
encoding => 'shift_jis',
@_,
}, $class;

$self->ua->add_handler(

という感じです。

Dumper $self->ua; すると undef です。

エディタを開いて試しに自分で
$ua = LWP::UserAgent->new(agent => "Monazilla/1.00 WWW::BBS::2ch/$VERSION");
$ua->add_handler(
とか書くと $ua は取得できて add_handler も動くので CPAN モジュールは問題なく入っているようです。

my $self = bless {} が怪しいのですが、どうすれば WWW::BBS::2ch の SYNOPSIS を動かせるでしょうか。


193 名前:nobodyさん mailto:sage [2011/10/08(土) 17:51:50.13 ID:???]
>>192
$self->{ua} で許して

194 名前:nobodyさん mailto:sage [2011/10/08(土) 18:24:39.39 ID:???]
$self->ua;

sub ua{ }


は定義されてるの?



195 名前:nobodyさん mailto:sage [2011/10/08(土) 23:56:07.90 ID:???]
>>192
どうも https://github.com/motemen/WWW-BBS-2ch の例が間違っているみたい。
| my $bbs = WWW::BBS::2ch->new(cache => $cache, ua => $ua);
ここで $cache, $ua なんて存在しないから。
その通りに入力したら $self->ua は undef になるだろう。ためしに引数無しで
| my $bbs = WWW::BBS::2ch->new;
としたらどうだ。

196 名前:nobodyさん mailto:sage [2011/10/09(日) 16:35:15.15 ID:???]
いまどきCGI.pmって見かけたけど、フレームワーク使えって意味だろうか。
わざわざフレームワーク通すまでもないときはどうするのがモダンなの?


197 名前:nobodyさん mailto:sage [2011/10/09(日) 17:53:18.28 ID:???]
cgi-lib.berkeley.edu/ ん?いや、何でもない…

198 名前:192 mailto:sage [2011/10/09(日) 18:49:28.44 ID:???]
>>195
うわああ、ありがとうございます!
動きましたぁばばばば。

199 名前:nobodyさん [2011/10/11(火) 23:38:30.50 ID:Xx0lESYm]
間違えて「プログラム技術板」に質問を書いてしまいましたが
此方で改めて質問させて下さい。

その1------------
DBIからのSqlサーバへの接続方法をご教示下さい。
質問場所がここじゃなかったら誘導お願いします。

以下の環境を作成し、
コマンドプロンプトからtest.plをCALLしたのですが
SQLサーバがないとのエラーが表示され、接続出来ませんでした。
値を色々変えてみたりしたのですがどうやっても接続できず…
何が悪いのかお手上げ状態です。

接続文字列が悪いのでしょうか…?

ODBCでの接続は行えており、CSEからのDB参照や
コマンドプロンプトからのsqlcmdコマンドでなら正常にアクセスできます。
[sqlcmd /E /S PC-Name\SQLEXPRESS]

環境
・Windows7
・Microsoft SQL Server 2008
・Perl5.0


Server:PC-Name\SQLEXPRESS
DB:sampleDB
User:user
Password:pass



200 名前:nobodyさん [2011/10/11(火) 23:39:50.63 ID:Xx0lESYm]
-----------------------
test.pl
-----------------------
$dataSource = "dbi:ODBC:".
"driver={SQL Server};".
"Server=(local);database=sampleDB;".
"Trusted_Connection=yes;".
"AutoTranslate=No;";
#データベースに接続
$user="user"; #ユーザ名
$pwd="pass"; #パスワード
$dbh = DBI->connect($dataSource,$user,$pwd)
or die $DBI::errstr;
# データアクセス(今は処理無し)
$dbh->disconnect;
-----------------------
エラー内容
-----------------------
DBI connect('driver={SQL Server};Server=(local);database=sampleDB;Trusted_Connec
tion=yes;AutoTranslate=No;','user',...) failed: [Microsoft][ODBC SQL Server Driver
][Shared Memory]SQL Server が存在しないか、アクセスが拒否されました。 (SQL-08001
) [state was 08001 now 01000]
[Microsoft][ODBC SQL Server Driver][Shared Memory]ConnectionOpen (Connect()). (S
QL-01000) at dbtst.pl line 28
[Microsoft][ODBC SQL Server Driver][Shared Memory]SQL Server が存在しないか、ア
クセスが拒否されました。 (SQL-08001) [state was 08001 now 01000]
[Microsoft][ODBC SQL Server Driver][Shared Memory]ConnectionOpen (Connect()). (S
QL-01000) at dbtst.pl line 28.
-----------------------


201 名前:nobodyさん mailto:sage [2011/10/11(火) 23:40:28.76 ID:???]
馬鹿には見えないtest.plが張ってあるらしいな

202 名前:nobodyさん [2011/10/11(火) 23:48:58.55 ID:Xx0lESYm]
その3------------
「その2」を付け忘れてしまいましたが
199-200でワンセットです。

Linux + MySql5.0 + DBIで動作しているシステムを
改造する為のローカルサーバを作成したいので、
どうしてもDBIを使用したいと考えています。

よろしくお願いいたします。


203 名前:nobodyさん mailto:sage [2011/10/12(水) 01:55:18.70 ID:???]
> Server=(local);
この表記はアリなのか?


204 名前:nobodyさん mailto:sage [2011/10/12(水) 04:13:51.23 ID:???]
>>201
そうみたいだね。



205 名前:nobodyさん mailto:sage [2011/10/12(水) 08:22:59.76 ID:???]
よくわからないから外れてるかもしれないけど
sampleDBが文字列じゃなくて変数になってないか?

206 名前:nobodyさん mailto:sage [2011/10/12(水) 12:30:39.86 ID:???]
'' で囲ってみ

207 名前:199 [2011/10/12(水) 18:44:51.34 ID:QKPkC9MD]
アドバイス有難うございます。

>>203
Server=(local);
の表記は、ネット上で拾ったやり方をそのまま使っているので
使える…とは思うのですが…。ちなみに、
Server='PC-Name\SQLEXPRESS';
にしても状況変化なしです。

205 206>>
"database='sampleDB';"
に変更してみましたが、変化なしです。


エラーメッセージで
「SQL Server が存在しないか、アクセスが拒否されました」
とあるので、DBではなくServerへの接続が
失敗しているのではないかと思うのですが

Windows7の場合カーネルの違いから挙動が異なる
といった事はありませんでしょうか?


208 名前:nobodyさん mailto:sage [2011/10/12(水) 19:15:26.58 ID:???]
>>207
いっそのこと、ODBC データソース アドミニストレータ で定義してしまいば?

209 名前:199 [2011/10/12(水) 20:45:40.79 ID:QKPkC9MD]
>>208
有難うございます!

ODBC経由でDBに接続する事でアクセする事が出来ました(>_<。
ユーザDSNに「dbgSQLServer」の名前でDBを登録し、
$dataSource= "dbi:ODBC:dbgSQLServer";
としたら無事SQLの実行まで確認できました。

直接接続する事にこだわる必要は無かったんですね。
何日も悩んでいた事だったので本当に助かりました。

有難うございました。

210 名前:nobodyさん mailto:sage [2011/10/12(水) 22:01:53.09 ID:???]
>>209
よかったよかった!
Windows+PostgreSQLでDBD::Pgが使えなくて困ったときにそうしたんだ。
その時PgPPどころかCPANもわからなかったあのころ。
車輪何個も作っちゃったけど、キニシナイ

211 名前:199 mailto:sage [2011/10/13(木) 18:35:59.97 ID:???]
>>210
本当有難うございました。

PostgreSQLは使ってみようとインストールする時点で
挫折した記憶が…(^^;

プログラムををゴリゴリ書くのは楽しいんですが
何時も環境構築が一番のネックになります。

これでやっとコーディングに入れます♪

212 名前:nobodyさん mailto:sage [2011/10/17(月) 23:46:25.75 ID:???]
ファイルロックについて質問です。

自分は今は rename とか mkdir とか使ってロック機構を実装してますが、
お仕事とかで perl を使ってる人はファイルロックする際には rename とか
mkdir とかでロックかけてるのでしょうか?
それとも flock を使用しているねでしょうか?

「DB 使えや」 ってゆう回答は求めておらず、ファイル読み書き時に於けるロックは、
仕事などではどう対応されているのか気になったもので、質問させていただきました。


213 名前:nobodyさん mailto:sage [2011/10/18(火) 01:32:44.53 ID:???]
確かに「DB使えや」ではあるなw

以前、自分が入社する前に書かれたソースを見たことがあるんだけど、その時はflockを使ってたっぽい。
ただflockすれば良いというものでもなく、きちんとした方法で使わないと全くの無意味だけど。

あと、今ならその辺を上手くやってくれるモジュールがるような気がする。

214 名前:nobodyさん mailto:sage [2011/10/18(火) 06:58:20.05 ID:???]
flockは使えない場合があるので(具体的には自分で調べてくれ)
その場合はmkdirなり使うとかの、別の方法で対処すると思う。
プロとかアマとかはあんまし関係ないんじゃないだろうか。



215 名前:nobodyさん mailto:sage [2011/10/18(火) 12:47:22.63 ID:???]
今のご時世でもflockが使えないとかあるの?

216 名前:nobodyさん mailto:sage [2011/10/18(火) 16:58:19.77 ID:???]
ご時世関係ない

217 名前: 忍法帖【Lv=16,xxxPT】 mailto:sage [2011/10/18(火) 17:43:19.26 ID:???]
>>212
イントラでperl使ってるけど…
ごめん、DB(PostgreSQL)つかってる。
月並みだけど、
DB>flock>その他の手段
だよね。

218 名前:nobodyさん mailto:sage [2011/10/18(火) 17:48:49.73 ID:???]
横槍失礼。
デッドロックに対する対応だけど、
プロセスがkillされるような事態に備えて $SIG でトラップすべきか、
次実行されたときにデッドロックされたファイル情報から指定時間経過してればデッドロックと判断。
どっちがいいんでしょうね。
トラップした方がスムーズにいけるっぽいけど、他の部分で別のトラップがされると実行されない可能性もあったりするんだよね。
迷うわぁ・・・

219 名前:nobodyさん mailto:sage [2011/10/18(火) 22:08:36.70 ID:???]
デッドロックはバグだ。
デッドロックしないようにつくれや

220 名前:nobodyさん mailto:sage [2011/10/18(火) 22:33:11.15 ID:???]
DB使う。

221 名前:nobodyさん mailto:sage [2011/10/18(火) 22:58:12.17 ID:???]
>>219さんは$SIGを適切に設定してる感じですか?

222 名前:nobodyさん mailto:sage [2011/10/18(火) 23:25:30.92 ID:???]
$SIGなの? %SIGじゃないの?

223 名前:nobodyさん mailto:sage [2011/10/19(水) 00:20:24.38 ID:???]
$SIG{} って書いてから {} だけ消したので修正ミスです ^-^;

224 名前:nobodyさん [2011/10/19(水) 00:46:29.74 ID:LOxxA4S5]
GDで文字列を画像に変換するとき
widthを入力しないといけませんよね
全角文字だけなら計算できるのですが、半角英数カナなどが含まれるので余白が発生してしまいます。
あらかじめ文字列の長さをpixelで計算する方法はありませんか?



225 名前:nobodyさん mailto:sage [2011/10/19(水) 09:54:29.71 ID:???]
何も調べずに書くが
cp932に変換してバイト数を調べるのはどうか

226 名前:nobodyさん mailto:sage [2011/10/19(水) 10:42:15.21 ID:???]
>>224
@bounds = GD::Image->stringFT($fgcolor,$fontname,$ptsize,$angle,$x,$y,$string)

227 名前:nobodyさん mailto:sage [2011/10/19(水) 14:19:45.05 ID:???]
>>226
完璧です。ありがとうございました。

228 名前:nobodyさん mailto:sage [2011/10/21(金) 17:01:48.08 ID:???]
GD で機種依存文字を使えるようにするための方法はありますでしょうか

229 名前:nobodyさん mailto:sage [2011/10/22(土) 05:11:26.88 ID:???]
time_%2F_1319178123_%2F_name_%2F_%82r%82%81%81%99%82k%82%85%82%85_%2F_title_%2F_%82%BD%82%A2%82%C6%82%E9.txt

現在ファイルがopenできなくなると言う罠に陥りました。
windows7でこうゆうファイル名なんですが、コレ問題ありますか?
運用はunix系で考えているんでそっちでも問題あれば教えてください。

230 名前:nobodyさん mailto:sage [2011/10/22(土) 05:13:47.30 ID:???]
すみませんなんでもないですopenでしました。

231 名前:nobodyさん mailto:sage [2011/10/22(土) 09:48:47.25 ID:???]
>>230
「き」と「し」を打ち間違えるとは珍しい。

232 名前:nobodyさん mailto:sage [2011/10/22(土) 20:17:03.51 ID:???]
>>229をデコードしたヤシは挙手ノ

233 名前:nobodyさん mailto:sage [2011/10/22(土) 21:14:46.30 ID:???]
Sa☆Lee って何だ?

234 名前:nobodyさん mailto:sage [2011/10/22(土) 21:57:21.39 ID:???]
Sa☆Leeでぐぐったヤシは挙手ノ



235 名前:nobodyさん mailto:sage [2011/10/22(土) 22:19:39.38 ID:???]
なんかの罠かと思ってスルーしてた

236 名前:nobodyさん mailto:sage [2011/10/24(月) 13:03:32.39 ID:???]
ハッシュの中の配列に、値を追加したいときはどうすればできますか?

こうすると
push($h{$i}->[0], "aaa"));

このようなエラーになります。
Type of arg 1 to push must be array (not array element)

237 名前:nobodyさん mailto:sage [2011/10/24(月) 13:36:02.75 ID:???]
push @{$h{$i}}, "aaa";

238 名前:nobodyさん mailto:sage [2011/10/24(月) 13:50:46.81 ID:???]
>>237
上手くいきました。ありがとうございます。
こんな書き方理解できない。もうPerlやりたくない。

239 名前:nobodyさん mailto:sage [2011/10/24(月) 13:58:00.35 ID:???]
同じプログラムをRubyとPHPとPythonでは書き直せるんですけど、
Perlだけ作法が全然違うからわかわからないんですけど、どうすればいいですか?????????

240 名前:nobodyさん mailto:sage [2011/10/24(月) 15:33:37.66 ID:???]
Perl5.14でその配列が既に存在していれば、

use v5.14;
push $h{$i}, "aaa";

でいけるかな?

241 名前:nobodyさん mailto:sage [2011/10/24(月) 17:29:05.68 ID:???]
>>239
全然違うってほどのもんじゃないとは思うけど。
例えばどんなところが書き直せないの?

242 名前:nobodyさん mailto:sage [2011/10/24(月) 19:39:40.90 ID:???]
むしろその中だと、PHP←→Perlが一番簡単な気がするんだw

243 名前:nobodyさん mailto:sage [2011/10/24(月) 23:41:27.27 ID:???]
>>241
ハッシュとか配列とかの操作でカッコとか記号とかが覚えられない。
代入するときも表示するときもアクセスの仕方が違ったりして覚えられない。ダンプするのも一苦労。
クラスのnewのblessとか未だに何なのかわからない。祝福とは???
リファレンスとかスカラーとかレキシカルとか聞き慣れない用語ばかり出てくる。
スコープとかクロージャとかJavaScriptの悪夢がよみがえる。
とにかく記号ばっかりで暗号いじってるみたいな意味不明さが怖い。

$hoge; $hoge{0}; $hoge->{0}; @hoge; @hoge{0}; @hoge->{0}; %hoge; %hoge{0}; %hoge->{0};
${$hoge}; @{hoge}; @{$hoge}; {@{$hoge{0}}} @{$hoge->[0]}; %{$hoge->[0]}; %{$hoge->{0}}

どれだよ!!!!!!!!111111111

244 名前:nobodyさん mailto:sage [2011/10/24(月) 23:51:16.92 ID:???]
独特の表記とか用語に拒否反応ってのはわからんでもないけど、
スコープとかクロージャ駄目ってんじゃ他の言語もまともに使えてないだろ……



245 名前:nobodyさん mailto:sage [2011/10/24(月) 23:54:49.09 ID:???]
>>243
意味不明って、単にPerlを知らないだけでは。
慣れればおいしいよ。

246 名前:nobodyさん mailto:sage [2011/10/25(火) 00:14:38.50 ID:???]
$hoge; スカラ
$hoge{0}; ハッシュ
$hoge->{0}; ハッシュへのリファレンス
@hoge; 配列
@hoge{0}; エラー 配列へのアクセスは $hoge[0] でアクセス
@hoge->{0}; エラー 配列へのリファレンスは $hoge->[0] でアクセス
%hoge; 連想配列
%hoge{0}; 記述エラー 連想配列内の要素は $hoge{0} でアクセス
%hoge->{0}; 記述エラ 連想配列へのリファレンスは $hoge->{0} でアクセス

${$hoge}; スカラのデリファレンス
@{hoge}; エラー
@{$hoge}; 配列のデリファレンス
{@{$hoge{0}}} 連想配列内の配列をデリファレンス ($hoge{0} の中に配列が入っている) ただし外の {} は括る必要なし。 この場合 {} はブロックになる。
@{$hoge->[0]}; 配列へのリファレンスの中の配列
%{$hoge->[0]}; 配列へのリファレンスの中の連想配列
%{$hoge->{0}} 連想配列へのリファレンスの中の連想配列

こんな感じのも良く使うので覚えた方がいいかも。
$hoge = {
  'array' => [], 連想配列へのリファレンスの中に配列を作る
  'hash' => { 連想配列へのリファレンスの中に連想配列へのリファレンスを作る
    'key1' => 'val',
    'key2' => 'val',
  }
};
それぞれへのアクセスは
$hoge->{'array'}->[1];
$hoge->{'hash'}->{'key1'};
となる。

247 名前:nobodyさん mailto:sage [2011/10/25(火) 00:41:32.32 ID:???]
> @hoge{0}; エラー 配列へのアクセスは $hoge[0] でアクセス

エラーではない
が、スライスを理解して使っているわけではなく、たまたま動いているだけ、の初心者が多いと思う

248 名前:247 mailto:sage [2011/10/25(火) 00:42:17.13 ID:???]
{} と [] を見まちがえた。ごめん。

249 名前:nobodyさん mailto:sage [2011/10/25(火) 01:04:32.90 ID:???]
@hoge{0} なら %hoge に対するハッシュスライスでしょ
warnings 有効なら @hoge{0} は警告出るだろうが、
@hoge{0..2} とか、 my @keys = (0); @hoge{@keys} なら問題ないはず

250 名前:nobodyさん mailto:sage [2011/10/25(火) 01:31:51.65 ID:???]
指摘のある通り、%hoge; と宣言されてるなら @hoge{0} は動作する。

けどね。
質問者がくじけてる部分を考えたらスライスは考えないほうがいいのでは?
という意味からエラーっていうことにした。

まぁ、言葉が足りなかったってのもあるけど ^-^;

251 名前:nobodyさん mailto:sage [2011/10/25(火) 01:51:36.00 ID:???]
>>246
> @{hoge}; エラー
エラーではない。

全ての変数や関数へのアクセス方法で一番冗長な書き方は sigil { (何か) } ([添え字]|{キー})
の形で、何かが裸の語なら変数名、リファレンスならデリファレンス、
それ以外なら何かの値を名前としたシンボリックリファレンスと解釈される。
通常の変数へのアクセスは、裸の語をデリファレンスすると捉えてもいい。

${ foo } … 通常の変数。{} は*省略可能*。 ${foo} = "foo${foo}foo$foo"; # ok
${ "foo" } … シンボリックリファレンス
${ $foo } … スカラーリファレンス $foo をデリファレンス
${ 'f' . 'oo' } … 式の値を名前としたシンボリックリファレンス
${ \ foo('bar') } … foo('bar') の戻り値のリファレンスのデリファレンス

perldoc.jp/docs/perl/5.10.0/perldata.pod#Slices
> (引用注: 添え字/キーの) かっこの種類(大かっこか中かっこか)は、見ているものが配列か
> ハッシュかをつかさどっています。一方、配列やハッシュの先頭の記号 ('$' か '@') は、
> 返ってくるものが単一の値(スカラ)か、複数の値(リスト)かを示しています。

use warnings; my @{foo} = ('a'..'f'); my %{bar} = ('g'..'j');
print ${foo}[3]; # 'd' へのアクセスで "d" を表示
print @{foo}[3]; # 警告有り。('d') へのアクセスで "d" を表示
print @{foo}[3,4]; # ('d','e') へのアクセスで "de" を表示
print ${foo}[3,4]; # 警告有り。リストをスカラーとして評価すると最後の値が返されるので "e" を表示
print ${bar}{'g'}; # 'h' へのアクセスで "h" を表示
print @{bar}{'g'}; # 警告有り。('h') へのアクセスで "h" を表示
print @{bar}{'g','i'}; # ('h','j') へのアクセスで "hj" を表示
print ${bar}{'g','i'}; # キー "g$;i" へのアクセスになるので undef

252 名前:nobodyさん mailto:sage [2011/10/25(火) 03:20:14.95 ID:???]
> print ${bar}{'g','i'}; # キー "g$;i" へのアクセスになるので undef
これだけ知らなかったわ。awk 由来なのかな。
まあ積極的に使う意義は無さそうだし、
人のコードで見かけることもないから覚えなくてもいいよね。

253 名前:nobodyさん mailto:sage [2011/10/25(火) 22:21:51.58 ID:???]
>>243
> クラスのnewのblessとか未だに何なのかわからない。祝福とは???
blessは意味わからないよね。
あれ、祝福とか変な言葉で説明するからわからんのさw
オレ流に説明してあげよう。

まず、これを実行してみよう。Dumperは変数の中身を表示する関数だ。use Data::Dumperが必要。
my $a = {key=>1};
print Dumper($a)

以下のように表示される。(改行インデントは折りたたむ)
そう、ようするにただのハッシュだ。
$VAR1 = {'key' => 1};


次に次の命令を実行してみよう。
my $a = {key=>1};
bless($a, "CLASS");
print Dumper($a)

以下のように表示される。さっきのハッシュの周りにCLASSが追加されている。
VAR1 = bless(  {'key' => 1},  'CLASS' );

つまりだ、これはCLASSという名前のクラス名(モジュール名)付きのハッシュということだ。
このモジュール名付きのハッシュにたいして、以下のように->を使って呼び出しをすると、
$a->foo()

$aにはCLASSというモジュール名が結びついているため、CLASS::foo()を呼び出すんだなとPerl実行環境は理解できる。
その時CLASS::foo()の第一引数に$aを渡すことで、foo()の中で$aの値の操作することが可能にある。

これでCLASSクラスのfoo()メソッド呼び出しの仕組みと、$aをCLASSクラスのインスタンスに変換することができた。

254 名前:nobodyさん mailto:sage [2011/10/25(火) 22:33:18.24 ID:???]
もう一つ、$a->foo() という書き方。

$a に bless使ってCLASSと結びつけたハッシュが入っていれば、
CLASS::foo()が呼び出されるわけだが、

$aは文字列でもよい。つまり、
$a = 'CLASS';
$a->foo();
この方式でもCLASS::foo()が呼び出せる。
通常は、CLASSを$aに入れずにそのまま書いて、CLASS->foo() となる。

でこれが foo()じゃなくて new() だと、CLASS->new() となる。
呼び出されるのは、当然CLASS::foo(); そして foo() の第一引数にはCLASSという文字列が入っている。

これを利用してCLASS::newされた時に、CLASSに結びつけたハッシュ、
つまりCLASSのインスタンスを返すことで、Perlにおけるnewの仕組みとなる。

あと余談。殆どの場合ハッシュにCLASSを結びつけるのだが、
別にただの値にCLASSを結びつけるのも一応可能。



255 名前:nobodyさん mailto:sage [2011/10/25(火) 22:34:03.01 ID:???]
訂正
×呼び出されるのは、当然CLASS::foo(); そして foo() の第一引数にはCLASSという文字列が入っている。
○呼び出されるのは、当然CLASS::new(); そして new() の第一引数にはCLASSという文字列が入っている。


256 名前:nobodyさん mailto:sage [2011/10/25(火) 22:36:14.83 ID:???]
> あと余談。殆どの場合ハッシュにCLASSを結びつけるのだが、
> 別にただの値にCLASSを結びつけるのも一応可能。


ただの値にblessはできんか。
何かしらの値のリファレンスにblessできる。

257 名前:nobodyさん mailto:sage [2011/10/25(火) 23:11:45.61 ID:???]
system("wget $url");
を使ってファイルをダウンロードしたいのですがうまくいきません。
perl というかwget の使い方の問題なのかもしれませんが、
適切な書き方をご存知のかたがいらっしゃったらおしえていただけませんか?

ダウンロードしたいファイルは以下のURLです。
ttp://ncode.syosetu.com/txtdownload/dlstart/ncode/108715/?no=1&hankaku=0&code=utf-8&kaigyo=CRLF

エラーとしては、こう言われます。
index.html?no=2&hankaku=0&code=utf-8&kaigyo=CRLF: Invalid argument
Cannot write to `index.html?no=2&hankaku=0&code=utf-8&kaigyo=CRLF' (Invalid argument).

258 名前:nobodyさん mailto:sage [2011/10/25(火) 23:53:11.13 ID:???]
自分は、たまーにハッシュに名前が欲しくて bless する事もあるw

use LWP::Simple;
my $data = get('URL');

特に認証がなければ、これで取得できるかと。

自分は

use LWP::UserAgent;
use HTTP::Request::Common;
use utf8;
my $ua = LWP::UserAgent->new;
 〜agent とか timeout とか max_redirect とか cookie の設定〜
my $req = GET('URL');
my $res = $ua->request($req);
my $content = $res->code() eq '200' ? decode('utf-8', $res->content()) : '';

ってやってる。
手順が多いけど、自分の頭ではこの方が使いやすい。

$res->code() eq '200' の部分は $res->is_success とかで置き換えられるけど、回線がパンパンのときに失敗すると
is_success は 1 を返すので信用出来ない。
HTML の取得なら、$res->content() に </html> が含まれるかどうかで判断した方が良い。
つっても、殆どの場合は is_success や is_error は正しく動作する。

259 名前:nobodyさん mailto:sage [2011/10/26(水) 01:13:19.12 ID:???]
>>257
wget は特に指定がなければサーバのパスに対応するファイル名でローカルに保存しようとするから、
? はファイル名に使えねえよと言われてるのでは。Windows ないから試せないけど。

>>258
sub is_info ($) { $_[0] >= 100 && $_[0] < 200; }
sub is_success ($) { $_[0] >= 200 && $_[0] < 300; }
sub is_redirect ($) { $_[0] >= 300 && $_[0] < 400; }
sub is_error ($) { $_[0] >= 400 && $_[0] < 600; }
sub is_client_error ($) { $_[0] >= 400 && $_[0] < 500; }
sub is_server_error ($) { $_[0] >= 500 && $_[0] < 600; }
# HTTP::Status より。

失敗したにもかかわらず is_success が真を返すというなら、
まず疑うべきは LWP でなくサーバ側のレスポンスでは?
原因がクライアント/サーバ/回線/他のいずれにせよ、
負荷等が原因で200以外の2xxが返ってくる状況なんてちょっと想像つかんが。

decode('utf-8', $res->content()) はよっっっぽど古いバージョンの LWP じゃない限り
$res->decoded_content(charset => 'utf-8') のほうがよかろ。

260 名前:nobodyさん mailto:sage [2011/10/26(水) 01:38:17.35 ID:???]
>>259
失敗なのに is_success が成功を返すのは少々特殊な状況なのは分かってる。

自宅でサーバー動かしてて家のルータは BA8000Pro なんだけど、BitTorrent で Linux ISO を放流してる。
バージョンアップがくるとコネクションがすごい数やって来て、NAT のテーブルが溢れて (上限は 2600)
名前解決すら頻繁に失敗するほど不安定になる。

この状況下で LWP で GET とかすると is_success が成功を返しても、->content() が全てを受け取ってないという事が起こる。

そのほかの環境は弄らずに BitTorrent だけ止めると LWP は正常に送受信できる。
これは何度も再現するのはテスト済。

ちなみに BitTorrent を動かしてるのは WEB サーバーとは別の PC です。
最近は BitTorrent 動かしてないからこういった症状ともおさらばで快適人生♪



>> decoded_content
おぉ〜、こんなメソッドあったんですね。ありがとう!
常々 Encode 呼び出すのめんどくせーって思ってたんで助かる。


261 名前:nobodyさん mailto:sage [2011/10/26(水) 02:43:24.74 ID:???]
>>259
>>257です。
アクセスが出来ないじゃなくて、書き込みができないっていう意味だったんですね。
もっと自分でよく考えてみるべきでした。

-Oオプションを付けて書き込むファイル名を指定したところ上手くいきました。

知恵を貸していただきありがとうございます。

262 名前:nobodyさん mailto:sage [2011/10/27(木) 00:59:33.75 ID:???]
>>244-256
あんなふざけたレスにマジレス返してくれてどうもありがとうございます。
まだ全部は試せてないですが、>>246とか物凄く参考になっています。
perldoc.jpなども読んで、もう少し勉強してみますね。

263 名前:nobodyさん mailto:sage [2011/10/27(木) 01:39:37.97 ID:???]

変数名の前の @、$、% の意味 (* ってのもあるけど、難しいので放置で OK)
変数に代入するときの { }、[ ]、( ) の意味を覚えるだけで、理解度はかなり違うと思います。

あとは perl の自由な書き方に慣れていただくしかw

264 名前:nobodyさん mailto:sage [2011/10/27(木) 16:41:18.27 ID:???]
たまに間違う… そういえばあんまり代入の時に [ ] って使わないなあ。
使ったことがないわけじゃないんだけど。



265 名前:nobodyさん mailto:sage [2011/10/27(木) 18:34:30.14 ID:???]
最近は面倒くさいので $data = [] とか $data = {} とかで済ますこと多いな。


266 名前:nobodyさん mailto:sage [2011/10/28(金) 20:00:02.80 ID:???]
Perlでw3mのようなコンソールアプリケーションを作る方法はあるのでしょうか?
環境はLinuxです。

よろしくお願いいたします。

267 名前:nobodyさん mailto:sage [2011/10/28(金) 20:16:08.47 ID:???]
curses を扱うモジュールはあるみたいだし、できるんじゃね
Python とかのほうが向いてる気はするけど

268 名前:nobodyさん mailto:sage [2011/10/30(日) 22:07:34.60 ID:???]
みなさんモデリングツールでUMLは使ってますか?
もし使ってる方はどのソフト使ってますか?

ttp://hibari.2ch.net/test/read.cgi/tech/1147499933/
↑ここでperlの話題がなく、「perl uml」で検索してもそれらしいものが見つからなかったので質問しました。
UMLを勉強しようと思うのですがどのツールがいいのかもわかりません。。

269 名前:268 mailto:sage [2011/10/31(月) 00:15:05.76 ID:???]
>UMLを勉強しようと思うのですがどのツールがいいのかもわかりません。。

これはココだとスレ違いですね。
この一文は無視して下さい。

270 名前:nobodyさん mailto:sage [2011/11/01(火) 11:30:50.31 ID:???]
バイナリデータについて質問です。
docomo携帯の太陽のSJIS絵文字コード(F89F)を表示しようとしたのですが、
(1)は表示されて、(2)は単なる文字列になっているようでした。
\x{}といった表記ではバイナリにならないのでしょうか?
また、バイナリにする場合、""での設定やpack()など色々あると思うのですが、
処理が速いのはどの方法になるのでしょうか?

(1)my $sun = "\xF8\x9F"

(2)my $sun = "\x{F89F}"


271 名前:nobodyさん mailto:sage [2011/11/01(火) 13:02:20.96 ID:???]
>>270
perldoc.perl.org/perlop.html#Quote-and-Quote-like-Operators
> If the number is 256 (0x100, 0400) or above, Perl interprets it as a Unicode code point
> and the result is the corresponding Unicode character.

www.nttdocomo.co.jp/service/developer/make/content/pictograph/basic/

よって iモードの Shift_JIS で "\xF8\x9F" に割り当てられている絵文字を
iモードの UTF-8 のページで出したければ "\xEE\x98\xBE" 。
(Perl用語で言うところの) Unicode 文字列なら "\x{E63E}" 。

参考ページ:
>>2
perldoc.jp/docs/perl/5.10.0/perluniintro.pod
search.cpan.org/dist/Encode-JP-Mobile/lib/Encode/JP/Mobile.pm
search.cpan.org/dist/Unicode-Japanese/lib/Unicode/Japanese/JA.pod

272 名前:270 mailto:sage [2011/11/01(火) 15:15:58.07 ID:???]
>>271
解決しました。
詳しい説明ありがとうございました。

273 名前:nobodyさん mailto:sage [2011/11/01(火) 15:20:02.29 ID:???]
my $a = {
x => [ 'a', '1' ],
y => [ 'b', '2' ],
z => [ 'c', '3' ],
};

my $b = map{}???

上記で$bに下記のようにセットするにはmapのところをどのように書けばよいでしょうか。

$b = {
x => 'a-1',
y => 'b-2',
z => 'c-3',
};

274 名前:nobodyさん mailto:sage [2011/11/01(火) 15:36:36.16 ID:???]
>>273
$b = { map { $_ => "$a->{$_}[0]-$a->{$_}[1]" } keys %$a };
# or
$b = { map { $_ => join '-', @{ $a->{$_} }[0,1] } keys %$a };



275 名前:nobodyさん mailto:sage [2011/11/01(火) 15:59:53.49 ID:???]
>>273
my $b = { map ref $_ ? join('-', @$_) : $_, %$a };
my $b; %$b = map ref $_ ? "$_->[0]-$_->[1]" : $_, %$a;

276 名前:273 mailto:sage [2011/11/01(火) 16:40:41.18 ID:???]
>>274,275

解決しました。
回答が早くて助かりました。
ありがとうございます。

277 名前:nobodyさん mailto:sage [2011/11/01(火) 17:31:41.93 ID:???]
サンプルとはいえ$aと$bは安易に使わないほうがいいぞ

278 名前:273 mailto:sage [2011/11/01(火) 17:56:13.77 ID:???]
use HTML::Template について質問です。
テンプレートファイル内で、「html出力させないコメント」というのは書けないのでしょうか?
例えば下記の#の行はoutputで出力させないといった動作をさせたいです。
もしできないのであれば、使用されている皆さんはコメントを書きたい時、<!-- -->で対応しているのでしょうか?

<html>
<head>
<title>hoge</title>
</head>
<body>
fuga<br>
#コメントを書きたい
</body>
</html>

279 名前:nobodyさん mailto:sage [2011/11/02(水) 04:52:21.99 ID:???]
>>278
無かったはず。

ただし、new()の際にfilterを設定することで、前処理を行うことが出来る。
これを利用して、特定の文字列を置き換える(削除する)ことは可能。
詳細はドキュメントを参照されたい。

HTML::Templateは痒いところに届かないというか、痒み?何それ? って作り方だからなあ。
非PGのデザイナーにテンプレートファイル作りを任せるなら、これくらいじゃないと使ってくれなかったりするがw


280 名前:nobodyさん mailto:sage [2011/11/02(水) 07:58:44.36 ID:???]
>>276
案の定Wikipediaの丸暗記か

281 名前:nobodyさん mailto:sage [2011/11/02(水) 10:15:20.86 ID:???]
>>280
君はまた見えない敵を作って、勝手に戦うのかい?

282 名前:デフォルトの名無しさん mailto:sage [2011/11/03(木) 03:59:56.91 ID:???]
>>280

おみそれいたしました。
丸暗記だと応用が効かなくて行き詰ってしまうことが多いです。

283 名前:nobodyさん mailto:sage [2011/11/03(木) 20:45:59.15 ID:???]
↓こちらのスレで誘導されてこの板に来ました。

Perlについての質問箱 49箱目
hibari.2ch.net/test/read.cgi/tech/1319953460/100-102n

Windows 2000、Activeperl 5.8 の環境で、
use Socket;
socket(・・・);
connect(・・・);
な感じでインターネット上のwebサイトからページを取得してるんだけど、
サイトの応答が遅いとき、応答が帰ってくるまでCPU負荷が100%近くになる。

これってどういった原因が考えられますか?
あるいは仕様でしょうか。
PCのスペックはWin2000を使っているというあたりで想像いただける通りかなりしょぼいですが、それにしても負荷高すぎかな、と。

Activeperlのバージョン上げれば直るのかな…

284 名前:nobodyさん mailto:sage [2011/11/03(木) 22:20:35.11 ID:???]
パソコンを変えることができないなら、LANカードを取り替えるか
あるいは追加して、それを使うようにして対処。
今使っているLANカード+ドライバが割込みに対応した作りではない
のでCPU負荷が100%近くになっている。



285 名前:nobodyさん mailto:sage [2011/11/03(木) 22:28:37.56 ID:???]
>>PCのスペックはWin2000を使っているというあたりで想像いただける通りかなりしょぼいですが
端折るな


ちなみに Pentium3 1GHz、ActivePerl 5.12 のうちの環境は sleep 使うと CPU 占有率が 80-90% とかになる。


286 名前:nobodyさん mailto:sage [2011/11/03(木) 22:52:53.96 ID:???]
>>284
LANカードの問題ですか。
ノートだから交換や追加は難しいですね…
>>285
すみません。
Pen4M1.8G(但し1.2G動作)です。

ありがとうございました。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<211KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef