くだすれPerl(超初心者用)2at PHP
くだすれPerl(超初心者用)2 - 暇つぶし2ch2:nobodyさん
08/03/03 12:33:59
テンプレとかないの?

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

4:nobodyさん
08/03/03 22:02:10 F1EuYZlD
なんだ、この馬鹿?
ケツの三行が間抜けすぎるんだけどw

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

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


6:nobodyさん
08/03/13 15:16:54
どのバージョンをDLしたらいいのかわかりません(WIN)


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

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

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

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

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

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

10:nobodyさん
08/03/14 01:49:59 sSfBLQ5N
8n って文字列かと思ったじゃねぇか
あとマルチポストは控えめに

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

12:nobodyさん
08/03/14 13:36:44
先生∩

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さん
08/03/14 18:49:24
>>11
アンカー先のURLで記事を表示できるようにする必要ががある。
例えば<a href="./bbs.cgi?No=100">100</a>とするなら、
No100の記事をファイルから取得して表示する。

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

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


14:nobodyさん
08/03/14 19:17:40
>>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さん
08/03/14 20:49:41
>>13
有難う御座います
BLOCK部の$seen{$_}の動きが解りました
grepとmapですね、精進しますorz
どうもperlの配列マジックが苦手で…

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

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

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

18:nobodyさん
08/03/15 03:38:52
LWPやXMLといったモジュールをフリー鯖で使用するにはどうすれば

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


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

21:nobodyさん
08/03/20 15:51:16 +FD61Aq0
>>17
具体的にどのようにしたら良いのでしょうか?

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

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

使うお問い合わせフォームは、「フォームメール」です。
URLリンク(www.rescue.ne.jp)

以下のFAQをみると、「次のコードを記述下さい」とコードが
書いてありますが、どこに入れればよいのかわかりません。
URLリンク(www.winserver.ne.jp)

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

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

23:nobodyさん
08/03/24 14:22:47
エラーメッセージ見てまず何が原因かと思った?
そっから考えろ

24:nobodyさん
08/03/24 15:00:22
そのコードは記述する必要がないんじゃないか?

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

26:nobodyさん
08/03/24 15:35:26
webform.cgi の中の受信先メールアドレスを自分のアドレスに書き換えて設置するだけでは?

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

28:nobodyさん
08/03/24 16:35:00
>>22
もう諦めて、無料のレンタルフォーム使ったら?fc2とかの

29:nobodyさん
08/03/26 21:12:26
Talk2chを参考にしてSOCKETを使い、スレのDATを取得したんですが、
取得したものを変数に格納する方法が分かりません

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

↑こんな感じです

30:24
08/03/26 21:14:23 YxQEkSzy
ID忘れてました
スイマセン

31:29
08/03/26 21:15:27 YxQEkSzy
29でしたorz

32:nobodyさん
08/03/26 21:27:35
既視感が。

>>29
スレリンク(tech板:737番) (738が俺)
向こうで続けてもいいと思うんだけど。

33:nobodyさん
08/03/27 06:27:10 17ssUCBE
>>32
低レベルすぎると思って

34:nobodyさん
08/04/03 16:38:03 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さん
08/04/03 16:51:17
プログラムの流れとか関係ない処理とかなら$_使ってもいいと思うけどなぁ
省略したほうが読みやすいときも個人的にいっぱいあるし

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

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

36:34
08/04/03 17:34:30
返事ありがとうございます。
$_が出てくるときは長々と複数行引きずる事はないですから、
害はないとは思うんですが・・・。

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

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

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

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

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

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

39:nobodyさん
08/04/03 20:07:16
名前も付けなくていいし。

40:nobodyさん
08/04/03 20:17:54
foreachループの制御変数( デフォルトで$_ )は使った後もとの状態に戻されるよ

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

42:nobodyさん
08/04/04 12:31:56
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さん
08/04/04 12:58:40
丸投げスレ池

44:nobodyさん
08/04/04 20:30:27
>>42です
>>43さん丸投げスレってあるのですか
私にピッタシのスレだ^^;
探してみるねお邪魔しましたノシ

