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


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

くだすれPerl(超初心者用)2



1 名前:nobodyさん mailto:sage [2008/03/03(月) 05:07:32 ID:???]
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Perl使いが優しくコメントを返しますが、
お礼はPerlの布教と初心者の救済をお願いします。

2 名前:nobodyさん mailto:sage [2008/03/03(月) 12:33:59 ID:???]
テンプレとかないの?

3 名前:nobodyさん mailto:sage [2008/03/03(月) 19:13:48 ID:???]
>>0
あ?ほんとに分かってんのか?
「はい」ってのはな「はい、わかりました」を略して「はい」なんだよ
頭だけでわかったって言わねんだぞ?学校の勉強じゃねえんだから
社会では?お?実際に出来て初めて「わかった」言うんだ
出来もしねえ奴が軽々しくはいなんて言うんじゃねえよ
お?聴こえてんのかよコラ?あ?
やる気がねえんだったら来なくていいぞ?
お前ナメてんだろコラ?
仕事中だと思って優しく口で言ってりゃ調子に乗んじゃねえぞコラ?お?
外で遭ってたら今頃カタワだぞお前?とっくに

4 名前:nobodyさん [2008/03/03(月) 22:02:10 ID:F1EuYZlD]
なんだ、この馬鹿?
ケツの三行が間抜けすぎるんだけどw

5 名前:nobodyさん mailto:sage [2008/03/07(金) 19:19:52 ID:???]
とにかく、画像とか抜きにしてテキストベースでじゃんけんゲームとか数当てゲームを作ってみれば良い。
とりあえず機能的には、繰り返し挑戦出来るとか残り回数があるとか。
○○より小さいです。 って表示させたりだ。

そうすることで 判定・繰り返し・変数を大まかに理解出来るだろう。


6 名前:nobodyさん mailto:sage [2008/03/13(木) 15:16:54 ID:???]
どのバージョンをDLしたらいいのかわかりません(WIN)


7 名前:nobodyさん [2008/03/13(木) 21:47:41 ID:vk+XUs64]
掲示板でデータを逆順に表示するリンクをつけたいのですが
reverse リスト 
をリンクとしてできるようにするにはどのようにしたらいいのでしょうか?
具体的には<a href=???>古い順</a>
といったリンクをつけたいです

8 名前:nobodyさん [2008/03/14(金) 00:10:56 ID:jE/64EXv]
$aaa=1;
if($aaa==1||$aaa==3)
これをもっと簡潔に書く方法がわかりません。

もうひとつ、
$aaaが8nなら、というのはどうやればよいのでしょうか。
調べてもわかりませんでした、おねがいしますm(_ _)m

9 名前:nobodyさん [2008/03/14(金) 01:46:19 ID:sSfBLQ5N]
>>7
リストをreverseさせるルーチンはあるのか?
だったらそこにジャンプさせる為の判別用の文字列をqueryで送ってやれば良し

>>8
これ直前で$aaaに1を代入してれば3になる可能性は皆無なんじゃないか?
$aaa==3 は必要無いだろ

if($aaa eq '8n')
これを調べても分からないんじゃヤバいぞ

10 名前:nobodyさん [2008/03/14(金) 01:49:59 ID:sSfBLQ5N]
8n って文字列かと思ったじゃねぇか
あとマルチポストは控えめに



11 名前:nobodyさん [2008/03/14(金) 11:05:45 ID:tA8hqU0W]
正規表現で>>1というようにアンカーが付くとリンクされるというのは出来たのですが、>>1のように単体でログを表示するやり方が分かりませんm(_ _)m

12 名前:nobodyさん mailto:sage [2008/03/14(金) 13:36:44 ID:???]
先生∩

sub uniq    #重複行削除
{
  my %seen;
  return (grep { ! $seen{$_}++ } @_);
}
sub uniqu    #1回のみの行
{
  my %seen;
  $seen{$_}++ for @_;
  return (grep { $seen{$_} == 1 } @_);
}

な感じの物を見つけたのですが、何が起きてるかさっぱり解りません。
そこで質問です。
以下は2行以上あるものだけの出力になるっぽいのですが、合ってるでしょうか?
sub uniqd
{
  my %seen;
  return (grep { $seen{$_}++ == 1 } @_);
}

13 名前:nobodyさん mailto:sage [2008/03/14(金) 18:49:24 ID:???]
>>11
アンカー先のURLで記事を表示できるようにする必要ががある。
例えば<a href="./bbs.cgi?No=100">100</a>とするなら、
No100の記事をファイルから取得して表示する。

>>12
foreach(@_)としてるのと同じ感じで、配列の各値が$_に一時的に格納される。
んで{}内で$seen{$_}に1を代入してるわけ。
ハッシュのキーは重複しないので++でカウントできる。おk?

この際ついでにgrepとmapについて勉強したほうがいい。
Perlの中でも強力な部類の関数だから


14 名前:nobodyさん mailto:sage [2008/03/14(金) 19:17:40 ID:???]
>>12
暇だから、、、
最後の質問は正解。

一番上の grep BLOCK の中だけ解説。
1. $seen{$_} で %seen に $_ が登録されてるかどうか調べる。
 当然最初の一回目は無いから偽。二回目以降は真。
2. ! によって1.の条件が偽の時のみ真。
3. ++ によって $_ を %seen に登録。(++によって数値と見なされ偽を0と
 解釈。で普通に1足される)。
4. 1. に戻るが、同じ物が二回目に出てくると真、なので 2. の条件に
 当てはまらない。
結果、 uniq なもののみがトラップされる。

uniqu はまあ論外。uniqd は ++ の挙動さえ理解してれば問題ない。
( $seen{$_} == 1 が解釈された後に $seen{$_} に1が足される。
ちなみに ++ $seen{$_} == 1 は uniq と同じ挙動になる。)


 

15 名前:nobodyさん mailto:sage [2008/03/14(金) 20:49:41 ID:???]
>>13
有難う御座います
BLOCK部の$seen{$_}の動きが解りました
grepとmapですね、精進しますorz
どうもperlの配列マジックが苦手で…

>>14
詳細な解説有難う御座います!
BLOCK部の動作が解って来ました
今迄一行スクリプト見ても"凄い"で終っていましたが、
何が起きているか理解できる様にしたいと思います

