Perlコーディング初心者質問スレ Part 63at PHP
Perlコーディング初心者質問スレ Part 63 - 暇つぶし2ch291:nobodyさん
11/11/05 11:43:23.98
>>289
BIOSのIRQの設定も板違いですね。
そうだとするとLANカードを変えても同じことになりそうなので。

292:nobodyさん
11/11/06 08:06:31.58
$test . '_aiueo'

こうゆう文字列でマッチさせようとしたときに、何も考えずに書けば

/$test_aiueo/

だけど、これじゃ $test_aiueo っていう変数は無いからエラーになるわけで、
$test という変数の直後に半角英数でマッチさせるにはどうすれば良いのでしょうか?


293:nobodyさん
11/11/06 08:12:06.72
すんません解決しました。

/${test}_aiueo/

こうゆう書き方できるんですね。
$hash={} を %{$hash} とか普段から使ってるクセに、なんですぐに書けなかったんだろう。。。


294:nobodyさん
11/11/06 10:03:01.99
こういう

295:nobodyさん
11/11/06 12:03:43.66
作ったスクリプトのどこの部分が処理に時間が掛かってるのか知りたいです。

処理ごとにデバッグプリントすれば可能ですが、非現実的だし、
後々デバッグプリントを消すのも手間なので、Perlでどこの部分で
時間が掛かってるとかのデバッグというか、トレースというか、
そういう事は出来るモジュールなどはあるのでしょうか?



296:nobodyさん
11/11/06 12:30:01.91
>>295
URLリンク(perldoc.jp)

297:nobodyさん
11/11/07 11:15:35.01
>>296
ありがとうございます。


#!/usr/bin/perl -d
use Devel::DProf;

で tmon.out を吐かせた後に dprofpp で得たいデータが取れました。


298:278
11/11/07 14:03:34.80
以前html::templateで質問したものです。
>>278の件は解決できました。
ありがとうございました。

もう一つ質問があります。
TMPL_INCLUDEのパスをcgi上でコントロールしたいのですが、下記のようなテンプレートはNGとなっています。

<TMPL_INCLUDE NAME="<TMPL_VAR NAME=incPath>">

そこでfilterを使って表現しようと思うのですが、どのようにすればよいでしょうか?
※cgi内の変数がfilter内のサブルーチンでそのまま使用できるのは確認できています。

my $incPath = './tmpl/inc.tmpl';
my $template = HTML::Template->new(
filename => './aaa.tmpl',
filter => sub{
my $ref = shift;
$ref =~ s/(\$[a-zA-Z0-9_]+)/eval($1)/g; #←ここの置換後の表現が思いつかないのでやりたいことのイメージを書いています。
},
);

--- template ---
<TMPL_INCLUDE NAME="$incPath">

299:298
11/11/07 17:02:01.60
>TMPL_INCLUDEのパスをcgi上でコントロールしたいのですが、

すみません。この一文はわかりづらいですね。
この文は無視してください。

300:nobodyさん
11/11/08 02:25:10.62
>>298
コメント削除の件は解決して何より。

インクルードファイルを動的に制御するなら、素直に<TMPL_IF>や<TMPL_UNLESS>で分岐させるのが良いのでは。
もしくは、CGI側で別途に読み込んで、<TMPL_VAR>で吐き出すか。

インクルードファフィルのルートディレクトリを指定するだけなら、
new()の時に path を指定することでコントロールできるっぽい。


【余談】
HTML::Templateは条件分岐がマトモに書けないから、可能なら拡張モジュールの利用も考えてみて。
自分は使ったことがないんだけど
URLリンク(search.cpan.org)
とかどうだろうか


301:298
11/11/09 16:21:33.08
>>300
もしかして279の方ですかね?
またまたご意見ありがとうございます。

色々試行錯誤しましたが、今回はfilterに下記のようにして対応することにしました。
$replace_ref = {
HENSUU => 'hogehoge',
};