45:nobodyさん
08/04/05 13:15:12
こんにちは>>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さん
08/04/05 13:22:57
>>45
while (<>){
 next if !( /<h1>/i .. /<\/h3>/i ) ;
 print ;
}
h3 が二箇所あるとかだったら知らん


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

48:nobodyさん
08/04/05 14:40:16
>>45
ついでに

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

でなったけど

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


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

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

50:nobodyさん
08/04/05 16:02:34
>>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さん
08/04/05 16:21:20
お世話になります>>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さん
08/04/05 16:24:30
>>50さん
>>45です
私が書き込む寸前にレスしてくれたんですね
入れ違いになってしまい申し訳ないです
(ソースを見ながら書くと遅くなってしまいました)
>>50さんに教えていただいたようにパイプを使ってやる方法を模索してみます
ありがとうございます

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

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

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

>>45
スレリンク(php板:277番) かつ
スレリンク(hp板:50番) な者ですが。
↑こんなやっつけ仕事を使い回そうとせずに「きちんと丸投げ」してくださいな。
自分より腕のいい人はたくさんいるから、暇つぶしで相手してくれるかもしれないし。

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

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

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

58:nobodyさん
08/04/05 17:13:24
>>55
なるほど。ありがとうございます

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

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

59:nobodyさん
08/04/05 17:46:59
>>57
うーん、仕変が激しすぎるので…仕事だったら請けてるんでしょうけど。
とりあえず
スレリンク(php板:278番)
という声もあったので、ちと考えてみます。

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

説明しようとするとウソを書きそうなので
perldoc perlop や
URLリンク(perldoc.jp)
の説明やサンプルを眺めてみてください。

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

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