16 名前:nobodyさん [2008/03/15(土) 01:02:29 ID:bB5F1BkL]
>>13
# アンカー表示
    if($FORM{'comment'} =~/>>(\d{1,4})/){
$no = $1
$DATA[$no]  = $ENV{'SCRIPT_NAME'}?no=$no
print "<a href=\"htttp://url&no=$no\">>>$no</a>";
といった感じでやってみたのですがうまくできません・・・
間違いだらけだと思いますが、何かとご指摘よろしくお願いします。

17 名前:nobodyさん mailto:sage [2008/03/15(土) 01:23:16 ID:???]
>>16
スクリプト自体に「no=123 を受け取ったら No.123 の記事だけを吐く」みたいな
機能が存在しないまま、アンカーのことばかり気にしてたりしないか。

18 名前:nobodyさん mailto:sage [2008/03/15(土) 03:38:52 ID:???]
LWPやXMLといったモジュールをフリー鯖で使用するにはどうすれば

19 名前:nobodyさん [2008/03/15(土) 12:35:24 ID:q6rOizZS]
>>18
pure perlなモジュールなら、自前の鯖にインスコされてる.pmファイルをうpすれば桶じゃね?


20 名前:nobodyさん mailto:sage [2008/03/17(月) 06:27:56 ID:???]
LWPって標準モジュールでなかったっけ?
XMLはモノによるけど有名どころはXPAT?必要だからインストール無しだと厳しい



21 名前:nobodyさん [2008/03/20(木) 15:51:16 ID:+FD61Aq0]
>>17
具体的にどのようにしたら良いのでしょうか?

22 名前:nobodyさん [2008/03/24(月) 12:00:22 ID:/JLxXrtH]
どこで質問してよいのかわからなかったのですが、
使うプログラムがPerlなので、こちらでさせて頂きます。

ウィンサーバーで、お問い合わせフォームを使おうと思っています。
www.winserver.ne.jp/

使うお問い合わせフォームは、「フォームメール」です。
www.rescue.ne.jp/cgi/webform/

以下のFAQをみると、「次のコードを記述下さい」とコードが
書いてありますが、どこに入れればよいのかわかりません。
www.winserver.ne.jp/faq/index.html#70

webform.cgiに入れればよいのかと確認しても、
「サポート外だから教えられない」と言われてしまいます。
webform.cgiに入れて試してみても、
「CGI Error
 The specified CGI application misbehaved
 by not returning a complete set of HTTP headers.」
と出てしまいます。

どうしたらよいのか、ご助力頂ければ幸いです。

23 名前:nobodyさん mailto:sage [2008/03/24(月) 14:22:47 ID:???]
エラーメッセージ見てまず何が原因かと思った?
そっから考えろ

24 名前:nobodyさん mailto:sage [2008/03/24(月) 15:00:22 ID:???]
そのコードは記述する必要がないんじゃないか?

25 名前:22 mailto:sage [2008/03/24(月) 15:26:00 ID:???]
>>23,24
CGI/Perlについては、設置程度はできるのですが、
それ以上はわからないのです・・・。
ウィンサーバーはパーミッションの設定はできないし、
>print "Content-type: text/html\n\n";
とあるので、とりあえずwebform.cgiの中で、
「Content-type」ああるところを上記の物に変更しても、
同じメッセージがでるしで・・・。
行き詰まっています。

26 名前:nobodyさん mailto:sage [2008/03/24(月) 15:35:26 ID:???]
webform.cgi の中の受信先メールアドレスを自分のアドレスに書き換えて設置するだけでは?

27 名前:nobodyさん mailto:sage [2008/03/24(月) 15:58:36 ID:???]
basp21 使えってサーバみたいだから sendmail(互換) 前提のスクリプトが
動くようにするのは「設置程度なら」の人にはきついと思う。

28 名前:nobodyさん mailto:sage [2008/03/24(月) 16:35:00 ID:???]
>>22
もう諦めて、無料のレンタルフォーム使ったら?fc2とかの

29 名前:nobodyさん mailto:sage [2008/03/26(水) 21:12:26 ID:???]
Talk2chを参考にしてSOCKETを使い、スレのDATを取得したんですが、
取得したものを変数に格納する方法が分かりません

print SOCKET "GET /PC11.2ch.net/dat/10000000.dat HTTP/1.0\r\n";

↑こんな感じです

30 名前:24 [2008/03/26(水) 21:14:23 ID:YxQEkSzy]
ID忘れてました
スイマセン



31 名前:29 [2008/03/26(水) 21:15:27 ID:YxQEkSzy]
29でしたorz

32 名前:nobodyさん mailto:sage [2008/03/26(水) 21:27:35 ID:???]
既視感が。

>>29
pc11.2ch.net/test/read.cgi/tech/1199977642/737 (738が俺)
向こうで続けてもいいと思うんだけど。

33 名前:nobodyさん [2008/03/27(木) 06:27:10 ID:17ssUCBE]
>>32
低レベルすぎると思って

34 名前:nobodyさん [2008/04/03(木) 16:38:03 ID:n0FZOeJi]
会社で、サブルーチンの中でグローバル変数?($_とか)を
使わんほうがいいということで、
print &gokei('山田<>1','菊池<>2','田中<>3');

sub gokei{
  local @lines = @_; local $gokei =0;
  foreach(@lines){
    my ($name,$pt) = split(/<>/,$_);#もしくはsplit(/<>/);
    $gokei += $pt;
  }
  return $gokei;
}
ってやってたのを軒並み
foreach my $line(@lines){
〜 = split(/<>/,$line);
〜;
}
に変更されちゃったんですが、そういうものなんですか?
なんかいろんなところで不便なんですが…。

35 名前:nobodyさん mailto:sage [2008/04/03(木) 16:51:17 ID:???]
プログラムの流れとか関係ない処理とかなら$_使ってもいいと思うけどなぁ
省略したほうが読みやすいときも個人的にいっぱいあるし

他のPerlをあまり使わない人のためじゃない?

あと、my変数と違ってlocal変数は本当はグローバル変数だよ

36 名前:34 mailto:sage [2008/04/03(木) 17:34:30 ID:???]
返事ありがとうございます。
$_が出てくるときは長々と複数行引きずる事はないですから、
害はないとは思うんですが・・・。

あと、上記ならまだいいんですが、
$yamadacount = grep((split(/<>/,$_))[0] eq '山田',@lines);
みたいな使い方してる場合はもうどうした物やら…

37 名前:nobodyさん mailto:sage [2008/04/03(木) 17:34:52 ID:???]
>>34
それよりも local @lines =@_ , (略) のが変。
$pt もグローバルだし。
perl4 時代のプログラム書くなよ。

まあ、$_ に関しては 35氏と同意見だけど、コーディング規約なら仕方ない部分はある。
(が、上記の理由により、貴社のコーディング規約が時代に則ったものとは判断しがたい。)

真相は、スパゲティをみかねた上司が手を入れちゃったって所じゃねえの?

38 名前:nobodyさん mailto:sage [2008/04/03(木) 19:35:33 ID:???]
失礼、$pt はグローバルじゃなかった、orz...
あと、()の行は「(が、仮に規約があったとしても、…」って書いたつもりだった。
>>36
$yamadacount
  = grep{
   my $line = $_ ;
   ( my $name, undef ) = split /<>/, $line ;
   $name eq '山田' } @lines ;

後、それを $_ を用いて書くなら(エンコーディングの話しは抜きにして)
$yamadacount = grep /^山田<>/, @lines ;
なりなんなりもっとすっきりしたコードが書けるんじゃね?

39 名前:nobodyさん mailto:sage [2008/04/03(木) 20:07:16 ID:???]
名前も付けなくていいし。

40 名前:nobodyさん mailto:sage [2008/04/03(木) 20:17:54 ID:???]
foreachループの制御変数( デフォルトで$_ )は使った後もとの状態に戻されるよ



41 名前:34 mailto:sage [2008/04/04(金) 10:01:42 ID:???]
いろいろ返事ありがとうございます。
さきほど以下のような形でまわしてみたところ、
@aaa = ('a','b','c');@bbb = ('A','B','C');
$_ = "HELLO";
foreach(@aaa){
  foreach(@bbb){
    print;
  }
  print;
}
print;
結果は'ABCDaABCDbABCDcABCDdHELLO'となりました。
ということはやっぱり>>40さんの言うとおり少なくとも
foreachで用いる$_は別段問題ないって事ですよねえ。
$_に直接何か入れる事なんてあんまりないですし。
もうちょっといろいろ試して勉強してみます。。

42 名前:nobodyさん mailto:sage [2008/04/04(金) 12:31:56 ID:???]
2種類のファイル(それぞれ複数あります)から必要部分を抽出して
リンク付きリスト作成したいのですがよろしくお願いします
perlで使う命令の意味もわからないレベルです(できれば丸投げ希望です)

1種目:htmlから抽出したい箇所
・<title>文字列</title> #1行構成
・<title xml:lang="ja" lang="ja">
文字列</title> #2行構成
・【住所】文字列 #1行の時と備考があって2行で構成されているファイルがある
・【TEL】半角数字で電話番号-ハイフン付き(03-3333-XXXX)10桁構成もしくは携帯(090-1234-XXXX)11桁構成

2種目:TXTから抽出したい箇所
<アピール>文字列<アピール>
約200文字〜300文字が改行無しに記載されている場合と
改行ありで2行から構成されている場合があります

★抽出したファイル名の一覧は<a href c:\test\list\ファイル名 </a>でリンク付き一覧
一覧表の構成(ソートは<title>の昇順)一覧表は.htmlで保存したいです

・<title>(htmlから抽出)
・【住所】(htmlから抽出)
・【TEL】(htmlから抽出)
・リンク付きでファイルネーム(htmlから抽出)
・<アピール>(TXTから抽出)
・リンク付きでファイルネーム(TXTから抽出)

それぞれの種類で複数あるファイルから上記部分を抽出して1枚の一覧表作成が目標です
どなたかよろしくお願い致します

43 名前:nobodyさん mailto:sage [2008/04/04(金) 12:58:40 ID:???]
丸投げスレ池

44 名前:nobodyさん mailto:sage [2008/04/04(金) 20:30:27 ID:???]
>>42です
>>43さん丸投げスレってあるのですか
私にピッタシのスレだ^^;
探してみるねお邪魔しましたノシ

45 名前:nobodyさん mailto:sage [2008/04/05(土) 13:15:12 ID:???]
こんにちは>>42です
丸投げスレを探したのですが既にあるスクリプトを改造するスレでした
私は改造とはちょっと違うのでこちらで勉強させてくださいお願いします
2枚のファイルから1枚にするより1枚の2箇所からのほうがいいかと思い結合させました
質問内容が>>42から変更します申し訳ないです

1枚のhtmlから異なる箇所にある複数行を読み込んで別ファイルを作る方法を教えて下さい
-------------------------------------
<h1>今日も晴れハレ^^</h1>
<h2>お友達を募集する</h2>
<h3>はじめまして<br>
元気だけがとりえの私です<br>
よろしくね</h3>
<h4>今日のラッキーカラーは黄色</h4>
-------------------------------------
<h1>〜</h1>と<h3>〜</h3>(複数行にまたがってる)の2箇所を読み込んで
読み込んだ部分だけ別のファイルに書き込んで保存したい(ファイルは新規作成)

部分的にでもアドバイスお願いできないでしょうか?
特に<h1>〜</h1>を読み込んだ後、離れた箇所にある<h3>〜</h3>の複数行を読み込ませる部分お願いしたいです
どなたかよろしくお願いします




46 名前:nobodyさん mailto:sage [2008/04/05(土) 13:22:57 ID:???]
>>45
while (<>){
 next if !( /<h1>/i .. /<\/h3>/i ) ;
 print ;
}
h3 が二箇所あるとかだったら知らん


47 名前:nobodyさん mailto:sage [2008/04/05(土) 13:31:19 ID:???]
ああ、思いっきし間違えた。
h1 と h3 だけ抽出したいのね。
while(<>){
 next if !( /<h[13]>/i .. /<\/h[13]>/i ) ;
 print ;
}
こっちだわ

48 名前:nobodyさん mailto:sage [2008/04/05(土) 14:40:16 ID:???]
>>45
ついでに

use strict;
my $joined = join "", <>;
my @matches = $joined =~ m{(<h[13]>.*?</h[13]>)}isg;
print map "$_\n", @matches;

でなったけど

リャマ本から省略して書くと
htmlみたいなマークアップ言語には多くの落とし穴があるから単純なパターンは使わずそれ用のモジュールを入手したほうがいいらしい。


49 名前:nobodyさん mailto:sage [2008/04/05(土) 15:04:15 ID:???]
>>46->>48
お忙しい中、レスありがとうです
>>45です
もしタグ名が違う場合はどう書けばよいでしょうか?
例にあげた文ではサーチする文字列のkeyは2箇所とも<h>ですが
<h>と<span>の2種類の場合はどうすればいいですか
丸投げですねすいません恐縮です

>>48のそれ用のモジュールってあるんですか
もしよろしければこちらも教えて下さい
何度もお手数をお掛けして申し訳ないです

50 名前:nobodyさん mailto:sage [2008/04/05(土) 16:02:34 ID:???]
>>49
use strict;
my $joined = join "", <>;
my @matches = $joined =~ m{(<h\d>.*?</h\d>|<span>.*?</span>)}isg;
print map "$_\n", @matches;

モジュールは探したけどわからんかった。すまん
それと、書いといて難なんだが勉強不足で>>47さんのコードがよく分からないけど
こっちのコードだと、でかいファイルを処理するときにjoinで全部繋げてからやってるから
たぶん、>>47さんのコードより表示するのが遅くなる
キーボード打つ回数も多くなるし



51 名前:nobodyさん mailto:sage [2008/04/05(土) 16:21:20 ID:???]
お世話になります>>45です
早速教えていただいたことを取り入れようとしてみたのですが
上手くいきませんでした

2種類あるタグは変数も2つに分けたほうがいいのでしょうか?
格納の仕方を教えて下さい

my $fileに<h1>〜</h1>を格納
my $file2に<span>〜</span>(複数行にわたる)を格納

2つの変数が格納された後
$file と $file2 の2つの変数をmy @files取り入れるのはどうすればいいですか
ハッシュは%linksとしたいです

書き込む時の事も2つになればどうすればいいのか?よくわかっていません
foreach my $file (sort keys %links) { print FH qq|\t<li><a href="$file">$links{$file}</a></li>\n| }
foreach my $file2 (sort keys %links) { print FH qq|\t<li>$file2</li>\n| }
でいいのか変数格納できていないので確かめていないです
どなたかよろしくお願い致します



52 名前:nobodyさん mailto:sage [2008/04/05(土) 16:24:30 ID:???]
>>50さん
>>45です
私が書き込む寸前にレスしてくれたんですね
入れ違いになってしまい申し訳ないです
(ソースを見ながら書くと遅くなってしまいました)
>>50さんに教えていただいたようにパイプを使ってやる方法を模索してみます
ありがとうございます

53 名前:nobodyさん mailto:sage [2008/04/05(土) 16:33:54 ID:???]
>>52
パイプは使ってないよ
m{(<h\d>.*?</h\d>|<span>.*?</span>)}isg
の縦棒(|)は右側か左側どっちかにマッチするようにしてるだけ
それと、このコードは
<span><span></span></span>とか入れ子になってると<span><span></span>にマッチしちゃう
正規表現の部分のコードのはてな(?)を取り除くと<span>aaa</span>……<span>bbb</span>のようになってるとき<span>aaa</span>……<span>bbb</span>にマッチしちゃう

だから、やっぱり書いておいて難なんだけどこのコードはおすすめできない

54 名前:nobodyさん mailto:sage [2008/04/05(土) 16:37:59 ID:???]
>>50さん
>>45です
my @files = glob("$dir*.html");
globでファイル名を配列として
そのあと
foreach my $file (@files) {
としてファイルを1つづつ読んでいます
ファイルの中が1箇所の時は大丈夫だったんですが
2箇所になると難しくなって困っています(例で言うと<h1>の部分と<span>の部分です)
アドバイス頂ければ嬉しいです
よろしくお願い致します
何度もすいません

55 名前:nobodyさん mailto:sage [2008/04/05(土) 16:42:14 ID:???]
>>50
モジュールは (HT|X)ML::Parser とか。
正規表現だけではネストに出くわしたときに「落とし穴」にはまる、と。

そのコード書ける人が>>47さんのが把握できないってのが腑に落ちんのだけど
どこが謎なの?

>>45
pc11.2ch.net/test/read.cgi/php/1203935151/277 かつ
pc11.2ch.net/test/read.cgi/hp/1205922529/50 な者ですが。
↑こんなやっつけ仕事を使い回そうとせずに「きちんと丸投げ」してくださいな。
自分より腕のいい人はたくさんいるから、暇つぶしで相手してくれるかもしれないし。

でも正直、あなたは丸投げ && 仕変連発を平気でなさるので業者に依頼して欲しい。

56 名前:nobodyさん mailto:sage [2008/04/05(土) 16:46:38 ID:???]
>>53さん
詳しくありがとうございます
>>45です
右か左かを選ぶって意味ですね
そうすると最長一致って事で<h1>の下にある<span>ばかりを選ぶことになりますね
どうすればいいのか・・・
ちょっと頭冷やして再考してみます
ありがとうございました
お返事頂けてよかったです

57 名前:nobodyさん mailto:sage [2008/04/05(土) 17:10:33 ID:???]
>>55さん
お世話になります
コーディング初心者スレで場所が違うと指摘を受けて自分が質問させてもらえるところを捜していたので
あなたとお会いできるとは思わなかったです
書いてくれた人にもう一度聞きたかったんだけど
みんなに迷惑だと言っていたのであなたに聞けなかったんですよ
また教えていただけないでしょうか?
お願いします
先のレスで書いたように別々のところ2箇所から取り出さなければいけない事がわかりました
以前お話したようにファイルリストを作りたいのですが
タイトルの下にもう1行ありました
タイトルにファイル名のリンクその下に1行書かなければいけなかったんです
もしよろしければお時間のある時にでもまた教えて下さい
お願い致します

58 名前:nobodyさん mailto:sage [2008/04/05(土) 17:13:24 ID:???]
>>55
なるほど。ありがとうございます

「/<h[13]>/i .. /<\/h[13]>/i」の部分が分かりません
$_に対してマッチしようとして真か偽を返すというのは分かるんですが範囲指定演算子がどういう役割をしてるか分からないです

>>56
何もできずにすまん
やっぱり>>55さんが紹介してくれたようなモジュールを使ったほうがいいよ

59 名前:nobodyさん mailto:sage [2008/04/05(土) 17:46:59 ID:???]
>>57
うーん、仕変が激しすぎるので…仕事だったら請けてるんでしょうけど。
とりあえず
pc11.2ch.net/test/read.cgi/php/1203935151/278
という声もあったので、ちと考えてみます。

>>58
そこの .. でしたか。

説明しようとするとウソを書きそうなので
perldoc perlop や
ttp://perldoc.jp/docs/perl/5.8.8/perlop.pod
の説明やサンプルを眺めてみてください。

60 名前:nobodyさん mailto:sage [2008/04/05(土) 18:14:08 ID:???]
>>59
すみません、perldocに目を通すのを忘れていました
コンテキストで役割が違うんですね
勉強になりました
本当にありがとうございました



61 名前:nobodyさん mailto:sage [2008/04/06(日) 14:25:12 ID:???]
こんにちは>>57です
>>59さんレスありがとうございます
わかりました
この先どんな問題が出てくるのか予想も出来ないので取り合えず自分でできるように頑張ってみます
2chで聞く時に「質問者は環境とやりたいことを出来るだけ詳しく」ということなので
やりたいことを詳しく書く、そしたら解答してくれる前に新しい問題点を発見して「質問内容を変更します」って繰り返してしまいました
解答してくれる方にはご迷惑をお掛けして反省しています
perlを始めて1週間、変数について勉強しているとこです
スカラ変数を2個にして配列変数0、1とすればいいのかなって思いました
それで正解なのかはわかりませんが取り合えずタイトル以外にもう1個スカラ変数を増やして読み書きできる事を目指してみます
ありがとうございました

62 名前:nobodyさん [2008/04/06(日) 22:29:28 ID:nA18XPcw]
perlの正規表現マッチングで、
htmlを読み込んだ$contentsから
<li>〜<li>の〜部分を抜き出したいと考えがえています。

for( my $i=1; $i <= 20; $i++){
if( $contents =~ m,^<li>(.*)</li>(.*),g ){
$block = $1;
$contents = $2;
}
}

この場合、i=1の時、
最後<li>のマッチングにかかる部分しか摘出できず、
うまい正規表現がないかと色々調べては回ったのですが、
ハマってしまいました。

$contensの初めからマッチングするようなコードを
ご教授お願いします。

63 名前:47 mailto:sage [2008/04/07(月) 07:06:59 ID:???]
誰向けでもなく一応のフォロー。 
my $cnt = 0 ;
while(<>){
 print $cnt . q{ } . $_ if $cnt != 0 or m{<span>}i ;
 $cnt += m{<span>}ig ;
 $cnt -= m{</span>}ig ;
}

>>62
my @res = $contents =~ m{<li>(.*?)</li>}gs ;



64 名前:nobodyさん mailto:sage [2008/04/07(月) 14:14:44 ID:???]
>>47さん
せっかく教えてくれたんだけど
今の私には理解できていないんだ(;´д⊂ヽ
後に参考になるかもしれないのでメモして大切に保存しておくよ
活用できなくて申し訳ない
ほんとにありがと

65 名前:nobodyさん mailto:sage [2008/04/07(月) 19:50:52 ID:???]
動画ファイル(youtube.flv)のハッシュ(SHA-1)を求める方法を教えてください。


66 名前:65 mailto:sage [2008/04/07(月) 20:57:10 ID:???]
あれからずっとググってやっと見つけました。
ありがとうございました。

67 名前:nobodyさん mailto:sage [2008/04/08(火) 00:48:13 ID:???]
perl/cgi逆引き大全600って本を1ページ目から読んでるんだけど
スカラと配列とハッシュがよくわかんない
スカラは値$
配列@は複数のスカラ値$
@があればスカラ変数$はいらないのでは?
@が複数のスカラ値と記載してあるんだけど
@へ複数の変数を入力する方法は記載されていないここが知りたいのに見当たらないね
最終的にソートする予定があればキーと値%のハュシュにしておいた方がいいのかな?
ソーと機能の所読んだらキーでソートするって書いてある
ハッシュをいくつも作って複数のハッシュを並べ替えてから書き込み
ってのが最終目標にすればいいのかな

39ページ目にして出てきたqwとはなんだろか??
目次にもTips検索にもない
ネットで調べたら
qw
シングルクォートで囲んだ文字列をスペースで split するのと同様です
命令を命令で説明しているところばかりだsplitってわかんない
splitを調べたsplitを使ってデータを分割と記載されている
・・・
qwはデータを分割するための命令なのか??
なんで日本語で解説しないんだ
先日もわかんない単語があった
ネットで調べたストリングと一緒と説明されていた
ストリング??ギターの弦か??ワケワカメ

68 名前:nobodyさん mailto:sage [2008/04/08(火) 05:45:29 ID:???]
Perlの前に日本語から勉強しなおせ

69 名前:nobodyさん mailto:sage [2008/04/08(火) 06:18:13 ID:???]
お前もな

70 名前:nobodyさん mailto:sage [2008/04/08(火) 06:31:50 ID:???]
ここが一番わかりやすかった
perlのアレコレ
ttp://furyo.on-air.ne.jp/linux/perl.html

私は10日ほど前からperlに興味を持ちお勉強してたんだよね
perl解説本3冊
ググルこと100サイト
初心者用ばかり選んでいるのにわかりにくいね

「簡単」「入門」「初級」で探してみるんだけど
中身は自分の思い出すためのメモ帳だね
全然わかんない
命令の説明に命令使って「入門」はないだろw
一般社会なら後進指導の立場には向いていないね
命令を説明するのに「○○はこんな感じです」と
その下にサンプル書いているだけではわかんね

私が選んだサイトは文脈からして10年くらいは経っているのではないかと思うがわかりやすいね
ヘンテコな広告も一切なくて集中して見れたな

「perlのアレコレ」管理人さんここを見ることはないかもしれないけど
ありがとう。



71 名前:nobodyさん mailto:sage [2008/04/08(火) 07:04:21 ID:???]
>>70
…そこもたいして他と変らんよ。多分、覚えたての頃に書いたんだろ。
ヘタに丁寧に書いてある分不味い。
# 範囲演算子の第二の用法(このスレの46)なんかは、まあ省くのは
# しかたないとして。
初心者向けと言うのを加味しても、for の項の例文の無意味な代入とか、
\w の説明とか、
if($target =~ /my main editor is (\w+)/)
{
 print "bad!\n" if $1 =~ /emacs/i;
 print "good!\n" if $1 =~ /vi/i;
}
こんな例文とか。ちょっと眺めただけでも突っ込み所がある。



72 名前:nobodyさん mailto:sage [2008/04/08(火) 23:43:12 ID:???]
$+ の意味はなんですか?
$# は探してたんでやっとわかった。最後の変数ね

大全600ダメだ
ゴミ買って来た様なもんだな使えねえ
他の解説書に気になるサンプルがあった
よく読んでもサンプルに出てくる$+の意味は解説されていない
仕方ないので意味を調べて廻る
くだらない時間が過ぎていく・・・
意味わかんないので他の解説書で調べたり
ググって調べたり無駄な時間ばっかりだ
それで答えは出てこない
どうなってんだ?
hello、perl以外作ったことないよ

グーグルで$+ と$# と半角でぐぐったら1件もヒットしない
なぜなんだろか??
怪しい命令なのかね

73 名前:nobodyさん mailto:sage [2008/04/08(火) 23:57:18 ID:???]
>>72
www.google.com/search?hl=en&q=perlvar

74 名前:nobodyさん mailto:sage [2008/04/09(水) 00:44:21 ID:???]
>>73
ありがと
ラストプレーンマッチ
最後にマッチする括弧がどれかわからない場合に使うと便利
まさにこれですよ^^
ありがとう

while (<FH>) { $links{$title} = $1 and last if (m!<title>(.+?)</title>!) }
これの m! の部分はマルチオプションっていうのかな
後ろに!が付いているので複数行はダメという意味でよい?

これを複数行対応にしたいのでシングルモードに!にしてみると
while (<FH>) { $links{$title2} = $1 and last if (s!<title>(.+?)\n(.+?)</title>!) }
デバッグでエラーになるんだよね

複数行対応にするにはどうしたらいいですか?
ここが$+の使いどころかな?
わかんない・・・


75 名前: ◆EtAiUEg7/Q mailto:sage [2008/04/09(水) 01:15:30 ID:???]
あぼーん用に捨てトリ。>>55です。

>>74
だからそのコードは使い回さずに書き直してくださいと(ry

m! … スラッシュのエスケープが面倒だった。 / 以外の記号でパターンを囲むとき用。
後ろの ! … m! で始めたんだから終わりも同じ記号。
複数行 … pc11.2ch.net/test/read.cgi/tech/1186030400/638+642 で教えました。

ついでに言うと
pc11.2ch.net/test/read.cgi/tech/1186030400/673
も私です。「gawkで片づいたら、くだすれPerlのアレは全部無駄ですか」という気持ちがあのレス。
ご自分でお書きのとおり「残念」です。

あと、ここもム板の正規表現スレも自分の日記を書くとこじゃありません。

76 名前: ◆EtAiUEg7/Q mailto:sage [2008/04/09(水) 01:55:27 ID:???]
忘れてた。

while (<FH>) { # 1行ずつ読み込んでループする。$_ に入ってるのは1行だけ }

77 名前:nobodyさん mailto:sage [2008/04/09(水) 02:43:19 ID:???]
>>75さん
こんばんわお世話になります^^
正規表現の「残念でした」は先の言葉が「次はなんだろう」だったので
クイズのノリなのかと思って
perl→gawkは正解じゃないので「残念でした♪またどーぞ♪」のノリでお答えしたのですが
言葉は難しいですね
ご心配無用ですよ
私がやりたい事を理解できればスグ消えます
ただ思ったよりかなり時間はかかっていますが
パソコンには関係のない商売なのでこればっかり調べたり勉強してとかは実際無理なので。
例の教えて頂いたコードを参考にさせて頂いているのですが
コードって元コードを理解しないと書けないですね^^;

あのコードで特にわからないの所は2箇所あります
1箇所目は複数行
2箇所目は下から3行目のループ
1行で$fileを3回使っていますよね
2回目$fileはファイル名だとわかるのですがlist_fileの宣言をすれば自動的に省略して$fileでOK??
1回目はmyが初めについているのでこの行で宣言してるってことなのだろうか?
3回目はlinksになっている何故$file(同じ文字なのに)動作は違うのかがよくわかりません
タイトルの下にデータ行と備考項目と増やしたいのですが何故か最初の5バイトが無くなるんです
まあ気長にやってみますよ
オヤシミ^^


78 名前: ◆EtAiUEg7/Q mailto:sage [2008/04/09(水) 03:07:32 ID:???]
>>77
# 「こんぴーたに無関係な商売なので、用事が済めばあんたらにもプログラミングにも用はない」と
# 言ってることに気づいてるのかなあ。

・複数行のこと。
ループ書き直すのが面倒な心境なので略。

・foreach my $file (sort keys %links) { print FH qq|\t<li><a href="$file">$links{$file}</a></li>\n| } のこと。
foreach (sort keys %links) { print FH qq|\t<li><a href="$_">$links{$_}</a></li>\n| }
# 動作は同じ。

79 名前:nobodyさん mailto:sage [2008/04/09(水) 03:29:44 ID:???]
>>78
よくわかんないけど
可哀相な人だ
ヘンテコなとらえ方してるね
あなたには感謝しているけど
仕事を放ったらかしでは生きていけませんという意味なのだが・・・
とにかくありがとう
>>78に記載してくれたコードも猫に小判
私には理解できていない
自力でなんとか頑張ってみるよ
あなたはとてもお人好しでいい人だ
知識もある
短気なところ直せば世界が変わると思うよ
オヤシミ^^

80 名前:nobodyさん mailto:sage [2008/04/09(水) 10:21:11 ID:???]
>>74
m//
perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators

複数行対応
perldoc.perl.org/perlre.html#Modifiers



81 名前:nobodyさん mailto:sage [2008/04/09(水) 11:43:17 ID:???]
>>◆EtAiUEg7/Q
アンタ良い人だよ、おつかれさんw

82 名前:nobodyさん mailto:sage [2008/04/09(水) 16:26:01 ID:???]
>>80
ありがと
$str =~ s/<aaa.*?>(.+?)<aaa>/$1/s;
これまだ活用できていないんよ^^;
検索するところに("$str")や("$1")とかしてみるんだけど結果が出ない
んで書き込みのところも同じようにしてみた・・・結果は出ない
命令の前にmyを付けてmy $str =~ s/<aaa.*?>(.+?)<aaa>/$1/s;とかやってみたけど同じだ
この複数行対応はまだまだ先の課題のようだorz

%linksこれって特別な命令ですか?
どうもこれがわかっていないと検索文字がおかしくなるみたい

(m!<title>(.+?)</title>!)これの場合対応したファイルは狙い通りに処理が終わる
(m!<title(.+?)/title>!)こうすると >タイトル< という感じで両端に><がひとつづつくっついている
他の<で始まる文字列を検索してみた
自分で適当に作った<aaa>とかは思い通りに処理してるけど
<objct>をターゲットにしてみた<object(.+?)object>
なぜか先頭部分と後部は消えている

%linksを%teslinkstesという変数名に変えてみた
構文チェックはエラーなし。しかし起動しなかった^^;

%linksを調べてみた
相変わらず全集600には当然のように記載されていない
ネットだけが頼りか・・・
リンク集ばかりヒットする
ググル文字を変えて「perl 命令」「perl 索引」「perl 逆引」
期待できそうなサイトはあったけど%linksは見当たらない

みんなどこで覚えてるんだろうか学校行ってたのかな?
サンプルを参考にさせて貰う以前の問題だな
%linksは明らかに特別な変数のような希ガス

83 名前:nobodyさん mailto:sage [2008/04/09(水) 16:33:39 ID:???]
「perl 特殊変数」でぐぐるといい
もしくは
perldoc Perlvar

特殊変数以外は自分で定義してるはず。

84 名前:nobodyさん mailto:sage [2008/04/09(水) 17:22:09 ID:???]
>>82
せめて>>70のリンク先(決して推薦はせんが、ま、しかたない)の全部を
「実践」- 読むだけじゃなく実際に実行してみること - してから
質問してくれんか?

答える気にもならんよ。レスしても「理解出来ない」で終りだし。
◆EtAiUEg7/Q はよくもまあこんなのに色んなスレで付き合ったもんだ。

85 名前:nobodyさん mailto:sage [2008/04/09(水) 17:51:57 ID:???]
>>83さん
>特殊変数以外は自分で定義してるはず。
これのようだ
ありがと

>>84
スレタイ嫁としかいいようないな
質問もアドバイスもしないあなたは何者?
どっか逝けばいいよ

86 名前:nobodyさん mailto:sage [2008/04/10(木) 13:21:24 ID:???]
超初心者用ってもPerlのって事だろ
日本語の初心者やそれ以下のヒトとしての初心者はどうかと思うがな


87 名前:nobodyさん mailto:sage [2008/04/10(木) 16:30:12 ID:???]
なんか思い込み激しいね
こんなの呼ばわりやそれ以下呼ばわりするほうが
よっぽど人として恥ずかしいので覚えておくといいよ
perl書けたから何?エライの?勘違いもイイトコだ実社会ではね
私はperlに関係あることを書き込みに来ているわけで
単語もわからないので超初心者だと自覚してるよ
まぁそういうのここでは関係ないでしょ
子供の言い合いみたいなのに付き合ってられないので
以降その手の話題は私にはしないで結構ですレスもしないです
今のところ解答者は2名のようだが居なくなるかもしれないし
気まぐれな方が通るかもわかんない
気長に待ってみてもレスもなく、このスレ消滅ってって事でも
それはそれで仕方ない私がどうこう出来ることでもない
煽るだけのレスよりかはいいと思う

今日のわからないこと。
取得タイトル部分は <a href でファイル名にリンクが張られている
後にprintした結果のタイトルには<title>のタグは付いていない
その部分を真似て他の部分を取得しようと試してみた
文字列だけがprintされているタグは前後ともに切れている
わからなかい例の1行で3回fileを使っている部分が味噌だな
その部分のスグ下で print FH qq|"$file"\n|; を記載してみた
何も取得しない・・・$fileを他の形式にしても同じようだ
謎の1行はその1行で3個の$fileを育成しているのか??
文字列の取得だけの場合は応用が利くって事がわかった
タグ付きの部分の取得はまた別にしたほうが良さげ
perlでタグ付き文字列取得の謎ってことで今日はおいておこ^^



88 名前:nobodyさん mailto:sage [2008/04/10(木) 16:57:06 ID:???]
質問にはわかる範囲で答えてあげたいけど、マナーや礼儀も必要。

質問は簡潔に。
煽りはスルーで。
回答には感謝を。
おっぱいうp。

89 名前:nobodyさん mailto:sage [2008/04/10(木) 17:04:46 ID:???]
せっかく和みレスが入った所悪いが、、、
>>87
俺は47=71=84≠86。
全く進歩しない奴にレスしてもつまらん。
お前が(無いと思うが)俺を回答者としてカウントしてるなら外してくれ。
「超初心者」と自覚してるならば、誘導URLを見て、変数、配列、ハッシュ
辺りの基本用語を頭に入れるくらいの礼儀は心得ろ。
# 正規表現スレにお前が表われて7日。全く進歩してないんだもん。
# 教えて君にも程がある。
煽ってくれても構わんが、その煽りの文章を考える暇があったら(中級以上の
リファレンスを買うんではなく)初心者本でも素直に買って読めよ。

空気悪くしてすまん、他の人。しばらくレスは自粛します。


90 名前:nobodyさん mailto:sage [2008/04/10(木) 17:07:35 ID:???]
マナーや礼儀ってあなたが決めてるの?
「マナーたるものこういうものである」
「礼儀とは云々・・・」思い込み激しいと疎外しちゃうよ
なんか勘違いしてるね
ペコペコしろという上から目線
キンモ〜〜としか言いようないなw



91 名前:nobodyさん mailto:sage [2008/04/10(木) 17:23:04 ID:???]
>>90
俺、>>81=>>83=>>88
質問者=初心者ではないし、回答者=エライわけでもない。
わからないことは質問する、わかることは答える。
ただ、教えを請う立場なら礼儀は必要だと思う。
でも勘違いしてるならしょうがない、以後回答は控えます。

92 名前:nobodyさん mailto:sage [2008/04/10(木) 17:30:12 ID:???]
>>91
あ、そうなんだ
お世話になったねありがと
お疲れちゃん

93 名前:nobodyさん mailto:sage [2008/04/10(木) 17:54:14 ID:???]
情報が只でもらえると勘違いしてる質問者か。
俺も抜ける。まぁ、頑張れ。

94 名前:nobodyさん mailto:sage [2008/04/10(木) 17:57:34 ID:???]
>>93
こんなとこで客を探してる暇な業者さんなのだろか?
さよなら
公然の場所で恥ずかしげもない
その発言が面白すぎて
釣られたー

95 名前:nobodyさん mailto:sage [2008/04/10(木) 18:09:05 ID:???]
久々に香ばしいのが沸いたなあ
ま、一所懸命煽ってがんばってくれ
俺も抜けるよー

96 名前:nobodyさん mailto:sage [2008/04/10(木) 18:15:14 ID:???]
>>95
ていうかさっきからここで発言してるの
あなたと私だけじゃないでしょうか?
まぁ解答しないよってのはよくわかったのだが
それで何?くらいにしか思わないのだがw
ま、さよなら
お元気で^^

97 名前: ◆EtAiUEg7/Q mailto:sage [2008/04/10(木) 18:30:14 ID:???]
>>85
スレタイの「超初心者」ってのは…
--
use strict;
my %doubutsu; # どうぶつハッシュ
# $doubutsu{'いぬ'} = 'ポチ';
# $doubutsu{'ねこ'} = 'タマ';
# はじめはこうしてたのですが、種類を増やしやすいように工夫してみました。

my @kumiawase = ('いぬ','ポチ','ねこ','タマ','へび','ガララ');
for (my $i = 0; $i < $#kumiawase; $i++) {
  $doubutsu{$kumiawase[$i]} = $kumiawase[$i+1];
}
foreach (keys %doubutsu) {
  # 「うちの タマ の名前は へび です。」という大惨事が!ヒントください!
  print "うちの $_ の名前は $doubutsu{$_} です。\n";
}
--
…こういう「プログラミングを身につけるのが目的」の超初心者さんのこと。

「そりゃそうなる。$i++ を $i+=2 に変えてみ。つーか、ガララかよw」とか
「("いぬ\tポチ",...) 形式にして foreach と split(/\t/) 使ったらどう?」とか
気のいい回答者さんたちが相手してくれる。

結果だけが目当てなのに業者依頼もせず、気長に取り組むつもりも全くなく、
先を急ぎまくって質問を次々に投げる人は、初心者でも何でもありません。

> 仕事を放ったらかしでは生きていけません

そうですよ。
あなたのような方から「要求定義262,500円 + 制作3,150円 = 計265,650円」をいただく立場の人たちが
仕事をほったらかしてタダでできるのは、冒頭のような初心者さんのお手伝いぐらいです。

98 名前: ◆EtAiUEg7/Q mailto:sage [2008/04/10(木) 18:30:49 ID:???]
>>89
今更ですが range operator の誰向けでもないフォロー、ありがとうございます。
説明しようとして「左項が真になるとスイッチが入り…えーと…perldoc」でしたので。

「よくもまあ」ではあるんですが、仕事もヒマな時期でしたし
・いつも見てるスレに何かが来る
・自分が回答
・「理解できない。でもありがとう」と言って(一旦)去る
…これで他の方の被害が少しは減るのなら、と。
ソフ板辺りも壮大なことになってそうですが、あちらは見てないので関わってません。

教えてちゃんですらないんですよね。
結果が欲しい、手法には興味がない(と書くと「違う」と返されるだろうけど)、と。
そんなわけだから処理系自体がコロコロ変わったりもするわさ、と。
腰を据えて初心者本でお勉強という方向へは行かない人なのでしょう。

本当は自分もこんな話は書きたくないんですが、誰かが書かないと日記が延々と続くんだなあ
と思ったので、NG用に捨てトリつけた次第です。

>>96
短気を起こしていろんな人を煽っても、いいことないですよ。
そういえば、私の短気なとこを直せば世界が変わると教えてくれた人がいました。



(レス|回答)自粛の方が続出、と。まあ、仕方ないというか自然な流れでしょうな。
捨てトリももう要らなくなって、ここは素敵な日記スレに移行かな。

99 名前:nobodyさん mailto:sage [2008/04/10(木) 18:31:42 ID:???]
>>96はKY

100 名前:nobodyさん mailto:sage [2008/04/10(木) 18:35:01 ID:???]
まーくだすれだしアリっちゃアリ。



101 名前: ◆EtAiUEg7/Q mailto:sage [2008/04/10(木) 18:37:23 ID:???]
>>99 =~ s/96/97/; # 勝手に直しとく

102 名前:nobodyさん mailto:sage [2008/04/10(木) 18:44:02 ID:???]
>>97
おぉやっぱりあなたか
あなたが顔を真っ赤かにしながらレスしている姿は笑えないよ
(まぁ吹いちゃってしまったのだがwww)
なんか難しい説明されてもよくわからない
くだすれ = くだらないスレ と教えてくれたのですが
しかも超初心者とまで付け足してあるw
まさに私のためのスレだと思ったよ
スレタイは業者の釣りえさだったのか
気づけよ>>自分www
そんなに必死になるほどのことでもないので
むしろどーでもいいことなんだけど
気になったからやってるだけで
質問者は回答に飢えている
この心理を突いた網だったのだ
ネットでネット(網)張ってましたねw
洒落にもならないけど実際そういう人がいてたのか・・・
必死やのー
ま、気長にやっていくのであなたは私を気遣う必要ないですよ
んじゃね

103 名前:nobodyさん mailto:sage [2008/04/10(木) 18:52:33 ID:???]
>子供の言い合いみたいなのに付き合ってられないので
>以降その手の話題は私にはしないで結構ですレスもしないです

リャマ本からの引用
「Perlは、少なくとも毎日20分間はプログラムを書く--そしてほとんどのプログラムをPerlで書く--人向けの言語です。」
もし、毎日書くか事情があるなら>>89の引用
>その煽りの文章を考える暇があったら(中級以上のリファレンスを買うんではなく)初心者本でも素直に買って読めよ。

腰を長くすえるなら応用のきくやつを学べ。
アドバイスいっぱい転がってるじゃん。
あと、おまえなじられたら死ぬのか?

104 名前:nobodyさん mailto:sage [2008/04/10(木) 18:54:15 ID:???]
                             |
                             |
      ∩___∩             |
      | ノ  _,  ,_ ヽ        ((  | プラプラ
     /  ●   ● |         (=)
     |    ( _●_)  ミ _ (⌒)   J  ))
    彡、   |∪|  ノ
⊂⌒ヽ /    ヽノ  ヽ /⌒つ
  \ ヽ  /         ヽ /
   \_,,ノ      |、_ノ

                        /
                 ぷちっ   /
         ∩___∩  .   从 /
         | ノ       ヽ      /
        /  ●   ● |  (=)ヽし
        |    ( _●_)  ミ/ ` ノ
       彡、   |∪|  ノ   /
         /   ヽノ     /  ノノ
         /         /
        /        /

           ムシャ         |
             ムシャ       |
      ∩___∩              |  ぷらぷら
      | ノ      ヽ        ((   |
     /  ●   ● |         J  ))
. ((  |    ( _●_)  ミ ・
    彡、   |∪}=) ,ノ ∴
     /    ヽ/^ヽ ヽ  。
     |      ヽ \ |
     |      ヽ__ノ

105 名前: ◆EtAiUEg7/Q mailto:sage [2008/04/10(木) 18:57:11 ID:???]
>>102
何か、私にはわからない謎の陰謀にお気づきになった様子ですが
自分が>>78の次に書いたのは>>97ですよ。
「私=ここで客を待ち構えてる業者」ということにしたいのでしたら、どうぞご自由に。

# こんなとこで客を拾うのってめんどくさそうだなーとしか思えないけど。

106 名前:nobodyさん mailto:sage [2008/04/10(木) 19:00:59 ID:???]
よくわからんが私の質問どっかいっちゃったのは確か棚

107 名前:nobodyさん mailto:sage [2008/04/10(木) 19:01:12 ID:???]
久々に叩かれまくられてるのを見た
超初心者でもここまでの香具師はそうそういまい

108 名前:nobodyさん mailto:sage [2008/04/10(木) 19:02:32 ID:???]
レスしてるのは俺ひとりなんだけどな。

109 名前:nobodyさん mailto:sage [2008/04/10(木) 19:09:35 ID:???]
電波役になったり電波に煽られる役になったり◆EtAiUEg7/Q役になったりしながら
ひとりでスレ回すのってマジ大変。

110 名前:nobodyさん mailto:sage [2008/04/10(木) 20:06:37 ID:???]
くだすれ = くだらないスレじゃなくて
詳しい人が見たらくだらない質問だと思ってたけどな。
>>1を読んでもそう取れる。



111 名前:nobodyさん mailto:sage [2008/04/10(木) 23:57:10 ID:???]
>>102
おまえ、キチガイで名をはせたヨシオカヒデノリだろ。キチガイっぷりがそっくりだ。

112 名前:nobodyさん mailto:sage [2008/04/12(土) 00:00:56 ID:???]
>>87
>>なんか思い込み激しいね

>>87を見ても>>102を見ても自分の発言に対して書いてるようにしか思えない点について


113 名前:nobodyさん mailto:age [2008/04/13(日) 13:47:51 ID:???]
元気でやっとるかね^^
ちょっとわからないことがあってまた落書きしに来たのだw
解答いただけたら嬉しいけど期待できないのはわかっているので
気長に解答者さん待ってみるよ^^;

@抽出部分の検索文字を <object (.+?)object> にすると
(.+?)の部分だけが取れて
始めに出てくるはずの <object と 最後の object> が現れないんだよね
変数宣言の名前を全部変えてみたけど動くので特別な変数名は使っていないようだ
perl自体がそういう仕様なのかね??

Aそれから複数行抽出なんだけど
1行もしくは2行もしくは3行ってのはダメなのかな?
(s<title(.+?)title>|<title(.+?)\n(.+?)title>|<title(.+?)\n(.+?)\n(.+?)title>s);

Bそれからまだあるんだよね
<title>
<object>
<span>
この3箇所を抽出したいんだけど何故か最後に書いたトコだけが取れるんだ
{ と } の間に3つとも書いているんだけど
ファイルクローズして改めてファイルオープンするって手順にするべきなのだろうか?
今はソースぐちゃぐちゃでワケワカメになってきたw

全集600ダメだ
オープン オブ ダイ で ダイの部分が予約語なのか調べて見てもわかんない
他の本でdieの意味がわかる
せめて予約語は全部掲載してもらいたいもんだ

それでは@〜Bよろしく願います
また会おう^^;
シーユーあげ印w

114 名前:nobodyさん mailto:sage [2008/04/13(日) 15:31:39 ID:???]
(〜´-`)〜

115 名前:nobodyさん mailto:sage [2008/04/13(日) 18:34:17 ID:???]
向うでデリミタの質問をしたのもコイツか?
お前のせいで、他の人の質問でも答える気にならんのだよ自重してくれんかね。

116 名前:nobodyさん mailto:sage [2008/04/13(日) 18:44:46 ID:???]
便乗したのがコイツだろ…進歩の無いコテが答えたからいいけどさ
あのコテも短レスで時々全然ボケた答え返すんだよなあ消えてくんねえかな

117 名前:nobodyさん mailto:sage [2008/04/14(月) 01:20:54 ID:???]
('A`)前進しないよ
これの27行目 closedir(DIR); でエラーになるんだけどなんで?
#!/perl/bin/perl
use strict;
use warnings;
print "<html>\n";
&traverse_html(".");
print "</html>\n";

sub traverse_html {
my $dirname = shift;
my $delim = '/';
if ($dirname =~ /[\/\\]$/) {
$delim = '';
}
print "<ul>\n";
opendir(DIR, $dirname) or die "$dirname: $!";
foreach my $entry (readdir(DIR)) {
next if ($entry eq '.');
next if ($entry eq '..');
my $filename = "$dirname$delim$entry";
if (-d $filename) {
print "<li>$entry\n";
&traverse_html($filename);
} else {
&do_html($filename, $entry);
}
}
closedir(DIR);
print "</ul>\n";
}


118 名前:nobodyさん mailto:sage [2008/04/14(月) 08:31:02 ID:???]
>>117 
再起してるからじゃね?先にファイル一覧を取得してclosedirしてから再起呼び出しするか、
ディレクトリハンドル(DIR)をローカル変数に浮かすかすればインジャネ?
traverse_html ※1 の中で traverse_html ※2 を呼び出す
→ ※1のDIRを※2で上書きする
  → ※1に戻ったとき ※2のDIRはclose済み
テストしてないから動くかは知らんけどこんな感じ。
sub traverse_html {
my $dirname = shift;
my $delim = '/';
my @entrys = undef;
my $i = 0, $j = 0;
if ($dirname =~ /[\/\\]$/) {
$delim = '';
}
print "<ul>\n";
opendir(DIR, $dirname) or die "$dirname: $!";
foreach my $entry (readdir(DIR)) {
next if ($entry eq '.');
next if ($entry eq '..');
$entrys($i++) = $entry;
}
closedir(DIR);
for ($j=0;$j<$i;j++){
my $filename = "$dirname$delim$entrys($j)";
if (-d $filename) { print "<li>$entrys($j)\n"; &traverse_html($filename); }
else { &do_html($filename, $entrys($j)); }
}
print "</ul>\n";
}


119 名前:nobodyさん mailto:sage [2008/04/14(月) 13:27:25 ID:???]
>>118さん
レスありがとう^^
試してみたら
my @entrys = undef;
my $i = 0, $j = 0;
部分でエラーになって以下関連箇所もエラーになるんだよね

>>117のコードでのエラー文こんな感じ
closedir() attempted on invalid dirhandle DIR at itiran-tes.pl line29
構文チェックではエラーにならない
デバッグの識別子チェックというのを実行してみたらエラー箇所がわかって
タイトルとファイル名は取得されていてリンクも貼られているようだ

>>117の closedir(DIR);がエラーにならないように出来たら
ワンステップだけど前進出来そうなんだよね
もうちょっと色々試してみるよ
朝のあわただしい中わざわざレスしてくれてありがとう
丁寧に教えてくれて感謝してまふ
んじゃ

120 名前:117 mailto:sage [2008/04/14(月) 13:33:05 ID:???]
>>117には続きがあるんだけど
2chの文字数制限で記載できなかったんだ

#ここに>>117の部分がある
sub do_html {
my ($filename, $entry) = @_;
return unless ($filename =~ /\.html?$/);
open(FILE, $filename) or die "$filename: $!";
my $file = join('', <FILE>);
close(FILE);
my $title;
if ($file =~ m|<title>(.*?)</title>|si) {
$title = $1;
$title =~ s/[\r\n]//g;
} else {
$title = $entry;
}
print qq|<li><a href="$filename">$title</a>\n|;
}





121 名前:118 mailto:sage [2008/04/14(月) 15:57:05 ID:???]
とりあえず、Linux Perl v5.8.6で動かしてみた。
117と120をつなげて動かしたら動いたよ。
OSやPerlインタプリタのの問題かな?

122 名前:nobodyさん mailto:sage [2008/04/14(月) 16:17:14 ID:???]
>>121
「オープン オブ ダイ」の話を書いてから12時間で
readdir でぶん回して再帰もしちゃうんだぞ、ってところが問題なんだと思うよ。

123 名前:117 mailto:sage [2008/04/14(月) 16:47:14 ID:???]
>>121さん
そうなんだ
わざわざテストしてくれたんだ(;´д⊂ヽありがとう
WindowsXP
アクティブパール5.88
シグウィンでもっかいテストしてみて作者にメールしてみるよ
ありがと

>>122
何が問題なのだ?
質問も解答もしないのに横から茶々入れてるあなたのほうがよっぽど問題なのだが・・・
購入した本にサンプルが付いていた
動かないので自分で解決できないか模索した
どこがおかしいのだ
あんたの頭かw



124 名前:nobodyさん mailto:sage [2008/04/14(月) 17:20:05 ID:???]
向うで再帰の質問をしたのもコイツか?
お前のせいで、他の人の質問でも答える気にならんのだよ自重してくれんかね。
>その煽りの文章を考える暇があったら(中級以上のリファレンスを買うんではなく)初心者本でも素直に買って読めよ。

125 名前:117 mailto:sage [2008/04/14(月) 17:21:37 ID:???]
cygwinで動いたんだけどcdのhtmlからの取得はしていなかった
サビフォルダーに置いていたhtmlからの取得は全部おk
コマンドプロンプトで確認したんだけど
ファイルは作成されていない
コマンドプロンプトの操作画面に現れたものを
ファイルに保存するのはどうすればいいですか?

取りあえず>>122は答えなくていいよ
どうせ野次るだけなのは明白だ
自分でも探してみるけど
私に理解できるように答えれる方おられましたらよろしくお願いします

126 名前:nobodyさん mailto:sage [2008/04/14(月) 17:22:29 ID:???]
>その煽りの文章を考える暇があったら(中級以上のリファレンスを買うんではなく)初心者本でも素直に買って読めよ。

127 名前:nobodyさん mailto:sage [2008/04/14(月) 17:23:21 ID:???]
>>124
それ勘違い
再起わかんないので具体的な質問できないよ
その質問には答えてあげればイイヨ
どうせ私が見てもわかんないのでヨロシコ

128 名前:nobodyさん mailto:sage [2008/04/14(月) 17:25:31 ID:???]
再帰を「再起」と書く初心者が同じ日に二箇所に現われるもんかねえ。

129 名前:nobodyさん mailto:sage [2008/04/14(月) 17:27:06 ID:???]
>>126
「超初心者用」と「初心者用」購入したんだけど
ささっと変数を解説したらCGIの話ばかりで
ファイル操作は最後のほうでちょびっとだけ解説してるんだ
なぜかperlの解説本は「CGI」「CGI」の連呼でキモい

130 名前:nobodyさん mailto:sage [2008/04/14(月) 17:29:05 ID:???]
>>128
誤字がどうしたのだ?
そんなの関係ないと思う
小心者だねw



131 名前:むこうの928 mailto:sage [2008/04/14(月) 18:04:05 ID:???]
>>124,>>128
激しくゴメン。別人です。
何日か前から、こっちがこんなことになってるから、むこうで聞いてみた。
(まあ実際WebProgではないんだけど)

しまった”再帰”か〜。
つっても再起でコケてるわけではなくて、(まただw)
どうも =~ s///e の”e”でこけてるようなんだ。

正規表現絡みで、しかもこっちこんな状況だったからあんま書き込みたくなかったんだけど
案の定つっこまれてしまった。

まあいいや、今は時期が悪かったってことで、暫く消えます。

132 名前:nobodyさん mailto:sage [2008/04/14(月) 20:11:42 ID:???]
一応、お詫びします。迷ったけどこっちに書きます。
貴方が本当に別人なら理解出来るでしょう。
======================
当方、確認の術を持たないので(win環境なし)。
s///e の問題にしろ再帰の問題にしろ、再帰を使うほどの
ネタでは無さそう。あくまでも適当に書いた例だけど。
# Wide character warning が出るのは御愛嬌。
use utf8 ;
my %hash
 = map{
  my $new = $_ ;
  $new =~ s/(\d)(\d)/$1十$2/ if length $new == 2 ;
  $new =~ s/1十(\d)/十$1/ ;
  $new =~ tr/123456789/一二三四五六七八九/ ;
  $new =~ s/0// ;
  $_, $new ;
 } 1 .. 99 ;

while(my $line=<DATA>){
  $line =~ s/(\d+)条/$hash{$1}条/; print $line ;
}
__DATA__
3条
24条
10条

133 名前:nobodyさん mailto:sage [2008/04/14(月) 20:48:09 ID:???]
こっちでいいのかな?

>>131
ActivePerl5.8.8(build816) で試そうとしたんですけど、標準入力からうまく食ってもらえず。

で、__DATA__ と <DATA> にしたり
open(IN, '<', 'list.utf8'); binmode(IN, ":utf8"); 以下略にしたりしてみたら
意図どおり(のはず)の出力になりました。perl.exe も落ちず。

# CP932 な環境で binmode(STDIN, ":utf8") って考えたこと自体がないのでよくわからない。

>>115>>124
諸事情により疲れすぎて疑心暗鬼になってるように見えますよ。
諸事情のほうは継続の気配なので、少し休まれては如何かと。

134 名前:130 mailto:sage [2008/04/15(火) 02:25:32 ID:???]
こっちにレスがついてた。みんなサンクス

>>132
イエッサー。わかりますとも。自分でも向こうに書き込んだ後に、ハッシュ使えばs///eも再帰も必要ないかなって思った。
処理速度もこっちのほうが速いし。でも自分で書いたのはこんなの。うーん、いまイチスマートにならないなあ。

my $kanj;
for (1..99){
    my $kan = $_;
    $kan =  substr($_,0,1) . '十' . substr($_,1,1) if($_ >= 10);
    $kan =~ tr/123456789/一二三四五六七八九/;
    $kan =~ tr/0//d;    $kan =~ s/一十/十/;    $kanj->{"$_"} = $kan;
 }

135 名前:130 mailto:sage [2008/04/15(火) 02:26:02 ID:???]
>>133
あれ、ちゃんと動きましたか?
うちでは昼間とは別のPC(PerlのVerは同じ)でやってみたけど、やっぱり例のWindowsダイアログが出て落ちる。
で、いろいろあがいてみたところ、上では、再帰ではないっぽいこと言ったけど、やっぱり再帰に問題ありかと。
特にif($num>=20)のところで、$1と$2を同じ関数に再帰してるとこで、次の正規表現マッチで$1$2あたりが壊れるんではないかと。
(ちなみに、これまたCentOS4,Perl-5.8.8-5.rpmだと期待通りに動く)

上で再帰ではないと思ったのは、あのスクリプトを、use utf8;とbinmode関係コメントアウトして実行してみると、
(当然tr/123.../のところで文字列がぶっ壊れるけど)、最後まで落ちずに走ることと、
以前に正規表現($1$2や$'$`$&も)使いまくりで、さらに6-7段ぐらいネストした関数書いた時も、期待通りに動いてくれたんで、
ちゃんと覚えてくれてるものかと思ってた。これからは、どうやらこれを改めないといけないようだ。

> # CP932 な環境で binmode(STDIN, ":utf8") って考えたこと自体がないのでよくわからない。
自分は、Win上でもtextは基本的にUTF-8で保存してるもんで、(本番環境がLinuxなのもあるけど)ワンライナーっぽく書くときは、
コードの中でopenやら、encode(decode(...))やら書くのメンドいんで、perl script.pl < infile.txt > puts.txt みたな感じを多用してます。
ちなみに、向こうのコードをopen(IN...)とかでやっても、ウチの環境ではやっぱりperl.exeが落ちるのは変わらない。

136 名前:134,135 mailto:sage [2008/04/15(火) 02:27:42 ID:???]
ごめん、激しくゴメン。
名前欄>>131の誤りです。
やっぱり消えます。

137 名前:nobodyさん mailto:sage [2008/04/15(火) 04:16:40 ID:???]
>>135
大変失礼しました、重ねてお詫びします。

>>133
>諸事情により疲れすぎて疑心暗鬼になってるように見えますよ。
>諸事情のほうは継続の気配なので、少し休まれては如何かと。
ほんとにその様です。穴があったら入りたいw

138 名前:nobodyさん mailto:sage [2008/04/15(火) 04:17:12 ID:???]
俺も穴があったら入りたい(性的な意味合いで)

139 名前:nobodyさん mailto:sage [2008/04/15(火) 15:19:10 ID:???]
これからジュンク堂とヨドバスカメラとbook1stとアサヒヤと紀伊国屋行ってみる
りゃまbonがいいんだね
先日、立ち読みしたラクダの本かな?
アレファイル操作詳しく載ってるの?
取りあえず今日はperlの絵本というのを探してみようかと思う
ま行ってみるよ
んじゃ

140 名前:133 mailto:sage [2008/04/15(火) 17:04:26 ID:???]
事故レス。
> 標準入力からうまく食ってもらえず。

test.pl < list.utf8 > converted.utf8 # 0バイトのファイル生成で頭抱える。
test.pl < list.utf8 # 何も吐いてくれない。
perl test.pl < list.utf8 > converted.utf8 # …ちゃんと食ってくれますね。

他人様の疲れを気にする前に、寝ぼけた自分をどうにかしろと。

>>135
要件通りに動くことより「なんで perl.exe が落ちるのはどうして?」が本題ですよね。
ちと時間があったので追試しました。

# 上記寝ぼけから醒めたので STDIN から食う元通りのコード
# 食わせたのは for (1..99) { print "ふんにゃか市$_条\n" } で作ったファイル

5.8.8-816 on Win2kSP4 → 正常動作。
5.8.8-819 on WinXPSP2 → 正常動作。
# ビルドを上げる
5.8.8-822 on WinXPSP2 → アッー!
# 本当に落ちたので下げた
5.8.8-820 on WinXPSP2 → 正常動作。

build822 だと見事に落ちますねえ。



141 名前:nobodyさん mailto:sage [2008/04/15(火) 19:22:38 ID:???]
みごとな検証、お疲れ様。
質問者様が見てくれるといいが。

142 名前:nobodyさん mailto:sage [2008/04/15(火) 23:20:39 ID:???]
>>140
原因が同じか違うかもさっぱりわからないが、
5.8.8 build822だとStorableを使ったコードで
大量のstorableデータ(50MB強)を読み込ませると読み込みが終わらない、
という現象にあたったことがある。
同一コードで、build817、あるいは5.10.0 build1001, 1002 では問題なかった。

というわけで、個人的にbuild822は信用していない。
参考情報と言うことで。

143 名前:nobodyさん mailto:sage [2008/04/16(水) 16:55:29 ID:???]
*本当の検証*が向こうに出てたので、>>131さんもご覧になるでしょう。
まあ、元々向こうのネタですし。
# きちんと問題の切り分けして再現する最小コード出す辺りが「向こう」なのかも。

自分のは検証でなく、「おらの環境では動いたずら」だけではひどいと思ったので
補足した程度ですから。

>>142
build822 をインスコすると build821 用の release.(html|txt) が入ってて萎えるんですが
CHANGES.txt で build821, 822 だけに書かれてる
> plus additional selected changes from the Perl 5.9 development branch.
これが気になってます。

> Build 821 was only distributed for HP-UX.
ここは…笑うところなのかな。

build822 が5.8系の latest ではあるんですが、自分も同じ印象です。
配布CGI+改造のテスト程度は大丈夫なんでしょうけどね。

144 名前:135 mailto:sage [2008/04/16(水) 20:08:19 ID:???]
みなさん本当にありがとうございます。
向こうで見事な回答を頂きました。(Cコードを読み解く力がないので具体的なことはよくわかりませんが・・。)

>>140
わざわざ試して頂いてありがとうございます。
自分の記憶では、817->819と820->822でバイナリ互換が崩れる(DBIやEncode、Uni-Jpなんかを再ビルドしないといけない)ので、
古いバージョンに戻してまでやってみようと言う気が起きませんでした。
(ちなみに819->820は再ビルド無しでモジュールが動きました。)

>>142,>>143
そうですか、build822はあんまりよろしくないのかな?
向こうの返答では、5.10系でも同様に落ちるらしいので、むしろこのコードで動いているほうがよろしくないってことで
修正されたんではないかと思いますが、実際のところよくわかりません。(動くことによる不具合が思いつかない。)
今度ヒマな時にでも、Linux環境でperl-5.10をソースからコンパイルして同じコード試して見ます。

まあどちらにせよ、再帰の中で、tr///(s///も?)を使うようなコードは書かないようにしないといけないっぽいですね。

145 名前:質問 [2008/04/16(水) 23:05:19 ID:oAcDKLtn]
ブラウザを閉じると、指定したファイルのデータを消すようにしたいのですが
perlで良い方法がありましたら教えてください。


146 名前:nobodyさん mailto:sage [2008/04/17(木) 09:24:21 ID:???]
>>145
サーバにいるPerlさんは、クライアントのブラウザが閉じたかどうかを知らないよ。

147 名前:nobodyさん mailto:sage [2008/04/18(金) 01:33:43 ID:???]
JavaScript併用

148 名前:145 [2008/04/18(金) 07:47:12 ID:ThTU7HIn]
>>146
サーバサイドだからやっぱり無理なんですかね・・ いいモジュールとか有ると期待していたんですが。。。

>>147
JavaScriptのどういったものが教えてください

149 名前:nobodyさん mailto:sage [2008/04/18(金) 10:00:46 ID:???]
閉じたら消すじゃなくて
開いたら消すにすれば?

150 名前:nobodyさん mailto:sage [2008/04/18(金) 14:57:49 ID:???]
JavaScriptならonUnloadで消去用のスクリプトを実行させれば?
もしくは実行終了のタイミングが予測出来るなら
folkなりthreadなりで子プロで消すとかね

そもそも消さなきゃならないデータなんて置かなきゃ良いんだよw
どうせダウンロードされたくない画像やら動画やらなんだろうけど
そんなもんはブラウザのキャッシュからいくらでも回収出来るからなぁ



151 名前:nobodyさん mailto:sage [2008/05/01(木) 01:13:00 ID:???]
foreach で読み込むときに異なる行を複数取得教えてください
foreachの前で下記のようにやってみたらエラーになります
$str1 =~ /あいうえお/;
$str2 =~ /さしすせそ/;


152 名前:nobodyさん mailto:sage [2008/05/01(木) 01:16:22 ID:???]
日本語が良くわかんない(><)

153 名前:nobodyさん [2008/05/02(金) 11:14:09 ID:Sh68NuTD]
2chの日付の後に付くIDはどうやって算出しているのですか?
よろしくお願いします。

154 名前:nobodyさん mailto:sage [2008/05/02(金) 23:30:24 ID:???]
pc11.2ch.net/php/#9のように?とは&使わずに引数使うのどうするの?

155 名前:nobodyさん mailto:sage [2008/05/03(土) 00:23:50 ID:???]
>>154
mod_rewriteとか。

実をゆうと localhost/file.cgi/aaa=bbb
とかで、/の後ろを引数として渡したり出来るんだけど、
色々と混乱しそうだから、俺は使わない。

156 名前:nobodyさん mailto:sage [2008/05/04(日) 16:40:15 ID:???]
どうやったら、変数に何も値が入ってないってことを確かめられるの?

157 名前:nobodyさん mailto:sage [2008/05/04(日) 18:06:42 ID:???]
$hensu or print "ナイヨ(><)\n";

158 名前:nobodyさん mailto:sage [2008/05/04(日) 18:19:28 ID:???]
$hensu = 0;
で破綻するので>>157はデタラメ。

defined($hensu) or print "ナイヨ(><)\n";
が正解。

159 名前:nobodyさん mailto:sage [2008/05/04(日) 19:26:18 ID:???]
>>156にとっての「何も値が入ってない」によって答えが変わるでしょ。

my $var = ''; # これが「長さ0の文字列が入ってる」のか「何も入ってない」のか
print "どっちが正解かわかんないんです(><)\n" if $var xor defined($var);

160 名前:nobodyさん mailto:sage [2008/05/04(日) 22:15:41 ID:???]
三値論理



161 名前:nobodyさん mailto:sage [2008/05/05(月) 18:10:43 ID:???]
use Socketと書かなくても、gethostbyname関数が使えるのはなぜ?
ドメインを入力してIPアドレスを出力するだけの、単純なスクリプトを作りたいので

162 名前:nobodyさん mailto:sage [2008/05/07(水) 13:21:17 ID:???]
記事の中の
 a href=" URL "
もしくは
 img src=" URL "
のURLが相対パスになっていた時に絶対パスに変換されるようにするには
どうしたらいいですか?

163 名前:nobodyさん mailto:sage [2008/05/07(水) 19:46:59 ID:???]
HTMLタグに「絶対パス」を入れても表示出来ないよ

164 名前:nobodyさん [2008/05/07(水) 21:26:07 ID:fDlQQ0EM]
いまapache?でcgiのテストをしてるんですが。
長居のでソースは遠慮するんですが、そのcgiを指定するとPLファイルをブラウザで表示したみたいに自分の打ったテキストがそのまま出てしまうのですが、このとき考えられるミスを教えて下さい。

165 名前:nobodyさん mailto:sage [2008/05/07(水) 22:20:31 ID:???]
>>161
use strict; use warnings;
#use Fcntl qw(:flock); use Socket;

open(LOG, '>', 'test.tmp') or die $!;
flock(LOG, 2);
#flock(LOG, LOCK_EX);
print LOG scalar gethostbyaddr(pack('C4', 127, 0, 0, 1), 2), "\n";
#print LOG scalar gethostbyaddr(pack('C4', 127, 0, 0, 1), AF_INET), "\n";
close(LOG);

use Fcntl qw(:flock) や use Socket しなくても flock() も gethostbyaddr() もつかえる。ふしぎ!

>>162
よくわかんないけど $ENV{'SERVER_NAME'} とか $ENV{'SCRIPT_NAME'} とか
ttp://search.cpan.org/~gaas/URI-1.36/URI.pm
ここの URI->new_abs() とかを眺めるといいんじゃないかと。

>>164
・自鯖板ネタなのにここに書いてる。
・よくわかんないまま共用レン鯖でテストしてる。
・ファイル名が なんたら.cgi だけど .htaccess で .cgi が text/plain になるよう仕込んである。
・ファイル名が なんたら.pl で実行属性がついてない。
・実は Perl と無関係な問題。
…1つぐらいは当たってると思います。

166 名前:nobodyさん mailto:sage [2008/05/07(水) 22:27:20 ID:???]
これじゃね?→Content-Type: text/html;

167 名前:nobodyさん [2008/05/07(水) 22:44:41 ID:fDlQQ0EM]
>>165
あ、すいません。自鯖板ネタなんだと思います。
そんな板があると知らなかったので・・・何回か色々とググったら、たぶんapacheの設定ミスみたいです。
見直してみます。
ご迷惑おかけしました。
>>166
そっちは試してみたので。スクリプト的にはたぶん問題ないです。
helloworldレベルの奴でも出なかったし、本丸写しでも無理でしたし。
ありがとうございました。

168 名前:nobodyさん mailto:sage [2008/05/08(木) 00:03:38 ID:???]
$HOGE = ABC
DEF123 を ABC123 に置き換えたい時は
$str =~ s/DEF123/$HOGE123/g;
では駄目ですよね? どうしたらいいですか?

169 名前:nobodyさん mailto:sage [2008/05/08(木) 00:16:04 ID:???]
$str =~ s/DEF123/${HOGE}123/g;

170 名前:nobodyさん mailto:sage [2008/05/08(木) 00:50:06 ID:???]
>>169
ありがとうございます。うう…



171 名前:nobodyさん mailto:sage [2008/05/08(木) 10:10:29 ID:???]
>>161
組み込み関数だから使える。

172 名前:161 mailto:sage [2008/05/08(木) 18:42:19 ID:???]
>>171
thx

173 名前:nobodyさん mailto:sage [2008/05/08(木) 20:29:16 ID:???]
ABC/DFG/HIJ/../  →  ABC/DFG/
こういうのが         こういう感じで置き換わるように

$str =~ s/\/[^\/]*\/\.\.\//\//g;
こうやってみたのですが

ABC/DFG/HIJ/../../  →  ABC/DFG/../
こういうのは         こうなっちゃいます

ABC/DFG/HIJ/../../  →  ABC/
こうなってくれるにはどうしたらいいですか?

174 名前:nobodyさん mailto:sage [2008/05/08(木) 20:46:01 ID:???]
../ を消すだけじゃ駄目?

$str =~ s{\.\./}{}g;

こんな風に。

175 名前:173 mailto:sage [2008/05/08(木) 20:59:09 ID:???]
>>174
../ が前方を巻き込んで消えるようにしたいのです
一行では無理でしょうか

176 名前:nobodyさん mailto:sage [2008/05/08(木) 21:06:50 ID:???]
ごめんなさい。
完全に勘違いしてました。

こういうこと?

$str =~ s{[^/]*/(\.\./)+}{}g;


177 名前:173 mailto:sage [2008/05/08(木) 21:22:58 ID:???]
>>176
すみませんお手数おかけして…
それだと
ABC/DFG/HIJ/../   の時も
ABC/DFG/HIJ/../../  の時も
ABC/DFG/  になってしまいます

ABC/DFG/HIJ/../../  の時には
ABC/   になるようにしたいのです

178 名前:nobodyさん mailto:sage [2008/05/08(木) 21:29:39 ID:???]
正規表現でどうにかする方向は>>176さんに任せつつ。

>>173
use File::Spec;
print File::Spec->canonpath('ABC/DFG/HIJ/../../'); # ABC

末尾のデリミタが消えたりしますが。

179 名前:176 mailto:sage [2008/05/08(木) 21:40:41 ID:???]
質問の趣旨がようやくわかった。ファイルパスの操作か。
こんなことしてどうするんだろうとか不思議に思ってた。
なんか寝ぼけてるな。
これを正規表現でどうにかしたのをみてみたい。

180 名前:173 mailto:sage [2008/05/08(木) 22:04:20 ID:???]
わ、最初からファイルパスと言うべきでした。すみません。
RSS出力のCGIをいじってて、文章中にあるリンクやimgタグがRSSフィードでは
絶対パスでないと働かないので、相対パスになってた時に絶対パスに置き換わるように
したかったのです。

$RSS_BASE_URI = "$ENV{'HTTP_HOST'}$ENV{'SCRIPT_NAME'}";
$RSS_BASE_URI2 = &GetDir($RSS_BASE_URI);

元のCGIにこれがあるので、

$str =~ s/href=\"/href=\"$RSS_BASE_URI2/g;
$str =~ s/src=\"/src=\"$RSS_BASE_URI2/g;
$str =~ s/http\:\/\/.*?\/http\:\/\//http\:\/\//g;
$str =~ s/\/\.\//\//g;
$str =~ s/\/[^\/]*\/\.\.\//\//g;

こうやってみたんですが…(見にくくてすみません)
こういう書き方をするようなものではないのでしょうか?

>>178
すみません、記事の中からURLを抜き出して当てはめるにはどうすれば…



181 名前:178 mailto:sage [2008/05/08(木) 22:46:06 ID:???]
my $str = 'ABC/DFG/HIJ/../.././././';
while (index($str, './') + 1) {
 $str =~ s!/\./!/!g;
 $str =~ s!/[^/]*/\.\./!/!g;
}
print $str;

ループなしでどうやるんだろう。

>>180
最初から「>>162です」と言って欲しかった気がする165です。
$RSS_BASE_URI2 の正体等々よくわかんないので、下記を見ながらごにょごにょしてください。

use URI;
print URI->new_abs('../../images/spacer.gif', 'example.com/cgi-bin/test/');
# example.com/images/spacer.gif

182 名前:nobodyさん mailto:sage [2008/05/08(木) 22:46:10 ID:???]
>>180
横レス。
モジュールがあるか?と静観してたんだが、こっちに移動してきたのかw
my $RSS_BASE = '/ABC/DFG/HIJ/' ; # 絶対パス
my $path = '../../abc/efg/' ; # 相対パス
my $cnt = $path =~ s{\.\./}{}g ; # ../ の数把握と同時に消去。
$RSS_BASE =~ s/([^\/]*?\/){$cnt}$// ; # 絶対パスから../の回数分のディレクトリを削る。
print $RSS_BASE . $path . "\n" ; # プリント。

183 名前:nobodyさん mailto:sage [2008/05/08(木) 22:47:32 ID:???]
ああ、やっぱモジュールがあったのねorz...
おまけにタワゴト書いてるし。


184 名前:173 mailto:sage [2008/05/08(木) 23:36:51 ID:???]
>>181
ごめんなさい。>>162です。
記事の中から該当部分を抜き出してまた戻す方法も分からない絶望的分からなさだったので
教えていただいたものを使うことができず、恥ずかし悲しくなりながら単純な置換だけでなんとか
やれないかと別の方向にごにょごにょしちゃってました。
もう少し勉強してそれを使えるようにがんばってみます。ありがとうございました。

>>182
移動してきてました…。
自分が知らないだけでこれもきっと一行ですむのだろうと思ってたら、そうでもないようですね。
勉強してなんとか単純置換以外も使えるようになろうと思います。ありがとうございました。

185 名前:nobodyさん mailto:sage [2008/05/09(金) 04:31:31 ID:???]
モジュール使えで終了な話ではあるけどワンライナーでかけないのが悔しいorz


186 名前:nobodyさん mailto:sage [2008/05/09(金) 07:34:10 ID:???]
せいぜい短くしても
$str="ABC/DFG/HIJ/../../././abc/efg" ;
1 while $str =~ s{([^/]*?/\.\./|\./)}{} ;
print $str . "\n" ;
程度だね。



187 名前:nobodyさん [2008/05/10(土) 18:46:41 ID:jhS0+1hl]
テストしても何も表示されないんですが何がおかしいのでしょう?
print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n";
print "<html>\n";
print "<head><title>あ</title></head>\n";
print "<body>$kao<br>$body<br>$asi</body>\n";
print "</html>";
タイトルすら出てくれないんです。
たぶん初歩的なミスだと思うのですが・・・


188 名前:nobodyさん mailto:sage [2008/05/10(土) 19:17:45 ID:???]
ヘッダは?

189 名前:nobodyさん [2008/05/10(土) 20:49:00 ID:jhS0+1hl]
print "Content-type: text/html\n\n";
これですか?


190 名前:173 mailto:sage [2008/05/10(土) 21:11:01 ID:???]
>>186
あ、一行でもできたんですね!
ありがとうございます、動きました!

URLを抽出してモジュールに渡すのに悪戦苦闘してましたが、
このままできないのもくやしいのでそっちもがんばってきます。



191 名前:nobodyさん mailto:sage [2008/05/10(土) 23:31:35 ID:???]
>>189
その行を print "<!DOCTYPE〜 の行の前に書いてる?
あとエラーじゃなくて真っ白? ソースも?

192 名前:nobodyさん [2008/05/11(日) 12:00:02 ID:/WAyhnOg]
>>191
はい。この行を書いて、一行改行してhtmlソースです。
ANHTTPDで真っ白でした。
前に$kaoとかを定義づけてるんですけども(ifで)それのミスなら500が出るかな、と思ったので。


193 名前:181 mailto:sage [2008/05/11(日) 17:10:05 ID:???]
>>190
「くやしいのでモジュール使うやりかたでもがんばってみる」方のようなので
ごにょごにょするときの参考にしてみてください。

use URI; # URIモジュールさん召喚。
my $RSS_BASE_URI2 = 'example.com/my/rss/generator/'; # 例。
my $str = join('', <DATA>); # __DATA__ 以下の割箸をまとめて $str に袋詰めします。

# >>180に基づいてみました。
$str =~ s/href="([^"]+?)"/'href="'. URI->new_abs($1, $RSS_BASE_URI2) .'"'/eg;
$str =~ s/src="([^"]+?)"/'src="'. URI->new_abs($1, $RSS_BASE_URI2) .'"'/eg;

print $str, "\n";
# 出力:
# <img src="example.com/diary/img/test.jpg">
# <a href="example.com/diary/latest">latest</a>
# <a href="example.com/test/script.cgi">Test Script</a>

__DATA__
<img src="../../../diary/././img/././test.jpg">
<a href="../../../diary/latest">latest</a>
<a href="example.com/test/script.cgi">Test Script</a>

194 名前:193 mailto:sage [2008/05/11(日) 17:25:08 ID:???]
事故レスれす。

> $str =~ s/href="([^"]+?)"/'href="'. URI->new_abs($1, $RSS_BASE_URI2) .'"'/eg;
> $str =~ s/src="([^"]+?)"/'src="'. URI->new_abs($1, $RSS_BASE_URI2) .'"'/eg;