filter{
$ref = shift;
$$ref =~ s|\[\#.*?\#\]||gxms; # [# ~ #]までをコメント
$$ref =~ s|\[\%\s+([a-zA-Z0-9_]+)\s+\%\]|$replace_ref->{$1}|gxms; # [% ~ %]を置き換え
}

----- html -----(どんなフォーマットがHTMLに影響ないかわからなかったので変数置き換えはtemplate-toolkitを参考)
<html><body>
[# コメント #]
変数=[% HENSUU %]
</body></html>
---------------

HTML::Template::Exprいいですね。
HTML::Template::Proにも取り込まれてるんで、高速化したい時には置き換えが簡単そう。
HTML::TemplateはIF文が貧弱すぎる。

302:nobodyさん
11/11/15 20:21:14.83
パターンマッチについてなのですが、

-------------------
<span class="availGreen">在庫あり。</span> <a href="/gp/help/customer/display.html?&nodeId=915624">
在庫状況</a>について<br /> この商品は、<b><a href="/gp/help/customer/display.html?ie=UTF8&nodeId=64
3004">Amazon.co.jp</a></b> が販売、発送します。 ギフトラッピングを利用できます。
-------------------
この文字列(実際には改行は入っていない)から、「Amazon.co.jp」(他の店名になることもある))の部分だけを取り出す為に

if ( $_ =~ />(.*?)<\/a><\/b> が販売/ ) {print $1;}
とすると、
-------------------
在庫あり。</span> <a href="/gp/help/customer/display.html?&nodeId=915624">
在庫状況</a>について<br /> この商品は、<b><a href="/gp/help/customer/display.html?ie=UTF8&nodeId=64
3004">Amazon.co.jp
-------------------
までが拾われてしまいます。

if ( $_ =~ /この商品は、<b><.*?>(.*?)<\/a><\/b> が販売/ ) {print $1;}
とすることにより、目的は達成できたのですが、何故最初のがダメなのかが良くわかりません。

なお、直前の「643004」の部分は場合によって変わるのでキーワードには出来ません。

303:nobodyさん
11/11/15 20:47:48.16
何故って…
.*?にはタグ(<.*?>)を含まないなんてルールはないし

304:nobodyさん
11/11/15 21:30:08.07
最小マッチの「最小」の意味を勘違いしてるパターンと予想。
.*? か .* かで影響されるのは "</a></b> が販売" の部分の探し方であって、
マッチすること自体が確定したら最初の ">" の位置は動かない。

関係ないが、この手の情報取得は可能ならまずAPIを検討すべき。
泥臭くスクレイピングするとしても、よほど高速性を重視するとかでなければ
正規表現じゃなくてTreeBuilderとかでDOMをパーズするほうが安全。

305:nobodyさん
11/11/16 00:15:29.63
>>304
ありがとう。
最初の「>」で拾ってしまうんですね。

高速性の必要なものではなく、いくつかの商品の価格変化をログ取ってるだけなので、
API利用するところまでは考えてません。手続きめんどいので。

306:nobodyさん
11/11/16 06:46:36.29
>>305
拾いたい箇所が1ファイルに1箇所くらいで構造も単純ならパターンマッチングの方が
手っ取り早いよね。
でも構造が繰り返しだったりややこしかったりする時はWeb::Scraperとか便利よ。

>>304
パーズ? パース? ← parse

307:nobodyさん
11/11/16 07:50:11.05
考えるの面倒だからという理由で、モジュールに丸投げする底辺でゴメンナサイ

308:nobodyさん
11/11/16 09:59:12.27
そのためのモジュールでしょ 無問題

309:304
11/11/16 10:04:04.24
ありゃ。smooth(ズ)→スムース みたいなもんで英語では parz って発音するものだと思い込んでたからそれに合わせてたわ。
調べてみたらイギリス英語系の辞書だとパーズだけど、アメリカ英語でパースが一般的みたいだからそっちのほうがいいや。サンクス

310:nobodyさん
11/11/16 16:16:46.49
>>309
>イギリス英語

へー。良いことを知った。

311:nobodyさん
11/11/16 16:34:39.13
本当だ。
2つ発音されるね。

parseの意味 - 英和辞書 - goo辞書
URLリンク(dictionary.goo.ne.jp)

312:nobodyさん
11/11/16 16:52:26.25
そうか。どっちもありなんだ。
勉強になったぜ。

313:nobodyさん
11/11/16 23:26:19.41
テキストファイルから3行だけほしいときって、1行で記述することってできますか?

今は for で回して push してるんだけど、
@lines = <$fh> x 3;
みたいな感じで書けたら落ですよね。。。

314:nobodyさん
11/11/17 00:05:31.82
>>313
#!/usr/bin/perl -w
use strict;
my @line = (scalar <DATA>, scalar <DATA>, scalar <DATA>); # 幾つ?
print @line, "---\n"; seek DATA, -12, 1; @line = ();

@line = map scalar <DATA>, 0..2; # 0から2とは?
print @line, "---\n"; seek DATA, -12, 1; @line = ();

push @line, scalar <DATA> while @line < 3; # 意図が分かりやすい
print @line;

__DATA__
foo
bar
baz
quux

315:nobodyさん
11/11/17 00:27:12.12
やっぱ、なんかしらで回すしか無いですよね。
ありがとうございました。

316:nobodyさん
11/11/17 00:48:38.68
>>315
ループを避ける事自体が至上命令ならば >>314 の1番目か
$/ = \64; # 充分なサイズのバッファ
my @line = <DATA> =~ /^(.*\n)(.*\n)(.*(?:\n|\z))/;

317:nobodyさん
11/11/17 00:53:27.15
@line = (<DATA>)[0..2];

318:nobodyさん
11/11/17 09:42:10.49
至上主義ってわけじゃないんだけど、ループの中で特に処理をするわけじゃないから
1行で簡潔にできたら嬉しいよね~

っていう程度です。


319:nobodyさん
11/11/18 00:09:48.76
ループを決して書こうとしない部下を思い出した。
そいつは自分自身がループして同じ内容を必要な行数分タイプしてたっけ。

320:nobodyさん
11/11/18 09:22:43.24
8bit機の時代はループの条件判定のタイムロスを惜しんで
ループ展開とかやったっけな。アセンブラで。

321:nobodyさん
11/11/18 10:21:10.82
ループではないけど、100程度のif文を自動生成するプログラムなら見たことがある…

322:nobodyさん
11/11/18 21:40:15.63 1hunDax1
入門書を読んでて気になったのですが
ダブルクォート文字列で使われるエスケープシーケンスと
マッチ演算子の中の正規表現で使われるエスケープシーケンスは
よく使われる改行文字(\n)やタブ(\t)などが両方にあるので
厳密に言えば違うけれども、大体同じものと理解していいのでしょうか?

それとも全く違う、あるいは全く同じものなのでしょうか?

323:nobodyさん
11/11/18 21:56:27.18
覚えることが少なくなるように同じ記法を採用しているだけで、
それを解釈するコードは文字列と正規表現では別物だと考えて
ください。

324:デフォルトの名無しさん
11/11/19 13:39:08.87
全く同じであれば、本の記述は1回のはず。
別物だから区別して書いてあって、本に2回出てくる。

でも覚えやすいように同じ記法にしている。

325:nobodyさん
11/11/23 23:35:55.57
やっと規制がとけました

>>323-324
ありがとうございます

326:nobodyさん
11/11/26 22:25:41.09
CGIに値を渡したいときの方法で質問です。

URLリンク(example.com)

と、PATH_INFOで渡すのと

URLリンク(example.com)

と、.htaccessに「DirectoryIndex index.cgi」を書いてPOST風?(呼び方がわからない)で取得する方法があると思いますが、
みなさんどちらを使っていますか?
どちらを使おうか悩んでいます。
(最初、index.cgiを消してPATH_INFOで渡せればすっきりするなと思いましたが、それだとURLリンク(example.com)となって
index.cgiを読ませる場所とPATH_INFOの切り分けができないと気づいて今に至っています)

個人の好みになるかもしれませんが、こっちをこんな理由で使っているという感想などいただけたら参考にしたいと思います。
ちなみにformタグではGETを使用しています。

327:nobodyさん
11/11/26 22:49:02.08
>>326
URLリンク(txqz.net)

328:nobodyさん
11/11/26 23:38:20.62 zFlJhwY9
system()で外部コマンドを呼び出すと呼び出しは行われるのですが、そのあとの処理に進まずに
Internal errorになってしまいます。なにか呼び出し方があるのでしょうか

system '/bin/ls', "-la";
print "Location: index.html\n\n";


329:nobodyさん
11/11/26 23:51:55.90
そのスクリプトを手元で実行したことはあるかい?

330:nobodyさん
11/11/27 00:07:55.85
CGIで動かしてるんだったらHTTPサーバのログにエラー内容が記録されてるんじゃないか?

331:nobodyさん
11/11/27 00:56:06.95 E4v1+esL
malformed header from script. Bad header=total 68: test.cgi, referer: URLリンク(redhat6)
とか出てます。Systemを実行しなければこのメッセージは出ないです。


332:nobodyさん
11/11/27 01:07:18.85
>malformed header
だからヘッダがどうなってるか見ろ

333:nobodyさん
11/11/27 01:44:44.18 E4v1+esL
ls -la とか バイナリの実行ファイルとかですが、、、

334:nobodyさん
11/11/27 02:47:47.23
うーん…
真っ先に HTTP ヘッダがなければCGIとして機能しないでしょ。
エラーになるのは当たり前。
でもって Location: で飛ばしてるんだから system '/bin/ls', '-la'; は全く意味がない。
仮に print "Location: index.html\n\n"; の次に置いても無視されるだけ。
そのCGIの目的(用途)は何なの?

335:nobodyさん
11/11/27 03:52:11.45
ん? Location: ~ を print しようがスクリプト自体は最後まで走るでしょ?
問題は system の出力先が標準出力、つまり普通に print するのと同じところに行ってるせいで、
スクリプトからサーバーへ渡される出力が

total 8
drwxr-xr-x 2 nobody nogroup 4096 Nov 27 00:00 ./
drwxr-xr-x 3 nobody nogroup 4096 Nov 27 00:00 ../
Location: index.html

みたいになってて、
サーバーとしては改行2つより前の部分は HTTP ヘッダとして解釈しなきゃいけない、
でも Location 以外の行は正しい HTTP ヘッダではない。
だからそこで内部エラーとして止めてる、ってことでは?
CGI 試す環境ないんで推測だけど。

336:nobodyさん
11/11/27 04:36:05.90
>>335
だからそう書いてるだろ。

337:nobodyさん
11/11/27 23:08:22.74
>>332
「ヘッダ」が分からないので見ろといわれてる対象が分かっていない
に一票。

つまり
print "Location: index.html\n\n";
は、理解して書いているのではなく、他のプログラムのコピペ。

338:nobodyさん
11/11/27 23:27:05.03
print "Location: index.html\n\n"; の前に system を置いちゃうくらいだからそうなんだろうな。

339:nobodyさん
11/11/28 01:55:16.13
ここまで答えのようなヒントが出てれば、あとは大丈夫でしょう。きっと・・・

340:326
11/11/28 15:55:21.96
>>327

ありがとうございます。
作成中のものはエントリのページなのでPATH_INFOで渡したいと思います。

この場合、URLからindex.cgiを消して尚且つPATH_INFOを取得するには
どのようにしたら良いのでしょうか?

URLリンク(example.com)

URLリンク(example.com)
にして、index.cgiを実行し、PATH_INFOから"/1/2/"取得したい

341:326
11/11/28 16:21:49.46
>>340
を実現するためググってみました。

URLリンク(hatsugen.zakzak.co.jp)

↑ここの「ANo.3」で下記のように書かれていました。


たとえば、httP://hoge.com/A/B というURLをブラウザに与えると、ブラウザはHTTPサーバー(hoge.com)に対して、/A/Bという
ファイルを送れと要求します。
サーバーはこれを探しますが、Bというファイルがなければ、それをディレクトリとみなして/A/B/として/A/B/を探します。
それが存在していれば開いてみます。
 httpd.confや.httaccessで下のように指定してあれば、
<IfModule dir_module>
  DirectoryIndex index.html index.htm index.cgi index.sh
</IfModule>
 前から順番にファイルを探して表示します。いずれもなければ、またこれも設定にしたがってディレクトリ内のファイル一覧を表示するか、
エラーを返すか、その指定もなければ/B/を切り捨てて環境変数に格納し、/Aについて同様な処理を繰り返します。


つづく

342:326
11/11/28 16:23:22.87
つづき

そこで下記を行いました。

URLリンク(example.com) の階層にindex.cgiと下記一行を書いた.htaccessを置きました。
DirectoryIndex index.cgi

URLリンク(example.com)で、URLリンク(example.com)にアクセスしたことを確認しました。

URLリンク(example.com)にアクセスするとエラーになりました。

URLリンク(example.com)というディレクトリは存在していないので、
一つ上がったURLリンク(example.com)のindex.cgiを探しに行くのではないかと思うのですが
何か間違えているのでしょうか?
どこをどうすればできるようになるのか教えてください。

343:nobodyさん
11/11/28 16:28:04.90
>>340-342
>>1
Apache~嗜みとして~ Part3
スレリンク(php板)
【Apache】mod_rewriteについて語るスレ
スレリンク(php板)

344:342
11/11/28 23:12:53.78
>>343
ここまでいくとCGIとは関係なくなってきますね。
誘導ありがとうございます。

質問は取り消します。

345:nobodyさん
11/11/30 10:29:57.17 gvpuZTLB
以前、Perlのマニュアル(リファレンスドキュメント)をダウンロードしたことがあったのですが、
今行ったら見つかりませんでした
どのページの、どの部分からダウンロードにいけるのでしょうか?

また、以前ダウンロードした時はは内容が英語でした
出来れば日本語版があればそちらをダウンロードしたいのですが、どこか内でしょうか?

346:nobodyさん
11/11/30 10:51:48.72
perldoc.jp

347:nobodyさん
11/11/30 21:09:58.63
Markdown.plの出力結果にhtml, head, bodyなどの要素を加えたいんですが
そういうオプションとかってデフォルトの機能にはないですよね?

出力されたhtmlファイルを開く→先頭に書き足す→末尾に書き足す→上書き保存
という処理をするスクリプトを書くということ以上の解決策ってないですよね?

348:nobodyさん
11/11/30 23:31:46.18
中間ファイル作らなくっても
先頭を書き出す→markdown.plを呼び出して結果を書き出す→末尾を書き出す→保存
でいいんじゃね?

349:nobodyさん
11/12/03 17:25:31.47
>>347
>上書き保存という処理をするスクリプトを書くということ以上の解決策

何をもって上/下と言っているのか分からんが、Markdown.pl に書き足す
方法はなぜ思い浮かばないのか。

350:nobodyさん
11/12/03 19:26:36.05
>>349
まあMarkdown.plはいじらないでそのまま使う方が自然だろう。
やるとしたら別名にリネーム(コピー)してから自分専用にカスタマイズ、かな。

ついでに350ゲト

351:nobodyさん
11/12/04 11:44:58.71
>>347
作者に要望を出す。これ最強。たぶんやってくれる。

352:nobodyさん
11/12/05 11:39:58.61
GoogleAnalyticsのモバイル版perlコードについて質問です。
下記の①の所って$ENV{'HTTP_REFERER'}が空だったら$refererはundefになりますよね?
ということは②の $referer eq "" でワーニングになるから、
修正したほうがいいですよね??

if ($referer eq "") { #→ ×
if (defined($referer) && $referer eq "") { #→ ○

#####################################################
# Copyright 2009 Google Inc. All Rights Reserved.
use URI::Escape;
use constant GA_ACCOUNT => 'MO-1887809-14';
use constant GA_PIXEL => '/ga.pl';

sub google_analytics_get_image_url {
my $url = '';
$url .= GA_PIXEL . '?';
$url .= 'utmac=' . GA_ACCOUNT;
$url .= '&utmn=' . int(rand(0x7fffffff));
my $referer = $ENV{'HTTP_REFERER'}; #①
my $query = $ENV{'QUERY_STRING'};
my $path = $ENV{'REQUEST_URI'};
if ($referer eq "") { #②
$referer = '-';
}
$url .= '&utmr=' . uri_escape($referer);
$url .= '&utmp=' . uri_escape($path);
$url .= '&guid=ON';
$url =~ s/&/&/g;
$url;
}

353:nobodyさん
11/12/05 13:46:44.74
しっかりと書くなら
my $referer = exists $ENV{'HTTP_REFERER'} ? $ENV{'HTTP_REFERER'} : '-';
Referer: 0 は明らかに無効だから単に
my $referer = $ENV{'HTTP_REFERER'} || '-';

あと、uri_escape()でやるならURIつかったら
sub {
my $uri = URI->new(GA_PIXEL);
$uri->query_form(
'utmac' => GA_ACCOUNT,
'utmr' => $ENV{'HTTP_REFERER'} || '-',
...
);
return $uri;
}

354:352
11/12/05 15:34:16.27
>>353

my $referer = $ENV{'HTTP_REFERER'} || '-';

が自分にはしっくりきました。
ありがとうございます。
よくみたら $query は使ってないですね。
よくみてたら何か色々おかしなコードだ。

とりあえず感謝です。

355:Web初級
11/12/08 16:43:00.58 bceXKvCi
超初心者です。仕事でホームページ1つ作る事に成りました。
職場では私しかDTPの経験がありません(Webかじったのも私一人)。
イラストレーターからドリームウエバーへ、やっと持って来れるようになりましたが、
コーディングがさっぱり上手く行きません。2度ほどWebスクールにデータ持参で習いに
行きましたが、真似してもさっぱり上手く出来ません。
これじゃ何回習っても、金捨てに行くようなもので困っております。
簡単なビジュアルなので、ハイレベルな技術はいらないと思います。
分かりやすい本とかあれば最高なんですが、なにか名案ありませんか。
よろしくお願いします。

356:nobodyさん
11/12/08 17:01:30.14
>>1を読むこともできないようじゃあ何もできないだろうねえ

357:Web初級
11/12/08 18:06:56.56 bceXKvCi
はははは‥…失礼しました。

nobodyさんが即答するスレでしたか、暗号のようなQAで驚きました。
おみそれしました。

358:nobodyさん
11/12/08 23:09:44.53
>>355
355のレベルでこれから頑張るよりも専門の会社に発注して、
自分は本業に専念したほうがよい

359: ◆gHpPvpjxUOSB
11/12/09 00:04:54.14
格安で俺が引き受けちゃるけんね

360:nobodyさん
11/12/09 10:54:15.39
>>355
そりゃコーディング違いだ。
私もコーディングは外注した方が幸せになれると思う。そんな付け焼き刃じゃどうにもならんでしょ。

361:Web初級
11/12/10 08:46:00.83 Suxg5Gi2
買って来ました「ドリームウエバーCS5.5スーパーリファレンス」と
「3週間でマスターWebデザインの教室」の2冊、これ見て仕上げる
しかありません。やっと再就職して、よこされたのがこの仕事。
試用期間中だし、だれもウエブの事は知りません。
やるしかありません。

362:nobodyさん
11/12/10 08:57:02.65
>>361
それと、Perlになんの関係が?

363:nobodyさん
11/12/10 09:12:56.68
>>362
何がわからないのか、わかっていないやつだな。

364:nobodyさん
11/12/10 09:49:06.29
      r;ァ'N;:::::::::::::,ィ/      >::::::::::ヽ
.      〃  ヽル1'´        ∠:::::::::::::::::i
       i′  ___, - ,. = -一   ̄l:::::::::::::::l
.      ! , -==、´r'          l::::::/,ニ.ヽ
      l        _,, -‐''二ゝ  l::::l f゙ヽ |、 ここはお前の日記帳じゃねえんだ
        レー-- 、ヽヾニ-ァ,ニ;=、_   !:::l ) } ト
       ヾ¨'7"ry、`   ー゙='ニ,,,`    }::ヽ(ノ  チラシの裏にでも書いてろ
:ーゝヽ、     !´ " ̄ 'l,;;;;,,,.、       ,i:::::::ミ
::::::::::::::::ヽ.-‐ ト、 r'_{   __)`ニゝ、  ,,iリ::::::::ミ
::::::::::::::::::::Vi/l:::V'´;ッ`ニ´ー-ッ-,、:::::`"::::::::::::::;゙ ,  な!
:::::::::::::::::::::::::N. ゙、::::ヾ,.`二ニ´∠,,.i::::::::::::::::::::///
:::::::::::::::::::::::::::::l ヽ;:::::::::::::::::::::::::::::::::::::::::::/ /
::::::::::::::::::::::::::::::! :|.\;::::::::::::::::::::::::::::::/ /

365:nobodyさん
11/12/10 16:44:40.44
最近では、広告も電子化されてしまい、チラシといっても
なかなか通じません。

チラシの裏エディタを紹介しておきますね。
(私も愛用しています)

URLリンク(yuukiremix.s33.xrea.com)

>>361
たぶん、それはくびっていう意味だと思うけど。

366:nobodyさん
11/12/10 17:53:31.12 bJAhMBsm
Perl CGIで、
WEBページにラジオボタン、チェックボックスを配置して、
保存ボタンで各項目のチェック状態をDBに保存して、
次回ページを表示するときに、前回のチェック状態を再現させたいのです。

DBに保存まではできたのですが、ラジオボタンとかのチェック状態を設定するにはどうやればいいのでしょうか?

367:nobodyさん
11/12/10 18:04:10.96
>>366
ラジオボタンやチェックボックスなら該当するinput要素に、
checked="checked"
ってすればいいとおもいます。

368:nobodyさん
11/12/10 18:14:29.61 bJAhMBsm
>>367
HTMLのコードを出力する時に
if (checked) {
print <input type="radio" checked="checked">
else {
print <input type="radio">
}
とかやるってことですか?
数が多くてすごい大変なんだけど、これ普通のやり方なのかな

369:nobodyさん
11/12/10 18:16:11.86 phxklYwZ
>>366

どんだけ馬鹿なの?消えろ

おおwwwwだっせーーーーーーーwwwwwwwwwwwwww

そんなチェック状態とか簡単に考え付くだろwwwwwwww
引き継げばいいだけなのにwwwwwwwwwww
頭悪すぎ

自分=ウサギ
お前ら=カメ

まじまだまだ寝てても平気みたいだね

370:nobodyさん
11/12/10 18:18:06.55 phxklYwZ
こいつらがやってること全部できる

低レベルすぎる

やっぱりセンスが違うんだなあ

371:nobodyさん
11/12/10 18:23:07.58
>>368
ヒアドキュメントに変数埋めといて、該当箇所だけにchecked="checked"が展開されるようにするとか、
input要素はループで生成するようにしておいて、if文減らすとか、とか、

372:nobodyさん
11/12/10 18:27:04.72
保守性とるなら、配列かハッシュにラジオボタンやチェックボックスに必要な内容を入れといて
ループで処理かなぁ。

373:nobodyさん
11/12/10 21:39:06.91
.emlからbase64の部分だけ正規表現で抽出する方法ってありますでしょうか?

374:nobodyさん
11/12/10 22:10:18.53
あります。

375:nobodyさん
11/12/11 11:50:08.36
えっ

376:nobodyさん
11/12/11 12:15:53.32
なり

377:nobodyさん
11/12/11 16:38:26.87
>>361
Perlでやれって言われたの?
今から短時間で実装するならPHPしかないんじゃないの。
Perlでテンプレートエンジンとウェブアプリケーションフレームワークの環境構築とかしてる時間はたぶんないんでしょう?

378:nobodyさん
11/12/12 10:19:09.76
>>373
どなたか具体的な方法をお願いしますです

379:nobodyさん
11/12/12 11:29:18.56 8Y5nZNmR
本文なのか添付なのか、plainなのかhtmlなのか・・・
質問がざっくばらんすぎなのでは?

380:nobodyさん
11/12/12 12:26:49.55
ざっくばらんの使い方おかしくね?
アバウトすぎるとでも言いたいんだろうけど

381:nobodyさん
11/12/12 14:15:46.02
ページにアクセスすると、POSTじゃない認証(Basic認証?)を使って表示されるページってありますよね
そのページをperlで取得しようと思っています。
ですが何度やっても401が帰ってくるばっかりでまったく進展しない・・・
#!/usr/local/bin/perl
$|=1;
print "Content-type: text/html\n";
print "\n";

#*一度authorization_basicでやってみました。*
#*他のサイトではうまくいったのですが 目的のサイトでは動作しなかった為*
#*ntlmを試しています*
use LWP::UserAgent;
use HTTP::Request::Common;

my $url = '認証が必要なURL';
# Set up the ntlm client and then the base64 encoded ntlm handshake message
my $ua = new LWP::UserAgent(keep_alive=>1);
# $ua->credentials('ホスト:80', '', "???\\ID", 'パスワード');
$request = GET $url;
print "--Performing request now...-----------<br>\n";
$response = $ua->request($request);
print "--Done with request-------------------<br>\n";
if ($response->is_success) {print "It worked!->" . $response->code . "<br>\n"}
else {print "It didn't work!->" . $response->code . "<br>\n"}

????の部分に思い当たる物が無いので ????\\を消して見てもだめでした。
どういった動きをしているのか、またなぜ失敗しているのかも負えず・・・困っています
宜しくお願いします

382:nobodyさん
11/12/12 18:29:36.74 8Y5nZNmR
Google さんで 「LWP::UserAgent ベーシック認証」 でググると、一番上に出てくるんだけどね。
ちゃんと調べろよカス。



use strict;
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(GET => 'URLリンク(www.example.com)');
$req->authorization_basic('fuga', 'hoge'); # 'ID', 'PASS'
my $res = $ua->request($req);

あと credentials はダイジェスト認証用じゃないかなと。
ベーシック認証なら authorization_basic を使う。
「ダイジェスト認証 領域名」 でググれば、知識も深まるかと思います。


ちなみに、僕は HTTP::Request::Coomon を使って $req = GET('URLリンク(www.example.com)'); って
やる方が好きです。

383:nobodyさん
11/12/12 18:48:35.31
>>382
どうもありがとう御座います
やってみましたが401が帰ってきました・・・

何でなんだろう?
WWW-AuthenticateにはNegotiateとNTLMって出てるのにorz

384:nobodyさん
11/12/12 19:57:09.04
NTLM ・・・ Windows認証か ・・・
URLリンク(perldoc.jp)
領域名の部分をちゃんと指定すれば、最初のコードで認証できるかと。
とりあえずサーバーにIISを使ってるなら、そう書いた方が良いと思う。


385:nobodyさん
11/12/12 20:04:00.94
>>384
すみませんサーバー側でIISを使ってるのかどうか 確認はしたのですが、確かではないのでorz
perlのコーディングとは違う質問で申し訳ありませんが、領域名っていうのはいったい何を指定すれば・・・
クライアント側で調べて分かる物なんでしょうか

386:nobodyさん
11/12/12 20:39:55.27
認証の設定をするときに、サーバー側で設定するもの。

387:nobodyさん
11/12/13 01:38:11.67
>>380
>>379は日本語がざっくばらんなんですな

388:nobodyさん
11/12/15 18:36:11.15
Spreadsheet::WriteExcel でエクセルファイルを出力しています。
セルはAからZ列があってそこから先はAA,AB,ACと続くのはご存知だと思います。
このアルファベットを数字に対応させたいと思ってますがアイディアがでませんのでどなたかご教示くださいませ。
1→A ,2→B,26→Z まではできるのですが( chr($_ + 0x60) )、27→AA,28→AB 以降をどうするかがわからないのです。
よろしくお願いいたします。

389:nobodyさん
11/12/15 19:08:41.22
$c=q{z};print++$c

390:388
11/12/15 19:27:18.02
すいません、説明が不足してました。申し訳ございません。
数字が26なら一発でZに、28なら一発でABに変換したいのです。

391:nobodyさん
11/12/15 20:03:59.53
再帰処理するサブルーチンでも作れば?

392:nobodyさん
11/12/15 20:45:17.94
sub convert {
my $n = shift;
my $al = shift || '';
return $n > 0 ? convert(int(($n - 1) / 26), chr(0x41 + ($n - 1) % 26) . $al) : $al;
}
print convert(28); #=> 'AB'

393:388
11/12/15 20:50:09.96
>>392
完璧です。
ありがとうございました。

394:nobodyさん
11/12/15 21:08:20.48
>>388
Spreadsheet::WriteExcel って、行・列ともに数値で指定できなかったっけ?

URLリンク(search.cpan.org)

395:nobodyさん
11/12/16 07:33:02.00
ムダナナヤミダッタトイウオチカ

396:nobodyさん
11/12/31 11:42:50.17 uq+4+jAH
Perlにかぎったはなしではないのですが、

cgiに送るデータを
index.cgi?user=foo
ではなく、例えば
URLリンク(favstar.fm)
のようにディレクトリ風に送って
CGI側で受け取るにはどうすれば良いんでしょうか?

397:日系アメリカ人 ◆japYJPNx6A
11/12/31 11:53:18.05
ディスパッチ

398:nobodyさん
11/12/31 11:54:05.80
PATH_INFO

399:nobodyさん
11/12/31 16:07:44.64
>>398
ありがとうございます!

400:nobodyさん
11/12/31 17:34:33.56 ELwS00/V
URLリンク(www.nicovideo.jp)

401:nobodyさん
12/01/02 00:05:58.15 xN/cFjEo
datファイルの中に書いてあるパスワードと一致した場合にページを表示させたいのですが
以下のソースでコマンドプロントから入力しても必ず失敗してしまいます

エラーはなく、perl -cw を使ってもOKになり問題はありませんでした

$datfile = "./add.dat";

open(DAT,"+< $datfile");
flock(DAT, 2);

$lock = <<"EOD";
<html><head><title>ページ</title></head>
<body>認証許可</body></html>
EOD

$line = <STDIN>;

chomp($line);

if ($line eq <DAT>) {
print "$lock";
}
else {
print "認証失敗";
}

close(DAT);

datファイルの中身は「t」という一文字が入っています
詳しい方、教えてください

402:nobodyさん
12/01/02 00:34:00.94
$datfile の1行目に改行があるとかじゃないの?

print によるデバッグがしやすいから、面倒でも最初は変数に入れるクセをつけてみると良いかも。


403:nobodyさん
12/01/02 07:39:45.76
まず use strict しろよ

404:nobodyさん
12/01/02 09:01:46.53
あとコマンドプロントじゃなくてコマンドプロンプトな。

405:nobodyさん
12/01/02 09:19:16.84
<DAT>からの入力をchompしてないからじゃね?

406:nobodyさん
12/01/03 02:35:21.75
あまりに下らないミスすぎて、恥ずかしすぎてお礼も言えないってか?

407:nobodyさん
12/01/03 08:07:23.54
お礼が欲しいなら2ちゃんねる以外でやれ

408:nobodyさん
12/01/03 08:39:34.48
>>407
うるせえカス

409:nobodyさん
12/01/03 08:59:10.49
罵倒されるのが嫌なら2ちゃんねる以外でやれw

410:nobodyさん
12/01/03 11:26:01.27
まあコマンドプロントじゃしょうがないか

411:nobodyさん
12/01/03 11:59:37.15
プロントにパスタでも食いにいくか。

412:nobodyさん
12/01/04 19:27:09.19
Webブラウザで表示された内容を取得しようと思ったのですが、
私が欲しい情報はJavaScriptにより出力されたものであるために、
単純にPerlを用いただけでは難しいと分かりました。
どのように対処すれば、JavaScriptの表示部分を取得できるのでしょうか?
よろしくお願いいたします。

413:nobodyさん
12/01/04 22:01:40.66
サーバーで javascript を走らせるフレームワークがあったような気がする

414:nobodyさん
12/01/05 01:03:58.26
spidermonkeyとか?js読めばどこに通信して何をしてるか分かるから、js無くてもいけると思うけど。

415:nobodyさん
12/01/05 01:39:51.36
Ajax で表示してるなら、firefox での拡張で HTTP 通信を覗けるのがあるから、
それで見張ればいい。

firefox 入れなくない!っていうなら snooper で見ればいい。

416:nobodyさん
12/01/05 22:01:42.38
急にPerlでCGIプログラムをやることに。
みなさんIDEは何をお使いですか?

今んとこ慣れないEclipseでやろうと
思ってます。

417:nobodyさん
12/01/05 22:27:56.90
Perlを始めとした動的言語では
コード補完もリファクタリングもヘルプも
中途半端にしかならないからIDEは重いだけだよ。

418:nobodyさん
12/01/05 22:34:01.35
テキストエディタのみ

最近はブロックの折り畳みとかあるんで、充分強力

419:nobodyさん
12/01/05 22:54:26.32
IDEに助けてもらおうと思ったんですが
効果が薄いようですね。
腹くくってエディタでやります。

420:nobodyさん
12/01/06 02:05:15.33
各個人のポリシー次第。なのかもしれませんが、質問です。

モジュール ( .pm) を作ったときって、何かエラーが合った場合に
die でスクリプトを止めてしまってエラーを通知するべきか、
それとも STDERR にエラーを出力しつつスクリプトは止めないようにするべきか、
どちらがオススメのコーディングの仕方なんでしょう?

421:nobodyさん
12/01/06 02:11:20.73
男は黙ってcroak

422:nobodyさん
12/01/06 03:13:39.39
>>420
してほしい事をやらせて
してほしくない事をやらせなければよい。

423:nobodyさん
12/01/07 06:25:16.35
>>421
croak が分からなかったので調べてみた。
呼び出し元が分かる die か。なるほど。
ワーニングには carp か。


ありがとう!



>>422
根本的に文章が読みとれてないですよ。


424:nobodyさん
12/01/07 12:06:24.49
>>423
> 根本的に文章が読みとれてないですよ。
俺は422ではないが、そっくりそのままお返しする。

425:nobodyさん
12/01/07 13:19:20.03
420は2択を迫っているが、422は場合によるといっていて、その場合についての説明もしている。
422が正解だと思うが。


426:nobodyさん
12/01/12 05:19:37.52
どうすんのがいいのか聞いてんのに場合によりけりとしたり顔で言われたら脱力する
420は場合によりけりということがわかった上で、基本的なスタンスはどっちがいいか聞いてんじゃないの?

俺はプロセス殺すなー
変な値入ってんのに処理続けても意味ないし
warnなんてデバッグでしか使ったことないや

427:nobodyさん
12/01/12 12:02:21.96
>>426
おまえも読解能力の欠陥持ちか。
「場合によりけり」では結局何も答えてないに等しいが、>>422はそんなこと書いてないだろ。
どういう時にどっちを選択すればいいかが簡潔に書いてあるだろ。

428:nobodyさん
12/01/14 02:03:55.49
time_tが32bitか64bitかを調べる方法はありますか?
2038年1月19日3時14分7秒以降のUNIX時間を取得してみるよりスマートな方法で。

学校の宿題でカレンダーを作ったら2038年2月でずれちゃいました。

429:nobodyさん
12/01/14 05:41:58.49
overflow 日付は分かってるんだから、最大値+1を与えた時に
日付がどうなってるか確かめればよい

430:nobodyさん
12/01/14 10:28:47.22
> 2038年1月19日3時14分7秒以降のUNIX時間を取得してみる

これで充分スマートじゃないか?


431:nobodyさん
12/01/14 12:11:45.71
俺に言わせれば、time_tが32bitか64bitかなんて重要な問題じゃないね。
本当に知りたいことは、2038年1月19日3時14分7秒以降が扱えるかだろう? (キリッ)

432:nobodyさん
12/01/14 12:21:34.67
ぶってぇ釣り針垂らしやがって・・・

433:nobodyさん
12/01/14 15:29:38.07
つーか「これは仕様です」で十分でしょ、実際仕様なんだから。
年が4桁で有限なのと同じでしょ。

434:nobodyさん
12/01/14 15:46:35.43
・Perl 5.12 以降を使う
・Time::y2038 モジュールを使う
・DateTime モジュールを使う
のどれかで解決

435:nobodyさん
12/01/14 16:24:02.91
他の人の労力で解決っているのは、仕事ではそうすべきだけど、
"トレーニング" である宿題ではそうすべきではない。むしろ
time_t にさえ依存せず、自力で10桁年カレンダーのような無駄
なものを作って自分自身の糧とすべし。

436:nobodyさん
12/01/14 18:04:47.99
>>435
その考え方は賛成できるけど、このスレ的には「車輪の再発明」って言われちゃうんだよね~ orz


437:nobodyさん
12/01/14 18:26:43.69
じゃあ、トレーニングだ。

自分で考えろ。こんな所聞くな。
他の人の労力で解決すんな。

438:nobodyさん
12/01/14 21:36:35.23
車輪の再発明はいいんだけど、大抵は独学のトホホなプログラムができあがあるから、せめて一度
既存モジュールの中身を読んでくれ。

439:nobodyさん
12/01/14 23:37:55.97
先生のために宿題をするのか、自分のために宿題をするのか違い。

440:nobodyさん
12/01/15 20:18:01.72
単位のためだろ

441:nobodyさん
12/01/15 20:45:40.76
そういうの全く理解できないんでごめんな

442:nobodyさん
12/01/18 21:06:05.29
元ファイルの内容を書き換えて別ファイルに保存する方法を教えてください。
元ファイル aaa.txt
変換プログラム trans.cgi
変換後のファイル bbb.txt

aaa.txt に書いてある「あ$kanaお」を読み込んで
trans.cgi にて$kana = きくけ; として変換し
bbb.txt に「あきくけお」で出力するには、どうしたらいいのでしょうか。

open関数で +< という読み書きでファイルを開いても
空テキストが作成されるだけで、うまくいきません。
どうかよろしくおねがいします。

443:nobodyさん
12/01/18 21:27:56.62
open(my $infh, ?<:utf8?, ?input.txt?);
open(my $outfh, ?>:utf8?, ?output.txt?);
while(my $line = <$infh>){
  ~処理~
  print $outfh $line;
}
close($outfh);
close($infh);

444:nobodyさん
12/01/18 22:19:08.77
>>442
URLリンク(perldoc.jp)

my %var = (FOO => 'bar');
open my $fh, '+<', $file or die $!;
read $fh => my $text, -s $fh;
$text =~ s/__([A-Z]+)__/$var{$1}/g;
seek $fh, 0, 0;
print $fh $text;
truncate $fh, tell;
close $fh;

open my $sfh, '<', $src_file or die $!;
open my $tfh, '>', $tmp_file or die $!;
while (<$sfh>) {
  s/__([A-Z]+)__/$var{$1}/g;
  print $tfh $_;
}
close $tfh and close $sfh or die $!;
rename $tmp_file => $src_file or die $!;

445:442
12/01/18 22:35:01.78
>>443さん
>>444さん

お返事ありがとうございました。
じっくり読んで頑張ってみたいと思います


446:nobodyさん
12/01/25 02:08:42.13 8GsK3GVU
ファイルの置換について質問させてください。
コマンドラインから、
echo "test.txt" | xargs perl -pi -e 's/hoge/HAGE/g'
とすると正しく置換されるのですが、
ブラウザからapacheをとおして、スクリプト内で上記のコマンドを、
`echo "[フルパス]test.txt" | xargs perl -pi -e 's/hoge/HAGE/g'`

system "echo ¥"[フルパス]test.txt¥" | xargs perl -pi -e 's/hoge/HAGE/g'"
とするとうまく置換されないのはなぜでしょうか?
またこのケースですとスクリプト内での記述はどのようにするのが適切でしょうか?宜しくお願い致します。



447:nobodyさん
12/01/25 03:35:55.61
CGI実行時のユーザ権限は
そのユーザ権限でファイルや当該ディレクトリは書き込み可能になっているか
をまずチェック。

448:nobodyさん
12/01/25 03:57:31.07 Arlh9fb/
447さん
お返事ありがとうございます。ディレクトリとファイルは権限777にして試してみたのですが、
置換されませんでした。あとスクリプト中の文字のエスケープ漏れもみなおしてみたのですが、
結果変わらずでした。さらに調べてみます。ありがとうございます。

449:nobodyさん
12/01/25 04:06:26.93
どう出来ないのか
エラーは出てないのか
端末でスクリプトを走らせたらどうなるか

450:nobodyさん
12/01/25 08:23:33.82
Apacheのerrorログを見てみる ←基本

451:nobodyさん
12/01/28 22:01:51.13
errorログを見て特に問題はないと思っていたら...

sendmailのログでしたorz←

452:nobodyさん
12/01/29 11:48:32.08
コマンドラインやめてopen(FILE,"[フルパス]test.txt")しちゃいなよ

453:nobodyさん
12/01/31 17:42:02.72
質問質問!
&sub1(qq(asdasdqwdasdasd));
sub sub1
{
while($_[0] =~ /asd/gs )#←①
{
print $_[0];#←①でマッチした中身を出力したいが、subの引数
}
}
こんな感じのプログラムを作ったのですが
$_[0]の中身が更新できなくて困っています・・・
どなたか回避する方法を教えてください!お願いします

454:nobodyさん
12/01/31 17:56:37.52
/asd/gs
 ↓
/(asd)/gs


あとついでに書き直した。

sub1(qq(asdasdqwdasdasd));
sub sub1{
 my $str = shift || '';
 while($str =~ /(asd)/gs){
  print $1;
 }
}

慣れてくれば良いけど、初心者であるうちは $_ をそのまま使わずに関数内で変数を用意して
そこへ格納したほうがいいよ。


455:nobodyさん
12/01/31 18:23:59.58
>>454
2つほど質問があるのですがいいですか!

456:nobodyさん
12/01/31 18:26:09.85
お礼を書くのを忘れていました
>>454 さん ありがとう御座います。

457:nobodyさん
12/01/31 18:52:11.00
don't ask to ask

458:nobodyさん
12/01/31 21:02:02.01
CGIのデータベースを運用しています。

auの端末で検索できるものとできない機種があります。
同じ2009年にでたモデルでもできるできないがあります。
例えばCA002はできるけど、K002はだめ。

できないものは、何も検索フォームに入れないで検索してもダメです。

Jcode.pl 2.13でエンコードしてますが、
これが悪いのでしょうか?

どうしたら、文字検索をできるようにできますか?



459:nobodyさん
12/01/31 21:33:09.50
>>458
携帯サイトのWebプログラムを語ろう Part3
スレリンク(php板)

460:nobodyさん
12/01/31 22:38:52.20
表示してる文字コードはなにか

端末が送ってきてる文字コードは本当に希望したものか


461:nobodyさん
12/01/31 22:46:58.04
>>460
Shift_JISです。

462:nobodyさん
12/01/31 22:57:27.90
utf-8 で書きませう

463:nobodyさん
12/01/31 23:06:58.71
Jcode.pmの好きなおいらがアドバイスしにやってきたょミ☆
初心者スレだしねミ☆

464:nobodyさん
12/01/31 23:43:18.05
>>462
邪悪なutf-8イラネ

465:nobodyさん
12/02/01 00:41:51.19
たしかに utf-8 はマッピングミスとかあるけど、
他からデータを持ってきたりとかしない場合には utf-8 で問題無い。


466:nobodyさん
12/02/01 01:42:35.88
Shift_JIS vs UTF-8 のゴングが今、スレ内に鳴り響きました!

467:nobodyさん
12/02/01 04:46:09.17
まずはアクセスログと標準入力に何が渡されたかを見る。

468:nobodyさん
12/02/01 06:04:45.99
>>466
プログラム板でやれ

469:nobodyさん
12/02/01 23:55:30.88
続きはSJIS板で

470:nobodyさん
12/02/03 01:56:38.79
cp932板はありますか?

471:nobodyさん
12/02/03 02:11:46.79
あるよ

472:nobodyさん
12/02/04 02:53:54.65
LWP::UserAgent で指定 URL をアクセスして、リダイレクトされた際に実際にアクセスした URL を知るにはどうしたら良いでしょうか?

header('Location') で調べれば良いと思ったものの、リダイレクトされた後には Location ヘッダは無く、
max_redirect(0) でリダイレクトさせなければ Location ヘッダを取得できて、リダイレクト先を知ることは出来ました。

max_redirect(0) でアクセスして、Location ヘッダがあれば max_redirect(1) とかにしてアクセス。
リダイレクトが1回で済まなければ max_redirect(2) でアクセスしてみる。

と言ったことをやってるのですが、これが非常に面倒なので結果的にアクセスした URL が取得できればと考えて質問させていただきました。

473:nobodyさん
12/02/04 03:45:11.91
>>472
response_done ハンドラか response_redirect ハンドラに URL を記録する処理を追加する。
URLリンク(search.cpan.org)

474:nobodyさん
12/02/04 09:09:19.56
んなことしなくても、
HTTP::Response オブジェクトは使われた HTTP::Request オブジェクトを丸々保持してるし、
リダイレクト前の Response も previous メソッドでたどれる。

use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $res = $ua->get("URLリンク(t.co)");
do { print $res->request->uri, "\n"; } while ($res = $res->previous);
__END__
URLリンク(www.asahi.com)
URLリンク(t.asahi.com)
URLリンク(t.co)

475:473
12/02/04 09:40:24.08
>>474
成程、そっちをみれば良かったのか。勉強になったよ。

use LWP::UserAgent;
my $r = LWP::UserAgent->new->get('URLリンク(t.co)');
print map $_->request->uri . "\n", $r->redirects, $r;
__END__
URLリンク(t.co)
URLリンク(t.asahi.com)
URLリンク(www.asahi.com)

476:nobodyさん
12/02/04 16:24:03.95
>>473-475
自分には >>474 さんの書き方がしっくりきたので、
これでいこうと思います。
ありがとうございました。



どうでもいい事だけど・・・
do{ }while( ) ってあまり好きじゃないw
ループの条件式が後に来るってーのが、なんか馴染めない (^-^;

477:nobodyさん
12/02/05 04:49:54.12
>>476
> do{ }while( ) ってあまり好きじゃないw
> ループの条件式が後に来るってーのが、なんか馴染めない (^-^;

その方が都合のいいケースもたまにあるでしょ。
最低1回は処理が必要、って時が。たまにね。

478:474
12/02/05 10:00:34.05
動作というより記法について言ってるのでは。
特にブロックの中身が複数行のときは最後の while を見るまでループだってことがわからんのが痛い。
あとまあ、動作も実際気持ち悪い。本物のループブロックじゃないから next とか使えんし。
まともに書く時はちょっと記述増えることになっても普通の while と last とかを組み合わせるほうがいい。

479:nobodyさん
12/02/06 18:29:54.91 ryr2jQRg
Perlによるネットワークプログラムの質問です。
Perl でアクセスしたいサイトがあるのですが、Perlからhtmlを読むことが出来ません。
IE8の「ソースを表示」では表示できるのですが。

アクセスしたいサイト :URLリンク(cinema.pia.co.jp)
Perlのスクリプトの場所 :URLリンク(x68000.q-e-d.net)
その説明 : URLリンク(x68000.q-e-d.net)

【実行結果】
perl http-client-2.pl -GET URLリンク(cinema.pia.co.jp)
HTTP/1.1 200 OK
Date: Mon, 06 Feb 2012 09:25:43 GMT
Server: Apache
Last-Modified: Fri, 28 Aug 2009 06:41:24 GMT
ETag: "304a0-2-f9082d00"
Accept-Ranges: bytes
Content-Length: 2
Connection: close
Content-Type: text/html

1

で終わってしまい、肝心のHTMLのBODYの部分を表示する事が出来ません。
どなたか分かる方教えてください。

480:nobodyさん
12/02/06 20:02:58.69
LWP 使えば?

481:nobodyさん
12/02/06 20:18:45.51
>>480
オレもLWP使うに1票

482:nobodyさん
12/02/06 22:10:48.93
wget使えば?

483:nobodyさん
12/02/06 22:53:24.14
一度やってみたかったのでtelnetにコマンドを流し込みます。
覚えるともう、病みつきです。ftpもこれでやってます。
sendmailだって大丈夫です。

484:479
12/02/07 01:13:45.57 eo0HNsOB
>>479 です。返信ありがとうございます

>>480 >>481
LWP 使ってみました。URLリンク(www.sea-bird.org)
出来ました
>>482
wget をPerlから?使う方法が分かりませんでした。コマンドとして使うという事なら目的と違います
>>483
上記チュートリアルサイトにて telnet も試しましたが、駄目でした


実は本当にやりたいことは別にあったので、すみませんが質問をやり直させてください

このサイトは、映画レビューサイトなのですが、
URLリンク(cinema.pia.co.jp) (xxxxxは数字)
にて、各ユーザーのレビュー一覧を見る事が出来ます
(実は自分のレビューを抽出したいだけです)
しかし、Perlからのアクセスでは、LWPを使ってもここではじかれてしまいます
(IE8の「表示→ソース」では見れるが、Perlにprintさせると違うものになっている)

どなたか原因分かりますでしょうか?

485:nobodyさん
12/02/07 01:25:44.20
「違うもの」が何だか分からないけど、ユーザーエージェントをIEにしてみたら?

486:nobodyさん
12/02/07 01:48:21.80
>>484
use LWP::UserAgent;
use HTTP:Request::Common;
my $ua = LWP::UserAnget->new();
$ua->agent('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E)');
my $req = GET('URLリンク(cinema.pia.co.jp)');
my $res = $ua->request($req);
if(open(my $outfh, '>', 'debug.html')){
print $outfh $res->content() || '';
close($outfh);
}


487:479
12/02/07 03:24:39.22
>>479 です。ありがとうございます

>>485 駄目でした。ソースの190行目辺りからが違ってきます
上手くいく時は、以下のようになります。良く分かりませんが。
<div id="mainImpMain">
<form method="get" class="common">
<ul class="pagedLink">

>>486
出来ました。ありがとうございました。

488:nobodyさん
12/02/07 23:59:17.86
>>487
何がだめだったのか、ちゃんと理解できてる?

489:nobodyさん
12/02/08 00:00:54.11
HTTP ヘッダに独自のヘッダを付加しようとしてるんですけど、
自分自身が呼ばれて起動された際の HTTP ヘッダってどうやって確認するのでしょうか?

use CGI の header はヘッダを出力するためのものっぽいし・・・

490:nobodyさん
12/02/08 00:27:39.96
>>489
それはあんたのスクリプトがどうやって呼び出されているかによる。
httpd に Apache を使ってて CGI 経由で呼び出されているなら
Apache のマニュアルと CGI の仕様書を読んでくれ。
URLリンク(httpd.apache.org)
URLリンク(www.studyinghttp.net)

あと HTTP の仕組みもきちんと理解してくれ。
URLリンク(www.studyinghttp.net)

491:nobodyさん
12/02/08 00:51:03.57
HTTP ヘッダの理解を深める為にマニュアルや RFC を求めてるんじゃなくて、
自身のスクリプトが呼ばれた際の HTTP ヘッダを得る方法を伺っているわけでして・・・


492:479
12/02/08 01:09:59.52
>>488
目的のスクリプトは書けたのですが、気持ち悪いので知ってるなら教えてもらえますか?


493:nobodyさん
12/02/08 04:36:08.44
「教えてもらえますか?」

最近の若い奴は、物事の尋ね方も知らないのか?ブツクサブツクサ

494:nobodyさん
12/02/08 07:53:34.31 D9+63/xk
<!-- link -->から<!-- /link -->までのタグ内に存在するURLとその行の「~」で囲まれてる部分を
抜粋するようなプログラムを作成したいと思います。

例えば、次のような文章があった場合、
------------------------------------
ほげほげふがふが
URLリンク(example.com)
ほげほげふがふが
URLリンク(example.com)
<!-- link -->
リンク一覧
~テスト~ URLリンク(example.com)
~さいたま~ URLリンク(example.com)
東京
<!-- /link -->
------------------------------------
結果は
------------------------------------
<a href="URLリンク(example.com)">テスト</a>
<a href="URLリンク(example.com)">さいたま</a>
------------------------------------

のようにしたいのですが、どのように書いたらよいでしょうか?

尚、URLを抜き出す正規表現は次のように書きました。
(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)


環境は、CentOS5 perl5.10です

495:nobodyさん
12/02/08 10:31:20.53
>>494
URLリンク(perldoc.jp)

my $protocol = qr/(?:https?|ftp)/;
my $format = '<a href="%2$s">%1$s</a>' . "\n";
my $text = do { ... };
my @link;
while ($text =~ m{<!-- link -->(.*?)<!-- /link -->}gs) {
  my $links = $1;
  push @link, sprintf $format, $1, $2
    while $links =~ m{~(.*?)~.*?($protocol://[!#-;=?-\[\]_a-z~]+)}gos;
}
print @link;

496:nobodyさん
12/02/08 12:09:45.01
>>493
その割には「お前ら教えろ」で回答貰えたりするけどな2ch

497:nobodyさん
12/02/08 23:05:10.70
>>496
それはむしろネタとして受け入れられてしまうんだろうなw

498:nobodyさん
12/02/19 12:41:02.48
私の働きが悪いせいか、私の物はほとんど買ってくれません。
下着は、妻と娘のお下がりです。
おまけに洋式トイレ、便座が上がってるとか、飛沫が飛んでるとか、いちいち五月蝿いんです。
おかげで、トイレは座ってするように強要され、もうブリーフの前、開ける必要が無いんだからと、私達のお下がりで十分でしょう。と、ここ何年も私の物は買ってくれません。
今では開き直って、ブラジャーもしています。
家に居る時は、娘のスカートを穿き、外出は娘のパンツ、ジーンズ穿いていきます。
娘は、始めは困惑していたが今では慣れ、何でも貸してくれます。
妻の洋服、パンツ、スカートはウエストがちょっときつい。
ストレッチの物は、勝手に着ています。

499:nobodyさん
12/02/19 13:22:18.26
cat >>498 > /dev/null

500:nobodyさん
12/02/19 15:19:47.97
next if $num == 498

501:nobodyさん
12/02/19 17:53:14.70
Global symbol "$num" requires explicit package name at >>500 line 1.

502:nobodyさん
12/02/19 22:33:36.65
どうせなら、>>498 は、そのカキコ内容を perl で記述すべし。

503:nobodyさん
12/02/20 14:28:00.53
use warnings; use utf8; use Corp; use Family;
my $family = Family->new();
$family->husband('>>498'); $family->wife('百合子(仮)'); $family->daughter('楓(仮)');
my $corp = Corp->new(); $corp->salaryCalculation();
$family->income($family->husband(), $corp->salary());

if($family->income($family->husband()) > 250000){
  # トイレ
  my $toto = Toilet->new();
  $toto->type('EU'); # JA or EU
  my $urine = $family->urine($family->husband()); # 小便をする
  $toto->urine($urine);
  if($toto->is_splash()){ $toto->forced_to_sit(1); } # トイレの用足しには座りを強制
  # 下着
  if($toto->forced_to_sit()){ $family->underwear($family->husband(), $family->underwear($family->wife()); }
  # 他の着衣
  if($family->underwear($family->husband()) eq $family->underwear($family->wife())){
    $family->brassiere($family->husband(), $family->brassiere($family->wife());
    $family->skirt($family->husband(), $family->skirt($family->daughter());
    $family->jeans($family->husband(), $family->jeans($family->daughter());
  }
}else{
  $family->underwear($family->husband(), 'BOXER PANTS');
  $family->brassiere($family->husband(), undef);
  $family->skirt($family->husband(), undef);
  $family->jeans($family->husband(), 'EDWIN');
}

>>498 じゃないけど、これが限界っす><
娘や妻への下着のセットは省いたw

504:nobodyさん
12/02/20 14:29:13.01
収入がちゃんとある場合の下着で、ブラとスカートはちゃんと undef にしてるところを評価して欲しいですw

505:nobodyさん
12/02/20 22:20:39.95
わろた

506:nobodyさん
12/02/21 10:11:33.62
修正
× $corp->salary()
○ $corp->salary($family->husband())

サラリーを得るのに名前を渡してなかった><


× if($family->income($family->husband()) > 250000){
○ if($family->income($family->husband()) < 250000){

不等号の向き間違えたw

507:nobodyさん
12/02/24 16:30:51.95
初めまして。

RSSのデータから、日付時刻とタイトル、そのリンク先URLを一覧にして取得したいと考えています。

・ブラウザに「取得」ボタンなどを表示し、それをクリックすることで最新の一覧を表示
・以前に取得したものは取得しない

先ずは上記2点を実装したいです。

良い方法や参考サイトなどをご教示頂きたいです。
よろしくお願いいたします。

508:nobodyさん
12/02/24 17:02:28.77
>>507
>>1-2

こんなCGI探してます 23
スレリンク(php板)
依頼されたツールを誰かが作るスレ
スレリンク(php板)
金出すからスクリプト作ってよvol.1
スレリンク(php板)
自作CGIを評価するスレ
スレリンク(php板)
自分の作ったCGIスクリプトをデバッグするスレ
スレリンク(php板)

スレリンク(php板:420-435番)

509:nobodyさん
12/02/24 17:22:17.71
>>508
最後のスレが役に立ちそうです。ありがとうございます。

510:nobodyさん
12/02/25 00:54:16.96
なぜマスコミは財務省の犬になるのか?

全国紙では唯一、増税批判の姿勢を取っていた産経新聞に、
昨夏、国税の税務調査が入った。
財務省にとって税務調査は言論統制の最強の武器で、
2009年には朝日、読売が申告漏れを指摘され、
それを機に朝日は増税礼賛へと傾斜し、
読売は財務省幹部の天下りを受け入れた経緯がある。

国税庁という「警察力」は、財務省の最強の武器なのです。
何しろ、徴税というのは「裁量範囲」が広い業務で、
調査官の「判断」により合法とされたり、
脱税とされたりしてしまうのです。
「去年はOKだったのに、今年は何でダメなんだ!」
といった事態は普通に起こります。


511:nobodyさん
12/02/25 13:09:52.88
眞子様は素敵

まで読んだ

512:nobodyさん
12/02/27 00:22:44.82
貞子は素敵

まで読んだ

513:nobodyさん
12/02/27 00:26:08.69
素数

に見えた

514:nobodyさん
12/02/27 00:46:41.84
素股

515:nobodyさん
12/02/27 07:22:57.09
眞子様は素股!?

516:nobodyさん
12/02/27 14:07:22.77
貞操は国家機密事項

517:nobodyさん
12/02/28 00:06:11.43 0AwG+yg0
質問なのですがPerlでこういうサイトって作れますか?
URLリンク(findrjp.com)
これはPHPだと思うんですけど
作るとしたらelsifで作る感じでしょうか?
こういうのってすぐ作れますか?

518:nobodyさん
12/02/28 00:51:16.58
お前には無理

519:nobodyさん
12/02/28 00:59:39.36
お前に出来たらチンパンジーでも出来るよ

520:nobodyさん
12/02/28 01:10:42.34
そうだねelsifさえ使いこなせれば簡単に作れるよ。でもelsifはかなり難しいから頑張ってね。

521:nobodyさん
12/02/28 01:35:37.84 0AwG+yg0
皆様生暖かいコメントありがとうございます。
どうせテメーらにはできないんだろwwwww
って挑発したらヒント教えてくれますか?
elsifは分かります

522:nobodyさん
12/02/28 10:18:18.70
はいはいマルチマルチ。

523:nobodyさん
12/02/28 14:34:14.89
実行中のスクリプトの場所に関して質問です。

スクリプト中で開くファイルはスクリプトのあるディレクトリのサブディレクトリに置いており、
全てフルパスで開くようにしています。
昨日初めて mod_perl を入れたところ、FindBin $Bin や Cwd が Apache のディレクトリになっています。

$ENV{'SCRIPT_FILENAME'} を使おうかと思ったのですが、デバッグでコンソールで実行することもあるため
$ENV{'SCRIPT_FILENAME'} は使えません。

$0 では cron でも mod_perl でも CGI でもコンソールでも期待する値が得られました。

./hoge.pl で実行して dirname($0) すると ./ 返ると書いてある場所もありますが、当方では
確認できませんでした。

そこで疑問に思ったのが、$0 を 100% 信用してもいいのか? ということです。
「他のプログラムにより強制的に書き換えられる」 という可能性は今は無しでお願いします。


524:nobodyさん
12/02/28 14:46:37.42
ちょっと勘違いがありました。

$0 は perl に与えられた path みたいですね。
HTTPd とかはフルパスを作って渡してくれてるっぽいけど、
コンソールではそうではない。

むぅ。。。

525:nobodyさん
12/02/29 01:59:02.18
mod_perl を導入してスクリプトが走るのが軽いからと F5 連打してたら
Not a CODE reference ~
っていうエラーが出た。
そのエラーが言う行は

main();

としかやってないのに。。。

526:nobodyさん
12/02/29 11:28:36.69
mod_perlが返すパスも元を追えば$0を元に生成してたと思う

527:nobodyさん
12/03/02 13:17:08.38
すみません、Web制作板からこちらに飛ばされて来ました。

ユーザーによる新規会員登録後、そのユーザー毎にディレクトリを自動的に生成し、
ユーザディレクトリ毎に容量制限を割り当てたいのですが、可能なのでしょうか?

ディレクトリを自動生成するところまではできています。


528:nobodyさん
12/03/02 18:09:30.62
ファイルが作成されようとする度に全ファイルサイズを得るか、
quota の導入。
quota を入れるなら、システムに実際にユーザーの作成が必要。

529:nobodyさん
12/03/03 19:01:18.46
if ( 現在使用サイズ + これから書き出すサイズ < 制限サイズ ) {
 ファイル書き込み
 現在使用サイズを書いたファイルorDBを更新(現在使用サイズ+これから書き出すサイズ)
}

サイズ取得はuse bytes; $data_size = bytes::length($data); かな。

530:nobodyさん
12/03/03 19:19:52.03
$^0って何でしたっけ。
検索しにくくて、、、、こういうのどうやって探せばいいんでしょう。
perlvarになかったので特殊変数ではないっぽい

531:nobodyさん
12/03/03 19:27:25.41
何でしたっけと言われても、少なくともPerlにおいては特殊変数ではないしそれ以外の何かの意味もない。

532:nobodyさん
12/03/04 02:19:05.56
$^O ならOS名なんだけどネ

533:nobodyさん
12/03/04 12:49:16.62
>>532
そんなのすぐ気づいたしw

534:530
12/03/04 17:01:24.24
ありがとうございます、OS名でぐぐったらいろいろ出てきました。
ゼロじゃなくて大文字のオーだったんですね。

OS名ということはシステムからPerlに提供されているものだと思って、%ENVと同じところに記述されているはずって当たりをつけたら
perlvarにありました。

535:nobodyさん
12/03/04 20:39:47.27
531恥ずかしすぎだなw

536:532
12/03/05 05:40:34.80
>>535
そんなことはない。$^0 は確かに特殊変数でもなんでもなかった訳だし。
ためしに$^0をプリントさせたらエラーで実行できなかったし。

537:nobodyさん
12/03/05 22:13:10.43
だが普通すぐ気づくだろう。

538:nobodyさん
12/03/06 01:30:36.74
「普通すぐ気づく」なら530の質問は最初からされてない

539:nobodyさん
12/03/06 01:42:56.66
荒らしはスルーで、、、

540:nobodyさん
12/03/06 02:52:11.60
>>538
なぜ?
$^O が検索しにくいのは同じだろう?

541:nobodyさん
12/03/06 02:56:51.45
perlvarとは何だったのか

542:nobodyさん
12/03/06 09:53:40.98 zjKZlebn
質問です、以下の最短マッチが機能しないっぽい? のですが、なぜでしょうか?

コード(抜粋)
$html =~ m!"(.*?)" class="Link88" href="/Models.aspx\?ModelID=$id"!s;
print $1;

実行結果
(~ごっそり省略) <a title="Loeka Creekside Fern Short Sleeve Jersey 2010

$htmlはLWPで拾ってきたHTMLです。数MBくらいあります。
パターンマッチ内の文字列 class="Link88"~ というあたりはちゃんとマッチしているようですが、
少なくとも Loeka の左にある " が $1 に含まれちゃうのはおかしい気がします。
また不思議なことに、修飾子 /s を外すとちゃんと最短でマッチしてくれます。

543:nobodyさん
12/03/06 10:29:35.15
再現可能なコードぐらい貼れ、どーせこうだろうが
$html = q{<a href="b"
id="a" class="Link88"};
$html =~ m!"(.*?)" class="Link88"!s;
$html =~ m!"(.*?)" class="Link88"!;

最短ってのはマッチし始めてからが最短になるんであって、グループ内に"を含まないなんてルールはない
つまり最初の"から class="Link88" ... の手前の"までがマッチするんだよ

544:nobodyさん
12/03/06 10:46:58.66
なるほど、左に向かって最短マッチはしてくれないんですね。
m!"(.*?)" class="Link88"!

m!"([^"]*?)" class="Link88"!
に変えて解決しました、ありがとうございます。

545:nobodyさん
12/03/06 12:52:17.96
質問が不親切、再現しようにもコードもない、質問者が何を求めているかを把握するにはこっちが質問を熟読して意図と本当にやりたいことを汲み取らなければならない、などという書き込みに神対応できる >>543 みたいな奴尊敬するわ。

546:nobodyさん
12/03/07 23:13:16.91
Kent Webさんからダウンロードしたpostmailの設置が上手くいかなくて困っています。

URLリンク(kueris.pro.tok2.com)
↑これなんですが、ご覧の通り送信ボタンを押すとエラーが出てしまいます。
このエラーは、「Minimal.pm」がCGIフォルダ内に見つからない、という意味だと思うのですが、ちゃんとアップロードはできています。

以下、その他の詳細です。
・check.cgiは問題なく機能しました。パーミッションも設定できています。
・postmail.cgiのみを「cgi-bin」というフォルダに移動させました。
・サーバーはTOK2という所をお借りしています。
・エラーメッセージにある13行目辺りの内容はこんな感じです。↓

9 # モジュール実行
10 use strict;
11 use CGI::Carp qw(fatalsToBrowser);
12 use lib './home/kueris/postmail-utf/lib';
13 use CGI::Minimal;
14 use Jcode;

よろしければお力をお貸しください。よろしくお願いします。

547:nobodyさん
12/03/07 23:45:53.60
use CGI::Minimal;
 ↓
use CGI;

またエラーが出たらお越し下さい。

548:546
12/03/08 00:14:54.72
>>547
ありがとうございます。お陰さまで、無事にそのエラーは解消されたです。

しかし、今度は別のエラーが発生しました。
URLリンク(kueris.pro.tok2.com)
↑今はこのようになっています。
パスが違うのかと思い、色々変えてみましたが、効果はありませんでした。
メッセージにある20行辺りの内容は以下の通りです。↓

19 # 設定ファイル認識
20 require './public_html/postmail-utf/init.cgi';
21 my %cf = &init;

度々で申し訳ありません。
ですが、何卒よろしくお願いします。

549:nobodyさん
12/03/08 09:26:25.31
require "./init.cgi";

で OK

550:546
12/03/08 12:15:53.18
>>549
ご回答ありがとうございます。
試してみましたが、相変わらず同様のエラーメッセージが表示されてしまいます。↓
URLリンク(kueris.pro.tok2.com)
init.cgi自体はちゃんとアップロードされているんですが…。

551:nobodyさん
12/03/08 12:34:33.65
init.cgiが@INCが示すディレクトリの中にあり、読める状態にあるかを確認

552:nobodyさん
12/03/08 16:18:28.19 BE:3622206896-PLT(12000)
そもそもTOK2でCGIをまともに動かそうなんて無茶なこと考えるなよ

553:nobodyさん
12/03/08 17:31:49.63
cwd でカレントディレクトリ表示させてみて

CGI で動いてない気がしてきた

554:nobodyさん
12/03/09 01:25:41.39
初歩すぎる質問で申し訳ありません。
今勉強中なのですが、
postデータ等をこれで変換すると言うのが良くあるのですが、

$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

たしかにこれでうまくいきますし、また基本的な挙動も理解しています。
分からないのは、なぜpack("C", hex($1))/egで、問題無く動くのかということです。
具体的には、
①$1で渡されるのは1バイト分なのに、なぜちゃんと2バイト文字として変換されるのか?
②%([a-fA-F0-9][a-fA-F0-9]の書式でなぜ半角文字が受け渡されるのか?
③例えば”テ”はpostからデータを受け取った時には83eなのに、なぜ問題無く変換されるのか?
④①にかぶりますが、なぜ(pack"c",***)で上手く動くのか? "c*"じゃないのに正常に動いてる。 また、$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/hex($1)/eg;で作った変数をそのままpack"c*",$value;としてもうまく動かないのに、なぜちゃんと動くのか?

いろいろ調べたりしたのですが、よくわかりませんでした。

555:nobodyさん
12/03/09 02:06:50.72
>>554
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; でググれ。

556:546
12/03/09 02:23:40.92
皆様、ご回答いただき本当にありがとうございます。

>>551
確認しましたが、問題ありません。
init.cgiは確かに存在しているはずなのですが、認識されていないようです。

試しに、アップロードされたinit.cgiに直接アクセスしてみたところ、404エラーが表示されました。(つづりやパスは間違えておりません)
同じフォルダ内にある別のプログラムにはアクセスできるのですが……。

>>552
プロバイダによってCGIの設置しやすさは違うのてでしょうか?
もしよろしければ、CGIが動きやすい所をご紹介していただけないでしょうか。

>>553
申し訳ありません。プログラミングの経験がない私には、「cwdでカレントディレクトリ表示」の意味がよくわかりません。
調べてみましたところ、これはperlにおけるコマンドのことなのでしょうか。
打ち込んでみましたが、上手く動作しませんでした。

557:nobodyさん
12/03/09 02:58:21.99
>>555
相当ぐぐったのですけど、「これで動く」「この処理はこう言う処理をしてる」と言う説明はありそれ自体はわかるのですが、
頭でイメージしたものだとどう考えてもエラーが起きるもしくは正しく動作しないはずなのに、「なぜこの書式で正しく動作してるのか?」と言う疑問の解決は見つかりませんでした。

558:nobodyさん
12/03/09 03:20:04.43
>>554
Perlより文字コードの勉強を先にすべきだな
(1)~(3)の疑問はそっち寄りだ

559:nobodyさん
12/03/09 03:37:26.52
>>556
KENT から落としてきて、

13行目:use CGI;
24行目と26行目をコメントアウトでとりあえず動くよ。

何も入力せずに 「送信する」 ボタンを押せば、動作してるのが確認できる。
URLリンク(www11.tok2.com)


ただし、これは貼らずにいられない。
Q.メールフォームを設置したいのですがsendmailは利用出来ますか?
URLリンク(tok2.com)

これ以上は スレチ (これ以上もクソも初めからスレチだが・・・) なので、改造スレの方へどうぞ。

560:nobodyさん
12/03/09 03:45:25.88
文字で考えるな
ただ単なるバイト列として考えればよろし。

今日は SJIS だと 8DA193FA という4バイト。
俺らが見てる 「今」 という文字は、コンピュータからしたら 「8DA1」 という並びのバイト列でしか無い。
そうゆう並びになったから、文字が見えるというだけだ。

561:nobodyさん
12/03/09 11:31:58.89
てst

562:554
12/03/09 13:02:31.68
説明が下手で申し訳ありません。

$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;を3つに分解した場合、

例えば、”テストtestだよ”を下の形で出力すると

$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/$1/g;

83e83X83gtest82BE82E6となります。これを$hexvalue = hex($value);に
いれようとしたのですが上手くいきません。

$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/hex($1)/eg;として出力すると

131e131X131gtest130190130230となり、これをpack("c*",131,e,131,X,131,g,t,e,s,t,130,190,130.230);としても当然上手くいきません。
”test”部分は元々半角小文字なのでs/で式から弾かれてるからとわかったのですが、
カタカナ部分の2バイト目は半角英数混じりなのですがここをちゃんと変換してないようですしそう言うオプションも無いのに、なぜ上手くいくのだろう?とよくわかりません。
カタカナの2バイト目の変換はどこでどのように行っているのでしょうか?

>>554の④は、gで次々代入してるからそう言う事なんだろうか?となんとなくイメージ出来ましたが・・・・・

563:nobodyさん
12/03/09 13:33:46.30
まず自己矛盾していることに気づいていない糞さ
>①$1で渡されるのは1バイト分なのに
>④①にかぶりますが、なぜ(pack"c",***)で上手く動くのか?
1バイト分のデータ(0x00-0xFF)をpackしてるんだからC*ではなくC

そして文字コードについて全く理解しようとしていない
「テ」の文字コードは「0x83 0x65」で、「e」の文字コードは「0x65」
だから「テ」をパーセントエンコードすると「%83e」であって
「%83」部分さえデコードすれば元の文字に戻るんだよ

ああ壁殴りてぇ

564:nobodyさん
12/03/09 14:03:28.44
>>562
ポイントは3つ。
一つ目。
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; はURLデコードするための一文であるということ。
”テストtestだよ” をURLエンコードすると
”%E3%83%86%E3%82%B9%E3%83%88test%E3%81%A0%E3%82%88”になる。(文字コードはUTF-8)
これをデコードして”テストtestだよ”に戻すのがURLデコード。
つまり$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;という一文の役目。

URLエンコードってのは、例えば「テ」(0xe38386)だったら「%E3%83%86」に変換する。
URLデコートってのは、例えば「%E3%83%86」だったら「テ」(0xe38386)に変換する。

2つ目
正規表現のパターンマッチは一つずつ行われる。
$value="%E3%83%86%E3%82%B9%E3%83%88test%E3%81%A0%E3%82%88"
に対して
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
をやると、

$1に"E3"が入った状態でpack("C", hex($1))が実行され、文字列"%E3"を0xE3に置換。
$1に"83"が入った状態でpack("C", hex($1))が実行され、文字列"%83"を0x83に置換。
$1に"86"が入った状態でpack("C", hex($1))が実行され、文字列"%86"を0x86に置換。
(以下略)・・・

だからhexやpackにまとめて”%E3%83%86%E3%82%B9%E3%83%88test%E3%81%A0%E3%82%88”入れようとするのは間違い。

3つ目
>なぜ上手くいくのだろう?
多くのマルチバイトな文字コードは、「漢字は○○から始まる」とか「ひらがなは××から始まる」っていうルールを持ってる。
だから半角英数とマルチバイト文字が混在しても問題ない。

565:nobodyさん
12/03/09 14:16:43.38
>>563
①と④はだいたいわかりました。ありがとうございます。

下の方は、pack("c*", 131,101);で”テ”になるのは理解しています。
ただhex($1の段階で131eと出力されてるみたいなので、普通に考えるとpack("c*", 131,c);と言う挙動をさせようとしてるように思えるのですが(当然これだと不具合が出ます)、特に修飾子があるわけでもないのになぜcを自動的に101に変換してるのかがわからないのです。

566:nobodyさん
12/03/09 14:22:20.55
>>565
>特に修飾子があるわけでもないのになぜcを自動的に101に変換してるのかがわからないのです。
「e」な。
そんでもってeの文字コードは10進の101。

>普通に考えるとpack("c*", 131,c);と言う挙動をさせようとしてるように思えるのですが
なりません。
pack("C", 131)、pack("C", 101)が順番に動いている。

567:nobodyさん
12/03/09 14:26:11.34
>>564
だいぶよくわかりました。本当にありがとうございます。
一文にする事で内部的に自動的にルールで振り分けてるから厳密に考えようとしてもしょうがないと言う事なのでしょうか。
とすると、あの一文を①%を抜く②10進数に変換③文字コードに変換三段階に分けて記述しようとすると逆に自動では行われないのでかなり膨大な記述になるのでしょうか。
わかりやすくしようと同じ挙動をするものをちょっと書いてみようと思ったら配列を使ったりしないとうまくいかない感じでした。

568:nobodyさん
12/03/09 14:35:01.38
>>566
なるほど。
内部的にはeを101に自動的に変換して文字列を次々に処理してるのですね。
するとそこの部分だけを抜き出して分けて記述しようとすると、やはりeを101に変換させるコードを書かないといけないと言うことですね。

569:nobodyさん
12/03/09 14:43:54.07
すみません ようやく理解しました。
0x83の次にcが来るので”テ”になる
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;の中ではeは未処理のまま0x83をpackで変換した物の後ろに単純にくっつけて出力したと言うことですね

ようやくわかりました。確かに文字コードの勉強が必要でした
よく調べてみます
大変お騒がせしました

570:546
12/03/09 16:47:52.35
>>559
ご回答ありがとうございます。
色々と見落としていた点があったようで、大変失礼致しました。
頂いた助言を元に、サーバーを変えて試してみます。
本当にありがとうございました。

571:nobodyさん
12/03/09 21:37:28.29
つか use CGI しているのにモジュール使っていないし、
use strict してても全然 strict じゃないw
こんなの怖くて使えないよ('A`)