62:nobodyさん
08/04/06 22:29:28 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
08/04/07 07:06:59
誰向けでもなく一応のフォロー。 
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さん
08/04/07 14:14:44
>>47さん
せっかく教えてくれたんだけど
今の私には理解できていないんだ(;´д⊂ヽ
後に参考になるかもしれないのでメモして大切に保存しておくよ
活用できなくて申し訳ない
ほんとにありがと

65:nobodyさん
08/04/07 19:50:52
動画ファイル(youtube.flv)のハッシュ(SHA-1)を求める方法を教えてください。


66:65
08/04/07 20:57:10
あれからずっとググってやっと見つけました。
ありがとうございました。

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

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

68:nobodyさん
08/04/08 05:45:29
Perlの前に日本語から勉強しなおせ

69:nobodyさん
08/04/08 06:18:13
お前もな

70:nobodyさん
08/04/08 06:31:50
ここが一番わかりやすかった
perlのアレコレ
URLリンク(furyo.on-air.ne.jp)

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

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

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

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

71:nobodyさん
08/04/08 07:04:21
>>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さん
08/04/08 23:43:12
$+ の意味はなんですか?
$# は探してたんでやっとわかった。最後の変数ね

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

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

73:nobodyさん
08/04/08 23:57:18
>>72
URLリンク(www.google.com)

74:nobodyさん
08/04/09 00:44:21
>>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
08/04/09 01:15:30
あぼーん用に捨てトリ。>>55です。

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

m! … スラッシュのエスケープが面倒だった。 / 以外の記号でパターンを囲むとき用。
後ろの ! … m! で始めたんだから終わりも同じ記号。
複数行 … スレリンク(tech板:638番)+642 で教えました。

ついでに言うと
スレリンク(tech板:673番)
も私です。「gawkで片づいたら、くだすれPerlのアレは全部無駄ですか」という気持ちがあのレス。
ご自分でお書きのとおり「残念」です。

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

76: ◆EtAiUEg7/Q
08/04/09 01:55:27
忘れてた。

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

77:nobodyさん
08/04/09 02:43:19
>>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
08/04/09 03:07:32
>>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さん
08/04/09 03:29:44
>>78
よくわかんないけど
可哀相な人だ
ヘンテコなとらえ方してるね
あなたには感謝しているけど
仕事を放ったらかしでは生きていけませんという意味なのだが・・・
とにかくありがとう
>>78に記載してくれたコードも猫に小判
私には理解できていない
自力でなんとか頑張ってみるよ
あなたはとてもお人好しでいい人だ
知識もある
短気なところ直せば世界が変わると思うよ
オヤシミ^^

80:nobodyさん
08/04/09 10:21:11
>>74
m//
URLリンク(perldoc.perl.org)

複数行対応
URLリンク(perldoc.perl.org)

81:nobodyさん
08/04/09 11:43:17
>>◆EtAiUEg7/Q
アンタ良い人だよ、おつかれさんw

82:nobodyさん
08/04/09 16:26:01
>>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さん
08/04/09 16:33:39
「perl 特殊変数」でぐぐるといい
もしくは
perldoc Perlvar

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

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

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

85:nobodyさん
08/04/09 17:51:57
>>83さん
>特殊変数以外は自分で定義してるはず。
これのようだ
ありがと

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

86:nobodyさん
08/04/10 13:21:24
超初心者用ってもPerlのって事だろ
日本語の初心者やそれ以下のヒトとしての初心者はどうかと思うがな


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

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



88:nobodyさん
08/04/10 16:57:06
質問にはわかる範囲で答えてあげたいけど、マナーや礼儀も必要。

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

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

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


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

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

92:nobodyさん
08/04/10 17:30:12
>>91
あ、そうなんだ
お世話になったねありがと
お疲れちゃん

93:nobodyさん
08/04/10 17:54:14
情報が只でもらえると勘違いしてる質問者か。
俺も抜ける。まぁ、頑張れ。

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

95:nobodyさん
08/04/10 18:09:05
久々に香ばしいのが沸いたなあ
ま、一所懸命煽ってがんばってくれ
俺も抜けるよー

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

97: ◆EtAiUEg7/Q
08/04/10 18:30:14
>>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
08/04/10 18:30:49
>>89
今更ですが range operator の誰向けでもないフォロー、ありがとうございます。
説明しようとして「左項が真になるとスイッチが入り…えーと…perldoc」でしたので。

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

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

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

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



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

99:nobodyさん
08/04/10 18:31:42
>>96はKY

100:nobodyさん
08/04/10 18:35:01
まーくだすれだしアリっちゃアリ。

101: ◆EtAiUEg7/Q
08/04/10 18:37:23
>>99 =~ s/96/97/; # 勝手に直しとく

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

103:nobodyさん
08/04/10 18:52:33
>子供の言い合いみたいなのに付き合ってられないので
>以降その手の話題は私にはしないで結構ですレスもしないです

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

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

104:nobodyさん
08/04/10 18:54:15
                             |
                             |
      ∩___∩             |
      | ノ  _,  ,_ ヽ        ((  | プラプラ
     /  ●   ● |         (=)
     |    ( _●_)  ミ _ (⌒)   J  ))
    彡、   |∪|  ノ
⊂⌒ヽ /    ヽノ  ヽ /⌒つ
  \ ヽ  /         ヽ /
   \_,,ノ      |、_ノ

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

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

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

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

106:nobodyさん
08/04/10 19:00:59
よくわからんが私の質問どっかいっちゃったのは確か棚

107:nobodyさん
08/04/10 19:01:12
久々に叩かれまくられてるのを見た
超初心者でもここまでの香具師はそうそういまい

108:nobodyさん
08/04/10 19:02:32
レスしてるのは俺ひとりなんだけどな。

109:nobodyさん
08/04/10 19:09:35
電波役になったり電波に煽られる役になったり◆EtAiUEg7/Q役になったりしながら
ひとりでスレ回すのってマジ大変。

110:nobodyさん
08/04/10 20:06:37
くだすれ = くだらないスレじゃなくて
詳しい人が見たらくだらない質問だと思ってたけどな。
>>1を読んでもそう取れる。

111:nobodyさん
08/04/10 23:57:10
>>102
おまえ、キチガイで名をはせたヨシオカヒデノリだろ。キチガイっぷりがそっくりだ。

112:nobodyさん
08/04/12 00:00:56
>>87
>>なんか思い込み激しいね

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


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

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

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

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

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

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

114:nobodyさん
08/04/13 15:31:39
(~´-`)~

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

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

117:nobodyさん
08/04/14 01:20:54
('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さん
08/04/14 08:31:02
>>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さん
08/04/14 13:27:25
>>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
08/04/14 13:33:05
>>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
08/04/14 15:57:05
とりあえず、Linux Perl v5.8.6で動かしてみた。
117と120をつなげて動かしたら動いたよ。
OSやPerlインタプリタのの問題かな?

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

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

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



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

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

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

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

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

128:nobodyさん
08/04/14 17:25:31
再帰を「再起」と書く初心者が同じ日に二箇所に現われるもんかねえ。

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

130:nobodyさん
08/04/14 17:29:05
>>128
誤字がどうしたのだ?
そんなの関係ないと思う
小心者だねw

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

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

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

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

132:nobodyさん
08/04/14 20:11:42
一応、お詫びします。迷ったけどこっちに書きます。
貴方が本当に別人なら理解出来るでしょう。
======================
当方、確認の術を持たないので(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さん
08/04/14 20:48:09
こっちでいいのかな?

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

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

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

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

134:130
08/04/15 02:25:32
こっちにレスがついてた。みんなサンクス

>>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
08/04/15 02:26:02
>>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
08/04/15 02:27:42
ごめん、激しくゴメン。
名前欄>>131の誤りです。
やっぱり消えます。

137:nobodyさん
08/04/15 04:16:40
>>135
大変失礼しました、重ねてお詫びします。

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

138:nobodyさん
08/04/15 04:17:12
俺も穴があったら入りたい(性的な意味合いで)

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

140:133
08/04/15 17:04:26
事故レス。
> 標準入力からうまく食ってもらえず。

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さん
08/04/15 19:22:38
みごとな検証、お疲れ様。
質問者様が見てくれるといいが。

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

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

143:nobodyさん
08/04/16 16:55:29
*本当の検証*が向こうに出てたので、>>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
08/04/16 20:08:19
みなさん本当にありがとうございます。
向こうで見事な回答を頂きました。(Cコードを読み解く力がないので具体的なことはよくわかりませんが・・。)

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

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

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

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


146:nobodyさん
08/04/17 09:24:21
>>145
サーバにいるPerlさんは、クライアントのブラウザが閉じたかどうかを知らないよ。

147:nobodyさん
08/04/18 01:33:43
JavaScript併用

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

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

149:nobodyさん
08/04/18 10:00:46
閉じたら消すじゃなくて
開いたら消すにすれば?

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

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

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


152:nobodyさん
08/05/01 01:16:22
日本語が良くわかんない(><)

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

154:nobodyさん
08/05/02 23:30:24
URLリンク(pc11.2ch.net)のように?とは&使わずに引数使うのどうするの?

155:nobodyさん
08/05/03 00:23:50
>>154
mod_rewriteとか。

実をゆうと URLリンク(localhost)
とかで、/の後ろを引数として渡したり出来るんだけど、
色々と混乱しそうだから、俺は使わない。

156:nobodyさん
08/05/04 16:40:15
どうやったら、変数に何も値が入ってないってことを確かめられるの?

157:nobodyさん
08/05/04 18:06:42
$hensu or print "ナイヨ(><)\n";

158:nobodyさん
08/05/04 18:19:28
$hensu = 0;
で破綻するので>>157はデタラメ。

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

159:nobodyさん
08/05/04 19:26:18
>>156にとっての「何も値が入ってない」によって答えが変わるでしょ。

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

160:nobodyさん
08/05/04 22:15:41
三値論理

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

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

163:nobodyさん
08/05/07 19:46:59
HTMLタグに「絶対パス」を入れても表示出来ないよ

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

165:nobodyさん
08/05/07 22:20:31
>>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'} とか
URLリンク(search.cpan.org)
ここの URI->new_abs() とかを眺めるといいんじゃないかと。

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

166:nobodyさん
08/05/07 22:27:20
これじゃね?→Content-Type: text/html;

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

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

169:nobodyさん
08/05/08 00:16:04
$str =~ s/DEF123/${HOGE}123/g;

170:nobodyさん
08/05/08 00:50:06
>>169
ありがとうございます。うう…

171:nobodyさん
08/05/08 10:10:29
>>161
組み込み関数だから使える。

172:161
08/05/08 18:42:19
>>171
thx

173:nobodyさん
08/05/08 20:29:16
ABC/DFG/HIJ/../  →  ABC/DFG/
こういうのが         こういう感じで置き換わるように

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

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

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

174:nobodyさん
08/05/08 20:46:01
../ を消すだけじゃ駄目?

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

こんな風に。

175:173
08/05/08 20:59:09
>>174
../ が前方を巻き込んで消えるようにしたいのです
一行では無理でしょうか

176:nobodyさん
08/05/08 21:06:50
ごめんなさい。
完全に勘違いしてました。

こういうこと?

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


177:173
08/05/08 21:22:58
>>176
すみませんお手数おかけして…
それだと
ABC/DFG/HIJ/../   の時も
ABC/DFG/HIJ/../../  の時も
ABC/DFG/  になってしまいます

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

178:nobodyさん
08/05/08 21:29:39
正規表現でどうにかする方向は>>176さんに任せつつ。

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

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

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

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

$RSS_BASE_URI = "URLリンク($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
08/05/08 22:46:06
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', 'URLリンク(example.com)');
# URLリンク(example.com)

182:nobodyさん
08/05/08 22:46:10
>>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さん
08/05/08 22:47:32
ああ、やっぱモジュールがあったのねorz...
おまけにタワゴト書いてるし。


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

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

185:nobodyさん
08/05/09 04:31:31
モジュール使えで終了な話ではあるけどワンライナーでかけないのが悔しいorz


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



187:nobodyさん
08/05/10 18:46:41 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さん
08/05/10 19:17:45
ヘッダは?

189:nobodyさん
08/05/10 20:49:00 jhS0+1hl
print "Content-type: text/html\n\n";
これですか?


190:173
08/05/10 21:11:01
>>186
あ、一行でもできたんですね!
ありがとうございます、動きました!

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

191:nobodyさん
08/05/10 23:31:35
>>189
その行を print "<!DOCTYPE~ の行の前に書いてる?
あとエラーじゃなくて真っ白? ソースも?

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


193:181
08/05/11 17:10:05
>>190
「くやしいのでモジュール使うやりかたでもがんばってみる」方のようなので
ごにょごにょするときの参考にしてみてください。

use URI; # URIモジュールさん召喚。
my $RSS_BASE_URI2 = 'URLリンク(example.com)'; # 例。
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="URLリンク(example.com)">
# <a href="URLリンク(example.com)">latest</a>
# <a href="URLリンク(example.com)">Test Script</a>

__DATA__
<img src="../../../diary/././img/././test.jpg">
<a href="../../../diary/latest">latest</a>
<a href="URLリンク(example.com)">Test Script</a>

194:193
08/05/11 17:25:08
事故レスれす。

> $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さん
08/05/11 20:48:25
>>192
ANHTTPDの設定だと思うけどなー。
「ANHTTPD 真っ白」でぐぐったらなんか色々出てきたから
やってみたら

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


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


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

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

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

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


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

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

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

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

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

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


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



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

208:nobodyさん
08/05/16 16:37:16
XPのためにWin98の本買うようなもの
最新のドキュメントを探したほうがいい
古いの見ても混乱するだけ

209:nobodyさん
08/05/16 16:45:50
>>208さん
そうだなー
そう言われればその通りですよね
やっぱり見合わせます
ありがとうございます

210:nobodyさん
08/05/16 17:18:48
Perlほど解説本なしでネットでまかなえるプログラミング言語はないだろう

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

212:nobodyさん
08/05/19 01:52:01
>>211
意味がわかりません。
> コマンドプロンプトからユーザエージェントして
とはどうゆうことですか?

213:nobodyさん
08/05/19 02:16:27
わかんないならスルーしろよ
なんで答えるの?
教えたらわかりそうなのか?

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

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

215:nobodyさん
08/05/19 02:26:22
>>214
ぅぉぉぉー ヽ( ゚д゚)ノヽ(゚д゚ )ノ ぅぉぉぉー
わかってんじゃん
それそれ
cp932をも少し詳しく

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

217:216
08/05/19 02:29:01
つーか、質問者さんがその態度で通すんだったら移動してくださいな。

くだらない質問でもど偉そうに聞いていいスレ
スレリンク(php板)

218:nobodyさん
08/05/19 02:40:29
>>215
次からは、もちっと質問を詳しく。

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

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

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

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

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

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

>>218
詳しくありがとう



221:nobodyさん
08/05/19 03:23:45
例の人が久々に来てたのか。エスパーたち、乙。

222:nobodyさん
08/05/19 10:53:12
またおまえかwww

223:nobodyさん
08/05/19 15:45:54
このバカ定期的に沸いてくるな
しかもあちこちに増殖している

224:nobodyさん
08/05/19 16:40:56
ふーん
人を馬鹿扱いできるほどお前稼いでるの?
税金なんぼ払ってるかいってみ

225:nobodyさん
08/05/19 16:59:25
失せろ

226:nobodyさん
08/05/19 17:15:21
キモイ

227:nobodyさん
08/05/19 18:46:02
稼いでる = 馬鹿でない

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

228:nobodyさん
08/05/19 18:49:18
なんか自分を凄く見せたがる為に銭金の話をしたがる馬鹿いるよな
森伊蔵云々、ディナー云々
中学生のホラ自慢みたいw


229:nobodyさん
08/05/19 19:09:24
もう構うなってw

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

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


231:nobodyさん
08/05/20 04:17:01

use LWP;
use Encode;

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

232:nobodyさん
08/05/20 04:28:46
>>231
私の環境ではエラーになっちゃったけど
物凄く参考になった
ありがとう

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

234:nobodyさん
08/05/20 15:30:39
>>231をhtmlファイルで保存したいんだけどできない
すいませんまた教えてください

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


235:nobodyさん
08/05/20 16:51:57
>>234
231をyahoo_get.plとでも名前付けて保存して、
perl yahoo_get.pl > yahoo001.html

236:nobodyさん
08/05/20 17:29:08
>>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さん
08/05/20 18:28:08
>>235
スクリプト内に入れてやれよww

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

238:nobodyさん
08/05/20 18:38:22
>>236
違う違う、235のは、コマンドラインから実行するんであって、perlスクリプトの中に書くんではない。

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

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

239:nobodyさん
08/05/20 18:42:43
wktk

240:nobodyさん
08/05/20 21:15:41
>>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('URLリンク(www.yahoo.co.jp)<)')->content();
ここからログインのテストしたいので
またお願いするかもしれませんが
その時はよろしくお願い致します
>>238さん
勉強方法詳しくありがとうございました
標準入出力の解説書なかなか見当たらないです
手持ちの解説書で標準入出力を解説しているのは
「perlデータマンジング」という本だけです
大変わかりやすく良書なのですが紙面の関係上さわり程度なのが残念です
何かお勧めの解説書があれば教えて頂ければ嬉しいです
ありがとうございました


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

242:nobodyさん
08/05/22 14:12:19
LPW

243:nobodyさん
08/05/22 14:12:53
間違えた笑
LWP

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

245:nobodyさん
08/05/24 02:20:54
trじゃダメなの?

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


247:nobodyさん
08/05/26 19:36:22
お前は何を言っているんだ

248:nobodyさん
08/05/26 20:03:33
なんで?
perlでなんでも出来るって言ってたじゃないですか?

249:nobodyさん
08/05/26 20:18:52
ネタですか?

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

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

252:nobodyさん
08/05/26 20:54:44
それをやろうと思ったのはお前が最初で最後だと思うよ

253:nobodyさん
08/05/26 21:12:52
>>252
なんでですか?
perlでは出来ないってことなの?

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


255:nobodyさん
08/05/27 02:30:31
>>252
自分は>>198>>201なんだけど、多分初めてじゃないと思うぞ(w)

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

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

256:255
08/05/27 02:31:04
でもまあ、サンプルでも書いとく。
use strict;
use LWP;
use Encode;
use HTML::Form;

my $pwd = `cd` . '\\';
my $cmd = 'C:\Program Files\Internet Explorer\iexplore.exe';
my $url = '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で表示される。(無理やり、画面遷移っぽくなるように作った。)
モジュールや関数の詳細は、自分で調べてくれ。


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