$str =~ s/(href="|src=")([^"]+?)"/$1. URI->new_abs($2, $RSS_BASE_URI2) .'"'/eg;

195 名前:nobodyさん mailto:sage [2008/05/11(日) 20:48:25 ID:???]
>>192
ANHTTPDの設定だと思うけどなー。
「ANHTTPD 真っ白」でぐぐったらなんか色々出てきたから
やってみたら

196 名前:nobodyさん mailto:sage [2008/05/12(月) 04:25:47 ID:???]
ブラウザを使わずにBookOFなどの商用サイトに接続して本を検索したり注文したりする
Perlで可能でしょうか?
可能でしたら具体的に教えていただけないでしょうか


197 名前:nobodyさん mailto:sage [2008/05/13(火) 03:27:45 ID:???]
そのサイトが検索用にAPIでも提供していれば
コマンドラインからの実行で検索は出来るはず(Amazon等)
注文までは知らね


198 名前:nobodyさん mailto:sage [2008/05/13(火) 05:33:31 ID:???]
>>196,>>197
別にAPIとか対応して無くても、Formで受け付けてくれるなら(JavascriptやFlashでなければ)
気合さえあれば、検索も注文も出来る。

199 名前:190 mailto:sage [2008/05/13(火) 07:31:33 ID:???]
>>193
ありがとうございます、参考に……って回答だった!
自分のとこでも動きました。こんなに簡潔になるなんて感激です。
~ s/ 以下にも入れられたんですね…
一回やってエラーが出たので(多分何か抜けてた)
別の場所で動かしたそれを元に戻す過程がいるのかと
甚だしい勘違いをしてました。

何一つ自分で解決できなかったけどなぜか大きく成長したような気がしました
本当にありがとうございます。
CGIでやってみたいことはまだまだあるので次はgoogle的なもので
解決できるようになりたいものです。

200 名前:nobodyさん mailto:sage [2008/05/14(水) 02:23:53 ID:???]
>>198
まあ、やって出来ない事は無いとは思うけど
気合いってよりは無駄な作業が多くなるでしょ
検索して返ってくるのはHTMLな訳だからそこから必要な物を切り出して
さらにフォームを探して送信する内容を整えて・・・




201 名前:nobodyさん mailto:sage [2008/05/14(水) 04:27:20 ID:???]
>>200
そう、だから気合がいる。昔そんなのを書いてて、
「こんなん苦労して書く必要あんのかよ?しかも1サイトにしか通用しねえし・・」
とか思ったこともあるけど、気合(笑)でカバーした。あの頃は若かった。

202 名前:196 mailto:sage [2008/05/14(水) 04:44:38 ID:???]
みなさん情報ありがとうございます
ブラウザ無しでできるって事ですね
ブラウザ無しでデータをやり取りすると速いんじゃないかと思うのですが
実際どうでしょうか?
込み合ってるサイトもスイスイですか?

203 名前:nobodyさん mailto:sage [2008/05/14(水) 05:50:58 ID:???]
>>202
それは、相手のサーバーの処理能力とか、回線状態による。
まあそのページが、Javascriptやら画像やらフレームやらで大変込み入った内容なら
ブラウザでレンダリングするよりかは早くなるかも知れん。
(向こうのレスポンスについては、こっちからじゃなんもでけん)
けど、HTMLを正規表現等でパースして、ifで場合分けして、Formに内容セットしてとかしてたら、
はっきり言ってブラウザでクリックしたりしてするのの楽さと比べて、そんな恩恵あるとは思えん。
なにより、そうゆうコード書くのにかなり気合を要する(w)。

まあやるのは自由だけど・・・。
DDosアタックでも仕掛けるのなら話は別だが・・。

204 名前:nobodyさん mailto:sage [2008/05/14(水) 06:19:24 ID:???]
スイスイ具合は「画像オフ・JSオフ・CSSオフ」のブラウザと大差ないよ。レンダリングの有無だけ。
「Perlで書けばスイスイ!」だけを期待してるんだったら、やめれと。
でも、HTMLをパースしてCookieも食べて、フォーム仕立てて送信、お返事をパース…の繰り返しを書いて
意地でもPerlで注文してやる、というマゾな考えならそれはそれでありなのかもね。

205 名前:nobodyさん mailto:sage [2008/05/16(金) 00:52:53 ID:???]
近所の古本屋さんでオライリーPerl リソースキット UNIX版Xと記載されたperlの解説本を発見!
定価15000円らしいのだが2000円の値札が付いている
CD付属でそのCDは未開封
パラパラッと立ち読みしたらWindows環境にも通用しそうな気がするんですよ
自分はWindows環境なんだけどこの本は勉強なりそうですか?
付録のCDはWindows環境でも使えそうですか?
ご存知の方お願いします


206 名前:nobodyさん mailto:sage [2008/05/16(金) 12:23:26 ID:???]
>>205
それ、解説書じゃなくて、CPANにある
モジュールのドキュメントを和訳しただけのものだから。
しかも10年前のものだから。
www.oreilly.co.jp/out/presuni/



207 名前:nobodyさん mailto:sage [2008/05/16(金) 16:32:25 ID:???]
>>206さん
ありがとうです
UNIXと記載がありますが2000円捨てるつもりで買ってみようかと思います
他にも古い本でプログラミングperlUNIXとか600円で売っていたんですよ
Windowsで動くのか心配だけど一緒に買ってみます

208 名前:nobodyさん mailto:sage [2008/05/16(金) 16:37:16 ID:???]
XPのためにWin98の本買うようなもの
最新のドキュメントを探したほうがいい
古いの見ても混乱するだけ

209 名前:nobodyさん mailto:sage [2008/05/16(金) 16:45:50 ID:???]
>>208さん
そうだなー
そう言われればその通りですよね
やっぱり見合わせます
ありがとうございます

210 名前:nobodyさん mailto:sage [2008/05/16(金) 17:18:48 ID:???]
Perlほど解説本なしでネットでまかなえるプログラミング言語はないだろう



211 名前:nobodyさん mailto:sage [2008/05/19(月) 01:43:18 ID:???]
コマンドプロンプトからユーザエージェントして返ってきた文字列が
英数字以外は文字化けしてます
コマンドプロンプト内で読めるように教えてください
jcode.plもエラーになります

212 名前:nobodyさん mailto:sage [2008/05/19(月) 01:52:01 ID:???]
>>211
意味がわかりません。
> コマンドプロンプトからユーザエージェントして
とはどうゆうことですか?

213 名前:nobodyさん mailto:sage [2008/05/19(月) 02:16:27 ID:???]
わかんないならスルーしろよ
なんで答えるの?
教えたらわかりそうなのか?

214 名前:nobodyさん mailto:sage [2008/05/19(月) 02:24:16 ID:???]
>>213
いやあ、多分LWP-UserAgentのことかなとエスパー。
ほんで取ってきたページのソースがcp932じゃないから
コマンドプロンプトで文字化け。

実は俺も昔やったことがある。
だから聞いてみた。

215 名前:nobodyさん mailto:sage [2008/05/19(月) 02:26:22 ID:???]
>>214
ぅぉぉぉー ヽ( ゚д゚)ノヽ(゚д゚ )ノ ぅぉぉぉー
わかってんじゃん
それそれ
cp932をも少し詳しく

216 名前:nobodyさん mailto:sage [2008/05/19(月) 02:27:15 ID:???]
「CLI で LWP を飛ばしたら、CP932 じゃない文字列が返ってきます」まではわかるから、
もう一段階進んで
「jcode.pl は UTF-8 を知らんぞ」でいいのかな。

217 名前:216 mailto:sage [2008/05/19(月) 02:29:01 ID:???]
つーか、質問者さんがその態度で通すんだったら移動してくださいな。

くだらない質問でもど偉そうに聞いていいスレ
pc11.2ch.net/test/read.cgi/php/1158647441/

218 名前:nobodyさん mailto:sage [2008/05/19(月) 02:40:29 ID:???]
>>215
次からは、もちっと質問を詳しく。

ほいで解決方だけど、
perl 実行したいスクリプト.pl > kekka.html
とでもして、そのファイルを各種文字コードで開けるエディタ(秀丸、TeraPad等)で開く
もし持ってなければ、とりあえずIEで開けばなんの文字コードかはわかる。
or
use Encode;(5.8以降標準で入ってる)
で文字コードをcp932に変換。

>>216
その可能性もあるかもだけど、多分、もともとのページの文字コードが分かってなかったら使えない。
(と思ったが、自動判別出来るんだっけ?もう長いこと使ってないから忘れちまった。)

あと、$response()->as_string() あたりでサーバーからのレスポンスヘッダが読めるから、
それでそのページの文字コードを判別しい。(か、もしくはhtmlの中の<metaを探すか)

219 名前:nobodyさん mailto:sage [2008/05/19(月) 02:50:31 ID:???]
>>218
自動判別は (jcode.pl|Jcode.pm|Encode::Guess) な感じでいちおうあるよ。
# jcode.pl は UTF-8 に対応してないので、その辺はどうにもならない。

どれも「当たるとは限らん」ところが大事ですけど。

220 名前:nobodyさん mailto:sage [2008/05/19(月) 02:50:47 ID:???]
>>217
気分悪いならスルーでいいよ
あなた個人を攻撃してるわけでもないのに
態度云々言われたらこっちが気分悪い
取り合えず2chには向いてないと思うよ
これからもし私を見かけてもスルーしてね
おちょくってるわけでもないのに変な奴だ

>>218
詳しくありがとう





221 名前:nobodyさん mailto:sage [2008/05/19(月) 03:23:45 ID:???]
例の人が久々に来てたのか。エスパーたち、乙。

222 名前:nobodyさん mailto:sage [2008/05/19(月) 10:53:12 ID:???]
またおまえかwww

223 名前:nobodyさん mailto:sage [2008/05/19(月) 15:45:54 ID:???]
このバカ定期的に沸いてくるな
しかもあちこちに増殖している

224 名前:nobodyさん mailto:sage [2008/05/19(月) 16:40:56 ID:???]
ふーん
人を馬鹿扱いできるほどお前稼いでるの?
税金なんぼ払ってるかいってみ

225 名前:nobodyさん mailto:sage [2008/05/19(月) 16:59:25 ID:???]
失せろ

226 名前:nobodyさん mailto:sage [2008/05/19(月) 17:15:21 ID:???]
キモイ

227 名前:nobodyさん mailto:sage [2008/05/19(月) 18:46:02 ID:???]
稼いでる = 馬鹿でない

上の理論が成り立つと思ってるマヌケさ

228 名前:nobodyさん mailto:sage [2008/05/19(月) 18:49:18 ID:???]
なんか自分を凄く見せたがる為に銭金の話をしたがる馬鹿いるよな
森伊蔵云々、ディナー云々
中学生のホラ自慢みたいw


229 名前:nobodyさん mailto:sage [2008/05/19(月) 19:09:24 ID:???]
もう構うなってw

230 名前:nobodyさん mailto:sage [2008/05/19(月) 21:49:23 ID:???]
みんなお疲れ様
わかる人お願いします
ソースコードutf-8で保存してから実行してみた
アクティブパール5.88
WindowsXp
ここからどうすれば日本語になるの?

use LWP::UserAgent;
use utf8;
use encoding 'cp932';
$ua = LWP::UserAgent->new();
$req = HTTP::Request->new("GET", "www.yahoo.co.jp/");
$res = $ua->request($req);
print $res->content();




231 名前:nobodyさん mailto:sage [2008/05/20(火) 04:17:01 ID:???]

use LWP;
use Encode;

print encode('cp932',decode('utf8',LWP::UserAgent->new()->get('www.yahoo.co.jp')->content()));

232 名前:nobodyさん mailto:sage [2008/05/20(火) 04:28:46 ID:???]
>>231
私の環境ではエラーになっちゃったけど
物凄く参考になった
ありがとう

233 名前:nobodyさん mailto:sage [2008/05/20(火) 04:36:24 ID:???]
>>231
できました!
スペースの文字コードを半角スペースに変えたらエラーにならないで実行できました
見事に日本語になってます
ありがとうございました!

234 名前:nobodyさん mailto:sage [2008/05/20(火) 15:30:39 ID:???]
>>231をhtmlファイルで保存したいんだけどできない
すいませんまた教えてください

open(FH, '>>', "yahoolog001.html") or die "Cannot open content()!";
flock(FH, 2);
print FH qq|content()\n|;


235 名前:nobodyさん mailto:sage [2008/05/20(火) 16:51:57 ID:???]
>>234
231をyahoo_get.plとでも名前付けて保存して、
perl yahoo_get.pl > yahoo001.html

236 名前:nobodyさん mailto:sage [2008/05/20(火) 17:29:08 ID:???]
>>235何回もすいません
どうすればいいのか?
下記のような状況です

open(FH, '>>', "yahoolog001.html") or die "Cannot open yahoo001.html!";
flock(FH, 2);
perl yahoo_get.pl > yahoo001.html;

-----------------
Can't locate object method "perl" via package "yahoo_get" (perhaps you forgot to
load "yahoo_get"?) at yahoo-tes001.pl line 6.

237 名前:nobodyさん mailto:sage [2008/05/20(火) 18:28:08 ID:???]
>>235
スクリプト内に入れてやれよww

print FH encode('cp932',decode('utf8',LWP::UserAgent->new()->get('www.yahoo.co.jp')->content()));

238 名前:nobodyさん mailto:sage [2008/05/20(火) 18:38:22 ID:???]
>>236
違う違う、235のは、コマンドラインから実行するんであって、perlスクリプトの中に書くんではない。

>>234とか見てると、ファイルのオープンとかはあってるけど、
オブジェクトとか、クラスメソッドとかのことを良く分かってないようなので、
とりあえず一行で書けるのにしてみた。

それから、君は>>211>>230と同じ人(?、かどうかは定かではないが)
コマンドプロンプトから実行してるなら、リダイレクトや標準出力、標準入力等についてもある程度は理解がないと。
(Perlではないんで、入門書とかにはあんまり書いてないか。でも基本ってか常識レベルなんで、
わかってないとこれからしんどいよ。逆にわかってくると、いちいちスクリプトの中でやらなくていいことが増えるんで
書くのが楽になるし、理解も深まる。)

239 名前:nobodyさん mailto:sage [2008/05/20(火) 18:42:43 ID:???]
wktk

240 名前:nobodyさん mailto:sage [2008/05/20(火) 21:15:41 ID:???]
>>237さん、>>238さん、御二方ともお忙しい中ありがとうございます
FH付けると何故かまた文字化けになってしまい苦戦していました
よくわかりませんがcp932を止めたら文字化けが亡くなりました
アドバイスのお陰で2つの方法で保存させることが出来ました
しかも昨日までは取得した最後の1024バイトしか表示されなかったのですが
ページ全部を取得できていますありがとうございました
↓スクリプトだけで保存でたソース
---------------
use LWP;
use Encode;
open(FH, '>>', "yahoolog001.html") or die "Cannot open yahoo_get.pl!";
flock(FH, 2);
print FH LWP::UserAgent->new()->get('www.yahoo.co.jp')->content();
↓コマンドラインから保存できたソース
--------------
use LWP;
use Encode;
print LWP::UserAgent->new()->get('www.yahoo.co.jp')->content();
ここからログインのテストしたいので
またお願いするかもしれませんが
その時はよろしくお願い致します
>>238さん
勉強方法詳しくありがとうございました
標準入出力の解説書なかなか見当たらないです
手持ちの解説書で標準入出力を解説しているのは
「perlデータマンジング」という本だけです
大変わかりやすく良書なのですが紙面の関係上さわり程度なのが残念です
何かお勧めの解説書があれば教えて頂ければ嬉しいです
ありがとうございました




241 名前:nobodyさん mailto:sage [2008/05/22(木) 14:07:57 ID:???]
お世話になります
httpsでログイン可能な簡易ブラウザサンプルどこかないでしょうか?
自分が調べたところ2001年にある雑誌が付録で付けていたようなのですが
絶版になり各方面探しても見当たりませんでした
やりたいことはhttps接続での送受信です
お心当たりのある方よろしくお願い致します

242 名前:nobodyさん mailto:sage [2008/05/22(木) 14:12:19 ID:???]
LPW

243 名前:nobodyさん mailto:sage [2008/05/22(木) 14:12:53 ID:???]
間違えた笑
LWP

244 名前:nobodyさん [2008/05/23(金) 20:25:12 ID:VktSXUAF]
sで一気にいくつかのものを変換する方法ありますか?
たとえるならあいうえおという文のあとおをかとこにおきかえたいんです。

245 名前:nobodyさん mailto:sage [2008/05/24(土) 02:20:54 ID:???]
trじゃダメなの?

246 名前:nobodyさん mailto:sage [2008/05/26(月) 19:32:51 ID:???]
どもお世話になります
あれから色々調べているんですけど
ログインや検索やセレクトメニューの選択やボタンクリックなど
具体的なサンプルってないですね
もしかしてperlで出来ないですか?
結局HACKER本買い捲ったんだけど
みんなHTMLの取得までなんですよ
そこからセレクトメニューを選んだりOKボタンをクリックするとか
できないんだろうか?


247 名前:nobodyさん mailto:sage [2008/05/26(月) 19:36:22 ID:???]
お前は何を言っているんだ

248 名前:nobodyさん mailto:sage [2008/05/26(月) 20:03:33 ID:???]
なんで?
perlでなんでも出来るって言ってたじゃないですか?

249 名前:nobodyさん mailto:sage [2008/05/26(月) 20:18:52 ID:???]
ネタですか?

250 名前:nobodyさん mailto:sage [2008/05/26(月) 20:35:06 ID:???]
>>248
もしかして>>196からの流れか?
ひょっとして画面が表示されて検索ワードが勝手に入力されてセレクトメニューが勝手に選択されてボタンが勝手に押されるとか
そういうのイメージしてる?



251 名前:nobodyさん mailto:sage [2008/05/26(月) 20:47:35 ID:???]
>>250
それそれ
それです!
perlで出来るんですよね?
今のところそのようなサンプル見当たらないんですよ
自動ソフトのスクリプトとかならOKボタンのクリックなどは
初歩の初歩インストール後5分後には覚えれるくらい簡単なんですけど
perlの場合参考になるような記述すら見当たらないんですよ
超凄いらしい解説本やオライリーのHACKシリーズやWEBシリーズを購入したんですけど
全然すごくない
OKボタンの1回すら出てこない
なんでもできないのですか?

252 名前:nobodyさん mailto:sage [2008/05/26(月) 20:54:44 ID:???]
それをやろうと思ったのはお前が最初で最後だと思うよ

253 名前:nobodyさん mailto:sage [2008/05/26(月) 21:12:52 ID:???]
>>252
なんでですか?
perlでは出来ないってことなの?

254 名前:nobodyさん mailto:sage [2008/05/26(月) 21:16:41 ID:???]
ちなみに自分はある自動ソフトで検索とか保存とか
WEB上での操作でやりたいことは大体教えてもらえましたよ
そのソフトを教えてくれる方たちはみんな普通にご存知でした
ただ遅いんですよorz
0.5秒で完結させたいんです


255 名前:nobodyさん mailto:sage [2008/05/27(火) 02:30:31 ID:???]
>>252
自分は>>198>>201なんだけど、多分初めてじゃないと思うぞ(w)

>>253,254
君のやりたいことってのが、GUIのツールみたく目に見える感じで動いて行くってのなら多分ムリ。
(Tkとか使ったら無理やりにでもできるかも知れん。でも自分はGUI系はからっきしなんで、よくわからん)

そうでなくて、コマンドラインから、ブラウザで操作したことと同じ結果を得るってことなら可能。
どんな本や、どんなページ参考にしたかわからないけど、
ちょっと上の方に出てるLWPなんかの解説や、CPANのmanualなんかをじっくり読めば(リンクを少々辿らないダメだけど)、
検索フォームにワード仕込んだり、”OK”ボタンを押すってことにもたどりつきそうだけど・・・。

256 名前:255 mailto:sage [2008/05/27(火) 02:31:04 ID:???]
でもまあ、サンプルでも書いとく。
use strict;
use LWP;
use Encode;
use HTML::Form;

my $pwd = `cd` . '\\';
my $cmd = 'C:\Program Files\Internet Explorer\iexplore.exe';
my $url = 'google.co.jp/';
my $lwp = LWP::UserAgent->new('agent'=>'mozilla3.9');
my $word; my $out1 = '1.html'; my $out2 = '2.html';
$word = shift() or $word = 'Perl'; $word =~ tr/\r\n//d;
my $html = $lwp->get($url)->content();
open(O1,">$out1"); print O1 $html; close(O1);
system qq("$cmd" "$pwd$out1");
my $form = HTML::Form->parse($html,$url);
$form->value('q' => encode('utf8',decode('cp932',$word)));
$form->value('ie'=> 'UTF-8');
my $response = $lwp->request($form->click);
my $out2 = '2.html';
open (O2,">$out2"); print O2 $response->content(); close(O2);
system qq("$cmd" "$pwd$out2");

これを、例えばtest_search.plとでも保存して、コマンドラインから、
perl test_search.pl "検索したいキーワード"
で実行すると、最初googleのTopが表示されて、それを閉じれば、そのワード(なければ”Perl”)での
検索結果がIEで表示される。(無理やり、画面遷移っぽくなるように作った。)
モジュールや関数の詳細は、自分で調べてくれ。

257 名前:nobodyさん mailto:sage [2008/05/27(火) 03:14:05 ID:???]
また湧いたのか・・・

258 名前:nobodyさん mailto:sage [2008/05/27(火) 03:29:45 ID:???]
>>255さん
ありがとうございます
まさにそれなんです
GUIを使わないで送受信してみたいんです
お疲れのところわざわざサンプルまで作って頂き本当にありがとうございます!
頂いたサンプルを参考にログインとかもチャレンジしてみます
ありがとうございました

259 名前:nobodyさん mailto:sage [2008/05/27(火) 14:08:14 ID:???]
ブラウザのインターフェースに強引に割り込ませるのかと思ったわ
httpについて勉強するといいよ

260 名前:nobodyさん [2008/05/28(水) 00:14:16 ID:T0EpbUiq]
ググったら趣旨が違うのしかでないんですが、
ifで、たとえば$Aに\という文字列が含まれる場合、
\が含まれています。とするにはどうしたらいいんでしょうか?
if($A =~ \\)
{print "\\が含まれています"}
でいけますか?



261 名前:nobodyさん mailto:sage [2008/05/28(水) 02:23:14 ID:???]
if($A =~ /\\/)

262 名前:nobodyさん mailto:sag [2008/05/31(土) 01:19:07 ID:???]
$in{'ext'} = extfind($in{'orgname'}); if(!$in{'ext'} && $in{'upfile'}){ &error(202); }

この処理ってどういう意味なのでしょうか?


263 名前:nobodyさん mailto:sage [2008/05/31(土) 02:02:14 ID:???]
;


264 名前:nobodyさん mailto:sage [2008/05/31(土) 15:52:59 ID:???]
>>262
>$in{'ext'} = extfind($in{'orgname'});
サブルーチン(?) extfindの一番目の引数にハッシュ$in{'orgname'}の値をセットして
呼び出し、戻り値をハッシュ$in{'ext'}に代入。

>if(!$in{'ext'} && $in{'upfile'}){ &error(202); }
次にハッシュ$in{'ext'}の中の人が留守で、
尚且つハッシュ$in{'upfile'}の中の人が居る場合
恐らくエラーメッセージを表示するであろう
サブルーチンerrorの一番目の引数に"202"をセットして呼び出す。


ちなみに2行を一行にまとめると↓みたいになる
&error(202) if(!&extfind($in{'orgname'}) && $in{'upfile'});

265 名前:264 mailto:sage [2008/05/31(土) 15:54:58 ID:???]
戻り値をセットせなあかんから1行にまとめたら駄目だな・・orz

266 名前:264 mailto:sageΛ||Λ [2008/05/31(土) 16:03:00 ID:???]
&error(202) if(!($in{'ext'} = &extfind($in{'orgname'})) && $in{'upfile'});

オリジナルと大して変わらんけどこうやればいけるか
スレ汚しスマソ・・

267 名前:nobodyさん mailto:sage [2008/05/31(土) 18:48:39 ID:???]
より、この処理ってどういう意味なのでしょうか?
という質問が出易くなりますな。

268 名前:nobodyさん mailto:sage [2008/05/31(土) 20:14:45 ID:???]
>>264
やっぱりperl難しいな・・・

sugachan.dip.jp/obsolete/snup/
拡張子合わずってログに記録したときは
ファイルをアップしないように改造しようかと
思ってるのだがなかなかできなくて。。。

$in{'ext'} = extfind($in{'orgname'}); if(!$in{'ext'} && $in{'upfile'}){ &error(202); }

$in{'ext'} = extfind($in{'orgname'}); if(!$in{'ext'}){ &error(202); }
に、しても普通にアップロードできてしまうし。。。どこがおかしい?

269 名前:nobodyさん mailto:sage [2008/05/31(土) 20:40:29 ID:???]
>>268
そこのアップローダの改造の質問 って前にもどこぞで見たなあ。
で「改造スレに行け」と言われてたハズだが?

ソースが好みじゃないのでやる気にならん。…改造スレ行けば?

270 名前:nobodyさん mailto:sage [2008/06/04(水) 08:35:22 ID:???]
perlで書かれたチャット掲示板みたいなCGIプログラムがあります
テキストエリアに文字を入力して、投稿ボタンを押すとregist.cgiに渡されて書き込まれる仕組みです
このregist.cgiはmessageとcountという2つの引数をとるみたいなのですが、
ブラウザからURL:/aaa/bbb/regist.cgi?message=test&count=1
とやっても書き込まれませんでした

ちなみにFirefoxのTemperDataで確認したリクエストとレスポンス上ではベーシック認証は使われていませんでした

最終的にはperlで自動的に書き込んでくれるプログラムを書きたいのですが、まずはperlでこのregist.cgiに投稿するにはどうすればいいか教えてください




271 名前:nobodyさん mailto:sage [2008/06/04(水) 10:11:46 ID:???]
postしてみろ

272 名前:nobodyさん mailto:sage [2008/06/04(水) 14:06:46 ID:???]
GETで投稿出来ちゃうと、2chにリンク貼られまくったときにw

273 名前:nobodyさん mailto:sage [2008/06/06(金) 23:21:44 ID:???]
sub getDirSize($)の($)ってどういう意味?

274 名前:nobodyさん mailto:sage [2008/06/07(土) 02:53:47 ID:???]
>>273
プロトタイプ。
$は引数としてスカラーしかとらないってこと。


275 名前:273 mailto:sage [2008/06/07(土) 08:37:38 ID:???]
>>274
thx

276 名前:nobodyさん [2008/06/13(金) 17:42:23 ID:GNaVOr+f]
UTF-8の16進コードを文字にしたいんですが、
pack('C*','0xe4','0xba','0xba')とやっても化けてしまいます。
どういう式を書けばいいのですか?

277 名前:nobodyさん mailto:sage [2008/06/13(金) 18:06:20 ID:???]
pack('C*',0xe4,0xba,0xba) だとどうなる?

278 名前:nobodyさん mailto:sage [2008/06/13(金) 18:32:03 ID:???]
>>277
ありがとうございます。できました。
裸のままでよかったのですね。
pack('H*','e4baba');
というのもあったみたいです。

今は10進→16進→文字なんですが、
10進から直接変換できますか?


279 名前:nobodyさん mailto:sage [2008/06/13(金) 18:37:43 ID:???]
0xがついてなきゃ10進だよ。
pack('C*',228,186,186) とか
10進の数字しかないならpack('C*','228','186','186') でも通るけどな。

280 名前:nobodyさん mailto:sage [2008/06/13(金) 19:26:54 ID:???]
ありがとうございます。
文字列との違いが判りました。

UTF-8のコード範囲を調べると
[\x00-\x7f]
[\xC0-\xDF][\x80-\xBF]
[\xE0-\xEF][\x80-\xBF][\x80-\xBF]
[\xF0-\xF7][\x80-\xBF][\x80-\xBF][\x80-\xBF]
とあります。
これには他の言語も含まれているとおもいます。
先ほど教えていただいた変換で一覧を作ろうと思うのですが、中国語なども混ざってしまいます。
日本語のみの範囲はどのようなものなのでしょうか。



281 名前:nobodyさん mailto:sage [2008/06/13(金) 19:41:37 ID:???]
ttp://ja.wikipedia.org/wiki/Unicode

282 名前:nobodyさん mailto:sage [2008/06/13(金) 20:36:31 ID:???]
そういえば、日本語じゃなくても、
罫線とか利用している文字もありますね。
なかなか難しい。

283 名前:nobodyさん mailto:sage [2008/06/15(日) 14:13:18 ID:???]
postやgetじゃなくて、普通にページにアクセスしたときの条件分岐が作りたいのですが、
そんなことはできませんか?

284 名前:nobodyさん mailto:sage [2008/06/15(日) 14:29:37 ID:???]
Use of uninitialized value in concatenation (.) or string at main.cgi line 93.
このエラーの意味が分からないのですが、教えて頂けませんか?

285 名前:nobodyさん mailto:sage [2008/06/15(日) 20:40:23 ID:???]
>>283
もう少し詳しく
>>284
main.cgiというファイルの93行目で、連結の方法がおかしい。

286 名前:nobodyさん mailto:sage [2008/06/15(日) 22:45:56 ID:???]
>>284
>>285 =~ s/連結の方法がおかしい/未定義値を文字列として評価している/;

例えば $foo が undef の状態で "foo$foo" とか 'foo' . $foo とか。

287 名前:nobodyさん mailto:sage [2008/06/16(月) 09:05:17 ID:???]
おはようございます。

あるサブルーチンでファイルを扱おうとしています。
evalの中でopenしたファイルハンドルをエラー処理(if $@)で閉じるにはどうすればよいのでしょうか。
環境はperl5.8 use strictです。

288 名前:nobodyさん mailto:sage [2008/06/16(月) 10:45:47 ID:???]
pc11.2ch.net/test/read.cgi/tech/1208674881/514
より

#!C:/perl/bin/perl

open(IN,"example.log");
while(<IN>){
$i++;
if($i == 3){ $line .= "\t\t$_"; }
else{ $line .= "$_"; }
}
close(IN);

open(OUT,">example.log");
print OUT $line;
close(OUT);

print"Content-type:text/html\n\n";
print "変更完了";


289 名前:nobodyさん mailto:sage [2008/06/16(月) 10:49:36 ID:???]
pc11.2ch.net/test/read.cgi/tech/1208674881/511
より

#!C:/perl/bin/perl

open(IN,"example.log");
while(<IN>){
unless($_ =~ /hoge/){ $line .= "$_"; }
else{ $line .= "\n"; }
}
close(IN);

open(OUT,">example.log");
print OUT $line;
close(OUT);

print"Content-type:text/html\n\n";
print "消去完了";


290 名前:nobodyさん mailto:sage [2008/06/16(月) 13:00:09 ID:???]
>>288-289
せっかくお答えいただいたのにすみません。
私が知りたいのはスコープを跨ぐ場合の話です。

例えば、evalの中で宣言した変数をevalの外で使おうとすると、perlに叱られます。
ファイルハンドルの場合は叱られないのですが、これが作法に則った方法なのかわかりません。



291 名前:nobodyさん mailto:sage [2008/06/16(月) 14:31:35 ID:??? BE:177559834-2BP(1)]
案1)
my $fh = IO::File 〜とかopen my $fh〜等を使って
いちいち閉じなくていいようにする。