572:nobodyさん
12/03/10 01:31:51.91
●やりたいこと:
 jpg画像のサムネイル作成(orファイルサイズ圧縮)がしたい。最悪トリミングでも


レンタルサーバ上でサムネイル画像を作成したいと思っております。
GDやImage Magick、Imager、epeg等々が入っていないのですが、
何かうまい方法がありましたら教えていただきたいと存じます。

配置してパスを通すだけで使えそうなモジュールがありましたら・・

573:nobodyさん
12/03/10 02:30:16.63
まじめな話、KENT はやめとけ。
あれは20年前のシステムだ。

574:nobodyさん
12/03/10 03:05:45.88
>>572
width height

575:nobodyさん
12/03/10 05:37:43.25
>>574
主旨が画像を読み込むスピードを早くしたいので、widthheight指定だけではではちょっと・・

576:nobodyさん
12/03/10 06:45:54.03
・画像を扱えるツール(プログラム)をレンサバにインストールする
 画像を扱うPerlモジュールは大抵別途本体(バイナリ)かライブラリも同時にインストールされてる必要があるからね
・画像加工できる別サーバを用意し、画像ファイルをそちらのサーバに投げてサムネイルを作ってもらい、それをダウンロードする

Image Magick じゃなくてImageMagick
でもImageMagickも入ってないレンサバって今時あるの? 画像ファイルを(たぶん大量に)アップロードできるくらいだから最安でカスカスのレンサバってことでもないと思うんだが