案2)
use IO::File;して
my $fh = *FH{IO};
$fh->close() if defined($fh) && $fh->opened();


292 名前:nobodyさん mailto:sage [2008/06/16(月) 16:00:58 ID:???]
>>290

失礼。他のスレッドへの返答でした。

pc11.2ch.net/test/read.cgi/tech/1208674881/519 への回答

# 変数が半角スペースで始まっていれば、半角スペースを先頭一個だけ消去
if($example =~ /^ /){ $example =~ s/ //; }
# 変数が全角スペースで始まっていれば、全角スペースを先頭から一個だけ消去
elsif($example =~ /^ /){ $example =~ s/ //; }

拙いですがどうですか?

293 名前:nobodyさん mailto:sage [2008/06/16(月) 16:05:48 ID:???]
>>292

修正です。

# 先頭の全角スペース、半角スペースの連続を削除
$example =~ s/^([\ \ ]+)//;


294 名前:nobodyさん mailto:sage [2008/06/16(月) 17:36:08 ID:???]
流れがよく分からんけど、
もうひとつファイルを用意して、
書き出して言ったらダメなの?

>>293
スクリプトとファイルの文字コードが同じならいいけど。

295 名前:nobodyさん mailto:sage [2008/06/16(月) 21:58:28 ID:???]
>>291
ありがとうございます。

お答えいただいた案1がしっくりきたので、この方式で行きます。

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

296 名前:nobodyさん mailto:sage [2008/06/17(火) 10:38:26 ID:???]
>>294

すいません、超未熟でした。

297 名前:nobodyさん [2008/06/18(水) 00:25:23 ID:Mmy0x8n6]
perlで、
print "あ";
で一秒待ってから
print "い";
を実行する方法ってありますか?
localtimeで受け取って1秒過ぎるまでwhileで空白を書き続けるってのも考えたんですが・・・
負荷がかかりそうなんで。

298 名前:nobodyさん mailto:sage [2008/06/18(水) 01:19:02 ID:???]
sleep 1;

299 名前:nobodyさん mailto:sage [2008/06/19(木) 06:37:25 ID:???]
select undef,undef,undef,1;

300 名前:nobodyさん mailto:sage [2008/06/19(木) 10:35:29 ID:???]
$| = 1;



301 名前:うっとりハムちゃん [2008/06/20(金) 15:05:12 ID:nHevfWAE]
すいません、教えてください。

掲示板に書き込まれた内容に URLが含まれていた場合、
自動的にリンクになるようにしたいのですが、
簡単に追加する方法等がありますか?
よろしくお願いします。


302 名前:nobodyさん mailto:sage [2008/06/20(金) 15:20:25 ID:???]
URLかチェックして一致したらAタグ追加する。
正規表現 perl URL とかでググれば例が出てくると思う

303 名前:nobodyさん mailto:sage [2008/06/20(金) 22:01:17 ID:???]
>>301

$_ =~ s/([^=^\"]|^)(http\:\/\/[\w\.\,\~\-\/\?\&\+\=\:\@\%\;\#\%\*]+)/$1<a href=\"$2\">$2<\/a>/g;


304 名前:nobodyさん mailto:sage [2008/06/20(金) 22:29:00 ID:???]
…メタ文字じゃない文字をエスケープして意味あんの?
文字クラス中のエスケープは更に酷い。

305 名前:うっとりハムちゃん [2008/06/21(土) 03:14:25 ID:k6DOaEg8]
皆さんレスありがとうございます。
>303 さんの記述を一行足すだけではダメですよね?
例えば $comment 内に書き込まれた中から抜粋する際は
それを指定する必要などはありますか?


306 名前:nobodyさん mailto:sage [2008/06/21(土) 07:47:06 ID:???]
minibbsあたりのソースで見ましたね>余計なエスケープ

307 名前:nobodyさん mailto:sage [2008/06/21(土) 17:19:06 ID:???]
>>305
print &autolink($comment);

sub autolink {
my $text = $_[0];
$text =~ s{(s?https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)}{<a href="$1">$1</a>}g;
return $text;
}

参考: Perlメモ
www.din.or.jp/~ohzaki/perl.htm#httpURL

308 名前:うっとりハムちゃん mailto:sage [2008/06/21(土) 19:10:28 ID:???]
できました!!!
とても親切で、どうもありがとうございました!!
助かりました! m(_ _)m


309 名前:297 [2008/06/21(土) 21:40:03 ID:etCJxH2B]
遅くなりました。
ありがとうございました。


310 名前:nobodyさん mailto:sage [2008/06/23(月) 09:49:20 ID:???]
遅くなったのは、教わったとおりにsleepしてから書き込んだから



311 名前:nobodyさん mailto:sage [2008/06/23(月) 20:42:58 ID:???]
だれかボスケテ。

---post_data.cgi---
use CGI::Lite

#read(STDIN,$buff,$ENV{'CONTENT_LENGTH'});
$param = CGI::Lite->new()->parse_form_data('POST');

print "Content-Type: text/plain\n\n";
print "$buff\n";
for (sort(keys(%$param))){
    print "$_ = " . $param->{"$_"} . "\n";
}
つう、なんの変哲もないファイルを書いて、これに、

---test.js---
function reQuested_files( data,method,fName,async,callback){
    var r_obj = crHttpReq();
    r_obj.onreadystatechange = function(){
    if(r_obj.readyState == 4){ callback(r_obj); }
    }
    r_obj.open( 'POST','post_data.cgi',async );
    r_obj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    r_obj.send( 'a=abcdeFG&b=123.4567&z=zzz' );
}

から、javascriptのXMLHttpRequest(所謂ajaxってやつ)でのPOST送信のテストをしたんだけども・・・、

312 名前:311 mailto:sage [2008/06/23(月) 20:43:29 ID:???]
これの戻り値を、
function callback_function(rs_obj){
    var res  = rs_obj.responseText;
    alert( decodeURI(res) );
}

で、alert表示させた場合の結果がおかしい。

具体的にゆうと、これでIEからの送信だと、alertに
a = abcdeFG
b = 123.4567
z = zzz

と、正確に(期待したとおりの)結果が返って来るんだが、最近出たばかりのFirefox3でやると、
結果alertになにも表示されない。

これjavascriptのせいかなと思って色々調べてみたんだが、まだはっきりとわからない。
けど試しに、上のレスのスクリプトで、コメントアウトしてる read() 部分を有効化させてやると、
どちらも同じ結果になる。(a=abcdeFG&b=123.4567&z=zzz)

つまりこれは、STDIN(POSTデータの実体)は入ってるのに、CGI::Lite->parse_form_data('POST')
で、なぜか狐3の時だけ、正常にパースされてない様なんだけど、どうなのかな? っと思って聞いてみた次第です。
(Web鯖のエラーログにも、値をParse出来ないみたいなerrorが出てました。)

これから、Javascript関係のスレにも行ってみようかと思うんですが、
とりあえず上記のPerlコードに、問題がないか確かめたかったんです。(問題ないですよね?)
ちなみに、htmlのフォーム上から、action="post_data.cgi" method="POST" で送った時は、IE,FFとも問題ありません。

313 名前:nobodyさん mailto:sage [2008/06/23(月) 22:23:59 ID:???]
スレチなきもするが、非同期通信の呼び出し方法はブラウザごとに違うよ。
つ prototype.js

314 名前:311 mailto:sage [2008/06/24(火) 05:32:07 ID:???]
>>313
ありがとうございます。そうなんですよ。
実はFF3リリース日に、別件でsync,ansyncについての挙動の違い(F1.5,2.0と3.0で)に遭遇しまして、
いろいろ調べてなんとかそちらの方は解消しました。今回のもやはり同様の理由かなぁ〜と思っていましたが、
原因判明しました。結論から言うと、javascript側だけの要因ではなく、Perl側にも原因があることがわかりました。
(割合は、とりあえず半々とゆうことにしときます。)

>>311の、post_data.cgiを、CGI::Liteだけでなく、CGI.pmにしてみたり、直でSTDINから読み込んだり、
同様のスクリプトをphpで実行したりして、原因突き止めました。

まず、IE6,7、Firefox1.5,2.0,3.0で、POSTしたデータそのものについては、1byteの違いもなかったんですが、
受け側により、処理の仕方に差異があるようでして、これの違いは、送り側の"Content-Type"にありました。

具体的には以下

315 名前:311 mailto:sage [2008/06/24(火) 05:38:53 ID:???]
送り側    ※     実際の送信されるリクエストヘッダ
IE 6       なし   (なにも無し)
IE 6       あり   application/x-www-form-urlencoded
IE 7       なし   (なにも無し)
IE 7       あり   application/x-www-form-urlencoded
FF 1.5    なし   application/xml
FF 1.5    あり   application/x-www-form-urlencoded
FF 2.0    なし   application/xml
FF 2.0    あり   application/x-www-form-urlencoded
FF 3.0    なし   application/xml; charset=UTF-8 ※1
FF 3.0    あり   application/x-www-form-urlencoded; charset=UTF-8 ※1
(※. setRequestHeader('...')の有無)
(※1.表示しているカレントページのcharsetに関わらず、UTF-8で固定のようです。)

316 名前:311 mailto:sage [2008/06/24(火) 05:48:29 ID:???]
モジュール  ヘッダ(#1)  パース(※)
CGI::Lite       なし    出来る
CGI::Lite       #2  出来る
CGI::Lite       #2 #8   出来ない
CGI::Lite       #3  出来ない
CGI.pm      なし    出来る(※)
CGI.pm      #2  出来る
CGI.pm      #2 #8   出来る
CGI.pm      #3  出来る(※)
Apache2::Reuest なし    出来ない
Apache2::Reuest #2  出来る
Apache2::Reuest #2 #8   出来る
Apache2::Reuest #3  出来ない
php(おまけ) なし    出来ない
php     #2  出来る
php     #2 #8   出来る
php     #3  出来ない

317 名前:311 mailto:sage [2008/06/24(火) 05:56:14 ID:???]
ずれまくりですいません。

>>315
については、一応RFCでは、フォームからの入力をPOSTする時には、必ず"application/x-www-form-urlencoded"
をヘッダに含めなくてはならないとなっております。
また、上記と似たような検証をしていたサイトがあって(といっても、そちらは1年ほど前の時点での調査でしたが)、
このようにブラウザごとに差異があるので、XHRでPOSTメソッドをリクエストをする時は、
setRequestHeader('application/x-www-form-urlencoded')が ”必須” になるとも書いてありました。
一応ここまでが、Javascript側の要因です。

>>316
Perlに関しては
#1 $ENV{'CONTENT_TYPE'}の値(ブラウザからのContent-Type リクエストヘッダ)
#2 application/x-www-form-urlencoded
#3 その他(text/plainなど)自前のLWPとHTTP::Request::Commonで、適当なリクエストヘッダをでっちあげて確認した。
#8 charset=UTF-8
※.一般的なデータ取得関数を使って、変数に値をセットできるかどうか。例:CGI::Lite->parse_form_data()、CGI.pm->Vars()、
phpだと$value=$_POST{'name'}など。CGI.pmだけは特殊で、x-www・・・以外のどんな場面であっても、
"POSTED=name=value&name=value&name・・・・"とゆう形で取得できる。

318 名前:311 mailto:sage [2008/06/24(火) 05:57:06 ID:???]
とゆうことで注目するのは、CGI::Liteだけ、"application/x-www-form-urlencoded"の後ろに"charset="が付くと、
データ取得関数でデータを取得出来ないことと、他の一般的なモジュールで本来取得できないハズの
Content-リクエストヘッダ無しの場合でも、普通にデータを取得出来てしまえるところに、混乱した原因があるようだ。

ちなみに、上の調査の追記としては、read(STDIN.$var,$ENV{'CONTENT_LENGTH}) を使えば、
全てのパターンでデータの取得が可能。(パースとデコードは全て自分でやらないといけないですが)
しかしながら、これを各moduleのデータ取得用関数の前に持ってくると、その後の取得関数が全てコケる。(値なしになる。)
また、取得関数の後に持ってきても、その前の関数の成功失敗に関わらず、データを取得できない。(phpでは未確認)
(多分STDINに対するファイルポインタが、終端まで行ってしまっためだと思う)

今までお恥ずかしいながら、ajaxに限らず、ほとんどCGI::Liteメインで書いてきた。(GET,POSTの違いも大して意識してなかった)
それにモジュールのロードが軽い(自機での測定で、CGI.pm比約四倍早い)し、自分には、CGI.pmは機能が豊富すぎて、
使いこなせてないって思ってた。

だけど、今後のこと(新しいブラウザ対応とか)を考えるに、どうもCGI::Liteだけではやっていけなくなってしまいそう。
まあ、最終リリースからもう五年もメンテされてないんで、早く乗り換えろよってのはもっともな話だとは思うけど・・。
なんかくやしいなぁ。

313さんへ、
自分はJavascriptについては、prototype.jsやjQueryなどの外部ライブラリを使ったことがなくて、余り詳しくもないんだけど、
これからはどうしようかと検討中です。でも今回の件に限れば、自分が受け側をCGI::Liteで利用したのが原因で
多分外部ライブラリ使ってても同じ現象に遭遇してたと思います。そんな時は余計に、原因の究明に困ったかも知れません。

とゆうことで、長々と失礼しました。同じような問題で悩んでる人がいたら、参考にして下さい。

319 名前:316貼り直し mailto:sage [2008/06/24(火) 06:17:21 ID:???]
mod   (#1)     (※) 
CL     なし     出来る 
CL     #2       出来る 
CL     #2 #8   出来ない 
CL     #3       出来ない 
Cp     なし     出来る(※) 
Cp     #2       出来る 
Cp     #2 #8   出来る 
Cp     #3       出来る(※) 
AR2   なし     出来ない 
AR2   #2       出来る 
AR2   #2 #8   出来る 
AR2   #3       出来ない 
php    なし     出来ない 
php    #2       出来る 
php    #2 #8   出来る 
php    #3       出来ない

説明は>>317の通り。
CL=CGI::Lite、Cp=CGI.pm、AR2=Apache2::Request、php=php(おまけ)。
#2 #8 は application/x-www-form-urlencoded; charset=UTF-8 のこと。
Apache2::Requestのつづり間違えてた。

320 名前:nobodyさん mailto:sage [2008/06/24(火) 10:11:34 ID:???]
cgiが正常ならクライアント側の問題だろ?
prototype.jsを遣わない理由がどこにある。



321 名前:nobodyさん mailto:sage [2008/06/24(火) 14:59:55 ID:???]
RequestHeaderが違ってくるのは、XMLHttpRequestメソッドとブラウザの問題だと思うんだけど。
ttp://www.fraction.jp/log/archives/2005/03/216

prototype.jsは関係ないんじゃない?と思ったが
XMLHttpRequestでgrepしてみると

/* Force "Connection: close" for older Mozilla browsers to work
* around a bug where XMLHttpRequest sends an incorrect
* Content-length header. See Mozilla Bugzilla #246651.
*/

こんなのが。補正してるってことかな?


RequestHeaderによっては受け取れない部分はCGI::Liteの問題。
知らないとハマるから、良い検証だったと思います。乙

322 名前:nobodyさん mailto:sage [2008/06/25(水) 05:30:05 ID:???]
>>320さん >>321さん
318です。仰るとおり、送って来るReuestHeaderが異なるのは、各ブラウザ側の挙動の違いの問題です。

その後、教えて頂いたprototype.jsのXHR周りの動作について、手持ちのブラウザで基本的な動作確認をしましたが、
やはり送ってくるRequestHeaderはブラウザごとに違います。設定によりいくらかのヘッダの操作も出来ますが、
FireFox3で、当該の"chaesrt=..."の部分を消すことは出来ないようです。

( これもブラウザにより異なります。IEでもデフォで、"charset="が付いてきたりします。
 ここら辺の違いを吸収してくれるハズのライブラリで、ブラウザごとに分かち書きとかしないといけないのは、
 本末転倒のような気がします。まあJavascriptのことはスレ違いになるんで、言及はここら辺でやめときます。)

323 名前:322 mailto:sage [2008/06/25(水) 05:30:57 ID:???]
で、何が問題かと言うと、実は今自分の運営しているサイトで、CGI::Liteで書いた既存のcgiが動いてるんですが、
現在、日中平均で30req/s前後、ピーク時で90-100req/s程度のリクエストがあります。このスクリプトを導入した際に、
CGI.pmとCGI::Liteでそれぞれベンチを取ったのですが、本番環境と同一ハード,ソフトの環境で、
CGI.pmだと40rq/s位で限界、CGI::Liteだと150-160rq/s位までは持ちこたえられるとの結果を得ましたので、
CGI::Lite版を採用することに決めました。(その時は、最大50rq/s程度が想定でしたが・・・)

で、今回これと同じ処理をするcgiに、Jsからajaxリクエストを投げるような構成を考えていたのですが、
そのテストの段で、上記の>>311のような問題に行き当たったわけです。
現実問題として、速度や負荷の観点から、今回もCGI::Liteで行こうと思ったのですが、上記のような問題のため
(prototype.jsを使う使わないに関係なく)CGI::Liteが使えないので困ったなぁ とゆう感じです。
( 実は、mod_perl+Apache2::Requestでは、同様の処理で 1800rq/s! とかベンチ出たんですが、
 実験的な環境のため、そのまま本番環境には投入できません。)

324 名前:nobodyさん mailto:sage [2008/06/25(水) 10:26:42 ID:???]
>>323
当然考えているとは思うけど、CGI::Lite に手を入れてしまうのがリーズナブルなんじゃないかな。
parse_form_data() 内で、
$content_type eq 'application/x-www-form-urlencoded'
と判断しているので、これを =~ にでもすればいいだけなわけだし。

325 名前:nobodyさん mailto:sage [2008/06/25(水) 13:14:34 ID:???]
簡単なパースしかしないなら、モジュール使わない方法もあるんじゃね?

326 名前:nobodyさん mailto:sage [2008/06/28(土) 19:23:20 ID:???]
HTMLフォームから送信されてきた文字列の中からURLを探しだして
<a href=>のタグをくっつけたいんですが、cgiのURLとかで?が入ってると上手く置き換えできません。
これを回避する方法を教えていただければ幸いです。

$mojiretu =~ s/$url/<a href="$url">$url<\/a>/; #$ulに?が入ってると置き換えできない。

327 名前:nobodyさん mailto:sage [2008/06/28(土) 19:59:00 ID:???]
>>326
上手く行くかどうかしらんし、根本的な解決にはならんかも知れんが、
$mojiretu =~ s/\Q$url\E/<a href="$url">$url<\/a>/;

328 名前:nobodyさん mailto:sage [2008/06/28(土) 20:12:33 ID:???]
>>327
うはwできた
ありがとおお!!

329 名前:nobodyさん mailto:sage [2008/06/28(土) 22:15:55 ID:???]
「\E までのパターン指定メタ文字の意味を打ち消す」

ってどういう意味かな?

330 名前:nobodyさん mailto:sage [2008/06/28(土) 22:29:45 ID:???]
$str="a?b";

のとき、

/$str/



/a?b/

じゃなくて、

/a\?b/

に展開されるようにしてくれる。




331 名前:nobodyさん mailto:sage [2008/06/28(土) 22:33:22 ID:???]
?が「パターン指定メタ文字」なんだな、たぶん。

それで、?があると、そのあとに続く文字が
特別な意味をもつんだな。

だからそれをエスケープ?しなくてはならなくて、
そのための呪文という意味か。よくわかりました。

332 名前:nobodyさん mailto:sage [2008/06/28(土) 22:50:41 ID:???]
>>331
>それで、?があると、そのあとに続く文字が
>特別な意味をもつんだな。
違うよw
ま、追い追い勉強しなw

333 名前:nobodyさん mailto:sage [2008/07/01(火) 21:46:30 ID:???]
perl -MCPAN -e shellの後に、install Math::BaseCalcしたら、
make: *** [test_dynamic] エラー 255ってでるんだよ
どうしたら、解決出きるのか教えてください

334 名前:nobodyさん mailto:sage [2008/07/01(火) 23:37:34 ID:???]
>>333
config で make program を変更してみるとか、、、フォースインストール
するとか、、、
俺の場合はMath::BaseCalcじゃないけど、makeでコケた奴はソースで手動で
コンパイルして入れたりもする。

335 名前:nobodyさん mailto:sage [2008/07/01(火) 23:40:04 ID:???]
>>333
まずはインストール時のメッセージをじっくり調べてみてはいかがでしょう。

336 名前:うっとりハムちゃん [2008/07/05(土) 00:33:32 ID:NR2upuAB]
すいません、おじゃまします。

cgiにアクセスした際に、同時に○○.phpを読み込む際のPerl記述を教えていただけると助かります。
よろしくおねがいします。


337 名前:nobodyさん mailto:sage [2008/07/05(土) 09:04:26 ID:???]
つ system
つ ``


338 名前:うっとりハムちゃん [2008/07/05(土) 13:03:49 ID:NR2upuAB]
レスありがとうございます!

例えば○○.php を読み込みたい(実行したい)場合、以下では無反応なのですが、間違っていますか?

system ("○○.php");


339 名前:うっとりハムちゃん [2008/07/05(土) 13:38:38 ID:NR2upuAB]
説明不足で申し訳ないのですが、用途としては、
phpカウンターをcgi(掲示板)実行時にも
カウントさせたいのです。

IMGタグでphpを読み込んでもいいのですが、
これだと携帯で見た時に壊れた画像マークになっちゃうので。。。

それで、cgiを実行時にphpファイルも同時実行できないかと思い、困っています。
よろしくお願いします。

340 名前:nobodyさん mailto:sage [2008/07/05(土) 14:13:13 ID:???]
携帯でそうなる理由を調べてそれを解消したほうが早い
systemで実行するなら/usr/local/bin/php xxx.phpとかだろうけど
それでキミの欲しいものが得られるのか?
http経由で呼ぶならそうすればいい



341 名前:うっとりハムちゃん mailto:sage [2008/07/05(土) 15:00:49 ID:???]
できました!
とても助かりました!!
どうもありがとうございました。 m(_ _)m


342 名前:nobodyさん mailto:sage [2008/07/05(土) 20:33:29 ID:???]
>>341
おめでとう。
何をどう変えてどのような望む動作が得られたのかはさっぱりわからんが。

343 名前:nobodyさん mailto:sage [2008/07/05(土) 21:27:12 ID:???]
おそらく直に読んでカウンターが上がったんじゃないかと

344 名前:うっとりハムちゃん [2008/07/05(土) 23:02:34 ID:NR2upuAB]
たびたびすいません (><)

system ("/usr/local/bin/php ○○.php");


↑これで うまくできたのですが、他のレンタルサーバーでも使おうと思ってみたら、
そっちではphpを読み込んでくれず、ソースコードが丸ごと表示されちゃいました。
サーバーによって動作は異なるのでしょうか?





345 名前:うっとりハムちゃん [2008/07/06(日) 01:29:25 ID:+aL1pH4z]
もしかして system の場合、何か終了(閉じる?)を記載しないといけないのでしょうか?
単純にphpカウンターを実行するだけでいいのですが。。。

346 名前:nobodyさん mailto:sage [2008/07/06(日) 02:26:42 ID:???]
>>344
そりゃあんた、その違うレンサバとやらがphp対応なのかどうかと、
phpの実行パスが/usr/local/bin/phpとは限らんだろう。

サーバによっては、httpからはphp実行出来ても、ユーザー権限で直接実行出来ないように
設定されてる場合もあるし。

347 名前:うっとりハムちゃん [2008/07/06(日) 02:40:09 ID:+aL1pH4z]
ありがとうございます。
サーバー会社に問い合わせたところ、

system ("/usr/local/bin/php ○○.php");

で動作しますと言われました。
パスに関してはあっているようです。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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