577:nobodyさん
12/03/10 08:45:04.67
>>576
ありがとう。それらは考えたんだけど鯖分けるなら自分でサムネつくるのと
手間がかわらないのでなやんでる。

うん。ImageMagickはいってない。

578:nobodyさん
12/03/10 10:20:44.99
ほかのレンタルサーバーに移動すればよい。

579:nobodyさん
12/03/10 12:27:16.79
フリーなサーバならまだしも、金を払ってるレンタルサーバなら GD ぐらい入ってないの?
perl が駄目でも、PHP で GD が動いてる可能性とかは?

580:nobodyさん
12/03/10 18:41:09.72
>>579
PHPでも組んでみたけどだめでした。

素直にさくらとかWebArenaSuiteX使うべきなんですが、
アプロダなのでちょっとアダルト要素入る可能性があり
ピンク系も許可のレンタル鯖でないとだめかなというのもネックになってます。

581:nobodyさん
12/03/11 00:39:52.43
HTML解析で質問です。
HTML::TreeBuilderを使って解析をしているのですが、
どうしても

<span class="hogehoge">fuga</span>

の、fugaが取り出せません。

($tree->look_down('class', 'hogehoge')

ではダメなのでしょうか・・・?ご教授お願いしますm(_ _)m

582:nobodyさん
12/03/11 09:53:46.90
>>581
同じクラスのエレメントが複数あるとか?

583:nobodyさん
12/03/23 00:48:00.36
なかなか短いコードで再現できなくて申し訳ないのですが、

print "DEBUG1\n";
$html =~ m!<a title="([^"]*?)" class="Link88" href="/Models.aspx\?ModelID=$id" id="ModelLink\d+">.*?<td class="Label11">(.*?)</td>.*?<td class="Label14">(.*?)</td><td class="Label13".*? (\d+)%</td>!s;
print "DEBUG2\n";

このm//の1行だけの処理に、20秒ほどかかることがまれに起きます。
その間 top(1)で見てるとCPU負荷が異常に跳ね上がります。
この行はループ中、LWPで取得するたび$htmlが変わりながら数百回実行されるのですが、
異常に時間がかかる時以外は瞬時に通り過ぎます。

時間がかかる時の $htmlを試しにファイルに吐かせてみましたが、
サイズはせいぜい500KBほどで、
このときのファイルを上記の行だけのテストスクリプトに食わせても
瞬時に終了し異常が再現できません。

原因と対策に何か考えられることはあるでしょうか?

584:nobodyさん
12/03/23 01:14:12.71
>>583
メモリスワップが発生してるとか。

585:nobodyさん
12/03/23 04:21:38.62 SsskDSLS
質問です。
Perl/CGI側でHTTPのエラーコードを返そうと思います。

  #!/usr/bin/perl
  print "Status: 404 Not Found\n";

  exit;

というコードを書いたとき、ブラウザ上では想定通りに404エラーとして表示されるのですが
Apacheのエラーログを見てみると

  Premature end of script headers: /home/foo/htdocs/bar.cgi

とだけ表示されます。この時、他のエラーメッセージは見当たりません。
きちんと動いてはいるので問題ないと言えば問題ないのですが、これを出さないようにするにはどうしたら良いでしょうか。

・404エラーではなく、普通にウェブページを出力した場合には問題ありません。
・同じディレクトリでは別のCGIも問題なく動いており、パーミッションはそれらと同値に設定してあります。
・確認してみたところバージョンはApacheが1.3、Perlが5.8です。古い(´・ω・`)


586:nobodyさん
12/03/23 04:35:43.93
たぶんcontent-typeを書くと消えるというかググれ

587:nobodyさん
12/03/23 04:46:19.26 SsskDSLS
>>586
ありがとう。でもtext/htmlにしろtext/plainにしろ状況は変わらないんだ

588:nobodyさん
12/03/23 04:58:11.94
>>585
exitって必要なの

589:nobodyさん
12/03/23 05:11:05.01
\n\n

590:nobodyさん
12/03/23 05:15:18.99
Header1: foo
Header2: bar
(空行)
body

仮にボディを空にするとしても、ヘッダとボディを隔てるものは必要ですよね

591:nobodyさん
12/03/23 05:46:15.14 SsskDSLS
>>588
確かに585のような最小コードでは、exitは有っても無くても変わらないかも。

>>589-590
ステータスコードの末尾を\n\nにすると、
実際にページが送信されている(といっても改行1つだけだが)という扱いになるのか、
デフォルトの404ページが表示されずに、真っ白のページが表示されるようだ。

ちょっと面倒だけど、ブラウザ表示用にエラーページを用意して、
それを出力するようにすれば、とりあえず問題は無さそう。


.htaccessでErrorDocument指定されてるページに飛ばすには、自前でリダイレクトするしか無いのかなー?


592:nobodyさん
12/03/24 01:12:43.26
>>591
普通exitなんて書かないよ?トホホにでも書いてあったのかな。


593:nobodyさん
12/03/24 03:29:50.29
>>592
トホホは見てないけど、そうなんだ。
正常終了のときは使わない方がいいのかな。まあ、異常終了ならdie使うけど。

594:nobodyさん
12/03/24 06:48:02.45
コードが最小だろうが最大だろうがそんなものは必要ない

595:nobodyさん
12/03/24 08:52:21.86
何故exitが不要なのか、
いわゆる「省略の美学」以外に積極的な理由があったら、誰か教えて欲しい。

何らかの弊害(速度や安全性の問題など)があるとか、
別の関数等で置き換えるのが普通だとか、
構造化プログラミングにおけるgoto不要論と同じような理由だとか、ヒントでも構わないので。

596:nobodyさん
12/03/24 09:25:36.37
そりゃなくても最後まで行けば仕舞いだけどexitは必ず書いてるな。

597:nobodyさん
12/03/24 09:51:51.12
>>595
コンパイル済みのスクリプトをキャッシュして使い回すような環境で
無闇に exit すると良くないケースがある。
URLリンク(cast-a-spell.at.webry.info)
URLリンク(harapeko.asablo.jp)

反対に、書かなくていい場面で書いておくのが「冗長の美学」でしかないのなら、
__END__ なり #exit なりとしておいた方が無害でいい。

598:nobodyさん
12/03/24 10:10:34.01
mod_perlとかplackみたいな永続化環境だとアクセスごとに走る部分でexitしたらだめじゃね
なんにせよこれ「いわゆる省略の美学」とは全く別問題

599:nobodyさん
12/03/24 10:43:09.74
>>597-598
ありがとう。
mod_perlへの移植(と言ってもかなり書き換えることになりそうだ)を考えるなら、
最初からexitを使わないコーディングが重要ってことか。

mod_perlだと通常のexitは使わないほうがいいってのは聞いたことがあったんだけど、
実際にmod_perlは弄ったことがなくて、その感覚が掴めてなかった。


>>596-597
プログラムを1ファイルで済ませたい場合、
自分はメインルーチンソースファイルの先頭に、サブルーチンを最後にまとめて書くことが多いんだけど、
メインルーチンの最後に、以下はメインルーチンとしては実行されませんよと明言するためにexitを入れたりしてた。

600:nobodyさん
12/03/24 11:58:06.99
俺も同じでソースの最初に main() なんだけど、その直前に exit() 書いてる。


use なんちゃら~

our なんちゃら~

main();

exit(0);

sub main{
}

sub func{
}


っていう感じ。

601:nobodyさん
12/03/24 17:23:47.75
Cから入った人に多そう、とか思った

602:nobodyさん
12/03/25 01:57:35.52
基本的に.pmにロジック書いて、.plはそれを呼ぶだけだからexitは滅多に使わないなあ。

603:nobodyさん
12/03/25 15:34:18.54
1枚スクリプトで、&main; exit; は有りだと思う。
ただ基本は >>602 のようにするから滅多に使わない。


冗長の美学を語る人が、1枚に長いスクリプト書いてるのは矛盾を感じる。


604:nobodyさん
12/03/25 18:03:11.28
>>603
そこはスクリプトの規模によるんじゃね?
短めの、他と共通化出来ないサブルーチンが2~3個あるくらいなら、分けるまでも無いだろう。

605:nobodyさん
12/03/25 19:02:45.23
それはそんなソースになってる時点で論外だな。

606:nobodyさん
12/03/25 19:14:00.38
別に嫌みとかでは無いんだけど、>>605 の数百行ぐらいの小さいソースと、
2~3000行ぐらいの中規模のソースを見てみたい。

ってのも、俺の殆どのソースは1枚で済ましてるから、他人ので学習というか知識を深めてみたいから。


607:nobodyさん
12/03/25 20:04:16.17
605は安価がないからなー、自分が思ってるのと全く違う主張の可能性もあるw

608:603
12/03/26 02:46:50.44
>>606
>>605 とは別人なんだが、数百行の小さいソースって、1プロジェクトで数百行ってことかな。
1ファイルで4,5百行くらいって話だとちょっと長いかな。
スクリプトファイルを書くにしても、大体いろいろな機能をクラス(pmファイル)に分けてそいつらの責任に任せたほうがメンテが楽。








609:nobodyさん
12/03/26 14:06:22.42
>>608
それはモダンなやり方ですか?

610:nobodyさん
12/03/27 01:13:45.03
え、モダンかぁ、、、、悪い書き方はしちゃダメだけど、モダンとかは気にしないほうがいいと思うよ、、、
流行り廃りだし、自分で判断したほうがいいよ


611:nobody
12/03/30 00:02:30.52
そうだね。モダンは足が速いから。スレッドももうなくなったしね。

612:nobodyさん
12/03/30 00:16:05.99
【モダン推奨】Perlについての質問箱 50箱目
スレリンク(tech板)

613:nobody
12/03/30 00:29:41.87
初心者には敷居が高いから万人向けってわけじゃない

614:nobodyさん
12/04/03 10:03:29.27
こちらはcatalystについての質問でもよろしいでしょうか?
catalystのスレはあるものの、人が居なさそうなので。。

catalystとApacheをつなぐために、
perl-Catalyst-Engine-Apache-1.12-1.el5.rf.noarch.rpm
を入れようとしているのですが、依存関係で以下の物が足りないと落ちます。
---> Package perl-Catalyst-Engine-Apache.noarch 0:1.12-1.el5.rf set to be updated
--> Processing Dependency: perl(Apache::RequestRec) for package: perl-Catalyst-Engine-Apache
--> Processing Dependency: perl(Apache::Response) for package: perl-Catalyst-Engine-Apache
--> Processing Dependency: perl(Apache::Const) for package: perl-Catalyst-Engine-Apache
--> Processing Dependency: perl(Apache2) for package: perl-Catalyst-Engine-Apache
--> Processing Dependency: perl(Apache::RequestIO) for package: perl-Catalyst-Engine-Apache
--> Processing Dependency: perl(Apache::URI) for package: perl-Catalyst-Engine-Apache
--> Processing Dependency: perl(Apache::Connection) for package: perl-Catalyst-Engine-Apache
--> Processing Dependency: perl(Apache::RequestUtil) for package: perl-Catalyst-Engine-Apache

いろいろ探すと、mod_perlの旧バージョン(1.9.9)には含まれていたものの最新バージョン(2.0.5)には含まれて居ないモジュールのようです。

対応方法が分かる方、ご教授いただけますでしょうか。
宜しくお願いいたします。


615:nobodyさん
12/04/03 11:11:13.68
>>614
人がいなくてもそれがそのスレなんだからそこに書くしかないんじゃ?
人が少ないからで別スレきたら何でもアリになるだろ

616:613
12/04/03 16:39:22.06
自己解決しました
Catalyst::Engine::Apache2
なるものがcpanから出てました
ちょうど過渡期のようですね


617:nobodyさん
12/04/04 00:34:44.70
過渡ちゃんペッ

618:nobodyさん
12/04/04 18:53:47.59
CGIゲーム改造してるんだけど

ID<>名前<>パスワード<>データ各種・・・

みたいに記録してあって下のように処理しててこれが何か所も出てくる
扱うデータ増やすたびに全て修正しなくちゃいけなくてやたら面倒くさい
配列だと見た目で何の変数かわかりにくいし連想配列はつなぐときの順番がばらばらだし
どちらも読み取りだけの時使わない変数まで格納するの無駄かなあと考えてたら先に進まなくなってしまった
変数の追加とか挿入とかするとき一か所くらいの修正でいい無駄の少ない方法ない?

for($i=0;$i<$num;$i++){
   ($id[$i],$name[$i],$pass[$i],...) = split (/<>/, $data[$i]);
   ↓
   処理
   ↓
   $newdata[$i] = "$id[$i]<>$name[$i]<>$pass[$i]<>...";
}


619:nobodyさん
12/04/04 20:03:38.87
>何か所も出てくる
subにぶち込んどきゃいいだろ

620:nobodyさん
12/04/04 21:27:07.37
そんなあなたにはスライス

621:nobodyさん
12/04/04 22:59:22.68
スライスって数字のやつ?何か挿入して増やそうとするとずれるよね
単純に後ろに追加すると位置的にわかりにくいから挿入したいんだが、数字のチェックもしなくていい方法ない?
元のデータの書き換えは再生成するから考えないとして


データ0<>データ1<>データ2<>・・・

データ0<>データ1<>データx<>データ2<>・・・

それとサブルーチンだとどうやって引き渡そうか悩んでる
配列だと結局受け取るときに順番が大事だし連想配列だと上書きする時また<>で連結しにくいと思ったんだが

622:nobodyさん
12/04/04 23:25:45.28
順番付き連想配列使えば良いじゃんw

623:nobodyさん
12/04/05 00:00:05.98
データファイルにはヘッダを必ず含めれば幸せになれるかも。

スライスは苦手なのでサンプルは今書けないけど、ファイルを全て読み込んだ時のイメージはこんな感じ。

my $data = {};
$data->{'headers'} = [~];
$data->{'data'} = [
 {○=>△,◇=>□},
 {○=>△,◇=>□},
  ~以下略~
];

読み書きは @{$data->{'headers'}} の順番で行えば良い

で、読み書きを行うサブルーチンを作れば良い。


CSV 的なデータを連想配列で読み込むモジュールがあった気がする。



次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch