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枚の一覧表作成が目標です
どなたかよろしくお願い致します
丸投げスレ池
>>42です
>>43さん丸投げスレってあるのですか
私にピッタシのスレだ^^;
探してみるねお邪魔しましたノシ
こんにちは
>>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>の複数行を読み込ませる部分お願いしたいです
どなたかよろしくお願いします
>>45 while (<>){
next if !( /<h1>/i .. /<\/h3>/i ) ;
print ;
}
h3 が二箇所あるとかだったら知らん
ああ、思いっきし間違えた。
h1 と h3 だけ抽出したいのね。
while(<>){
next if !( /<h[13]>/i .. /<\/h[13]>/i ) ;
print ;
}
こっちだわ
>>45 ついでに
use strict;
my $joined = join "", <>;
my @matches = $joined =~ m{(<h[13]>.*?</h[13]>)}isg;
print map "$_\n", @matches;
でなったけど
リャマ本から省略して書くと
htmlみたいなマークアップ言語には多くの落とし穴があるから単純なパターンは使わずそれ用のモジュールを入手したほうがいいらしい。
>>46-
>>48 お忙しい中、レスありがとうです
>>45です
もしタグ名が違う場合はどう書けばよいでしょうか?
例にあげた文ではサーチする文字列のkeyは2箇所とも<h>ですが
<h>と<span>の2種類の場合はどうすればいいですか
丸投げですねすいません恐縮です
>>48のそれ用のモジュールってあるんですか
もしよろしければこちらも教えて下さい
何度もお手数をお掛けして申し訳ないです
>>49 use strict;
my $joined = join "", <>;
my @matches = $joined =~ m{(<h\d>.*?</h\d>|<span>.*?</span>)}isg;
print map "$_\n", @matches;
モジュールは探したけどわからんかった。すまん
それと、書いといて難なんだが勉強不足で
>>47さんのコードがよく分からないけど
こっちのコードだと、でかいファイルを処理するときにjoinで全部繋げてからやってるから
たぶん、
>>47さんのコードより表示するのが遅くなる
キーボード打つ回数も多くなるし
お世話になります
>>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| }
でいいのか変数格納できていないので確かめていないです
どなたかよろしくお願い致します
>>50さん
>>45です
私が書き込む寸前にレスしてくれたんですね
入れ違いになってしまい申し訳ないです
(ソースを見ながら書くと遅くなってしまいました)
>>50さんに教えていただいたようにパイプを使ってやる方法を模索してみます
ありがとうございます
>>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>にマッチしちゃう
だから、やっぱり書いておいて難なんだけどこのコードはおすすめできない
>>50さん
>>45です
my @files = glob("$dir*.html");
globでファイル名を配列として
そのあと
foreach my $file (@files) {
としてファイルを1つづつ読んでいます
ファイルの中が1箇所の時は大丈夫だったんですが
2箇所になると難しくなって困っています(例で言うと<h1>の部分と<span>の部分です)
アドバイス頂ければ嬉しいです
よろしくお願い致します
何度もすいません
>>53さん
詳しくありがとうございます
>>45です
右か左かを選ぶって意味ですね
そうすると最長一致って事で<h1>の下にある<span>ばかりを選ぶことになりますね
どうすればいいのか・・・
ちょっと頭冷やして再考してみます
ありがとうございました
お返事頂けてよかったです
>>55さん
お世話になります
コーディング初心者スレで場所が違うと指摘を受けて自分が質問させてもらえるところを捜していたので
あなたとお会いできるとは思わなかったです
書いてくれた人にもう一度聞きたかったんだけど
みんなに迷惑だと言っていたのであなたに聞けなかったんですよ
また教えていただけないでしょうか?
お願いします
先のレスで書いたように別々のところ2箇所から取り出さなければいけない事がわかりました
以前お話したようにファイルリストを作りたいのですが
タイトルの下にもう1行ありました
タイトルにファイル名のリンクその下に1行書かなければいけなかったんです
もしよろしければお時間のある時にでもまた教えて下さい
お願い致します
>>55 なるほど。ありがとうございます
「/<h[13]>/i .. /<\/h[13]>/i」の部分が分かりません
$_に対してマッチしようとして真か偽を返すというのは分かるんですが範囲指定演算子がどういう役割をしてるか分からないです
>>56 何もできずにすまん
やっぱり
>>55さんが紹介してくれたようなモジュールを使ったほうがいいよ
>>59 すみません、perldocに目を通すのを忘れていました
コンテキストで役割が違うんですね
勉強になりました
本当にありがとうございました
こんにちは
>>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: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 ;
>>47さん
せっかく教えてくれたんだけど
今の私には理解できていないんだ(;´д⊂ヽ
後に参考になるかもしれないのでメモして大切に保存しておくよ
活用できなくて申し訳ない
ほんとにありがと
動画ファイル(youtube.flv)のハッシュ(SHA-1)を求める方法を教えてください。
66 :
65:2008/04/07(月) 20:57:10 ID:???
あれからずっとググってやっと見つけました。
ありがとうございました。
perl/cgi逆引き大全600って本を1ページ目から読んでるんだけど
スカラと配列とハッシュがよくわかんない
スカラは値$
配列@は複数のスカラ値$
@があればスカラ変数$はいらないのでは?
@が複数のスカラ値と記載してあるんだけど
@へ複数の変数を入力する方法は記載されていないここが知りたいのに見当たらないね
最終的にソートする予定があればキーと値%のハュシュにしておいた方がいいのかな?
ソーと機能の所読んだらキーでソートするって書いてある
ハッシュをいくつも作って複数のハッシュを並べ替えてから書き込み
ってのが最終目標にすればいいのかな
39ページ目にして出てきたqwとはなんだろか??
目次にもTips検索にもない
ネットで調べたら
qw
シングルクォートで囲んだ文字列をスペースで split するのと同様です
命令を命令で説明しているところばかりだsplitってわかんない
splitを調べたsplitを使ってデータを分割と記載されている
・・・
qwはデータを分割するための命令なのか??
なんで日本語で解説しないんだ
先日もわかんない単語があった
ネットで調べたストリングと一緒と説明されていた
ストリング??ギターの弦か??ワケワカメ
Perlの前に日本語から勉強しなおせ
お前もな
ここが一番わかりやすかった
perlのアレコレ
ttp://furyo.on-air.ne.jp/linux/perl.html 私は10日ほど前からperlに興味を持ちお勉強してたんだよね
perl解説本3冊
ググルこと100サイト
初心者用ばかり選んでいるのにわかりにくいね
「簡単」「入門」「初級」で探してみるんだけど
中身は自分の思い出すためのメモ帳だね
全然わかんない
命令の説明に命令使って「入門」はないだろw
一般社会なら後進指導の立場には向いていないね
命令を説明するのに「○○はこんな感じです」と
その下にサンプル書いているだけではわかんね
私が選んだサイトは文脈からして10年くらいは経っているのではないかと思うがわかりやすいね
ヘンテコな広告も一切なくて集中して見れたな
「perlのアレコレ」管理人さんここを見ることはないかもしれないけど
ありがとう。
>>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;
}
こんな例文とか。ちょっと眺めただけでも突っ込み所がある。
$+ の意味はなんですか?
$# は探してたんでやっとわかった。最後の変数ね
大全600ダメだ
ゴミ買って来た様なもんだな使えねえ
他の解説書に気になるサンプルがあった
よく読んでもサンプルに出てくる$+の意味は解説されていない
仕方ないので意味を調べて廻る
くだらない時間が過ぎていく・・・
意味わかんないので他の解説書で調べたり
ググって調べたり無駄な時間ばっかりだ
それで答えは出てこない
どうなってんだ?
hello、perl以外作ったことないよ
グーグルで$+ と$# と半角でぐぐったら1件もヒットしない
なぜなんだろか??
怪しい命令なのかね
>>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>!) }
デバッグでエラーになるんだよね
複数行対応にするにはどうしたらいいですか?
ここが$+の使いどころかな?
わかんない・・・
忘れてた。
while (<FH>) { # 1行ずつ読み込んでループする。$_ に入ってるのは1行だけ }
>>75さん
こんばんわお世話になります^^
正規表現の「残念でした」は先の言葉が「次はなんだろう」だったので
クイズのノリなのかと思って
perl→gawkは正解じゃないので「残念でした♪またどーぞ♪」のノリでお答えしたのですが
言葉は難しいですね
ご心配無用ですよ
私がやりたい事を理解できればスグ消えます
ただ思ったよりかなり時間はかかっていますが
パソコンには関係のない商売なのでこればっかり調べたり勉強してとかは実際無理なので。
例の教えて頂いたコードを参考にさせて頂いているのですが
コードって元コードを理解しないと書けないですね^^;
あのコードで特にわからないの所は2箇所あります
1箇所目は複数行
2箇所目は下から3行目のループ
1行で$fileを3回使っていますよね
2回目$fileはファイル名だとわかるのですがlist_fileの宣言をすれば自動的に省略して$fileでOK??
1回目はmyが初めについているのでこの行で宣言してるってことなのだろうか?
3回目はlinksになっている何故$file(同じ文字なのに)動作は違うのかがよくわかりません
タイトルの下にデータ行と備考項目と増やしたいのですが何故か最初の5バイトが無くなるんです
まあ気長にやってみますよ
オヤシミ^^
>>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| }
# 動作は同じ。
>>78 よくわかんないけど
可哀相な人だ
ヘンテコなとらえ方してるね
あなたには感謝しているけど
仕事を放ったらかしでは生きていけませんという意味なのだが・・・
とにかくありがとう
>>78に記載してくれたコードも猫に小判
私には理解できていない
自力でなんとか頑張ってみるよ
あなたはとてもお人好しでいい人だ
知識もある
短気なところ直せば世界が変わると思うよ
オヤシミ^^
>>◆EtAiUEg7/Q
アンタ良い人だよ、おつかれさんw
>>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は明らかに特別な変数のような希ガス
「perl 特殊変数」でぐぐるといい
もしくは
perldoc Perlvar
特殊変数以外は自分で定義してるはず。
>>82 せめて
>>70のリンク先(決して推薦はせんが、ま、しかたない)の全部を
「実践」- 読むだけじゃなく実際に実行してみること - してから
質問してくれんか?
答える気にもならんよ。レスしても「理解出来ない」で終りだし。
◆EtAiUEg7/Q はよくもまあこんなのに色んなスレで付き合ったもんだ。
>>83さん
>特殊変数以外は自分で定義してるはず。
これのようだ
ありがと
>>84 スレタイ嫁としかいいようないな
質問もアドバイスもしないあなたは何者?
どっか逝けばいいよ
超初心者用ってもPerlのって事だろ
日本語の初心者やそれ以下のヒトとしての初心者はどうかと思うがな
なんか思い込み激しいね
こんなの呼ばわりやそれ以下呼ばわりするほうが
よっぽど人として恥ずかしいので覚えておくといいよ
perl書けたから何?エライの?勘違いもイイトコだ実社会ではね
私はperlに関係あることを書き込みに来ているわけで
単語もわからないので超初心者だと自覚してるよ
まぁそういうのここでは関係ないでしょ
子供の言い合いみたいなのに付き合ってられないので
以降その手の話題は私にはしないで結構ですレスもしないです
今のところ解答者は2名のようだが居なくなるかもしれないし
気まぐれな方が通るかもわかんない
気長に待ってみてもレスもなく、このスレ消滅ってって事でも
それはそれで仕方ない私がどうこう出来ることでもない
煽るだけのレスよりかはいいと思う
今日のわからないこと。
取得タイトル部分は <a href でファイル名にリンクが張られている
後にprintした結果のタイトルには<title>のタグは付いていない
その部分を真似て他の部分を取得しようと試してみた
文字列だけがprintされているタグは前後ともに切れている
わからなかい例の1行で3回fileを使っている部分が味噌だな
その部分のスグ下で print FH qq|"$file"\n|; を記載してみた
何も取得しない・・・$fileを他の形式にしても同じようだ
謎の1行はその1行で3個の$fileを育成しているのか??
文字列の取得だけの場合は応用が利くって事がわかった
タグ付きの部分の取得はまた別にしたほうが良さげ
perlでタグ付き文字列取得の謎ってことで今日はおいておこ^^
質問にはわかる範囲で答えてあげたいけど、マナーや礼儀も必要。
質問は簡潔に。
煽りはスルーで。
回答には感謝を。
おっぱいうp。
せっかく和みレスが入った所悪いが、、、
>>87 俺は47=71=84≠86。
全く進歩しない奴にレスしてもつまらん。
お前が(無いと思うが)俺を回答者としてカウントしてるなら外してくれ。
「超初心者」と自覚してるならば、誘導URLを見て、変数、配列、ハッシュ
辺りの基本用語を頭に入れるくらいの礼儀は心得ろ。
# 正規表現スレにお前が表われて7日。全く進歩してないんだもん。
# 教えて君にも程がある。
煽ってくれても構わんが、その煽りの文章を考える暇があったら(中級以上の
リファレンスを買うんではなく)初心者本でも素直に買って読めよ。
空気悪くしてすまん、他の人。しばらくレスは自粛します。
マナーや礼儀ってあなたが決めてるの?
「マナーたるものこういうものである」
「礼儀とは云々・・・」思い込み激しいと疎外しちゃうよ
なんか勘違いしてるね
ペコペコしろという上から目線
キンモ〜〜としか言いようないなw
>>90 俺、
>>81=
>>83=
>>88 質問者=初心者ではないし、回答者=エライわけでもない。
わからないことは質問する、わかることは答える。
ただ、教えを請う立場なら礼儀は必要だと思う。
でも勘違いしてるならしょうがない、以後回答は控えます。
>>91 あ、そうなんだ
お世話になったねありがと
お疲れちゃん
情報が只でもらえると勘違いしてる質問者か。
俺も抜ける。まぁ、頑張れ。
>>93 こんなとこで客を探してる暇な業者さんなのだろか?
さよなら
公然の場所で恥ずかしげもない
その発言が面白すぎて
釣られたー
久々に香ばしいのが沸いたなあ
ま、一所懸命煽ってがんばってくれ
俺も抜けるよー
>>95 ていうかさっきからここで発言してるの
あなたと私だけじゃないでしょうか?
まぁ解答しないよってのはよくわかったのだが
それで何?くらいにしか思わないのだがw
ま、さよなら
お元気で^^
>>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円」をいただく立場の人たちが
仕事をほったらかしてタダでできるのは、冒頭のような初心者さんのお手伝いぐらいです。
>>89 今更ですが range operator の誰向けでもないフォロー、ありがとうございます。
説明しようとして「左項が真になるとスイッチが入り…えーと…perldoc」でしたので。
「よくもまあ」ではあるんですが、仕事もヒマな時期でしたし
・いつも見てるスレに何かが来る
・自分が回答
・「理解できない。でもありがとう」と言って(一旦)去る
…これで他の方の被害が少しは減るのなら、と。
ソフ板辺りも壮大なことになってそうですが、あちらは見てないので関わってません。
教えてちゃんですらないんですよね。
結果が欲しい、手法には興味がない(と書くと「違う」と返されるだろうけど)、と。
そんなわけだから処理系自体がコロコロ変わったりもするわさ、と。
腰を据えて初心者本でお勉強という方向へは行かない人なのでしょう。
本当は自分もこんな話は書きたくないんですが、誰かが書かないと日記が延々と続くんだなあ
と思ったので、NG用に捨てトリつけた次第です。
>>96 短気を起こしていろんな人を煽っても、いいことないですよ。
そういえば、私の短気なとこを直せば世界が変わると教えてくれた人がいました。
(レス|回答)自粛の方が続出、と。まあ、仕方ないというか自然な流れでしょうな。
捨てトリももう要らなくなって、ここは素敵な日記スレに移行かな。
まーくだすれだしアリっちゃアリ。
>>99 =~ s/96/97/; # 勝手に直しとく
>>97 おぉやっぱりあなたか
あなたが顔を真っ赤かにしながらレスしている姿は笑えないよ
(まぁ吹いちゃってしまったのだがwww)
なんか難しい説明されてもよくわからない
くだすれ = くだらないスレ と教えてくれたのですが
しかも超初心者とまで付け足してあるw
まさに私のためのスレだと思ったよ
スレタイは業者の釣りえさだったのか
気づけよ>>自分www
そんなに必死になるほどのことでもないので
むしろどーでもいいことなんだけど
気になったからやってるだけで
質問者は回答に飢えている
この心理を突いた網だったのだ
ネットでネット(網)張ってましたねw
洒落にもならないけど実際そういう人がいてたのか・・・
必死やのー
ま、気長にやっていくのであなたは私を気遣う必要ないですよ
んじゃね
>子供の言い合いみたいなのに付き合ってられないので
>以降その手の話題は私にはしないで結構ですレスもしないです
リャマ本からの引用
「Perlは、少なくとも毎日20分間はプログラムを書く--そしてほとんどのプログラムをPerlで書く--人向けの言語です。」
もし、毎日書くか事情があるなら
>>89の引用
>その煽りの文章を考える暇があったら(中級以上のリファレンスを買うんではなく)初心者本でも素直に買って読めよ。
腰を長くすえるなら応用のきくやつを学べ。
アドバイスいっぱい転がってるじゃん。
あと、おまえなじられたら死ぬのか?
|
|
∩___∩ |
| ノ _, ,_ ヽ (( | プラプラ
/ ● ● | (=)
| ( _●_) ミ _ (⌒) J ))
彡、 |∪| ノ
⊂⌒ヽ / ヽノ ヽ /⌒つ
\ ヽ / ヽ /
\_,,ノ |、_ノ
/
ぷちっ /
∩___∩ . 从 /
| ノ ヽ /
/ ● ● | (=)ヽし
| ( _●_) ミ/ ` ノ
彡、 |∪| ノ /
/ ヽノ / ノノ
/ /
/ /
ムシャ |
ムシャ |
∩___∩ | ぷらぷら
| ノ ヽ (( |
/ ● ● | J ))
. (( | ( _●_) ミ ・
彡、 |∪}=) ,ノ ∴
/ ヽ/^ヽ ヽ 。
| ヽ \ |
| ヽ__ノ
>>102 何か、私にはわからない謎の陰謀にお気づきになった様子ですが
自分が
>>78の次に書いたのは
>>97ですよ。
「私=ここで客を待ち構えてる業者」ということにしたいのでしたら、どうぞご自由に。
# こんなとこで客を拾うのってめんどくさそうだなーとしか思えないけど。
よくわからんが私の質問どっかいっちゃったのは確か棚
久々に叩かれまくられてるのを見た
超初心者でもここまでの香具師はそうそういまい
レスしてるのは俺ひとりなんだけどな。
電波役になったり電波に煽られる役になったり◆EtAiUEg7/Q役になったりしながら
ひとりでスレ回すのってマジ大変。
くだすれ = くだらないスレじゃなくて
詳しい人が見たらくだらない質問だと思ってたけどな。
>>1を読んでもそう取れる。
>>102 おまえ、キチガイで名をはせたヨシオカヒデノリだろ。キチガイっぷりがそっくりだ。
元気でやっとるかね^^
ちょっとわからないことがあってまた落書きしに来たのだ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
(〜´-`)〜
向うでデリミタの質問をしたのもコイツか?
お前のせいで、他の人の質問でも答える気にならんのだよ自重してくれんかね。
便乗したのがコイツだろ…進歩の無いコテが答えたからいいけどさ
あのコテも短レスで時々全然ボケた答え返すんだよなあ消えてくんねえかな
('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";
}
>>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";
}
>>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: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:2008/04/14(月) 15:57:05 ID:???
とりあえず、Linux Perl v5.8.6で動かしてみた。
117と120をつなげて動かしたら動いたよ。
OSやPerlインタプリタのの問題かな?
>>121 「オープン オブ ダイ」の話を書いてから12時間で
readdir でぶん回して再帰もしちゃうんだぞ、ってところが問題なんだと思うよ。
123 :
117:2008/04/14(月) 16:47:14 ID:???
>>121さん
そうなんだ
わざわざテストしてくれたんだ(;´д⊂ヽありがとう
WindowsXP
アクティブパール5.88
シグウィンでもっかいテストしてみて作者にメールしてみるよ
ありがと
>>122 何が問題なのだ?
質問も解答もしないのに横から茶々入れてるあなたのほうがよっぽど問題なのだが・・・
購入した本にサンプルが付いていた
動かないので自分で解決できないか模索した
どこがおかしいのだ
あんたの頭かw
向うで再帰の質問をしたのもコイツか?
お前のせいで、他の人の質問でも答える気にならんのだよ自重してくれんかね。
>その煽りの文章を考える暇があったら(中級以上のリファレンスを買うんではなく)初心者本でも素直に買って読めよ。
125 :
117:2008/04/14(月) 17:21:37 ID:???
cygwinで動いたんだけどcdのhtmlからの取得はしていなかった
サビフォルダーに置いていたhtmlからの取得は全部おk
コマンドプロンプトで確認したんだけど
ファイルは作成されていない
コマンドプロンプトの操作画面に現れたものを
ファイルに保存するのはどうすればいいですか?
取りあえず
>>122は答えなくていいよ
どうせ野次るだけなのは明白だ
自分でも探してみるけど
私に理解できるように答えれる方おられましたらよろしくお願いします
>その煽りの文章を考える暇があったら(中級以上のリファレンスを買うんではなく)初心者本でも素直に買って読めよ。
>>124 それ勘違い
再起わかんないので具体的な質問できないよ
その質問には答えてあげればイイヨ
どうせ私が見てもわかんないのでヨロシコ
再帰を「再起」と書く初心者が同じ日に二箇所に現われるもんかねえ。
>>126 「超初心者用」と「初心者用」購入したんだけど
ささっと変数を解説したらCGIの話ばかりで
ファイル操作は最後のほうでちょびっとだけ解説してるんだ
なぜかperlの解説本は「CGI」「CGI」の連呼でキモい
>>128 誤字がどうしたのだ?
そんなの関係ないと思う
小心者だねw
>>124,
>>128 激しくゴメン。別人です。
何日か前から、こっちがこんなことになってるから、むこうで聞いてみた。
(まあ実際WebProgではないんだけど)
しまった”再帰”か〜。
つっても再起でコケてるわけではなくて、(まただw)
どうも =~ s///e の”e”でこけてるようなんだ。
正規表現絡みで、しかもこっちこんな状況だったからあんま書き込みたくなかったんだけど
案の定つっこまれてしまった。
まあいいや、今は時期が悪かったってことで、暫く消えます。
一応、お詫びします。迷ったけどこっちに書きます。
貴方が本当に別人なら理解出来るでしょう。
======================
当方、確認の術を持たないので(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条
こっちでいいのかな?
>>131 ActivePerl5.8.8(build816) で試そうとしたんですけど、標準入力からうまく食ってもらえず。
で、__DATA__ と <DATA> にしたり
open(IN, '<', 'list.utf8'); binmode(IN, ":utf8"); 以下略にしたりしてみたら
意図どおり(のはず)の出力になりました。perl.exe も落ちず。
# CP932 な環境で binmode(STDIN, ":utf8") って考えたこと自体がないのでよくわからない。
>>115>>124 諸事情により疲れすぎて疑心暗鬼になってるように見えますよ。
諸事情のほうは継続の気配なので、少し休まれては如何かと。
134 :
130: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: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が落ちるのは変わらない。
ごめん、激しくゴメン。
名前欄
>>131の誤りです。
やっぱり消えます。
>>135 大変失礼しました、重ねてお詫びします。
>>133 >諸事情により疲れすぎて疑心暗鬼になってるように見えますよ。
>諸事情のほうは継続の気配なので、少し休まれては如何かと。
ほんとにその様です。穴があったら入りたいw
俺も穴があったら入りたい(性的な意味合いで)
これからジュンク堂とヨドバスカメラとbook1stとアサヒヤと紀伊国屋行ってみる
りゃまbonがいいんだね
先日、立ち読みしたラクダの本かな?
アレファイル操作詳しく載ってるの?
取りあえず今日はperlの絵本というのを探してみようかと思う
ま行ってみるよ
んじゃ
140 :
133: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 だと見事に落ちますねえ。
みごとな検証、お疲れ様。
質問者様が見てくれるといいが。
>>140 原因が同じか違うかもさっぱりわからないが、
5.8.8 build822だとStorableを使ったコードで
大量のstorableデータ(50MB強)を読み込ませると読み込みが終わらない、
という現象にあたったことがある。
同一コードで、build817、あるいは5.10.0 build1001, 1002 では問題なかった。
というわけで、個人的にbuild822は信用していない。
参考情報と言うことで。
*本当の検証*が向こうに出てたので、
>>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: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で良い方法がありましたら教えてください。
>>145 サーバにいるPerlさんは、クライアントのブラウザが閉じたかどうかを知らないよ。
JavaScript併用
148 :
145:2008/04/18(金) 07:47:12 ID:ThTU7HIn
>>146 サーバサイドだからやっぱり無理なんですかね・・ いいモジュールとか有ると期待していたんですが。。。
>>147 JavaScriptのどういったものが教えてください
閉じたら消すじゃなくて
開いたら消すにすれば?
JavaScriptならonUnloadで消去用のスクリプトを実行させれば?
もしくは実行終了のタイミングが予測出来るなら
folkなりthreadなりで子プロで消すとかね
そもそも消さなきゃならないデータなんて置かなきゃ良いんだよw
どうせダウンロードされたくない画像やら動画やらなんだろうけど
そんなもんはブラウザのキャッシュからいくらでも回収出来るからなぁ
foreach で読み込むときに異なる行を複数取得教えてください
foreachの前で下記のようにやってみたらエラーになります
$str1 =~ /あいうえお/;
$str2 =~ /さしすせそ/;
日本語が良くわかんない(><)
153 :
nobodyさん:2008/05/02(金) 11:14:09 ID:Sh68NuTD
2chの日付の後に付くIDはどうやって算出しているのですか?
よろしくお願いします。
どうやったら、変数に何も値が入ってないってことを確かめられるの?
$hensu or print "ナイヨ(><)\n";
$hensu = 0;
で破綻するので
>>157はデタラメ。
defined($hensu) or print "ナイヨ(><)\n";
が正解。
>>156にとっての「何も値が入ってない」によって答えが変わるでしょ。
my $var = ''; # これが「長さ0の文字列が入ってる」のか「何も入ってない」のか
print "どっちが正解かわかんないんです(><)\n" if $var xor defined($var);
三値論理
use Socketと書かなくても、gethostbyname関数が使えるのはなぜ?
ドメインを入力してIPアドレスを出力するだけの、単純なスクリプトを作りたいので
記事の中の
a href=" URL "
もしくは
img src=" URL "
のURLが相対パスになっていた時に絶対パスに変換されるようにするには
どうしたらいいですか?
HTMLタグに「絶対パス」を入れても表示出来ないよ
164 :
nobodyさん:2008/05/07(水) 21:26:07 ID:fDlQQ0EM
いまapache?でcgiのテストをしてるんですが。
長居のでソースは遠慮するんですが、そのcgiを指定するとPLファイルをブラウザで表示したみたいに自分の打ったテキストがそのまま出てしまうのですが、このとき考えられるミスを教えて下さい。
>>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つぐらいは当たってると思います。
これじゃね?→Content-Type: text/html;
167 :
nobodyさん:2008/05/07(水) 22:44:41 ID:fDlQQ0EM
>>165 あ、すいません。自鯖板ネタなんだと思います。
そんな板があると知らなかったので・・・何回か色々とググったら、たぶんapacheの設定ミスみたいです。
見直してみます。
ご迷惑おかけしました。
>>166 そっちは試してみたので。スクリプト的にはたぶん問題ないです。
helloworldレベルの奴でも出なかったし、本丸写しでも無理でしたし。
ありがとうございました。
$HOGE = ABC
DEF123 を ABC123 に置き換えたい時は
$str =~ s/DEF123/$HOGE123/g;
では駄目ですよね? どうしたらいいですか?
$str =~ s/DEF123/${HOGE}123/g;
172 :
161:2008/05/08(木) 18:42:19 ID:???
ABC/DFG/HIJ/../ → ABC/DFG/
こういうのが こういう感じで置き換わるように
$str =~ s/\/[^\/]*\/\.\.\//\//g;
こうやってみたのですが
ABC/DFG/HIJ/../../ → ABC/DFG/../
こういうのは こうなっちゃいます
ABC/DFG/HIJ/../../ → ABC/
こうなってくれるにはどうしたらいいですか?
../ を消すだけじゃ駄目?
$str =~ s{\.\./}{}g;
こんな風に。
175 :
173:2008/05/08(木) 20:59:09 ID:???
>>174 ../ が前方を巻き込んで消えるようにしたいのです
一行では無理でしょうか
ごめんなさい。
完全に勘違いしてました。
こういうこと?
$str =~ s{[^/]*/(\.\./)+}{}g;
177 :
173:2008/05/08(木) 21:22:58 ID:???
>>176 すみませんお手数おかけして…
それだと
ABC/DFG/HIJ/../ の時も
ABC/DFG/HIJ/../../ の時も
ABC/DFG/ になってしまいます
ABC/DFG/HIJ/../../ の時には
ABC/ になるようにしたいのです
正規表現でどうにかする方向は
>>176さんに任せつつ。
>>173 use File::Spec;
print File::Spec->canonpath('ABC/DFG/HIJ/../../'); # ABC
末尾のデリミタが消えたりしますが。
179 :
176:2008/05/08(木) 21:40:41 ID:???
質問の趣旨がようやくわかった。ファイルパスの操作か。
こんなことしてどうするんだろうとか不思議に思ってた。
なんか寝ぼけてるな。
これを正規表現でどうにかしたのをみてみたい。
180 :
173:2008/05/08(木) 22:04:20 ID:???
わ、最初からファイルパスと言うべきでした。すみません。
RSS出力のCGIをいじってて、文章中にあるリンクやimgタグがRSSフィードでは
絶対パスでないと働かないので、相対パスになってた時に絶対パスに置き換わるように
したかったのです。
$RSS_BASE_URI = "
http://$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:2008/05/08(木) 22:46:06 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" ; # プリント。
ああ、やっぱモジュールがあったのねorz...
おまけにタワゴト書いてるし。
184 :
173:2008/05/08(木) 23:36:51 ID:???
>>181 ごめんなさい。
>>162です。
記事の中から該当部分を抜き出してまた戻す方法も分からない絶望的分からなさだったので
教えていただいたものを使うことができず、恥ずかし悲しくなりながら単純な置換だけでなんとか
やれないかと別の方向にごにょごにょしちゃってました。
もう少し勉強してそれを使えるようにがんばってみます。ありがとうございました。
>>182 移動してきてました…。
自分が知らないだけでこれもきっと一行ですむのだろうと思ってたら、そうでもないようですね。
勉強してなんとか単純置換以外も使えるようになろうと思います。ありがとうございました。
モジュール使えで終了な話ではあるけどワンライナーでかけないのが悔しいorz
せいぜい短くしても
$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>";
タイトルすら出てくれないんです。
たぶん初歩的なミスだと思うのですが・・・
ヘッダは?
189 :
nobodyさん:2008/05/10(土) 20:49:00 ID:jhS0+1hl
print "Content-type: text/html\n\n";
これですか?
190 :
173:2008/05/10(土) 21:11:01 ID:???
>>186 あ、一行でもできたんですね!
ありがとうございます、動きました!
URLを抽出してモジュールに渡すのに悪戦苦闘してましたが、
このままできないのもくやしいのでそっちもがんばってきます。
>>189 その行を print "<!DOCTYPE〜 の行の前に書いてる?
あとエラーじゃなくて真っ白? ソースも?
192 :
nobodyさん:2008/05/11(日) 12:00:02 ID:/WAyhnOg
>>191 はい。この行を書いて、一行改行してhtmlソースです。
ANHTTPDで真っ白でした。
前に$kaoとかを定義づけてるんですけども(ifで)それのミスなら500が出るかな、と思ったので。
193 :
181:2008/05/11(日) 17:10:05 ID:???
194 :
193: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;
>>192 ANHTTPDの設定だと思うけどなー。
「ANHTTPD 真っ白」でぐぐったらなんか色々出てきたから
やってみたら
ブラウザを使わずにBookOFなどの商用サイトに接続して本を検索したり注文したりする
Perlで可能でしょうか?
可能でしたら具体的に教えていただけないでしょうか
そのサイトが検索用にAPIでも提供していれば
コマンドラインからの実行で検索は出来るはず(Amazon等)
注文までは知らね
>>196,
>>197 別にAPIとか対応して無くても、Formで受け付けてくれるなら(JavascriptやFlashでなければ)
気合さえあれば、検索も注文も出来る。
199 :
190:2008/05/13(火) 07:31:33 ID:???
>>193 ありがとうございます、参考に……って回答だった!
自分のとこでも動きました。こんなに簡潔になるなんて感激です。
~ s/ 以下にも入れられたんですね…
一回やってエラーが出たので(多分何か抜けてた)
別の場所で動かしたそれを元に戻す過程がいるのかと
甚だしい勘違いをしてました。
何一つ自分で解決できなかったけどなぜか大きく成長したような気がしました
本当にありがとうございます。
CGIでやってみたいことはまだまだあるので次はgoogle的なもので
解決できるようになりたいものです。
>>198 まあ、やって出来ない事は無いとは思うけど
気合いってよりは無駄な作業が多くなるでしょ
検索して返ってくるのはHTMLな訳だからそこから必要な物を切り出して
さらにフォームを探して送信する内容を整えて・・・
>>200 そう、だから気合がいる。昔そんなのを書いてて、
「こんなん苦労して書く必要あんのかよ?しかも1サイトにしか通用しねえし・・」
とか思ったこともあるけど、気合(笑)でカバーした。あの頃は若かった。
202 :
196:2008/05/14(水) 04:44:38 ID:???
みなさん情報ありがとうございます
ブラウザ無しでできるって事ですね
ブラウザ無しでデータをやり取りすると速いんじゃないかと思うのですが
実際どうでしょうか?
込み合ってるサイトもスイスイですか?
>>202 それは、相手のサーバーの処理能力とか、回線状態による。
まあそのページが、Javascriptやら画像やらフレームやらで大変込み入った内容なら
ブラウザでレンダリングするよりかは早くなるかも知れん。
(向こうのレスポンスについては、こっちからじゃなんもでけん)
けど、HTMLを正規表現等でパースして、ifで場合分けして、Formに内容セットしてとかしてたら、
はっきり言ってブラウザでクリックしたりしてするのの楽さと比べて、そんな恩恵あるとは思えん。
なにより、そうゆうコード書くのにかなり気合を要する(w)。
まあやるのは自由だけど・・・。
DDosアタックでも仕掛けるのなら話は別だが・・。
スイスイ具合は「画像オフ・JSオフ・CSSオフ」のブラウザと大差ないよ。レンダリングの有無だけ。
「Perlで書けばスイスイ!」だけを期待してるんだったら、やめれと。
でも、HTMLをパースしてCookieも食べて、フォーム仕立てて送信、お返事をパース…の繰り返しを書いて
意地でもPerlで注文してやる、というマゾな考えならそれはそれでありなのかもね。
近所の古本屋さんでオライリーPerl リソースキット UNIX版Xと記載されたperlの解説本を発見!
定価15000円らしいのだが2000円の値札が付いている
CD付属でそのCDは未開封
パラパラッと立ち読みしたらWindows環境にも通用しそうな気がするんですよ
自分はWindows環境なんだけどこの本は勉強なりそうですか?
付録のCDはWindows環境でも使えそうですか?
ご存知の方お願いします
>>206さん
ありがとうです
UNIXと記載がありますが2000円捨てるつもりで買ってみようかと思います
他にも古い本でプログラミングperlUNIXとか600円で売っていたんですよ
Windowsで動くのか心配だけど一緒に買ってみます
XPのためにWin98の本買うようなもの
最新のドキュメントを探したほうがいい
古いの見ても混乱するだけ
>>208さん
そうだなー
そう言われればその通りですよね
やっぱり見合わせます
ありがとうございます
Perlほど解説本なしでネットでまかなえるプログラミング言語はないだろう
コマンドプロンプトからユーザエージェントして返ってきた文字列が
英数字以外は文字化けしてます
コマンドプロンプト内で読めるように教えてください
jcode.plもエラーになります
>>211 意味がわかりません。
> コマンドプロンプトからユーザエージェントして
とはどうゆうことですか?
わかんないならスルーしろよ
なんで答えるの?
教えたらわかりそうなのか?
>>213 いやあ、多分LWP-UserAgentのことかなとエスパー。
ほんで取ってきたページのソースがcp932じゃないから
コマンドプロンプトで文字化け。
実は俺も昔やったことがある。
だから聞いてみた。
>>214 ぅぉぉぉー ヽ( ゚д゚)ノヽ(゚д゚ )ノ ぅぉぉぉー
わかってんじゃん
それそれ
cp932をも少し詳しく
「CLI で LWP を飛ばしたら、CP932 じゃない文字列が返ってきます」まではわかるから、
もう一段階進んで
「jcode.pl は UTF-8 を知らんぞ」でいいのかな。
217 :
216:2008/05/19(月) 02:29:01 ID:???
>>215 次からは、もちっと質問を詳しく。
ほいで解決方だけど、
perl 実行したいスクリプト.pl > kekka.html
とでもして、そのファイルを各種文字コードで開けるエディタ(秀丸、TeraPad等)で開く
もし持ってなければ、とりあえずIEで開けばなんの文字コードかはわかる。
or
use Encode;(5.8以降標準で入ってる)
で文字コードをcp932に変換。
>>216 その可能性もあるかもだけど、多分、もともとのページの文字コードが分かってなかったら使えない。
(と思ったが、自動判別出来るんだっけ?もう長いこと使ってないから忘れちまった。)
あと、$response()->as_string() あたりでサーバーからのレスポンスヘッダが読めるから、
それでそのページの文字コードを判別しい。(か、もしくはhtmlの中の<metaを探すか)
>>218 自動判別は (jcode.pl|Jcode.pm|Encode::Guess) な感じでいちおうあるよ。
# jcode.pl は UTF-8 に対応してないので、その辺はどうにもならない。
どれも「当たるとは限らん」ところが大事ですけど。
>>217 気分悪いならスルーでいいよ
あなた個人を攻撃してるわけでもないのに
態度云々言われたらこっちが気分悪い
取り合えず2chには向いてないと思うよ
これからもし私を見かけてもスルーしてね
おちょくってるわけでもないのに変な奴だ
>>218 詳しくありがとう
例の人が久々に来てたのか。エスパーたち、乙。
またおまえかwww
このバカ定期的に沸いてくるな
しかもあちこちに増殖している
ふーん
人を馬鹿扱いできるほどお前稼いでるの?
税金なんぼ払ってるかいってみ
失せろ
キモイ
稼いでる = 馬鹿でない
上の理論が成り立つと思ってるマヌケさ
なんか自分を凄く見せたがる為に銭金の話をしたがる馬鹿いるよな
森伊蔵云々、ディナー云々
中学生のホラ自慢みたいw
もう構うなってw
みんなお疲れ様
わかる人お願いします
ソースコードutf-8で保存してから実行してみた
アクティブパール5.88
WindowsXp
ここからどうすれば日本語になるの?
use LWP::UserAgent;
use utf8;
use encoding 'cp932';
$ua = LWP::UserAgent->new();
$req =
HTTP::Request->new("GET", "
http://www.yahoo.co.jp/");
$res = $ua->request($req);
print $res->content();
use LWP;
use Encode;
print encode('cp932',decode('utf8',LWP::UserAgent->new()->get('
http://www.yahoo.co.jp')->content()));
>>231 私の環境ではエラーになっちゃったけど
物凄く参考になった
ありがとう
>>231 できました!
スペースの文字コードを半角スペースに変えたらエラーにならないで実行できました
見事に日本語になってます
ありがとうございました!
>>231をhtmlファイルで保存したいんだけどできない
すいませんまた教えてください
open(FH, '>>', "yahoolog001.html") or die "Cannot open content()!";
flock(FH, 2);
print FH qq|content()\n|;
>>234 231をyahoo_get.plとでも名前付けて保存して、
perl yahoo_get.pl > yahoo001.html
>>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.
>>236 違う違う、235のは、コマンドラインから実行するんであって、perlスクリプトの中に書くんではない。
>>234とか見てると、ファイルのオープンとかはあってるけど、
オブジェクトとか、クラスメソッドとかのことを良く分かってないようなので、
とりあえず一行で書けるのにしてみた。
それから、君は
>>211や
>>230と同じ人(?、かどうかは定かではないが)
コマンドプロンプトから実行してるなら、リダイレクトや標準出力、標準入力等についてもある程度は理解がないと。
(Perlではないんで、入門書とかにはあんまり書いてないか。でも基本ってか常識レベルなんで、
わかってないとこれからしんどいよ。逆にわかってくると、いちいちスクリプトの中でやらなくていいことが増えるんで
書くのが楽になるし、理解も深まる。)
wktk
>>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('
http://www.yahoo.co.jp')->content();
↓コマンドラインから保存できたソース
--------------
use LWP;
use Encode;
print LWP::UserAgent->new()->get('
http://www.yahoo.co.jp')->content();
ここからログインのテストしたいので
またお願いするかもしれませんが
その時はよろしくお願い致します
>>238さん
勉強方法詳しくありがとうございました
標準入出力の解説書なかなか見当たらないです
手持ちの解説書で標準入出力を解説しているのは
「perlデータマンジング」という本だけです
大変わかりやすく良書なのですが紙面の関係上さわり程度なのが残念です
何かお勧めの解説書があれば教えて頂ければ嬉しいです
ありがとうございました
お世話になります
httpsでログイン可能な簡易ブラウザサンプルどこかないでしょうか?
自分が調べたところ2001年にある雑誌が付録で付けていたようなのですが
絶版になり各方面探しても見当たりませんでした
やりたいことはhttps接続での送受信です
お心当たりのある方よろしくお願い致します
LPW
間違えた笑
LWP
244 :
nobodyさん:2008/05/23(金) 20:25:12 ID:VktSXUAF
sで一気にいくつかのものを変換する方法ありますか?
たとえるならあいうえおという文のあとおをかとこにおきかえたいんです。
trじゃダメなの?
どもお世話になります
あれから色々調べているんですけど
ログインや検索やセレクトメニューの選択やボタンクリックなど
具体的なサンプルってないですね
もしかしてperlで出来ないですか?
結局HACKER本買い捲ったんだけど
みんなHTMLの取得までなんですよ
そこからセレクトメニューを選んだりOKボタンをクリックするとか
できないんだろうか?
お前は何を言っているんだ
なんで?
perlでなんでも出来るって言ってたじゃないですか?
ネタですか?
>>248 もしかして
>>196からの流れか?
ひょっとして画面が表示されて検索ワードが勝手に入力されてセレクトメニューが勝手に選択されてボタンが勝手に押されるとか
そういうのイメージしてる?
>>250 それそれ
それです!
perlで出来るんですよね?
今のところそのようなサンプル見当たらないんですよ
自動ソフトのスクリプトとかならOKボタンのクリックなどは
初歩の初歩インストール後5分後には覚えれるくらい簡単なんですけど
perlの場合参考になるような記述すら見当たらないんですよ
超凄いらしい解説本やオライリーのHACKシリーズやWEBシリーズを購入したんですけど
全然すごくない
OKボタンの1回すら出てこない
なんでもできないのですか?
それをやろうと思ったのはお前が最初で最後だと思うよ
>>252 なんでですか?
perlでは出来ないってことなの?
ちなみに自分はある自動ソフトで検索とか保存とか
WEB上での操作でやりたいことは大体教えてもらえましたよ
そのソフトを教えてくれる方たちはみんな普通にご存知でした
ただ遅いんですよorz
0.5秒で完結させたいんです
>>252 自分は
>>198や
>>201なんだけど、多分初めてじゃないと思うぞ(w)
>>253,254
君のやりたいことってのが、GUIのツールみたく目に見える感じで動いて行くってのなら多分ムリ。
(Tkとか使ったら無理やりにでもできるかも知れん。でも自分はGUI系はからっきしなんで、よくわからん)
そうでなくて、コマンドラインから、ブラウザで操作したことと同じ結果を得るってことなら可能。
どんな本や、どんなページ参考にしたかわからないけど、
ちょっと上の方に出てるLWPなんかの解説や、CPANのmanualなんかをじっくり読めば(リンクを少々辿らないダメだけど)、
検索フォームにワード仕込んだり、”OK”ボタンを押すってことにもたどりつきそうだけど・・・。
256 :
255: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 = '
http://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で表示される。(無理やり、画面遷移っぽくなるように作った。)
モジュールや関数の詳細は、自分で調べてくれ。
また湧いたのか・・・
>>255さん
ありがとうございます
まさにそれなんです
GUIを使わないで送受信してみたいんです
お疲れのところわざわざサンプルまで作って頂き本当にありがとうございます!
頂いたサンプルを参考にログインとかもチャレンジしてみます
ありがとうございました
ブラウザのインターフェースに強引に割り込ませるのかと思ったわ
httpについて勉強するといいよ
260 :
nobodyさん:2008/05/28(水) 00:14:16 ID:T0EpbUiq
ググったら趣旨が違うのしかでないんですが、
ifで、たとえば$Aに\という文字列が含まれる場合、
\が含まれています。とするにはどうしたらいいんでしょうか?
if($A =~ \\)
{print "\\が含まれています"}
でいけますか?
if($A =~ /\\/)
$in{'ext'} = extfind($in{'orgname'}); if(!$in{'ext'} && $in{'upfile'}){ &error(202); }
この処理ってどういう意味なのでしょうか?
;
>>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:2008/05/31(土) 15:54:58 ID:???
戻り値をセットせなあかんから1行にまとめたら駄目だな・・orz
266 :
264:2008/05/31(土) 16:03:00 ID:???
&error(202) if(!($in{'ext'} = &extfind($in{'orgname'})) && $in{'upfile'});
オリジナルと大して変わらんけどこうやればいけるか
スレ汚しスマソ・・
より、この処理ってどういう意味なのでしょうか?
という質問が出易くなりますな。
>>264 やっぱりperl難しいな・・・
http://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); }
に、しても普通にアップロードできてしまうし。。。どこがおかしい?
>>268 そこのアップローダの改造の質問 って前にもどこぞで見たなあ。
で「改造スレに行け」と言われてたハズだが?
ソースが好みじゃないのでやる気にならん。…改造スレ行けば?
perlで書かれたチャット掲示板みたいなCGIプログラムがあります
テキストエリアに文字を入力して、投稿ボタンを押すとregist.cgiに渡されて書き込まれる仕組みです
このregist.cgiはmessageとcountという2つの引数をとるみたいなのですが、
ブラウザからURL:/aaa/bbb/regist.cgi?message=test&count=1
とやっても書き込まれませんでした
ちなみにFirefoxのTemperDataで確認したリクエストとレスポンス上ではベーシック認証は使われていませんでした
最終的にはperlで自動的に書き込んでくれるプログラムを書きたいのですが、まずはperlでこのregist.cgiに投稿するにはどうすればいいか教えてください
postしてみろ
GETで投稿出来ちゃうと、2chにリンク貼られまくったときにw
sub getDirSize($)の($)ってどういう意味?
>>273 プロトタイプ。
$は引数としてスカラーしかとらないってこと。
275 :
273:2008/06/07(土) 08:37:38 ID:???
276 :
nobodyさん:2008/06/13(金) 17:42:23 ID:GNaVOr+f
UTF-8の16進コードを文字にしたいんですが、
pack('C*','0xe4','0xba','0xba')とやっても化けてしまいます。
どういう式を書けばいいのですか?
pack('C*',0xe4,0xba,0xba) だとどうなる?
>>277 ありがとうございます。できました。
裸のままでよかったのですね。
pack('H*','e4baba');
というのもあったみたいです。
今は10進→16進→文字なんですが、
10進から直接変換できますか?
0xがついてなきゃ10進だよ。
pack('C*',228,186,186) とか
10進の数字しかないならpack('C*','228','186','186') でも通るけどな。
ありがとうございます。
文字列との違いが判りました。
UTF-8のコード範囲を調べると
[\x00-\x7f]
[\xC0-\xDF][\x80-\xBF]
[\xE0-\xEF][\x80-\xBF][\x80-\xBF]
[\xF0-\xF7][\x80-\xBF][\x80-\xBF][\x80-\xBF]
とあります。
これには他の言語も含まれているとおもいます。
先ほど教えていただいた変換で一覧を作ろうと思うのですが、中国語なども混ざってしまいます。
日本語のみの範囲はどのようなものなのでしょうか。
そういえば、日本語じゃなくても、
罫線とか利用している文字もありますね。
なかなか難しい。
postやgetじゃなくて、普通にページにアクセスしたときの条件分岐が作りたいのですが、
そんなことはできませんか?
Use of uninitialized value in concatenation (.) or string at main.cgi line 93.
このエラーの意味が分からないのですが、教えて頂けませんか?
>>283 もう少し詳しく
>>284 main.cgiというファイルの93行目で、連結の方法がおかしい。
>>284 >>285 =~ s/連結の方法がおかしい/未定義値を文字列として評価している/;
例えば $foo が undef の状態で "foo$foo" とか 'foo' . $foo とか。
おはようございます。
あるサブルーチンでファイルを扱おうとしています。
evalの中でopenしたファイルハンドルをエラー処理(if $@)で閉じるにはどうすればよいのでしょうか。
環境はperl5.8 use strictです。
http://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 "変更完了";
http://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 "消去完了";
>>288-289 せっかくお答えいただいたのにすみません。
私が知りたいのはスコープを跨ぐ場合の話です。
例えば、evalの中で宣言した変数をevalの外で使おうとすると、perlに叱られます。
ファイルハンドルの場合は叱られないのですが、これが作法に則った方法なのかわかりません。
291 :
nobodyさん: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 修正です。
# 先頭の全角スペース、半角スペースの連続を削除
$example =~ s/^([\ \ ]+)//;
流れがよく分からんけど、
もうひとつファイルを用意して、
書き出して言ったらダメなの?
>>293 スクリプトとファイルの文字コードが同じならいいけど。
>>291 ありがとうございます。
お答えいただいた案1がしっくりきたので、この方式で行きます。
またよろしくお願いします。
297 :
nobodyさん:2008/06/18(水) 00:25:23 ID:Mmy0x8n6
perlで、
print "あ";
で一秒待ってから
print "い";
を実行する方法ってありますか?
localtimeで受け取って1秒過ぎるまでwhileで空白を書き続けるってのも考えたんですが・・・
負荷がかかりそうなんで。
sleep 1;
select undef,undef,undef,1;
$| = 1;
301 :
うっとりハムちゃん:2008/06/20(金) 15:05:12 ID:nHevfWAE
すいません、教えてください。
掲示板に書き込まれた内容に URLが含まれていた場合、
自動的にリンクになるようにしたいのですが、
簡単に追加する方法等がありますか?
よろしくお願いします。
URLかチェックして一致したらAタグ追加する。
正規表現 perl URL とかでググれば例が出てくると思う
>>301 $_ =~ s/([^=^\"]|^)(http\:\/\/[\w\.\,\~\-\/\?\&\+\=\:\@\%\;\#\%\*]+)/$1<a href=\"$2\">$2<\/a>/g;
…メタ文字じゃない文字をエスケープして意味あんの?
文字クラス中のエスケープは更に酷い。
305 :
うっとりハムちゃん :2008/06/21(土) 03:14:25 ID:k6DOaEg8
皆さんレスありがとうございます。
>303 さんの記述を一行足すだけではダメですよね?
例えば $comment 内に書き込まれた中から抜粋する際は
それを指定する必要などはありますか?
minibbsあたりのソースで見ましたね>余計なエスケープ
できました!!!
とても親切で、どうもありがとうございました!!
助かりました! m(_ _)m
309 :
297:2008/06/21(土) 21:40:03 ID:etCJxH2B
遅くなりました。
ありがとうございました。
遅くなったのは、教わったとおりにsleepしてから書き込んだから
だれかボスケテ。
---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: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とも問題ありません。
スレチなきもするが、非同期通信の呼び出し方法はブラウザごとに違うよ。
つ prototype.js
314 :
311: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: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: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: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: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で利用したのが原因で
多分外部ライブラリ使ってても同じ現象に遭遇してたと思います。そんな時は余計に、原因の究明に困ったかも知れません。
とゆうことで、長々と失礼しました。同じような問題で悩んでる人がいたら、参考にして下さい。
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のつづり間違えてた。
cgiが正常ならクライアント側の問題だろ?
prototype.jsを遣わない理由がどこにある。
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の問題。
知らないとハマるから、良い検証だったと思います。乙
>>320さん
>>321さん
318です。仰るとおり、送って来るReuestHeaderが異なるのは、各ブラウザ側の挙動の違いの問題です。
その後、教えて頂いたprototype.jsのXHR周りの動作について、手持ちのブラウザで基本的な動作確認をしましたが、
やはり送ってくるRequestHeaderはブラウザごとに違います。設定によりいくらかのヘッダの操作も出来ますが、
FireFox3で、当該の"chaesrt=..."の部分を消すことは出来ないようです。
( これもブラウザにより異なります。IEでもデフォで、"charset="が付いてきたりします。
ここら辺の違いを吸収してくれるハズのライブラリで、ブラウザごとに分かち書きとかしないといけないのは、
本末転倒のような気がします。まあJavascriptのことはスレ違いになるんで、言及はここら辺でやめときます。)
323 :
322: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! とかベンチ出たんですが、
実験的な環境のため、そのまま本番環境には投入できません。)
>>323 当然考えているとは思うけど、CGI::Lite に手を入れてしまうのがリーズナブルなんじゃないかな。
parse_form_data() 内で、
$content_type eq 'application/x-www-form-urlencoded'
と判断しているので、これを =~ にでもすればいいだけなわけだし。
簡単なパースしかしないなら、モジュール使わない方法もあるんじゃね?
HTMLフォームから送信されてきた文字列の中からURLを探しだして
<a href=>のタグをくっつけたいんですが、cgiのURLとかで?が入ってると上手く置き換えできません。
これを回避する方法を教えていただければ幸いです。
$mojiretu =~ s/$url/<a href="$url">$url<\/a>/; #$ulに?が入ってると置き換えできない。
>>326 上手く行くかどうかしらんし、根本的な解決にはならんかも知れんが、
$mojiretu =~ s/\Q$url\E/<a href="$url">$url<\/a>/;
「\E までのパターン指定メタ文字の意味を打ち消す」
ってどういう意味かな?
$str="a?b";
のとき、
/$str/
が
/a?b/
じゃなくて、
/a\?b/
に展開されるようにしてくれる。
?が「パターン指定メタ文字」なんだな、たぶん。
それで、?があると、そのあとに続く文字が
特別な意味をもつんだな。
だからそれをエスケープ?しなくてはならなくて、
そのための呪文という意味か。よくわかりました。
>>331 >それで、?があると、そのあとに続く文字が
>特別な意味をもつんだな。
違うよw
ま、追い追い勉強しなw
perl -MCPAN -e shellの後に、install Math::BaseCalcしたら、
make: *** [test_dynamic] エラー 255ってでるんだよ
どうしたら、解決出きるのか教えてください
>>333 config で make program を変更してみるとか、、、フォースインストール
するとか、、、
俺の場合はMath::BaseCalcじゃないけど、makeでコケた奴はソースで手動で
コンパイルして入れたりもする。
>>333 まずはインストール時のメッセージをじっくり調べてみてはいかがでしょう。
336 :
うっとりハムちゃん:2008/07/05(土) 00:33:32 ID:NR2upuAB
すいません、おじゃまします。
cgiにアクセスした際に、同時に○○.phpを読み込む際のPerl記述を教えていただけると助かります。
よろしくおねがいします。
つ 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ファイルも同時実行できないかと思い、困っています。
よろしくお願いします。
携帯でそうなる理由を調べてそれを解消したほうが早い
systemで実行するなら/usr/local/bin/php xxx.phpとかだろうけど
それでキミの欲しいものが得られるのか?
http経由で呼ぶならそうすればいい
できました!
とても助かりました!!
どうもありがとうございました。 m(_ _)m
>>341 おめでとう。
何をどう変えてどのような望む動作が得られたのかはさっぱりわからんが。
おそらく直に読んでカウンターが上がったんじゃないかと
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カウンターを実行するだけでいいのですが。。。
>>344 そりゃあんた、その違うレンサバとやらがphp対応なのかどうかと、
phpの実行パスが/usr/local/bin/phpとは限らんだろう。
サーバによっては、httpからはphp実行出来ても、ユーザー権限で直接実行出来ないように
設定されてる場合もあるし。
347 :
うっとりハムちゃん:2008/07/06(日) 02:40:09 ID:+aL1pH4z
ありがとうございます。
サーバー会社に問い合わせたところ、
system ("/usr/local/bin/php ○○.php");
で動作しますと言われました。
パスに関してはあっているようです。
こんにちは初心者です。
KENTWEBさんのところのBASIC認証式パスワード管理pwmgrというCGIを使いたいと思っています。
サーバーはろりぽっぷなのですが
CGIプログラムの説明を読んでいると、ログの取得について、
# 【利用条件】
# 1. SSIの利用できるサーバ
# 2. 環境変数 $ENV{'REMOTE_USER'} にてユーザーIDが取得できること
# ※ 2. については、同梱の pwlog_test.cgi にてテストすること
とあるのですが、
環境変数 $ENV{'REMOTE_USER'} とは何なんでしょうか?
使えない場合、使えるようにする方法はあるんでしょうか?
教えて下さい。
よろしくお願いします。
また、他の方法でIDとホスト名をリスト化することはできないでしょうか?
KENTWEBさんに聞くとか^^
>>348 固有の ID であれば良い、ということであれば、何かユニークな文字列を生成して $ENV{'REMOTE_USER'} に代入しておく手もあります。
あんまり筋の良くない手法なので元のスクリプトの動作を理解した上でどうぞ。
詳細は perlvar の %ENV ハッシュの項を見てください。
351 :
うっとりハムちゃん:2008/07/06(日) 16:27:06 ID:+aL1pH4z
たびたびすいません。
system ("/usr/local/bin/php ○○.php");
で正常に動作するのはCLI版のPHPで、
CGI版のPHPだとヘッダが出力されるため
表示がおかしくなり、動作しないみたいです。
解決するためにはCGI版のPHPでヘッダが出力されないように
systemを行いたいのですが、その場合の記述は
どのようになるのでしょうか?
>>351 # 勘でレス
my $php_output = qx{"/usr/loca/bin/php ○○.php"};
print +(split(/\n\n/, $php_output, 2))[1];
353 :
うっとりハムちゃん:2008/07/06(日) 17:41:18 ID:+aL1pH4z
レスありがとうございます。
my $php_output = qx{"/usr/local/bin/php ○○.php"};
print +(split(/\n\n/, $php_output, 2))[1];
を使わせていただきましたが、phpが実行されませんでした。。
354 :
352:2008/07/06(日) 18:08:25 ID:???
>>353 system( qw{/usr/local/bin/php -q ○○.php} ); # これも勘
355 :
うっとりハムちゃん:2008/07/06(日) 18:17:32 ID:+aL1pH4z
レスありがとうございます。
phpを実行しようとしているようですが、そのために
ヘッダが出力されるため表示がおかしくなり、動作しないみたいです。
356 :
352:2008/07/06(日) 18:29:36 ID:???
# さらに勘で
# Perl スクリプトをその場で即座に終了してよければ
exec( qw{/usr/local/bin/php -q ○○.php} );
ちなみになぜ勘なのかというと、情報がタリンからです。
ぱっと思いついた不足情報を以下に列挙しておきます。
・最終的に端末に返されるデータはどういうものか
・それは perl から返すのか php から返すのか
・Perl スクリプトで system() を呼び出す前後にどのような処理を行い、
・また、どのような出力をどこに返しているか
「phpが実行されませんでした」
・PHP処理系が起動しないのか、
・期待した表示が行われないだけなのか
「表示がおかしくなり」
「動作しないみたいです」
・おかしいとは具体的にどういうことか
・おかしいながらも表示はされているのに動作しないとはどういうことか
357 :
うっとりハムちゃん:2008/07/06(日) 19:15:01 ID:+aL1pH4z
度々すいません。
掲示板CGIにアクセスがあった際に
phpカウンターを同時に実行(カウント)させたいのです。
とくに戻ってくる必要はなく、基本的には教えていただいた
system ("/usr/local/bin/php ○○.php");
で良さそうなのですが、問題は
CGI版のPHPでヘッダが出力されないように
systemを行うことなので、悩んでいます。
system ("/usr/local/bin/php ○○.php");
の場合、phpのヘッダが戻ってくることにより
CGIがおかしくなり、ソースコードがまるまる表示されてしまいます。
単純に、返ってくるヘッダを無効(?)にする記述があると助かります。
説明が下手ですいません。。
358 :
352:2008/07/06(日) 21:03:06 ID:???
>>357 > 単純に、返ってくるヘッダを無効(?)にする記述があると助かります。
実際に HTTP Response Header 出力が原因だとすれば、やはり、
system( qw{/usr/local/bin/php -q ○○.php} ); # -q に注目
でうまいこといきませんか。
> CGIがおかしくなり、ソースコードがまるまる表示されてしまいます。
「CGIがおかしくなり」には具体的情報がありません。
「ソースコード」は何のソースコードでしょう?
どうしてもうまくいかないときは、あっさり発想を切り換えて別の設計を試すのも一興。
がんばってください。
>>357 phpから帰って来た値(文字列)を出力する必要あるのか?
それまでの説明から、
> 掲示板CGIにアクセスがあった際に
> phpカウンターを同時に実行(カウント)させたいのです。
ってことだから、多分外部ファイルなりにカウントを保存してるんだと思うけど、
その数値がインクリメントされさえすればいいってのなら、
my $php_res = `/usr/local/bin/php *.php`; とでもして、
その受け取った戻り値の$php_resは出力させなければいい。
system()にしろ、print $php_res; にしろ受け取った戻り値をそのまま出力させようとするから、ヘッダとかでおかしくなる。
どうしても戻り値をperl側から出力したいのであれば、
>>352で出来そうな気もするけど、
ひょっとしたら改行が"\r\n"かも知れないので、
for (split/\n/,$php_res){
print "$_\n" unless(m/^Content\-type:/i);
}
でどうか?(生の戻り値に"Content-type"から始まる文字列行がないことが前提だけど・・)
> ソースコードがまるまる表示されてしまいます。
これだけど、自分のごく勝手な勘だけど、上記の件とは無関係に、<? ?>が原因でね?
ちゃんと<?php ?>にしてるか〜?
360 :
うっとりハムちゃん:2008/07/07(月) 02:22:31 ID:w0zyvflA
皆さん、レスありがとうございます。
>358
-q でヘッダを出力しないようにできると思ったのですが、ダメでした。
同様にCGIのプログラムが まるまる表示されてしまいます。
phpを実行しているのは間違いなさそうですが、
戻ってきたヘッダが、その後のcgiを無効にしちゃっているみたいです。
>359
おっしゃるとおり、外部ファイルにカウントしているので、
php自体は。あくまでも実行させるだけで、
返ってくるヘッダは無用なのです。
さっそく
my $php_res = `/usr/local/bin/php ○○.php`;
for (split/\n/,$php_res){
print "$_\n" unless(m/^Content\-type:/i);
}
と記述してみましたが、戻ってきたヘッダが邪魔をして
cgiのプログラムが まるまる表示されてしまいます。
php自体は実行させているようです。
戻り値に Content-type ですよね!?
たぶん、入っていないかと。。。
phpのほうは、
<?php
?>
ではさんでいます。
>>360 なあそれ、phpの呼び出し云々ではなくて、cgi(perl)のほうは正常に動いてる?
(例えば、print "hellow world"だけとか、php呼び出し部分をコメントアウトするとかして)
> cgiのプログラムが まるまる表示されてしまいます。
コレ見るに、その"別のレンサバ"とやらに移したときに、*.cgiに実行権限がないとか、
実行が許可されてないディレクトリに配置したとか、そこらへんは大丈夫か?
phpの戻り値に"Content-type"ヘッダがあろうがなかろうが、cgiがちゃんと実行されてたなら、
そのcgiのソースが表示されるってことはないと思う。
(仮にヘッダ出力がおかしくても、500 Internal Server Errorとかになるハズ)
問題がカウントだけなら、掲示板でカウントしちゃったら?
hello
世界
365 :
うっとりハムちゃん:2008/07/07(月) 15:24:36 ID:Q4oOUlGo
皆さん、度々レスありがとうございます。
CLI版PHPのサーバーでは問題なく動いています。
CGI版PHPのサーバーだとcgiも動いていますが、PHPのヘッダが
戻ってきたのが影響してプログラムがテキストで表示されちゃいます。
ちなみにcgiの実行権限等は大丈夫です。
たしかに今回はカウントに関してのみなので、
別の策を考えたいとも思っていますが、
今後も同様の悩みを抱えると困るので、
できれば解決したいと思い、皆さんのお力に頼ってしまっているところです。
サーバー会社がPHPをCLI版に設定してくれ、無事に動作しました。
数日に渡り、皆さんに親身に相談にのっていただき、大変嬉しかったです!
お騒がせしました。 m(_ _)m
my $calc = new Math::BaseCalc(digits => [0,1]);
を、->を使って
my $calc = Math->BaseCalc->new(digits => [0,1]);
と書いても大丈夫ですか?
you,まずやってみなyo!
質問はそれからだ
369 :
のの:2008/07/08(火) 00:36:18 ID:???
yomi-search Ver4.21が携帯で使えるように改造中です。
INランキングはリフレッシュジャンプを使っているので、携帯によってはリフレッシュジャンプが出来なくて
真っ白なページが表示されてしまいます。そこで、
sub r_link{
#(2.1)アクセスジャンプ処理(&r_link)
if($EST{rev_fl}){
$FORM{id}=~s/\D//g;
if($FORM{id}){
local($fl=0,@ref_list);
$FORM{id}=~s/\n//g;
&lock_rev();
open(OUT,">>$EST{log_path}rev_temp.cgi");
print OUT "$FORM{id}<>" . time() . "<>$ENV{'REMOTE_ADDR'}\n";
close(OUT);
&unlock_rev();
}
}
$EST{location}=0; #refreshジャンプにする
&location($EST{rev_url});
}
の&location($EST{rev_url});をprint<<"EOM"〜EOMに変えて、htmlタグを記入したら、PCとソフトバンクではきちんとページが表示されるのに、auではタグがむき出しになります。
何かよい方法はありませんでしょうか。
改造スレ池
1から9までの4つの数字からできている配列の中で、重複した数字をヒットさせるには
どうしたらいいでしょうか。
たとえば
@suuji = (5,4,5,4)の時
@suuji = (3,3,3,3)の時
@suuji = (1,2,9,9)の時
などです。
if($suuji[0] ==$suuji[1])||($suuji[0] ==$suuji[2])||(略) )
{print "重複してるよ\n";}
のようにひとつひとつチェックしていっても可能ですが
もっとすっきり書く方法があったらお願いします。
if($suuji[0] ==$suuji[1])||($suuji[0] ==$suuji[2])||(略) )
{print "重複してるよ\n";}
ねーよwwwww
ねーですか。
普通はどう書くんでしょうか。
sub test {my %U;1 <= grep $U{$_}++,@_}
えーと難しいですね
配列から重複した要素をgrepで取り出して
その数をカウント…でいいんでしょうか
>>375 ハッシュテーブルさえ理解してればどの様にでも出来る。
このスレの>>12-
>>15あたり読め。後は自分で応用しろ。
あ、例を書くの忘れてたw
@res = keys %{ { map{ $_, 1 } qw( 1 2 9 9 ) } } ;
ありがとうございました。
まだ完全には理解しきれてませんが、
なんか見えてきた気がします。
379 :
質問:2008/07/08(火) 23:51:46 ID:ELkvWtkp
誘導されてきました。
送信ボタンを2回押さないとframe2へ出力されなくて困っています。
送信ボタンを1回押すだけで出力できるような方法を教えてください。
現在の構成ですが、
A.cgi
<form action="B.cgi" target="frame2">
と作成しています。
A.cgiではチェックリストを作って、選択したデータ(装置名)を取得するようにしています。
送信ボタンを押すとB.cgiが実行されてその結果をframe2へhtmlで出力するようにしています。
vi B.cgi
@取得したデータをCファイルへ書き込み
A取得したデータをhtmlで出力
B ` D.pl` を実施
vi D.pl
D.plがすでに起動していれば、改めてD.plを実行しない(多重起動防止)
Cファイルに何も記録がなければD.pl自体を終了させる
while(-s Cファイル){
Cファイルに何か書き込みが有る場合、
Cファイルを読み込んでその装置へデータをsnmpで取得しに行く
sleep 30;
}
状況としては、チェックリストで項目を選択し送信ボタンを押すと、1回目のB.cgiが実行されるわけですが、
B.cgi内でD.plを走らせている為(30秒ループ)、D.plが終了しない限りB.cgiが終了しないので
結果としてframe2への出力がされないようです。
次に送信ボタンを押すと、1回目のD.plがすでに起動しているので2回目のD.plは終了し、2回目のB.cgiは終了し、
frame2へも出力されます。
いまいち何したいかわからんけど、
> B.cgi内でD.plを走らせている為(30秒ループ)、D.plが終了しない限りB.cgiが終了しないので
結果としてframe2への出力がされないようです。
D.plを呼ぶ前に「close STDOUT」 してもだめかな?
>>379 > frame2への出力
ってのが、B.cgiの2.の段階のこと?(多分違うと思うけど。3.の後の`D.pl`の後かな)
D.plを多重起動禁止とか、Cファイルに書き出しとかせずに、
B.cgiからrequireなりで呼び出して、直接その装置(何のだ?)に値するものを引数なりで渡せばええんでね?
で、戻り値をB.cgiから出力と。
これなら、ファイルのロックだとか破損だとか考えずに、B.cgiをいくらでも(cpuとメモリの限り)実行できると思うが・・。
snmpのことはよう知らんから、これではダメなのかも知れないけど。
382 :
nobodyさん:2008/07/09(水) 07:17:22 ID:bhbbhnXI
>>381 >> frame2への出力
>ってのが、B.cgiの2.の段階のこと?(多分違うと思うけど。3.の後の`D.pl`の後かな)
そうです。B.cgi内では@ABの順番で記述していますが、B.cgiが終了しないと
B.cgiの処理結果であるAが出力されないようです。
>>380 >>381 今日あたり書かれていることを勉強して試してみます。
383 :
381:2008/07/09(水) 10:16:07 ID:???
>>382 あれ、そうなの?じゃあD.plは一体何をしてるんだ?
自分の解釈としては、
A.cgi→フォーム(装置の種類?)を選択→B.cgiでそれを受け取りCファイルに書き出す
→D.plがCファイルの内容を読み取り、snmpからその装置の値(統計?測定値?)を取りに行く
→結果をB.cgiに返す→B.cgiで結果を出力 かと思ってたんだけど・・。
もし言うとおり、B.cgiの2.の部分が出力されないってことなら、
>>380の方法か、
(Web鯖がApacheだと仮定して)
$| = 1;
print "Content-type....."
print " " x 256;
とかを、HTMLの出力前にやってみれば?
(確かApacheがcgiかの出力を256byte分バッファリングしたはず。だから最初に256byte分なにかを出力する)
384 :
nobodyさん:2008/07/10(木) 13:55:54 ID:udSkOiii
<FONT>タグだけ禁止するようにしたいんだけどどうすればいいですか?
$FORM_DATA{$name_data}=~s/<FONT>/<FONT>/g;
$FORM_DATA{$name_data}=~s/<\/FONT>/<FONT>/g;
これでやってもうまくいかないです。
タグ、こういう使い方しないし → <FONT>
それに、スタイルシートとかJavaScriptで壊滅しちゃうよ?
Perl以前の問題ですね。
ひろゆきがあめぞうを攻撃したとき、
「スタイルシート破壊攻撃」
というものであめぞうを壊滅させたのだ
388 :
nobodyさん:2008/07/10(木) 17:37:23 ID:dih1cMi9
いくらググってもまったくわからなかったから質問です
ソフトバンクでの$ENV{'HTTP_USER_AGENT'}の中に含まれる
ブラウザのことなんですが、携帯のブラウザって変更できますか?
機種変えないとブラウザは変更できませんか?
携帯は途中に介するゲートウェイで追加するから、自由には出来ない。
アプリのブラウザとか
Perl関係ないやん。
392 :
nobodyさん:2008/07/11(金) 11:46:21 ID:blsFm1gd
389さんくす
perlで携帯サイトを作ったので個体識別情報を
パスにして重複登録を防ごうとしてるので。
何で質問時にそういう情報出さないのかね?
394 :
nobodyさん:2008/07/11(金) 17:55:47 ID:8w4o/9wt
2ちゃんで使える自動書き込みスクリプトを作るにはperlを学べばいいのですか?
perlである必要は無いが、perlでもできる
396 :
nobodyさん:2008/07/11(金) 18:24:17 ID:8w4o/9wt
簡単なものでいいのですが、より早くそれを作れるのはどの言語ですか?
個人のスキルに依る。
教えると荒し幇助になるから、後は勝手にやってろ
早く作れるのはPerlに決まってるだろ。他の言語環境だと、往々にしてミラーリングでいきなり詰まる。
399 :
nobodyさん:2008/07/11(金) 19:11:25 ID:8w4o/9wt
ではPerlをやってみようと思います。
ありがとうございます。
Perlのスレで聞いたらPerlという答えが来るに決まってるだろw
昔からデューク(笑)とかフェイザー(厨)はPerlです。
402 :
nobodyさん:2008/07/15(火) 23:35:01 ID:xfy/3+9x
すいません、2点教えてください。
別ファイルからURLを読み込んで表示させたいのですが、
$url =
http://○○○.○○.jp/********/**********/************/********/****.htm 等の場合、
の$url中から
http:// という文字だけを削除する記述と、
URLが長すぎる場合、20文字以降は ... で省略して表示させる記述を教えてください。
よろしくお願いします。
>>402 http の h を抜くんだね? .htm の h は抜かないんだね?
$url =~ s/^h// ;
20文字以降、、、は、
$url = +( unpack q{A20}, $url ) . '...' if length $url > 20 ;
404 :
402:2008/07/16(水) 00:28:18 ID:WNn5k82F
ありがとうございます!
$url でやろうと思ったのですが、他ファイル(plファイル)から
%url% というので読み込む際の記述を教えていただけると助かります。(^^;
あと、 h だけではなく、
http:// の全てを削除したいと思います。
度々すいませんが、よろしくお願いします。m(_ _)m
405 :
402:2008/07/16(水) 00:36:08 ID:WNn5k82F
あ、すいません。
「
http:// 」 を抜きたいのです。
.htm の 「 h 」 は抜かないです。
>>404 すまんが %url% と言うのは理解出来ん。なんじゃそりゃ?
.htm 以外の h を全部抜くのは
$url =~ s/h(?!tm.?$)//g ;
あたりで何とか。
408 :
402:2008/07/16(水) 00:52:08 ID:WNn5k82F
他サーバーから入ってくるXMLデータから抽出したurlを
cgiの中で %url% という記述で呼び出しているんです。
%url% を $url に変換(?)しようと思い、
$url ="%url%";
と書いてみましたが、無反応でした。
記述が間違っているようで・・
あと、 .htm 以外の h を全部抜くのはなく、
「
http:// 」 と 「
https:// 」 を抜きたい場合は、
$url =~ s|
http://|| ;
$url =~ s|
https://|| ;
でしょうか??
説明下手ですいません。(^^::
410 :
nobodyさん:2008/07/16(水) 01:04:47 ID:WNn5k82F
ありがとうございます。
%url% を $url に変換(?)できれば希望通りになりそうなのですが、
この記述は難しいでしょうか??
s{^(
https://|h)}{} ; 質問者さんの意図には関わらず、一応の訂正
%url% に関しては知らん。
専ブラで見たのが間違いだった。409、411は無意味だ。スレ汚しすまん。
413 :
402:2008/07/16(水) 01:28:15 ID:???
すいません、発想を変えたらできました!!!!
cgiではなく、読み込む前のplファイル内でイジっていたら、うまくいったようです!
大変助かりました!
ありがとうございました!!
今回初めてperlでcgiを作ったのですがローカルサーバで動作を確認しようと
したのですがうまくいきませんでした。
このcgiはブラウザから引き渡されたデータを処理するのして記録(log)に残す
のですがInternal Server Errorになってしまいます。
perlのパスはあっていましたし、改行もLFでした。
apacheを使っている?のですが他のcgiは動いたのでapacheの設定は間違って
いないはずです。。。
cgi-lib.plを使っているのですがそれのパスが違うのと思いましたが
よくわかりません。
cgi-lib.plがあるフォルダのパスはそのフォルダをTerminalにつっこんで
でたパスをそのまんま書きました。
use lib'#ここにTerminalからのパス';みたいな感じです。
下にファイルのURLを張りましたのでどなたか教えて頂けないでしょうか?
よろしくお願いします<(_ _)>
http://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/356.zip
Macかいな。
InternalServerErrorのときは、その理由も別のエラーで出てるはずだが、apacheのログはどうなってる?
perl -wc
[confirm.cgi]
syntax error at confirm.cgi line 43, near "print"
[reservation.cgi]
Name "main::LOG" used only once: possible typo at reservation.cgi line 19.
あとコンソールから直接実行してみるのもいいよ。
ちょっとやってみたが、confirm.cgi の
>print "<HTML><BODY BGCOLOR=\"YELLOW\">\n"
この行の末尾に ; セミコロンがないからsyntax errorおこしてる。
418 :
414:2008/07/16(水) 11:49:34 ID:???
>>415-417 返信ありがとうございます<(_ _)>
たしかにセミコロンが抜けていました;つけるとちゃんと実行はできたの
ですが記録するlogファイルは作成されるのですが中身が空なのです。
>>416さんのreserve.cgiの警告は1回だけしか変数と言う警告みたいで
気にすることはないみたいな感じで書かれていました。
ファイルでに追加書き込みの部分が
open(LOG1,">>reserve.log");
print LOG "\"$yourname\",\"$phone\",\"$email\",\"$answer1\",\"$date\",\"$stay\",\"$answer2\"\n";
close(LOG1);
みたいな感じなのですがどこかおかしいでしょうか?
ファイルが存在しない場合は新規で作成してくれました。
カレントディレクトリに存在しなければ umask 666 で新規作成する。
とありましたがそこが問題なのでしょうか?umask 666;とopen関数の後に
入れても何も書き込まれなかったのですが...。
openがLOG1なのに、print が LOGなのはおかしいと思わないのか
あとファイルが作成できてたならパーミッションいじらんでいいよ。
suEXECで動いてるんだろう。
421 :
414:2008/07/16(水) 12:53:40 ID:???
>>419-420 回答ありがとうございます。
なんとも単純なミス・・・・
昨日から徹夜でしたので頭が回ってないようです;;
何度も確認してこれからは聞きたいと思います、ありがとうございました!
>>419 こういう時はperlはエラーを出さないの?
他の言語では出すの?
423 :
nobodyさん:2008/07/16(水) 22:30:17 ID:WNn5k82F
ちょっと教えてください。
パスワードで入室するだけのcgi部分なのですが、
設定された有効パスワード「$pwd」以外にも、もう一つ有効パスワード「$pass」を追加する場合、
どのようにすればいいでしょうか?
※「$pwd」と「$pass」の、どちらでも入室できるようにしたいのです。
$pass = '9999';
## --- パスワード暗号処理
sub passwd_encode {
$now = time;
($p1, $p2) = unpack("C2", $now);
$wk = $now / (60*60*24*7) + $p1 + $p2 - 8;
@saltset = ('a'..'z','A'..'Z','0'..'9','.','/');
$nsalt = $saltset[$wk % 64] . $saltset[$now % 64];
$encode_pwd = crypt($pwd, $nsalt);
}
## --- パスワード照合処理
sub passwd_decode {
if ($encode_pwd =~ /^\$1\$/) { $crptkey = 3; } # FreeBSDサーバ対応
else { $crptkey = 0; }
$check = "no";
if (crypt($pwd, substr($encode_pwd,$crptkey,2)) eq "$encode_pwd") {
$check = "yes";
}
}
424 :
423:2008/07/16(水) 22:33:12 ID:WNn5k82F
すいません、以下が照会部分です。
# パスワード照合
local($encode_pwd) = $pw;
&passwd_decode;
if ($check eq 'no') {
last;
&error("パスワードが違います","lock");
}
グローバル変数使いまくり、、、
>>422 ヲーニングを出すように設定すれば出るよ。
use wanings ;
use strict ;
らへん。
パスを2つ設定するという設計を見直したほうがいい。
>>423 実装自体は簡単で、有効なパスワードをひとつずつ順次判定して、有効なパスワードに合致した時点でその旨報告すれば良いだけです。
>>426 の言うように、単一のアカウントに複数の有効パスワードを設定する設計は必然性がなく、安全性は確実に下がるのでおすすめしません。
まさかとは思いますが万が一、全アカウントに共通のパスワードを付加しようとしているのであれば、ほとんど論外と言えます。
もしその目的なら別途管理者アカウントを実装されるのが良いでしょう。
蛇足ですが、良い本を一冊でよいので、買って読みましょう。
>>401 perlがその目的に向いているわけではなく、あの馬鹿がperlしか知らなかっただけ。
CGIゲームや、掲示板などでデータを保管する時
名前<>パス<>投稿時間<>メッセージ
などのように<>で区切りますが、<>を使う理由ってありますか?
,とか|で区切っているものも時々みかけますが、自分が見た中では
<>が一番多かったです。
掲示板ではタグが使えないから<や>が出現しないからです。
,とか|だと投稿記事に普通に含まれてるので。
,とか|だと普通のデータにも含まれ易い文字だからエスケープしないといけない
となると書き出しの時のエスケープに加えて読み出しの時もそのための処理が必要になる
<>だと,データに含まれてたとしても保存する時に&<&>にすればいいだけ
<>だと2バイト食うから、それなら非アスキー文字で\0とかで区切るとデータファイルを
テキストエディタで見ると変になるかもしれない
<のみで区切ると容量的には減るだろうがエディタで見たときデータ同士の区切りがピンとこないかな。。
<>の区切りがいいか悪いかはわからんが、KENTが配布してるCGIで広まったのかな?
俺はタブ区切りが一番好きだな。
>>430-431 なるほどねー
そういう理由がちゃんと書いてある
本とかWEBはあるのかな。
>>433 > そういう理由がちゃんと書いてある
> 本とかWEBはあるのかな。
何かの標準というわけでもなく、特定の実装でたまたまそれ("<>")が選ばれた、というだけなので、根拠を求めるなら当該実装のドキュメントを読むのが筋だろうと思います。
435 :
nobodyさん:2008/07/20(日) 21:44:54 ID:UlzGONXm
>>432 タブ区切りを好む奴はそもそもデータを触ったことが殆ど無い。まああくまで俺の偏見だが。
データの種類による
表示に違いの出るエスケープコードをデータから省いて区切り文字にするのが楽。
<>はタブの強調表示が出来ないメモ帳向け。
データ区切りに便乗。
aabbddedd<>1232345<>0<>qwer345566
abd<>123<>100<>derfgtg
となっちゃうデータを、見た目だけ
aabbddedd<>1232345<>0 <>qwer345566
abd <>123 <>100<>derfgtg
のように区切り文字あわせで表示してくれるようなエディタってないでしょうか。
>>438 perl -ple "s/<>/\t/g" > outfile.tsv
-> 続きは Excel で。
# 僕はその手のファイルを手編集せにゃならん事態は避けたい。
Excel表示なら、タブなんて選ばないわな。
RFC4180な素朴なCSVにしておけば、間違いなく誰のExcelでも同じように表示される。
タブに対応してないexcelってあんの?
それに、OOoならフツーによめるぞ。
いちいちメニュー→データのインポート→読み込むカラムや区切り文字の設定→・・・
とか、マンドクセー ってことでしょ?(しかもExcelが覚えてくれないし)
それに知ってるやつになら問題ないけど、よく知らんやつにも配布する、とかになると
開き方説明したり、「なんでこんな形式なんだー!」とかクレーム来ることうけあい。
タブ区切り=ニートまたは1人で細々
ウチの Excel、ダブルクリックで TSV を開いてくれるんだ。おかしいのか。
データの中身を弄らないという点でタブ区切りは楽なんだけど、ダメなのか。
>>446 必要な範囲で一貫性が維持できるならなんでも可。
好き嫌いは人それぞれナノ。
問題無い
ちゃんとCSVにすると "〜","〜","〜" だし
wqを外すとカンマを処理しなくちゃならないから俺もTSVにしてる
フォームだと通常はTAB含まれないので楽(コピペされると入るけど)
db使えよ
SQLite最高ですね
DB使うんだったら、プライマリキーとかインデックスを覚えてくれ・・・
453 :
449:2008/07/24(木) 03:39:07 ID:???
依頼仕事だと「エクセルでデータを見たい」とか言うバカがいるんだよ
どーせ見ねぇくせに・・・
データ保持はDBで、出力だけcsvだのexcel向けにしては
>>454 んだからよ、その出力形式の四方山話をしてんじゃねえのかよ。^^;
読み込みが面倒って話じゃないのかね
だったら出力だけCSVでいいじゃん
いい機会だしOOo導入汁
>>457 Sun の Java VM のインストーラに勧められて入れた。起動はしていない。
>>458 タスクにクイック起動が潜んでると思われw
>>459 見つかりません。ぼくの OOo は壊れているのでしょうか。
Perl と関係ないな…。
時間を扱うデータに取り組んでいるんですが、
たとえばグリニッジ標準時をを日本での何年何月何日何時何分何秒に直す方法は
あちこちで見かけます。
逆に何年何月何日何時何分何秒をグリニッジ標準時に
直すにはどんなふうにすればいいんでしょうか?
以前両方の換算をしてくれるサイトがあったと思うのですが、
URLを忘れてしまいました。
つ Date::Manip
463 :
nobodyさん:2008/07/29(火) 15:51:40 ID:PIvmZbRo
perlでcsvをtexの表の形にしたいんですが、
どうやったらいいか教えていただけないでしょうか?
正規表現を使うのはわかるのですが、いまいち流れがわかりません
何か参考サイトなどがあると良いのですが・・
>>463 use Text::CSV;
my $csv = Text::CSV->new({ binary => 1 });
my @texlines = ();
while (<>) {
$csv->parse($_) or die $!;
push @texlines, join( ' & ', $csv->fields($_) ) . " \\\\\n";
}
print @texlines;
# よく知らんけどこんな感じでいかがかしら。
TeXの表じゃなかったのか・・・
readdir() attempted on invalid dirhandle FILE
ってどういう意味
>>466 無効なディレクトリハンドル FILE を readdir() しようとしてコケました。
FILE はまだ開かれていないか、あるいは正しいディレクトリハンドルではないか、もしくは「俺は最初ッから、その FILE って名前が気に入らなかったんだよぉッッ……!」 な可能性があります。
血眼でデバグってください。
468 :
464:2008/07/30(水) 22:08:18 ID:???
>>465 てふの表て、カラム区切りが "&" で、ライン区切りが "\\" じゃなかったんですか?
実際よく知らないのでこれを機会に教えて星ス。
質問です。
掲示板cgiにアクセス解析cgiを組み込みたいと思っています。
そのアクセス解析は本来SSI用で、shtmlから
<!--#include virtual="./accesskaiseki.cgi?id=123456"-->
で呼び出すようになっています。
掲示板cgi内に
require './accesskaiseki.cgi';
と記述すると、とりあえずは動いているのですが、
「id=123456」の部分を送るにはどう記述すればいいんでしょうか?
お恥しい質問ですいません。
忍者か何か?
なんでidを送る必要があるの?
471 :
nobodyさん:2008/07/31(木) 12:30:12 ID:uEHg7ipC
質問なのですが今簡単なチャットみたいな物のcgiを作っているのですが
うまく表示できません。
構文エラーはでませんでした。
どのようにしたいかと言うと入力フォームに何かを書き込むと
投稿者のid(そのサイトに何番目にきたか)と入力したメッセージを順に表示したいのです。
メッセージと番号は他のログファイルに蓄積されていきます。
ログファイルにはメッセージは書き込まれるのですがidは空白になってしまいます;
どなたか教えて頂けないでしょうか?
ファイルは
http://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/380.txtです。
初心者なので変なタグを使っているかもしれません;
print "<INPUT TYPE=\"HIDDEN\" NAME=\"id\" VALUE=\"$count\">\n";
この行見ればわかるでしょ
>>472 返信ありがとうございます。
\nが不要でした!直したらできたのですが
ログファイルの中身を表示ができないんですよね;
open(FILE2,"+>>log.dat");
while($line=<FILE2>){
print $line;
}
で表示されないんですよね;
datファイルのパーミッションの問題なのでしょうか?
一応chmod 666 log.datをすると
Operation not permittedとでてしまいます。
本一冊読んでからやれ
すみませんないとかできました。
色々とすみませんでした。
せめて事後報告ぐらいすればまだ救われるのに。
477 :
469:2008/07/31(木) 17:47:51 ID:???
>>470 ページ名です。
ページ別に解析できるアクセス解析です。
外部のcgiではありません。
解決したやつはどの案件で、未解決なのはどれだよ。
これがわからんから答えにくいぞ。
479 :
466:2008/07/31(木) 18:19:18 ID:???
ではテンプレ
解決済み
○○○○○○○
○○○○○○○
○○○○○○○
未解決
○○○○○○○
○○○○○○○
○○○○○○○
解決済み
○○○○○○○
○○○○○●○
○○○○○○○
未解決
○○○○○○○
○○○○○○○
○○●○○○○
使い方チガウw
483 :
469:2008/07/31(木) 23:25:49 ID:???
自分は未解決です。
解る方いたら宜しくお願いします。
$ENV{QUERY_STRING}= 'id=123456'; してから require したらどうかな
>>469 ./accesskaiseki.cgi の仕様によります。
閲覧可能なのであれば、同プログラムのソースを読み解いてみましょう。
運が良ければ system("./accesskaiseki.cgi", "id=$page_id") で動作するかもしれません。たぶんしないけど。
独立したスクリプトファイルで、引数が重要な意味を持つものを require するのは大抵得策ではありません。
require はコードを、あなたのスクリプト内に読み込み、あなたのスクリプトの一部分であるかのように実行します。
独立したプログラムを呼ぶなら、代わりに system()、exec()、または `` 演算子を使うとよいでしょう。
それぞれ特徴があり、適切に使い分けるべきものですから、この機会に調べてみてください。
> お恥しい質問ですいません。
ここはくだすれ。気にスンナ。
486 :
469:2008/08/01(金) 00:25:55 ID:???
>>484 >>485 有難うございます。
今まで基本が無いままに、いくつかのCGIを強引に改造したりして使っていましたが、結局は遠回りしていたように思いました。
もう少し基本的なことから調べてやってみようと思います。
>>485さんの優しいお言葉に感謝します。
487 :
nobodyさん:2008/08/02(土) 07:23:12 ID:q/UXvg4W
すいません、教えてください。
いま、以下の記述により、$CがAAAの場合、「これはAAAパターンです」となるようにしてあります。
if ($A ne '' && $B ne '' && $C eq 'AAAA') {
$str = 'これはAAAAパターンです';
}
else {
$str = '';
}
これに付け足して、$CがBBBの場合、「これはBBBパターンです」となるようにしたいのですが、
その場合の記述を教えていただけると助かります。
よろしくお願いいたします。 m(_ _)m
>>487 $str = '';
if ($A ne '' && $B ne '' && ($C eq 'AAAA' || $C eq 'BBB')) {
$str = "これは$Cパターンです";
}
if ($C eq 'AAAA') {
$str = 'これはAAAAパターンです';
} elsif ($C eq 'BBBB') {
$str = 'これはBBBBパターンです';
} elsif ($C eq 'CCCC') {
$str = 'これはCCCCパターンです';
else {
$str = '(´・ω・`)';
}
490 :
487:2008/08/02(土) 16:13:10 ID:???
レスありがとうございました!
できました!!
感謝しています(^^)
>>490 感謝はもらっとくが、それよりも実施内容を報告してホシス。
492 :
487:2008/08/03(日) 18:35:47 ID:???
elsifで完璧に振り分けることができました。
(´・ω・`) は、もちろん使ってません(笑)
(´・ω・`) モレカワイソス
>>492 しょぼん使わないのは勝手だが、
全て外れた場合の処理はつけておけよ。
495 :
困った:2008/08/04(月) 00:04:55 ID:???
すいません、教えて下さい。
リングワールドっていうPerl言語で出来たブログを使わせてもらっているのですが、
そのブログのタイトル部にフラッシュを表示させたいのですが全くPerl言語が分からないので
やさしい方、教えて下さい。
作成者によると、現在はJPGなど画像表示が出来るようになってますが、フラッシュは無理とのこと。
改造は自由で、個人でしてくださいとの事です。
サイズは幅760ドットというのが前提らしいので、フラッシュもそれに合わせるつもりです。
多分この辺りだと思うのを次レスに書きますが、違う可能性もあるので
ttp://blog-imgs-26.fc2.com/i/k/a/ikajyef/tt.txt に全文アップしましたので、どうぞよろしくお願いします。
496 :
困った:2008/08/04(月) 00:05:44 ID:???
# タイトル画像の設定
my $title_html;
my $title_description_html;
if ( $title_description ne "" ) {
if ( $title_description ne "" ) {
$title_description_html .=<<HTML;
<div class="title_description">
$title_description
</div>
HTML
}
}
if ($title_image ne "") {
$title_html = <<TITLE;
<div class="title_box"><h1><a href="$config->{'toppage_url'}" class="title"><img src="$image_url/$title_image" border="0" alt="$title_str"></a></h1></div>
TITLE
} else {
$title_html = <<TITLE;
<div class="title_box">
<div style='padding:10px'>
<div class="title_string">
<h1>
<a href="$config->{'toppage_url'}" class="title">
$title_str
</a>
</h1>
</div>
$title_description_html
</div>
</div>
TITLE
perl関係無し
498 :
困った:2008/08/04(月) 00:15:53 ID:???
>>497 ま〜〜じ〜〜〜でぇ〜〜〜〜
ではコレはどこで聞けばいいのだろうか・・・
作者
500 :
困った:2008/08/04(月) 00:21:26 ID:???
>>499 作者の方に聞いたのですが、「ご自分で研究していただくようにお願いします。」
と、回答がありました・・・が、1から覚える時間が・・まぁ勝手な言い分ですが。
$title_html = <<TITLE;
↑
ここからここまでの間に好きなようにhtml書いてよ。
↓
TITLE
502 :
困った:2008/08/04(月) 00:27:04 ID:???
>>501 ありがとうございます。ちょっとやってみます。
503 :
困った:2008/08/04(月) 00:34:29 ID:???
504 :
困った:2008/08/04(月) 02:24:24 ID:???
出来ました!!!!!!凄くうれしい
$title_html = <<TITLE;
<paramname=quality value=high><param name=bgcolor value=#F7F7F7>
<embed src="
http://〜〜〜.swf" quality=high bgcolor=#F7F7F7 width=760 height=150 type="application/x-shockwave-flash" >
</embed>
TITLE
} else {
$title_html = <<TITLE;
<paramname=quality value=high><param name=bgcolor value=#F7F7F7>
<embed src="
http://〜〜〜.swf" quality=high bgcolor=#F7F7F7 width=760 height=150 type="application/x-shockwave-flash" >
</embed>
TITLE
よく分からないので合ってても違ってもフラッシュ表示しろ!みたいにしたら出来ました!
ありがとうございました。
perl6が出来ると相当文法変わるみたいですね
配列の書き方すら変わるそうで
すると、今からperl5のらくだ本とか買うのは無駄かな?
リャマはもう読破したんだが…Effectiveとか、クックブックとか、らくだ本に進んでみたいと思っています
ただ、正直安い本じゃないのでperl6の話を聞き迷っています。
それよりも、いつ出来上がるか分からないperl6の書籍を待つより、perl5のこれらの秀逸な文章を読んでしまった方がいいかな?
>>505 当分メジャーデビューしないしでても当分perl5は残るから大丈夫
モジュールがインストール出来ません、どうか解決のヒントをください
cpan[1]> install Gtk2
CPAN: Storable loaded ok (v2.18)
Going to read /root/.cpan/Metadata
Database was generated on Mon, 04 Aug 2008 19:02:47 GMT
CPAN: YAML loaded ok (v0.66)
Going to read /root/.cpan/build/
............................................................................DONE
Found 24 old builds, restored the state of 24
Running install for module 'Gtk2'
Running make for T/TS/TSCH/Gtk2-1.183.tar.gz
Has already been unwrapped into directory /root/.cpan/build/Gtk2-1.183-N08YV3
-- No Makefile created, won't make
Running make test
Make had some problems, won't test
Running make install
Make had some problems, won't install
>>507 Makefile.PL かなんかあんだろうから、そん中見て、わかんなかったら手で叩いて様子を見てみちゃどうか。
509 :
507:2008/08/06(水) 20:47:23 ID:???
>>508 亀レスになってしまって申し訳ありません
おかげさまで、Gtk2をインストールすることができました
感謝します
510 :
508:2008/08/07(木) 00:54:10 ID:???
>>509 >>491 参照。
どうやったらうまくいったね?
原因はなんだったんだろうね?
そういう情報が世界の役に立つのね。
感謝はおいしくいただきたいのね。
>>505 何が目的で本なんか読むんですか?
添付ドキュメントにざっと目を通した方がよほど良いと
思いますが。
>>511 本はセックスに似ている。
よいときはすごくよいし、よくなくてもないよりはましだ。
>>511みたいな、他人のやり方にいちいちけち付ける奴は、どこいっても煙たがられるな
プログラム業界では特に嫌われる罠。まあそれは勝ち組って事だが、他の業界でも大抵そうだから、結局だめな罠。
まあくだ質だから、こういうのも仕方ないかw
>>511 添付ドキュメント=perldoc≒ラクダ本
つまりラクダ本を読めと言うアドバイスですね。
まあまああんまし刺激するな
ここ荒らされてもこまるしな
でもオフラインドキュメントにもよさはあるよ。
だって、添付ドキュメントって英語だろ?
(↓)を思い出した
From: [330] デフォルトの名無しさん <sage>
Date: 2008/07/27(日) 00:15:07
>>327 勉強したいなら本ばっか読んでないで
プログラム書けよ
受験勉強じゃねーんだからw
らくだ本はperldocで代替できるから英文が読めれば不要。
日本語しか分からないというのなら、らくだ本じゃなくて翻訳ソフトを買うことを推奨する。
EffectivePerlは一通り読む。
クックブックは買って常備する。
Perlの質問の答えは、だいたいPerldocかクックブックのどっちかに載ってる。
書籍ネタが出てるので俺も質問
オライリーの「CGIプログラミング」って、初めてのPerl読んだくらいで理解できる?
それとも、続・初めてのPerlくらいの知識が要求されるんだろうか?
>>523 BOOK:
for ( @want_to_read ) {
$book = new Book($_);
$book->read($_);
if ( $book->did_understand() ) {
$book->sale_to('Book-off');
}
else {
push @read_later, $book;
}
next BOOK;
}
合法的に犯行予告が出来るサイトを造ったやつか。
それははまちゃんじゃないの?
みんなレンタルサーバ+cgiで使うなら、Apacheインストールしてローカルでテストするよね?
Apacheはかんたんにインストールできるけど、これって自分もサーバになるってことでしょ?
セキュリティとかむちゃくちゃ怖くない?
でも設定ファイルとか超難しいし…みんなどうやって勉強したの?
気になるなら自分だけallowするかイントラネットでやればいいと思うが
>>528 そんなに難しいかぁ?
ってか、cgiやhtml的な知識だけでなく、
そうゆうことも含めてテストしたり、調整、制御できるのが、
ローカルサーバー組む利点ではないのかな?
(なにも自鯖で公開するとかって意味ではなくね。)
ルータ内にあれば悩み事はかなり減るんじゃないかな。
とりあえず設定ファイルのアクセス制限を「俺専用」に書き換えるだけの
知識でいいんだからあんまり難しく考えなくていいよ。
よく分からないままいろいろ公開してる人よりは怖がってるぐらいのほうがいいかな。
>>528 つ[ VMware player + 好きなOS ]
533 :
nobodyさん:2008/08/10(日) 20:41:19 ID:SuPNfSed
すいません、教えてください。
$aaaa= とすると、該当する数値が例えば2と5と10のように複数ある場合、
この中で一番大きい数字を $aaaa_maxにしたいのですが、記述を教えてください。
説明が下手で申し訳ないのですが、伝わった方、よろしくお願いします。 m(_ _)m
534 :
533:2008/08/10(日) 20:48:29 ID:SuPNfSed
上の補足ですが、
$aaaa_max="$aaaaの中の一番大きい数値";
としたいのです。(^^;
>>534 $aaaa_max=0;
ループ{
$aaaa= ; # $aaaaをひとつ取得する (2,5,10)
if($aaaa>$aaaa_max){
$aaaa_max = $aaaa;
}
}
print $aaaa_max;
・モジュールと配列使うなら
use List::Util qw(max);
@aaaa = (2,5,10);
$aaaa_max = max @aaaa;
print $aaaa_max;
($aaaa_max) = sort { $b <=> $a } (2, 10, 5, 3, 9);
print $aaaa_max;
$aaaa が複数の値になるらしいからループ案でいいんだろうね。
$aaaa_max = (sort { $b <=> $a } (2, 10, 5))[0] ;
max関数ってなかったっけ?
数レス上も読まんのか…
そこらへんはカレーがスルーの方向で。
541 :
533:2008/08/12(火) 02:23:53 ID:ihBdNY6v
皆さんレスありがとうございました!
なんとか希望通りできました。
感謝してます。
もう一つ教えていただきたいのですが・・
$total_plus = $totalの数値 + $total{'count'}の数値
としたい場合の記述を教えていただけると助かります。
よろしくお願いします。 m(_ _)m
例によってスカラが複数の値を取る気配
543 :
541:2008/08/12(火) 02:56:40 ID:???
すいません、できました。
お騒がせしました。
544 :
nobodyさん:2008/08/12(火) 13:48:33 ID:Iypx/LW1
正規表現でマッチした行と、そこから下3行の計4行を
行ごとに配列にまとめたいのですがどうしたらいいでしょうか?
よろしくおねがいします。
545 :
nobodyさん:2008/08/12(火) 14:01:51 ID:??? BE:828610278-2BP(1)
sub {
my($fh,$cond) = @_;
while(<$fh>){
return [
$_,
$fh->eof ? undef : $fh->getline,
$fh->eof ? undef : $fh->getline,
$fh->eof ? undef : $fh->getline,
] if /$cond/;
}
return;
}
>>544 カスタマイズは自分でしてね。
use Data::Dumper ;
my @arr ;
while (<>) {
next if ! /Data/ ;
push @arr, [ $_, map{ eof() ? () : scalar <> ; } 0 .. 2 ] ;
# 一箇所限定なら、以下でも良いんじゃね?
# push @arr, $_, map{ eof() ? () : scalar <> ; } 0 .. 2 ;
# last ;
}
print Dumper \@arr ;
おっと、もちろん正規表現中の文字はDataじゃなくて御自分のを
マッチした時、3行スキップしてないか?
>>548 「マッチした時の当該3行の再マッチ」はスキップしてる。
提示されて無いもんで。
@lines = read_file(ふぁいる)
してしまえばヤリたい放題でつ (><;)
Undefined subroutine &main::read_file called at (><)
Can't locate File/Slurp.pm in @INC (@INC contains: ><;)
use File::Slurp;
my @lines = read_file('foooooooooo.txt');
chomp(@lines);
my @list;
foreach(0..$#lines){
$lines[$_] =~ m/hogehoge/ or next;
push(@list, [@lines[$_..$_+3]]);
}
これで、ヤリたい放題になるって本当ですか?
>>552 ヤリたいコトとヤる相手とヤる場所によります。
気取ったイケメンが自宅四畳半なら
>>545。
慣れない奴がミラパルコで大回転なら
>>546。
絶倫がロイヤルスイートで小さい相手とヤるなら
>>552。
それぞれ可能なオプションが異なります。
つまんねえよ。
print <<HTML;
とやるとHTMLとしてブラウザ上に出力されるのは分かるのですが、同じようなやり方で
ファイル出力をする方法はないでしょうか?
一々
print FILE $mojiretu;
と打つのもアレなので、何か方法があったらよろしくお願いいたします。
利用環境
フリーのCGIサーバー:isweb
対象ブラウザ(関係ないと思いますが……):基本的にFireFox2,3、ie6,7、OSはwin、macで動けばいいと考えています。
以上です。よろしくお願いいたします。
>と打つのもアレなので
アレって?
558 :
556:2008/08/17(日) 18:22:55 ID:???
>>557 申し訳ありません。
一々
print FILE $mojiretu;
と打つのも面倒なので、何か方法があったらよろしくお願いいたします。
と訂正します。
>print FILE $mojiretu;
え? これ打つのが面倒なの?
プログラミングやめた方がいいよ
$mojiretu<<HTML;
{ここに文字列を入力する}
{ここに文字列を入力する}
{ここに文字列を入力する}
HTML
print FILE $mojiretu;
print FILE <<HTML;
なんたら
なんたら
HTML
562 :
556:2008/08/17(日) 20:07:42 ID:???
皆様有難うございます。
ヒアドキュメントというキーワード(560さんや561さんが教えてくださったもの)で調べたら、目的の物がありました。
本当に有難うございます。
563 :
556:2008/08/19(火) 02:01:55 ID:???
ちなみに今日は快便でした
564 :
556:2008/08/20(水) 00:20:47 ID:Pb480w2m
あ、べつにいつものことなんですけどねw
565 :
556:2008/08/20(水) 05:37:21 ID:???
うんち、今日はやや下痢。
昨日の、スポーツドリンクがいけなかったのかしら。
566 :
556:2008/08/21(木) 04:50:49 ID:???
おきた。今日のウンチ、かなりしぶとい。
小さい塊が、まだ少し入っているようだ。
567 :
556:2008/08/21(木) 17:33:02 ID:???
やっと今残りの塊が出た
うんち日記ワロスwwwwwwwwww
569 :
556:2008/08/22(金) 09:40:41 ID:???
うんち、今日はなかなかでず。(昨日の反動か?)
仕方なく会社で用を足す。俺の階は、大便用が3つしかないから、朝はラッシュ時に壮絶なバトルが、展開される。。。
クソレスって言って欲しいだけだろ。
ハッシュ名に変数を使うにはどうすればよいのでしょうか?
hoge$hensu{key}のような感じなのですが…
シンボリックリファレンスを使えば望みどおりのことができます。
${"hoge$hensu"}{key}
ただしこれが可能なのは以下の条件を満たす場合です:
- 対象のハッシュがパッケージグローバルであること。
- それを行うスコープで事前に no strict 'refs' して制限を緩めておくこと。
# もちろんコード全体を use strict していますよね?
より望ましい解は
>>572 が言うように「シンボリックではない」リファレンスを使うことです。
リファレンスを活用した「ハッシュのハッシュ」、すなわち二次元ハッシュがあなたの望むものです。
%hoge = ();
$hoge{'hoshinoa'}{key} = 'ki';
$hensu = 'hoshinoa';
print $hensu, $hoge{$hensu}{key}, "\n";
この方法には前述のような制限がありません。
シンボリックリファレンスが strict で制限されていることからも分かるように、イマドキはこちらが主流です。
ありがとうございます
よくわかりませんががんばろうと思います><
なんかすげーむずかしそうだな。
576 :
573:2008/08/23(土) 00:45:43 ID:???
説明下手でごめんよぅ。
元の
>>571 の質問に関する話題は perlfaq7 の "How can I use a variable as a variable name?" で詳しく触れられています。
さらに、リファレンスについては perlreftut, perlref の両ドキュメントに、また多次元配列及びハッシュについて perllol に、もっと詳しい話が載っています。
ぜひ見てみてください。
$hoge{ほしのあ}{キー} に「き」を代入して、$hensu に「ほしのあ」を代入して、
はい表示が「ほしのあき」になりましたってやかましいんじゃ、というお話だから
そんなに難しいことじゃないよ。
>>573 何か疲れてませんか。
578 :
573:2008/08/23(土) 00:56:40 ID:???
>>577 分かりやすい素敵な説明ありがとうございます。
# 認めたくないものだな……、昨日未明まで客先でトラブっててロクに寝ないまま一日働いた後だということを……。
>>577 何を言ってるのか、さっぱりわからん><
多次元ハッシュは
%hash{'$hensu'} = (
'AA' => 'AA',
'BB' => 1,
'CC' => 65,
'DD' => 1200
);
のようにリストで代入することはできないのでしょうか、
perllolをみたんですけど多くの数を一度に代入する方法について載ってないような、
>>580 「多次元ハッシュ」などと事実とことなる認識の仕方を
しているから、3秒考えればわかることを思いつけないんだ。
別のワードでググッたらでましたすみませんでした
583 :
nobodyさん:2008/08/24(日) 13:25:05 ID:abdzrOGO
すみません教えてください。
環境はMac OS X 10.5.4, Perl 5.8.8です。
CPANでXML::Atomをインストールしたいのですが、
make testの段階で以下のようにFailedになっている箇所があって
インストールできません
| t/00-compile...........ok
| t/01-util..............ok
| t/02-content...........ok 1/32
| # Failed test in t/02-content.t at line 57.
| # got: 'My name is 宮川.'
| # expected: 'My name is 宮川.'
| t/02-content...........NOK 22# Looks like you failed 1 test of 32.
| t/02-content...........dubious
| Test returned status 1 (wstat 256, 0x100)
| DIED. FAILED test 22
02-contentというファイルで実際にテストしているっぽい部分は以下のようになっていました
| $content->body("My name is \xe5\xae\xae\xe5\xb7\x9d.");
| is $content->mode, 'xml';
| is $content->body, "My name is \xe5\xae\xae\xe5\xb7\x9d.";
「\xe5\xae\xae\xe5\xb7\x9d」を「宮川」という漢字として
出力できていないのが原因っぽい気がするのですが。。
解決の方向性だけでもご教示いただけると助かります。
よろしくお願いします。
584 :
583:2008/08/24(日) 13:32:45 ID:abdzrOGO
すみません、上の書き込みでバックスラッシュを半角で書き込んだら
意図した通り表示されなかったのですが、
実際は以下のようにgot:〜の行には文字コード(?)、
expected:〜の行には「宮川」という漢字が表示される状態です。
| # got: 'My name is \xe5\xae\xae\xe5\xb7\x9d..'
| # expected: 'My name is 宮川.'
585 :
583:2008/08/24(日) 13:37:07 ID:???
たびたびすみません、今度こそ最後にします
以下のような出力でした。実際は&が半角です。
| # got: 'My name is &#x5BAE;&#x5DDD;.'
| # expected: 'My name is 宮川.'
\ と バックスラッシュは同じ文字コードで、フォントで切り替えるから気にしないでいい。
で、\xe5\xae\xae\xe5\xb7\x9dは、UTF-8で「宮川」だ
何が知りたいんだっけ?
モジュールWWW::Mechanizeでクッキーを受けとるにはどうしたらよいのですか?
for (2000000000000000..3000000000000000) {
なんちゃら…
}
とやったら、Range iterator outside integer range と叱られました。
桁デカ杉なんでしょうか。どうすればいいですか?(><)
>>583 $content->mode は xml で合っていて、
$content->body は (x|x?ht)ml の文字参照に置き換えられている状態ですね。
その動作でかまわなければ、
t/02-content.pl 内の、
is $content->body, "My name is \xe5\xae\xae\xe5\xb7\x9d.";
を以下に変更すればそのテストに関しては通ると思われます。
is $content->body, "My name is 宮川.";
その動作ではまずい場合は、モジュール内の関連コードをいじるしかないかなあ。
>588 Math::Bigint
>>590 ありがとうございます!
ググったら分かる人が分かる人向けに書いたドキュメントしかみつかりません(><)
もう少しググって諦めます。
あきらめたらそこで試合終了でした。
593 :
590:2008/08/24(日) 20:43:08 ID:???
>>591 5.8.0 から導入された bigint プラグマを使う方法もある。遅いがちゃんと動く。
use bigint;
# あとは何も考えずに書くだけ。
# さすがにこれならおまえでもやれる。がんばれ。
# 遅いので部分的に無効にしたい場合
{
no bigint;
# bigint じゃなくてもいい処理
}
>>593 use bigint;
for (2000000000000000..3000000000000000) {
なんちゃら…
}
!Range iterator outside integer range at…
ActivePerl 5.8.8 Build 822 (><)あーーー
>>587 マルチ乙。
>>594 こう書くしかないんじゃ?
for (my $i = 2000000000000000; $i <= 3000000000000000; $i++) {
つかなんで、くだすれに質問してんだか。
596 :
583:2008/08/24(日) 21:22:33 ID:???
>>586 レスありがとうございます。
わかりにくくて申し訳ないです。
状況としては本来「宮川」と表示されるべき文字列が、
HTMLの文字参照に置き換えられて「&#x5BAE;&#x5DDD;」となっているので
make testでひっかかっているという状況でした。
>>589 ありがとうございますー。
話がわかっていただけて嬉しいです。エスパーですね。
私も先程なんとか文字参照に置き換えられているのに気付いて
モジュールのソースとにらめっこしたんですが
それらしい部分を見つけられず。。
…と思ったら、libxml2のバージョンが古いと
非ASCII文字が強制的に文字参照に変換されてしまうらしいです。
MacPortsで新しいバージョンのlibxml2を入れたら解決しました!
いろいろとありがとうございましたー。
>>593,595
こんな便利なものがあるんだな。
質問者さんは 2e+15 から 3e+15 までループが回って解決でいいんだけど、別方面が。
>>590 perldoc perldiag
> Range iterator outside integer range
> (F) One (or both) of the numeric arguments to the range operator ".." are outside the range
> which can be represented by integers internally. (snip
use Math::BigInt;
my $num = Math::BigInt->new('2000000000000000');
my $addone = $num + "1";
for ($num .. $addone) { sleep 1 }
Range iterator outside integer range at - line 4.
use feature qw( :5.10 );
system q|cls|;
use bigint;
use Win32::Sound;
$|=1;
#----------------------------------
for (my $i = 2000000000000000; $i <= 3000000000000000; $i++) {
say "$i";
Win32::Sound::Play("file.wav");
}
↑こりゃーおもろい
601 :
590:2008/08/24(日) 23:16:40 ID:???
>>599 おお。そゆことだったんですね。
さらに、
> One possible workaround is to force Perl to use magical string increment
> by prepending "0" to your numbers.
ということは…、
for ('02000000000000000'..'03000000000000000') {}
おおぅ、これで動作したよおい。^^;
なるほど。マジカルインクリメント使えるのね。
use utf8;
use open IO => ":encoding(cp932)";
binmode STDIN => ":encoding(cp932)";
binmode STDOUT => ":encoding(cp932)";
binmode STDERR => ":encoding(cp932)";
use Encode;
use feature qw( :5.10 );
for (my $a=10000;$a>=1;$a=$a-1){
system q|cls|;
say "お前の寿命はあと".$a."秒";
}
file:///C:/Kudasure/〜で直接リンクしてあって、
Webサーバ等は起動していません。
……Webサーバを通す
607 :
604:2008/09/01(月) 11:04:42 ID:???
文字列を渡してローカルで処理したいだけなので、
Webサーバを常駐させたくないんです。
他にKudasure.plに文字列を渡す方法があれば教えてください。
Kudasure.pl自体は動作してます。
609 :
604:2008/09/01(月) 11:43:44 ID:???
>>608 やりたい事はまさにそれなんですが、URLのリストが沢山あって
それを保存してます。htmlなら一覧を見られて1クリックで実行できます。
そのhtmlから
>>608みたいに羅列して
バッチファイルを作っちゃダメなの?
611 :
604:2008/09/01(月) 12:25:44 ID:???
○○.batを作れということですか?
リストのどれがクリックされるか分からないので
html生成時にバッチファイルを作成できません。
インターフェースがHTMLならWebサーバ経由で叩くしかない
直接実行できたら問題あるだろjk
もう、ローカルにapacheでも入れたら?
>>607 > Webサーバを常駐させたくないんです。
Windowsにはスーパーサーバって無いの?
615 :
604:2008/09/01(月) 12:43:12 ID:???
>直接実行できたら問題あるだろjk
Perlスクリプトの実行自体はfx3で問題なくできてます。
Webサーバはインストールしてありますが、
ツールのために常時起動させたくなくて質問しました。
直リン、ワンクリックで使えると便利なので。
しかし、出来ないと分かって諦めがつきました。
クリップボードで渡してみる事にします。
あ、ほんとだfirefoxだとできるんだすげー
firefox3だけど、perlのスクリプト、実行されないよ。
うちだけ?
>>615 ならfirefox3スレで聞くべき内容じゃん
何気に便利だったりする。
そもそも実行環境が無いとか
621 :
nobodyさん:2008/09/03(水) 22:14:02 ID:Mtq7kJsd
サイトに来た人のIPアドレスを記録するスクリプトを作りたいと思っています。
===ソースコード===
1 #!/usr/bin/perl
2
3 $IP_addr = $ENV{REMOTE_ADDR};
4
5 if ($count = open(OUT, ">>List.dat")) {
6 flock OUT, 2;
7 print OUT $IP_addr;
8 flock OUT, 8;
9 close OUT;
10 } else {
11 $count = 100;
12 }
13
14 print "Content-type: text/html\n\n";
15 print "IPアドレス:", $ENV{REMOTE_ADDR}, "<br>";
16 print '$count = ', $count;
これを実行してみると、ファイルが開けずに$count=100が表示されてしまいます。
同じフォルダ内でopen関数は使えたので、できそうな感じはするのですができません。
どこを書き直したら、IPアドレスを記録してくれるのか教えてもらえないでしょうか。
お願いします。
List.datが既存なら書き込み権限があるかどうか
List.datを作成ならそのディレクトリに実行権と書き込み権があるかどうか
623 :
621:2008/09/03(水) 23:04:45 ID:Mtq7kJsd
>>622 アドバイスありがとうございます。
解決しました・・・。
/var/www/htmlに上のスクリプトを置いてあるのですが、
/var/www/htmlとスクリプトのパーミッションは777なので、
書き込み権限はあると思います。
後はスクリプトのほうでファイルを作成してくれるのかと思いましたが、
作成されていなかったのですが、
List.datを用意してあげたら問題なく書き込めました。
open (OUT, ">>List.dat")の追加書き込みでは、ファイルがなければ作成する、と
手元の参考書に書いてあったのですが何が原因だったのでしょう・・・。
>>623 この場合、スクリプト自身のパーミッションは関係しません。
List.dat を置くディレクトリのパーミッションが重要です。
>>623 > 手元の参考書に書いてあったのですが何が原因だったのでしょう・・・。
それを調べられるのはお前だけ。
そういうのは777じゃなくてギリギリ最低限のパーミッションはいくつか、を常に考えたほうがいいよ。
わかってしまえばこの手のことに悩まなくなるよ
> 5 if ($count = open(OUT, ">>List.dat")) {
ここで $count にどんな値が入るという想定になってるんだろ。
ActivePerlを下ろしてきてインストール後cpanからモジュールを
下ろしcpan モジュール名としたところ
Alert: While trying to 'parse' YAML file
'D:\Perl\cpan\FTPstats.yml'
with 'YAML::XS' the following error was encountered:
Usage: YAML::XS::LibYAML::Load(yaml_str) at D:\Perl\lib/YAML/XS.pm line 70.
というエラーらしきものがでて先に進むことがができません。他に何か必要
なのでしょうか?
PPMでやるんじゃない?
できました、ありがとうございます
>>627 perldoc -f open を穴が開くまで嫁。
632 :
627:2008/09/05(金) 01:45:29 ID:???
>>631 > Open returns nonzero upon success, the undefined value otherwise.
> If the open involved a pipe, the return value happens to be the pid of the subprocess.
こういう値を「$count に代入して表示」するコード(
>>621)に疑問を持ったんだけど、読み足りない?
穴が開くほどは読んでない。
>>632 じゃあ通りすがりのおれが特別に教えてやるよ
>>621はIPアドレスを記録するのが目的で、$countは制御がどこに移ったかを確認するためだけのもの
ま、if文で必ず真偽が代入されるからelseは余計だけどな
634 :
627:2008/09/05(金) 02:41:42 ID:???
>>633 特別に教えてくれてありがとう。「else なら 100」用ということで。
$is_success ぐらいのほうが似合うぞぐらいの気持ちで書いたもんに
>>631が来るとは思わなかった。
635 :
631:2008/09/05(金) 02:53:49 ID:???
>>634 失礼した。カルシウム足りないらしい。
ブールで済む話ならむしろ代入は要らんし、
>>621 程度の処理なら or die でも事足りるところを、
あえて表示用に拾ってるなら
>>633 ってことだね。
プログラム板から越してきました。
ActivePerl 5.10 で Mail::IMAPClient を使って、Gmail に接続。
未読メールの添付ファイルを取ってくる……というスクリプトを書いているのですが、
取ってきた添付ファイルが軒並み破損してしまっており、正常なものが取得できません。
具体的にどんな感じになるのかというと、
PDF = ファイルが壊れている、と出て開けない。
JPG = 画像の下の方がブロックノイズ(最後までデータができていないっぽい)
HTM = ファイルの最後の方で途切れてしまう。
TXT = ファイル末尾に謎の文字化け。(=ェ攵モ]スクラmエ輜オラ ←こんなのが。なんだこりゃ。)
となります。
ソースは
>>637 に貼ります。
どのようにしたら、正常なファイルを取得することができるのか教えていただけないでしょうか?
use strict;
use MIME::Parser;
use Mail::IMAPClient;
use IO::Socket::SSL;
my $parser = new MIME::Parser;
$parser->output_to_core(1);
my $socket = IO::Socket::SSL->new(PeerAddr => 'imap.gmail.com',PeerPort => 993) or die "socket(): $@";
my $client = Mail::IMAPClient->new(Socket => $socket, User => 'user', Password => 'password') or die "new(): $@";
if ( $client->IsAuthenticated() ){
$client->select('INBOX');
my @uid = $client->unseen;
foreach my $id (@uid) {
my $message = $client->message_string($id) or warn "Timeout!";
my $entity = $parser->parse_data($message);
my $header = $entity->head;
if ( $entity->is_multipart ){
my $parts_count = $entity->parts;
for (my $i = 1; $i < $parts_count; $i++) {
my $part_entity = $entity->parts($i);
my $filename = $part_entity->head->recommended_filename;
my $filebody = $part_entity->bodyhandle->as_string;
open(FILE, ">$filename");
print FILE $filebody;
close(FILE);
}
}
}
}
>>636 超初心者用スレで質問する内容じゃないと思うけど。。。
テキストファイルも化けてるから解決にはならないと思うけど、binmodeはしたほうがいい
639 :
636:2008/09/05(金) 11:54:09 ID:???
>>638 他に質問スレが見あたらなかったもので……スミマセン。
binmode も試している(先のソースじゃ消えてしまってました)のですが、やはり同様です。
ただ、binmode にしないと JPG ファイルは読み込みすらできなくなります。
ここでかれこれ数時間詰まっちゃってますヽ(´Д`;)ノ
>>636 > どのようにしたら、正常なファイルを取得することができるのか教えていただけないでしょうか?
クイズ?
>>636 > どのようにしたら、正常なファイルを取得することができるのか教えていただけないでしょうか?
デバッグして問題点を見つけ出し、そこを修正すれば良い。
MIME::Parserだな
644 :
636:2008/09/05(金) 18:59:17 ID:???
確かにデバッグして問題点見つけられればいいんですが、正直お手上げ状態なんです。
>>641 添付無しのメール、本文を抜き取る分には問題ないみたいです。
ただ添付ファイルを拾おうとすると、前述のとおりに問題が出てしまいます。
>>643 MIME::Parser の使い方がどこかおかしいでしょうか。初めて使うモジュールなもので……。
>>644 > 添付無しのメール、本文を抜き取る分には問題ないみたいです。
> ただ添付ファイルを拾おうとすると、前述のとおりに問題が出てしまいます。
じゃあ、問題ないメールをgmailを通さずに直接パーザに食わせて見ろ。
>>645 おおお、いけました!
Mail::IMAPClient の message_to_file で一度ファイルに保存してから、
MIME::Parser で処理したら正常にファイルを取得することができました。
公開されてるモジュールでこんなこともあるんですね。勉強になりました。
>>646 品質が高いから公開されているのじゃあない。
公開してフィードバックを活かすから品質が上がるのだ。
# CPAN でもマイナーモジュールの中にはソースがアレなのもたくさんあるのよ。
解決おめでとう。
現象を David にレポートして、そのサイクルに貢献するのも一興。
649 :
nobodyさん:2008/09/11(木) 04:32:33 ID:Fj1BKArt
perl初心者です。よろしくお願いします。
複数の行からなる配列を特定の行で行ったソートと同じ順に並び変えたいのですがうまくいきません。
例として下の@hairetu1を昇順にソートして、それと同じソートを他の4つの配列にも施したいです。
@hairetu1=[30,80,50,90]
@hairetu2=[3,8,5,9]
@hairetu3=[さん,はち,ご,きゅう]
@hairetu4=[a,b,c,d]
@hairetu5=[3305,2206,1600,1128]
↑を↓の様にソートしたいのです。
@hairetu1=[90,80,50,30]
@hairetu2=[9,8,5,3]
@hairetu3=[きゅう,はち,ご,さん]
@hairetu4=[d,b,c,a]
@hairetu5=[1128,2206,1600,3305]
みなさんは複行配列のソートはどうされているのでしょうか
お教えいただけませんでしょうか。どつぼにはまっています。
$a <=> $b −−>大きくなる順番だから、「昇順」
$b <=> $a −−−>小さくなる順番だから、「降順」
用語はこれで合ってる?
@hairetu5=[1128,2206,1600,3305]
これってどういうルールで並び替えたのかよくわからない。
単に間違い?
@hairetu3=[さん,はち,ご,きゅう]
↑これってそのままだと無理だよね?
まず、数字ではないから、数値ソートは使えない。
文字列ソートはできるが、それって単に
アスキーの順番に並び替えるだけだから。
だから、どうしてもというなら、ハッシュで
3→さん
8→はち
9→きゅう
みたいな対応表を作っておいて、それで
3,8,9を数値ソートする、という風にしないと
だめなんじゃないかな。
phpの人です
perlでHello worldと文字列を出力したいのですが表示されません
perlはc:\perlにはいってて、perl.exeはbinの中にあります
どのように書き直したら文字列を出力できますでしょうか?
#!/c:\perl\bin\perl.exe
print "<html><head><title>テストperl</title></head><body>";
print "Hello world\n";
print "</body></html>";
お前は何を言ってるんだ
>>653 #!C:/Perl/bin/perl.exe
print "<html><head><title>テストperl</title></head><body>";
print "Hello world\n";
print "</body></html>";
をtest.plと保存して、
http://hoge/test.pl をアクセスしてみろ。
wwwサーバ使った実行ならヘッダも書いとけ
Content-Type: text/html
>>649 用途に向いたデータ構造に変更しましょう。
> @hairetu1=[30,80,50,90]
もし本当にこうだとすると、以下と等価であり、
少々不自然で扱いづらいでしょう。
@hairetu1 = ( [30,80,50,90] );
# @hairetu1 は $hairetu1[0] に無名配列リファレンスを持つ、
# 1要素のみの配列になっている点に注意。
以下は一例です。
@hairetu = (
[qw( 30 3 a 3305 さん )],
[qw( 80 8 b 2206 はち )],
[qw( 50 5 c 1128 ご )],
[qw( 90 9 d 1128 きゅう )],
);
あとは値を比較した結果を使って @hairetu の要素を入れ換える操作を行えばおっけー。
その辺の操作は調べると見つかるのでがんばって。
ワロタ
661 :
nobodyさん:2008/09/11(木) 11:07:57 ID:n+/h4em7
あっはっはwwwwwまだこのスレあったのかwwwwww
いつまでクソ言語にしがみついてんだよテメエらwwwww
いま時代はRuby,php,pythonだろwwww
乗り遅れ乙wwwww
うぇっwwうぇwww時代に乗れなくてくやしいのうwwくやしいのうwwwwww
>>649 my @hairetu1=(30,80,50,90);
my @hairetu2=(3,8,5,9);
my @hairetu3=qw/さん はち ご きゅう/;
my @hairetu4=qw/a b c d/;
my @hairetu5=(3305,2206,1600,1128);
my @array;
for (0..4) {
push @array, join(',', $hairetu1[$_], $hairetu2[$_], $hairetu3[$_], $hairetu4[$_], $hairetu5[$_]);
}
@array = sort { $b cmp $a } @array; # <=> かもしれないけどなんとなく cmp
print join("\n", @array); # この順にしたいんですよね
Excel みたいな「行と列」を思い浮かべながら @hairetu1, 略, @hairetu5 で
再現しようとするからどつぼなんだと思う。
my @hairetu1 = (30,80,50,90);
my @hairetu2 = (3,8,5,9);
my @hairetu3 = ('さん','はち','ご','きゅう');
my @hairetu4 = qw(a b c d);
my @hairetu5 = (3305,2206,1600,1128);
my @narabi = sort{$hairetu1[$b] <=> $hairetu1[$a]} (0..$#hairetu1);
foreach(\@hairetu1, \@hairetu2, \@hairetu3, \@hairetu4, \@hairetu5){
@{$_} = @{$_}[@narabi];
}
--
my @hairetu = ([30,3,'さん','a',3305], [80,8,'はち','b',2206],[50,5,'ご','c',1600], [90,9,'きゅう','d',1128]);
@hairetu = sort{$b->[0] <=> $a->[0]} @hairetu;
普通はこっち。
この超絶簡単な例題に、どうしたらそういう答え(つか思いきりバッドノウハウ)を
思いつくのか理解出来ん。データ構造が腐ってるってのを置いとくにしても、、、
my @ind = sort { $hairetu1[$b] <=> $hairetu1[$a] } 0 .. 3 ;
@hairetu1 = map{ $hairetu1[$_] } @ind ;
@hairetu2 = map{ $hairetu2[$_] } @ind ;
# 略
@hairetu5 = map{ $hairetu5[$_] } @ind ;
ちなみに自分でデータ構造から考えるなら二次元配列かhashにするに決ってる、こんなもん。
666 :
649:2008/09/11(木) 14:32:27 ID:MBV8c4KU
皆さんどうもありがとうございます。助かります。
今から皆さんが教えてくれたのを全部試してやってみます。
つか自分超絶初心者です。。。
いいプログラム作れる様がんばります。
死んじゃダメだよ! ゼッタイ。
668 :
662:2008/09/11(木) 15:35:31 ID:???
>>664 俺ですね。
他の配列のソート順でgdgdしてたので、質問者さんがわかりそうな道具で
「こういう感覚ですかね?」と書こうとした(ものがアレすぎたのでお怒りになった)んですけど
寝とけばよかったです。0 .. 4 とか書いてるし。
くだすれなのに「腐ってる」「こんなもん」なんてことになってるのも、その怒りの余波だと思うので
質問者さん、すみません。
669 :
nobodyさん:2008/09/11(木) 18:40:06 ID:h0fBdZdn
初心者なんですが、すいません。
コードを読んでいると$hoge[2]とかいうのはわかるんですが、
$hoge[1][0][0]=3;
$hoge[1][0][1]=5;
$hoge[1][0][2]=7;
とかいうのが出てきたんですが、これは何を意味しているんでしょうか?
どういう意味で多次元配列使ったかは本人に聞く以外にはないと思う
673 :
669:2008/09/11(木) 19:14:29 ID:h0fBdZdn
多次元配列ですか。ありがとうございます。調べてみます。
ところで、
$hoge[1][0][0]=3;
$hoge[1][0][1]=5;
$hoge[1][0][2]=7;
の場合、
@hoge=( [ [*,*,*], [*,*,*], [*,*,*] ], [ [3,5,7], [*,*,*], [*,*,*] ], …)という感じでしょうか?
だとしたら、この3,5,7だけを
@list=(3,5,7)の様にひとつの配列にするにはどうすれば良いでしょうか。
何度もすいません。
@list = @{$hoge[1][0]}
675 :
669:2008/09/12(金) 00:22:15 ID:Oy+yCkpG
676 :
nobodyさん:2008/09/22(月) 04:48:26 ID:aVlitntf
すいません、超初心者です。
@a = ([5,8,0,50], [4,6,1,30], [3,7,1,200], [5,8,1,50], [3,8,0,150], [2,9,0,110])
grepを使って、上の配列から3つ目が1のものだけを抜き出して、
@b = ([4,6,1,30], [3,7,1,200], [5,8,1,50])
としたいのですが、どのように記述すればいいのでしょうか。
@b = grep { $_->[2] == 1 } @a
foreach $_ (@b) {
print "@$_\n";
}
↑結果を表示するには
このコードでいい?
やってみてから書き込め
それ!
それがだいじ
> ↑結果を表示するには
> このコードが窮極?
って質問すればいいんじゃないかな
TMTOWTDI
って答えが返ってくるんじゃないかな
683 :
676:2008/09/25(木) 01:55:10 ID:rnTIMd1p
>>677 ありがとうございました。
返事が遅れてすいません。
なぜかホスト規制くらって2〜3日アクセスできませんでした。orz
684 :
nobodyさん:2008/10/03(金) 16:52:32 ID:Rl6ONEmX
すいません、超初心者です。
↓の様な記述ですが、
my $flag = (!$a) ? random(3) : random(11));
↑これは、
$aの値が無ければ3未満のランダムの数を$flagに代入、
$aの値が存在すれば11未満のランダムの数をで$flagに代入
ですよね。
ただ、↓の様なのがあって、どうしても意味がわかりません。
my $flag = (!$a) ? !($b >= random(100)) : (($c <= $a) ? random(3) : random(11));
↑これはどのように解すれば良いのでしょうか。
>>684 random てのが何を示すか分らんが…。
! ( $b >= random(100) ) は確実に0、1しか返さんから変に思えるが、
まあ、アリではあるので。
ポイントは、
1. 条件式「!($b >= random(100)) 」を式としてではなく値として利用。
2. 三項演算子の二段がさね。
my $res = COND ? TRUE_EXPR_1
: ( COND ? TRUE_EXPR_2
: FALSE_EXPR_2 ) # FALSE_EXPR_1
;
my $flag
= ! $a # CONDITION
? !($b >= random(100)) # TRUE_EXPRESSION
: # FALSE_EXPRESSION ( だかその中にさらに三項演算子)
(
($c <= $a) # CONDITION
? random(3) # TRUE_EXPRESSION
: random(11) # FALSE_EXPRESSION
)
;
分けると
my $pre_flag = ($c <= $a) ? random(3) : random(11) ;
myy $flag = ! $a ? !($b >= random(100)) : $pre_flag ;
686 :
Perlについて教えてください。:2008/10/03(金) 18:04:37 ID:PunwVHG2
cgi掲示板なのですが、ログインすると文字化けしてまして、
コードがISO、西ヨーロッパなどとなってしまうのです。
そこで、headerの部分にcharset=を含めようとしてるのですが、
何度やっても、500エラーになってしまいます。
sub header {
print "Content-type: text/html\n\n";
print "<!--//HEAD//-->\n";
print "<html><head>\n";
print "<META http-equiv="Content-type" content="text/html; charset=Shift_JIS">\n"
print "<title>CGI Control Panel</title>\n";
print "<META http-equiv="Content-type" content="text/html; charset=Shift_JIS">\n"
↑
を追加して日本語になるように、お願い致します。
セミコロンが抜けてる
あと、Content-type: text/html; charset=云々
というのもあるよ。
689 :
684:2008/10/04(土) 09:25:08 ID:S1uyMhw/
>>685 なるほど、わかりました。
すいません。randomはrandの間違いでした。
my $flag = (!$a) ? !($b >= rand(100)) : (($c <= $a) ? rand(3) : rand(11));
つまり↑と↓は同じという理解で良い訳ですね。
my $flag;
if (!$a) {
$flag = !($b >= rand(100));
} elsif ($c <= $a) {
$flag = $rand(3);
} else {
$flag = $rand(11);
}
ありがとうございました。
690 :
nobodyさん:2008/10/04(土) 10:53:07 ID:uZuIKJns
「導入効果バツグン! PHP5.0+MySQL5.0で構築する最速Webシステム」
↑これおすすめ!
"register_globals = on"
を推奨していることについて気をつければ・・・ですが
専用鯖なら気にならんからな
safe_modeと勘違いしてる悪寒
1 ******
2
3 aaa
4
5 ******
上のようなテキスト(数字は行番号)で、任意の文字列(aaa)にマッ
チしたら、囲まれた範囲(2行目〜4行目)を別ファイルにコピーする
コードはどう書けばいいでしょうか?
自分でも調べますが、perlは全く知らないので教えてくれる人がい
ると助かります。
1: > perlは全く知らないので
2: ところでaaa
3: aaa
4: aaa
5: これだと
6: aaa
7: どこからどこまでaaaが
8: aaa
9: aaa囲まれた
10: 範囲なんだ
>>694 簡単なのは「******」から次の「******」までをバッファリングして、
バッファの中に「aaa」があったらファイル開いて書き込む、とかかね。
697 :
694:2008/10/04(土) 20:31:56 ID:???
696氏の方針で。
perl -0777ne 'print grep /^aaa$/m, /^\*{6}\n(.*?)(?=^\*{6}\n)/gms ' hoge.txt >fuga.txt
正規表現一回だと結構めんど
perl -0777ne 'print /^\*{6}\n((?:(?!^\*{6}\n).)*?^aaa\n(?:(?!^\*{6}\n).)*?)(?=^\*{6}\n)/gms ' hoge.txt >fuga.txt
699 :
694:2008/10/04(土) 22:21:09 ID:???
700 :
694:2008/10/05(日) 14:05:30 ID:???
お陰様で当初の目標は達成できました。どうもありがとう。
次は一歩すすんで、↓のようなテキストの場合、2-4行目と9-11行
目を別ファイルに保存したいのです。
1 *start*
2
3 aaa
4
5 *end*
6
7
8 *start*
9
10 aaa
11
12 *end*
ファイルをオープンしてwhile文で繰り返し処理をしたら行けるの
かな、と思ったのだけど、よく考えたらwhileは1行ずつしか読み
込まないからこの方法だと駄目なのですね。
分かる人がいたらお願いします。
>ファイルをオープンしてwhile文で繰り返し処理をしたら行けるの
>かな、と思ったのだけど、よく考えたらwhileは1行ずつしか読み
>込まないからこの方法だと駄目なのですね。
なにがダメなんだ?
後出し追加質問は良くない。
自分で何処まで書けたのか提示しないのも良くない。
この質問に答えた後に、「では…の様にするのはどうしたら良いでしょう?」
って来るのが目に見えてて答える気にはならん罠。
後から出すんだから追加質問に決まってたorz...
httpリクエストヘッダからクッキーを抜き出したいんだけどお願いします
クッキーを発行しているページへ下記の様にしましたけどエラーです
どなたか手直しお願いします
やりたいことは新しいクッキーを100個くらい集めたいです
use
HTTP::Request; use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $request =
HTTP::Request->new(GET => '
http://hoge.jp');
while(1){
my $response = $ua->request($request);
print $response->header('Set-Cookie'),"\n";
sleep 1;
>>704 hoge.jp は実在だから使うなと(ry
えぇええええ!
実在してたのかorz
この前、実在のアドレスは2chで晒すなと指摘を受けたので
気をつけたのに
>>705さんは私と多分どこかで遭遇してるね
いつも応援ありがとう
よろしく^^
実在はwww.hoge.jpの方だた。良く見ずに書いた。
あなたには非が無い。
708 :
694:2008/10/05(日) 16:00:04 ID:???
>>702 それは申し訳ない。
次からはルールに倣って質問します。
クッキー食いたくなった
711 :
700:2008/10/05(日) 17:06:32 ID:???
自分で考えてみて、出来たことは出来た。
Cは知っているのでその知識で強引に実現した感じ。
=========
#!/usr/bin/perl
$i = 1;
open IN, "hoge.txt";
while (<IN>) {
if (/.*start.*/) {
$flag = on;
$string = "";
} elsif (/.*end.*/) {
open OUT, ">file$i";
print OUT $string;
$i += 1;
$flag = off;
close OUT;
} else {
if ($flag eq on) {
$string .= $_;
}
}
}
close IN;
=========
perlの人からは腐ったコードに見えると思うので改良点が有ったら
教えてください。Cの人から見ても腐ってる、というのはこの際勘
弁。
712 :
700:2008/10/05(日) 17:38:53 ID:???
文字列aaaを含むという条件を忘れていたので追加しました。
========
#!/usr/bin/perl
$i = 1;
open IN, "hoge.txt";
while (<IN>) {
if (/.*start.*/) {
$flag = on;
$string = "";
} elsif (/.*end.*/) {
$_ = $string;
if (!/.*aaa.*/gms) {
next;
}
open OUT, ">file$i";
print OUT $string;
$i += 1;
$flag = off;
close OUT;
} else {
if ($flag eq on) {
$string .= $_;
}
}
}
close IN;
=======
>>712 正規表現の.*はいらない。gmsもいらない
あと、状態遷移のアルゴリズムはシグナル判定(start,end文の検出)を
状態判定(flagの検出)の内側に持ってきた方がよいと思われ。
>>712 裸の文字列は、C でも厳禁 => $flag = 'on', $flag eq 'on'
715 :
700:2008/10/05(日) 21:09:06 ID:???
レスどうもです。
「こんなのperlを最大限に使えば半分以下のコードで済む」といっ
た間違いで無ければ、さしあたってはそれでいいです。とりあえず
動くものを書いて、根本的なロジックがおかしくなければ後は修正
するだけなので。
そういった間違いではないようなので、後はこれをブラッシュアッ
プしていきます。どうもありがとうございました。
たぶんこれからも「次の段階」がずっと続くような取り組みかたをしてて
「C脳の自分」(表現が悪くて申し訳ない。悪意はないです)が不安で訊いてしまうのかな?
ループ制御できてフラグ使えてパターンマッチ使えてるんだし
指摘されてる bare word とかそんなもんじゃないすか。
> 「こんなのperlを最大限に使えば半分以下のコードで済む」
'on' or 'off' のフラグ変数でなく範囲演算子 .. でフリップフロップ(
>>46の使い方)させたら便利とか
フラグ変数使うにしても文字列比較より 1 か 0 のほうが楽とかコマゴマしたのはあるけど、
動きゃいいんです。
まぁ元々perlは最初からカチっと作るモノには向いてないからな
コード部分だけだったら8行。
シェバン行とuse strict; use warnings で11行。
そんなもん追求するには10年早い。
>>710さん
>>704です
ご指摘ありがとうございました
お陰さまで動くようになりました^^;
空行の全角スペースを削除して
最後の行に}を付け足しただけで
エラー無くなりました
ありがとうございました^^
WEBから抽出した文字列をテキスト保存する方法教えてください
>>720です
言葉足らずですいません
ファイル名は年月日時分秒で保存したいです
よろしくお願いします
>>720です
テキスト保存できるようになったのですが
ファイル名をTES-YYYYMMDDHHMMSS.txtにする方法わかりません
どなたか教えてください
お願いします
よく分からないんだがファイルをダウンロードした時の時刻をファイル名にするってこと?
それともファイルのタイムスタンプをファイル名にするってこと?
>>723さん
レスありがとうございます
>>720です
ダウンロードが完了した時刻をファイル名にしたいと思います
tes-08-10-06-04-41-50.txt
上記のようなファイル名が目標です
お時間のあるときにでも教えて頂けたら幸いです
use DateTime;
$filename = DateTime->now(time_zone => "+0900")->strftime("tes-%y-%m-%d-%H-%M-%S.txt");
>>725さんありがとうございます
>>720です
教えて頂いたコードでテストしてみたところ
Can't locate DateTime.pm in @INC (INC contains: C:/Perl/lib .) at tes.pl line 6.
BEGIN failed--compilation aborted at tes.pl line 6.
とエラーになります
当方の環境でしょうか?
WindowsXp ActivePerl-5.8.8.822です
今日はオヤスミしますので、また明日にでも調べてみます
お疲れのところ本当にありがとうございました
>>712 use File::Slurp;
my $text = read_file('hoge.txt');
my @part = ($text =~ m|^\*start\*$((?:(?!^\*start\*$).)*?aaa.*?)^\*end\*$|gms);
for (my $i = 0; $i < @part; $i++) {
write_file('file' . ($i + 1), $part[$i]);
}
もう一行減らせるなw
>>720です
先人の残してくれたものを参考にさせて頂き
なんとか目標のものができました
みなさん本当にありがとうございました^^
use
HTTP::Request; use LWP::UserAgent;
use File::Find;
use File::Basename;
my $ua = LWP::UserAgent->new;
my $request =
HTTP::Request->new(GET => '
ttp://www.ググル.co.jp/');
$i = 1;
while($n < 3){
$n++;
my $response = $ua->request($request);
print $response->header('Set-Cookie'),"\n";
sleep 1;
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
@a = split($i);
$i = sprintf("TES-%s%04d年%02d月%02d日%02d時%02d分%02d秒%s", $a[0], $year+1900, $mon+1, $mday, $hour, $min, $sec, $a[1]);
open(DATAFILE, ">> $i.txt") or die("Error:$!");
print DATAFILE $response->header('Set-Cookie'),"\n";}
あぁ1箇所書きミスしてた^^;
まあいいかw
終ったんならいいけど、参考までに
use POSIX qw(strftime) ;
print strftime "%y年%m月%d日%H時%M分%S秒\n", localtime ;
年四桁%Y
use strict;
use warnings;
use LWP::UserAgent;
use Time::Piece;
use IO::File;
my $fname = localtime->strftime("%Y年%m月%d日%H時%M分%S秒.txt");
my $ua = LWP::UserAgent->new;
my $req =
HTTP::Request->new(GET=>'
http://www.google.co.jp/');
my $res = $ua->request($req);
if ($res->is_success) {
my $io = IO::File->new("$fname", ">");
$io->print($res->content);
$io->close;
}
>>734さん
レス遅くなり申し訳ないです
サンプル作ってくれたんだ^^
ありがとう
環境の違いなのか4行目のuse Time::Piece;の部分がキャントロケートなんとかってエラーが出るんです
use Time::Piece;が当方のパソコンにインストールされていないってことなんでしょうか?
せっかく
>>734さんが作ってくれたのに使えなくってすいません
ありがとうございました
CPAN使ったことないのか?
数日前にperlの勉強を始めた超初心者です。
配列の勉強中で下のようなのを書いたんですが、実行するとエラーになります。
どこが悪いのか分からないので教えていただけないでしょうか?
#!/user/bin/perl
$. = ",";
$\ = "\n";
@data = (3,6,7);
print @data;
%data[1] = 'six';
print @data;
%data[5] = 9;
print @data;
@data = (1,2);
print @data;
一行目
>>738 あ、基本的なところが;;
直して実行してみましたが、まだエラーになります(ノд`)
他に変なところは無いでしょうか?
%data[1] => $data[1]
%data[5] => $data[5]
エラー文くらい読もうぜ
すみません;;
ありがとうございます;;;
初心者がつまづく最初の難関だよねー
なんで配列の要素にアクセスするのに、
%じゃなくて$なんだよと。
なんでと言われてもなぁ
なんで説明に => 使うんだよ・・・
うんうん
748 :
nobodyさん:2008/10/14(火) 14:49:26 ID:W0wcfnrq
漠然とした質問ですみません。
今HP乗せてるブロバイダでperl4が対応しなくなるので、ソーすを変更しろと
いう通知が来ました。無料公開のCGIを拾ってきて掲示板や質問を埋めて
もらってメールを受けるのを使った程度の記憶しかありませんw
4から5に変更するにはどうしたらいいのでしょうか?
たぶんそのまんまでいいよ。
4→5になるのはPHPのような気がする。
751 :
nobodyさん:2008/10/14(火) 15:47:24 ID:CJyY9JPp
リンゴはコマンドプロンプト無いけどどこで実行確認するの?
OSXのことかね。
ssh起動してターミナルでGo。
753 :
nobodyさん:2008/10/14(火) 19:19:11 ID:CJyY9JPp
754 :
nobodyさん:2008/10/18(土) 08:37:31 ID:TpRddp7o
Embperlというperlモジュールを追加したいのですが、
追加中に
Apache source not found, enter path name or q to quit
といわれてしまいます。
Apacheのソースコードなどが必要ということでしょうか?
Apacheのバージョンが2.2.6なのですが、ソースコードが見当たらないです。
すいませんがご存知の方教えてほしいです。
>>754 配布元ウェブサイトに行くとそのあたりのことを書いてありますが。
756 :
nobodyさん:2008/10/18(土) 11:46:59 ID:TpRddp7o
また質問です。
Apache2.2.6から2.2.10にアップグレードする場合、
古いApacheを消さず、そのままアップグレードってできますか?
環境はwindowsXPです。
757 :
nobodyさん:2008/10/18(土) 11:48:06 ID:TpRddp7o
誤爆しました。すいません。
Larry Wall に、Programming Perl の第4版をいつ書くのかを聞きたいのですが、どこで聞けますか?
使用しているモジュールのバージョンアップ後に
lwpでhttpsサイトのソースをgetで取ると一部が抜けてしまう
状態になったのですが、Crypt-SSLeayを削除したところ
問題なく取得できるようになりました。
最近のバージョンではCrypt-SSLeayは使わなくなったのでしょうか?
760 :
759:2008/10/18(土) 21:31:03 ID:???
すんません、なんか勘違いしていたようです・・・
あれこれやってるうちにp5-Net-SSLeayの方も入れてました。
これも消したところ接続不能に…
一方ずつ試してみたところ、Crypt-SSLeayの方では
>>759の状態になるのですが
Crypt-SSLeayを削除してNet-SSLeayを入れたところ正常になりました。
LWPではCrypt-SSLeayの方を使ってたと思うんですが、Net-SSLeayに変わったのかな・・
BASIC認証もおかしくなったしportupgradeでまとめてあげたのが悪かったのか…(´・ω・`)
761 :
nobodyさん:2008/10/24(金) 04:49:19 ID:kVbR7JUN
perlで入力された文を単語に分割し、単語ごとに改行し、a.txtファイルへ追加書き込みを行うプログラムを具体的にそのプログラムを書いて教えてください。
単語に分けるには形態素解析とか使うのが常套だと思うが
ここに書くには面倒だな
くだ質問失礼します。
あるPerlスクリプトでMIME::Toolsを利用しているのですが
MIME::Tools内でFile::Tempをインクルード?しようとしているときに
File::Temp Vresion 0.18 Required--This only Version 0.12と表示され
スクリプトが動作しません。
CPANではFile::TempのVer 0.12の配布は終わったらしくインストールできません。
そこでtar.gzを探してインストールしてみたのですがエラーは改善しません。
CPANでインストールしたものを-Dオプションで削除しても同様でした。
CPANでインストールしたものとtarボールからインストールしたモジュールは
同居できないのでしょうか?
もしそうだとするとこのエラーは解決しないのでしょうか。
動作OSはDebian Etchです。
>>763 > File::Temp Vresion 0.18 Required--This only Version 0.12
File::Temp Vresion 0.18 が必要--これはたったの Version 0.12
765 :
763:2008/10/24(金) 14:33:43 ID:???
>>764 レスありがとうございます。
英語を誤読していましたか。お恥ずかしいです。
で、CPANでFile::Tempと念のためMIME::Toolsを最新にしてみました。
File::TempはVre 0.20、MIME::Toolsは5.427に上がりました。
ですが元のParlスクリプトを実行すると
全く同じエラーが表示されます。
バージョン番号を誤認しているようなのですが
そもそもParlやCPANはどこでバージョンを管理しているのでしょうか。
思い込みと決めつけ
>>765 コンソールから、
perl -MFile::Temp -e "pritn $File::Temp::VERSION" (Unix系ならシングルクオートで)
やってみ。
これで0.12が出たら、多分、システムにもともと入ってた0.12と新しく入れた0.18が共存してる。
OSとか分からんからはっきりとは言えないけど、そのシステムに合ったやり方で
モジュールのバージョンアップしないと(ActivePerlならppm、RHEL系Linuxならrpmなど)
違うファイルパスに二つのバージョンが入ってしまう、ってことも起こり得る。
768 :
763:2008/10/24(金) 15:22:04 ID:???
>>767 レスありがとうございます。
教えていただいたコマンドを実行してみましたが何も表示されませんでした。
念のためsudoにてroot権限でも実行してみましたが同じでした。
(ちなみ動作環境はDebian Etchです)
とりあえず共存の可能性があるとのことご指摘があったので
Perlのモジュールが格納されてそうなディレクトリを
調べてみたいと思います。
>>768 大変失礼した。
>>767の"pritn"は"print"のtypoだ。pritnてなんだよ(w)
あと、OSちゃんと書いてたの見落としてた。ごめん。
で、なにも表示されないってことだけど、それはおかしいと思う。
(モジュールが入ってなければなんらかのエラーが出るはず。bashからなら囲いの""を’’にしてみて)
Deb系のことは詳しく知らないからあくまでも参考だけど、RHEL系の場合/usr/lib/perl5 以下に、
5.8.8とかsite_perl、vendor_perlみたいなディレクトリがいくつかあって、例えばrpmから入れたらvendorに入るけど、
tarから手動でmakeとかするとsite_perlに入ったりする。(モジュールによって違う)
770 :
763:2008/10/24(金) 20:41:34 ID:???
>>769 フォローありがとうございます。
SSHクライアントの表示がおかしかったようです。
実行結果をリダイレクトしてviで覗いたら
0.20と記録されていました。
で、途中報告です。
実は動かそうとしているスクリプトは
後出しで申し訳ないのですがほかのサーバで動作していた
Movable Type関係のスクリプトなのです。
で、Movable Type内にもPerlのライブラリがあるらしく
そちらとバッティングしている可能性が大きくなってきました。
今回Debianに移行評価テストをしているのですが
ディストリビュートのディレクトリ構成やパーミッションの違いが
影響しているのもあるようです。
引き続き調べてみて、報告したいと思います。
まず自分自身を評価しろよ
772 :
763:2008/10/24(金) 23:18:20 ID:???
結果報告です。
途中経過に書いた通りなのですが
Movable Type 内にextlibというディレクトリがあり
その中にFile::Tempの0.12がインストールされていました。
動作させようとしていたスクリプトが
Movable Typeで提供しているライブラリを優先させて
インクルードさせていたために
CPANでインストールしても有効にならないということでした。
で、Movable Type内のFile::Tempをリネームして
スクリプトを実行したところバージョンチェックに引っかかりませんでした。
ただその後jcode.pmの実行中にたくさんのエラーを吐いて
処理が止まっていました。
これ以上深追いしても私の手で解決するには時間がかかると判断し
今回の評価作業は打ち切りました。
ただ今回初めてPerlでの作業を行って勉強になりました。
コメントしてくだった方に感謝します。
test.cgi?page=1 にアクセスすると
<html><body>1</body></html>
と表示され、test.cgi?page=2 だと
<html><body>2</body></html>
…というふうに数字が増えていき、これをpage=10までやる。
という場合どうしたらいいですか?
printf(<<HTML, ($ENV{QUERY_STRING}=~/(\d+)/)[0]+1);
Content-type: text/html
<html><body>%d</body></html>
HTML
775 :
773:2008/11/11(火) 16:08:15 ID:???
>>774 ありがとうございます。エラーになってしまって表示されません…。
値の設定とかが必要なのでしょうか?
10まで、とか条件抜けてるけど、エラーにはならんぞ。
先頭の #!/path/・・・/perl とか、パーミッションとかは問題ないな?
777 :
773:2008/11/11(火) 16:49:28 ID:???
print "Content-type: text/html\n\n<html><body>%d</body></html>"
で%dと表示されるので環境に問題はないと思うのですが…。
先頭の#!/path/・・・/perl の次の行から
>>774を貼り付けてtest.cgiで保存し
ブラウザでアクセスしているのですが、何か根本的に間違えていますか?
そこまでやってて環境とエラー内容を書かないのはなんでだ
まあ普通は CGI.pm 使うとこからやった方がいいが。
779 :
773:2008/11/11(火) 17:15:43 ID:???
すみません、動きました!
文末にスペースが入っちゃってました。
ありがとうございます!
既存のCGIを少し変えて、件数ごとのページ送りができるようにしたいと思っています。
送り方は何でもいいのですが、例えばこんな感じで↓
$hyouji=表示件数
$cnt = 0;
for (@logdat) {
$cnt++;
next if ($cnt < $pageno + 1);
next if ($cnt > $pageno + $hyouji);
print "$logdat[$cnt-1]<hr>";
}
print "<form action=\"$script\" method=\"post\">\n";
$next = $pageno + $hyouji;
$back = $pageno - $hyouji;
if ($next < $cnt) {
print "<input type=\"submit\" name=\"page=$next\" value=\"次の$hyouji件\">\n";
}
ただ、元のCGIに以下のような記述があり、どうすればこれを保持したまま上のボタンが
機能するようになるのかがわかりません。
my($cl)=$ENV{'CONTENT_LENGTH'};
read(STDIN, $a, $cl);
foreach (split(/&/, $a)){
($arg, $val)=split(/=/, $_);
$val =~ s/\+/ /g;
$val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/ego;
}
undef $a;
どうかご教授ください…
ご教示ください…
…はうざキモイ
ご教示ください!
785 :
nobodyさん:2008/11/14(金) 22:30:27 ID:SnXSZwdH
なぜ1になるんだ!
print ("RlNG" ne uc "ring");
RINGとRlNGは違う
Perlをゼロから勉強したいんですが、お勧めの書籍ってなんですか?
誰かが書き込んだので私も^^
>>787さん
実は私も超初心者で何からどうすればよいのかわかんなかったので
2chで聞いてみた
たまたま答えた人がこう言ったんですけど(その後、誰もフォローもしないので)
おもいっきり信じてしまいました
「Perlでなんでもできるよ。Perlは簡単なので初心者向きだよ」ってね
しかし、Perlにできることは限られていました
それに簡単ではありません
ちょっと込み入ったことをやろうとしたら
参考書20冊買いました。でもできませんでした。
何が言いたいのかというと
Perlで時間潰すくらいなら初めからCがいいです。もしくはC++ね
Perl使いの最高峰レベルで難しいことやるよりは
Cプログラマヘタレレベルのほうが簡単に色んなことができました
VC++がいいかも知れません
Cはプログラムの王様です
やりたいことが難しいことになるほど
いずれCにいかなきゃなあって思うはずだよ
それなら最初からCかC++の方が絶対いいよ
私はPerlスレでオモイッキリ小馬鹿にされまくって結局何もできないまま挫折しました
今はCの超〜〜〜初心者ですが既に私のやりたいことできました
悪いことはいわないのでCかC++(VC++なら無料でできます)がいいよ
Perlスレの解答者は自己満足で人をけなしてばかり
あなたをオモチャにするだけで、あなたの役には立ちません
マジでCかC++がいいとおもう
もし、どうしてもPerlに拘るのならここで質問しない方がいい
いじくられて小馬鹿にされるだけです
CからみたらPerl使いなんて何もできないヘタレですよ
そのくせ生意気にも人様を小馬鹿にするのが趣味なんです
とにかくC(もしくはC++またはVC++)です!
>20冊買いました
お前perl or C以前にセンス無いからやめちまえ。
参考書買って「読む」って事が分ってないだろ…
「実際の例題とか自分で打って実行してみる」
それが「読む」って事だよ。
20冊も読んでたらそれなりになってるだろ普通。
Perlとかこれからすたれる言語はやめたほうがいいよ。
RubyかPythonあたりにしなさい。
>>787さん見ましたか
ここの連中はこうやって煽るばかりです
そして私が質問するとできないのでみんな消えちゃうんですよw
20冊読んでってわかんないから挫折したんだよ
Cのほうが圧倒的にいいよ
Perlなんて何もできないくせに難しいだけ
やっと覚えてもちょっと計算するか文字列扱うくらいだろ
例えば半自動でいいからヤフーのIDを10分で200個作れるのか
そう3秒に1個ね
できてから言え!
ここで迷解答してればいいよ
>>787 とにかくPerlやPHPやjavaスクリプトとかはやらないほうがいい
JAVAも遅い
Cだよ
も少し込み入ったことやるならC++
VC++使えばPerlより簡単だ
貼り付ければほぼ完了だもん
Perlは口ばっかし
お前らやってみろよヤフID
私は簡単にVC++で作れたよ
あのままPerlやってても多分、今でも作れなかったと思う
そういうサンプル皆無なんだもん
そのくせ「なんでもできる」だからねw
はらいてー
LWPだっけあれでどこまでできるか試してみればいいだろ
何もできないよ
おい!
どうした迷解答者
また言い放題で消えちゃったか
そうなると思ってたよ
はよヤフID3秒で作れるソースくれくれ
ほらほら
Perl云々ってなんでこんない質問者をいじくりたおすかな
自分じゃ何もできないくせに
おら
はよヤフID製作マシーンだせよ
お前らホント口先だけだな
C++がいいよマジで。
Perlで粋がってる奴ってなんなんだ?
私は挫折したけど
ホント今、思い出しても
振り回されっぱなしで何も習得できなかったよなあ
おい20冊読んでわからん奴はむいてないとか言った奴
お前は早急にヤフーID製作ソフト作ってみ
私はC++で1日で作れたよ
お前は人様を小馬鹿にするんだから
私より早く作れるのを頼むよwww
口先くん
まあ、未だにPerlで作れないけど
別にいいよ
私は前から言ってたけどPerl覚えるためにPerlやるんじゃないって
簡単に挫折しないで目標を達成
これを以前言ったら「それPerl」って言われたけど
Perlじゃなにもできないよ
Perl解答者はヤフーId1分間に20個以上は作れるのか?
私はPerl全くできないのと同じレベルだけど
私は作ったよC++でね
簡単さ
人をけなすより
作ってから言え!
PerlじゃC++の足元にも及びません
世界中が認めますよ
それなのにPerlできない奴を見つけて遠吠え
情けないやつらだ
>>797 それはまさに今キミがやってることそのものだ
ここはCGI作ったら一人前だと勘違いしてる奴ばかり
サーバサイドって作れるように言語がそういう仕様なんだから作れて当たり前
私がクライアント操作を知りたいって言えばみんな消える
サーバサーバサーバ
どの解説書もサーバサーバサーバ
うんざり!
そんなことより本当に必要な解説書はPerl本にはなかったな
私の言う本当のクライアント操作のサンプルはPerlではない
サーバサーバわっしょいわっしょい
そういう時代じゃないと思う
Perlの解説本を買えば
みーーーーーんな
お決まりのCGI
サーバサイドって言う割には遅すぎて細かいことは
「サーバサーバ」の掛け声でごまかしちゃう
さーば!さーば!さーば!
もうちょっとクライアント側に詳しい解説本はないのか探しまくったけど
ない
当たり前だ
Perl自体が、私の言うクライアント操作できないじゃん!
さーば!さーば!さーば!あほか。
自慢のサーバサイドもCの前では非力すぎて話にならない
もっとゴロゴリ力業の必要な私が言うクライアント操作なんて夢物語
サーバ!サーバ!って言ってるあいだはわかんあいだろね
本当に難しいのはクライアント操作だったんだ
Perl解説本100冊買えば100冊ともサーバのことばっかし
その割には
サーバとしては小回りきかない
中途半端
ほんと時間の無駄だったわ
こんなのでクライアント操作を模索してた自分が無知すぎて
perlの実態わかったとき自分をワロタ
さーば!さーば!さーば!
あほか
解説本どおりにすりゃあほでもできる
そんなことよりクライアント操作だ
Perlじゃ無理!!!!
さーば!さーば!さーば!
なんでもさーば!
絶対さーば!
さーばさいどは凄いんだぞ〜〜
さーば信者はカス
本当に難しいのはクライアント操作
それをここで聞いてた私も速く気づけばよかったとオモイッキリ後悔してるよ
こいつらクライアント操作はできないくせに
サーバのことがわかったら一人前に
人様を小馬鹿にしやがって。
さーば!さーば!さーば!さーば!・・・死ぬまでやっtればいいよ
だいたいPerlがサーバサイドって思っているのは
perl使いだけですよ
細かなことができないのに
なんでサーバサイドなんだよ
CGI作れるってだけだろ
ぽかーーーーん
ちょっと込み入ったことをやろうとしたら
参考書20冊買いました。でもできませんでした。
↓
Perl使いの最高峰レベルで難しいことやるよりは
Cプログラマヘタレレベルのほうが簡単に色んなことができました
ちょっと込み入ったことはできなかったが最高峰には到達したようだ。
なんか痛い無能がわいてるな
Perlなんて所詮はテキスト処理をちょこっとするだけのスクリプト言語
それがたまたまUNIX系サーバに載ってるって事でCGIを作るのに丁度良かっただけ
この痛い奴はどんな幻想持ってたんだ?
Perl云々でなく自分が無能だって事を理解しようね
今時、Perlを始めるなんて信じられない
>>809 おれは主食をPerlとする者だが、その意見には賛成する。
787です
CGIがPerlで書かれてるから勉強したいだけなんです。
ちょっといじって改造とかしたいんです。
ダメだ! こっちへ来てはダメだ!! おれたちはもうダメだがおまえだけでも逃げろ!!
こうですか?
>>811 ネットで解説してるサイトで十分じゃね?
814 :
787:2008/11/17(月) 12:15:30 ID:???
プログラミングの基礎がわかってるなら
Googleだけでなんとかなりそうだけど、
そうじゃないならどうなんでしょうか?
ちょっといじって改造ならその都度検索掛けながら出来ると思うよ。
ローカル環境で動作テストすれば試行錯誤しても誰にも迷惑かけないしね。
$a=getc;
chomp($a);
$b=int($a);
$b%=0xFF;
printf("%0x",$b);
getcで受け取った1文字のアスキーコードを表示したいのですが
上のコードを実行しても"0"しか表示されません。
どうしたらいいでしょうか?
・getcのファイルハンドルは<STDIN>
・getcの行で「a(リターンキー)」を押したら「61」と16進数で表示される
これがやりたいことです。
unpack('H2', getc);
821 :
nobodyさん:2008/11/19(水) 08:25:12 ID:Fi86N1yA
kentwebさんの画像アップ掲示板をDLしてアップロードしたのですが
掲示板が出ません、
clip.cgi?mode=check にアクセスしても404になりますし
ドメインのアドレスをクリックしても、アップロードしたファイルがそのまま出てくるだけで
1週間悩んでもわかりません><
アドバイス頂けませんか? サーバーはさくらのレンタルでライトプランです
FTPができてるなら
/home/アカウント名/www/ にCGIをアップロードして実行権限与えるだけのようだが
一週間の悩んでたのならまず落ち着け
823 :
821:2008/11/19(水) 11:48:01 ID:Fi86N1yA
>>822 レスありがとうございます、
先ほど掲示板は出ました、
しかし、掲示板から画像投稿しても画像が出ません><
imgデェレクトリには、投稿した画像はあるのですが、画像がでません
$ImgUrlはサーバーの説明ページを見てやったので間違いないと思うのですが…
そのimgディレクトリを直接URLで指定したら出る?
825 :
821:2008/11/19(水) 12:33:43 ID:Fi86N1yA
>>824 ああ出ました!
ありがとうございます! おかげでできました!
826 :
821:2008/11/21(金) 11:44:39 ID:+lsYQ29g
また質問させて頂きたいのですが、
kentwebさんの画像アップ掲示板(clipboard)にカウンターをつけたいのですが
調べても、解説しているサイトが無くて
どなたかヒントでいいので教えて頂けませんか?
改造スレいけって
ActivePerl5.8.8のppm(GUI)からDBD::mysqlをインストールしようと思ったのですが見つかりません
OSはWin2k SP4です
どうすればインストール出来るのでしょうか?
831 :
nobodyさん:2008/11/29(土) 12:59:08 ID:060X3luI
初心者です
あ い う え お か き く け こ
と文字列があり、リロードする度に2回ずつ表示させるにはどう書いたら良いか教えてほしいです。
一回目 あ
二回目 あ
三回目 い
って感じです。宜しくお願いします。
ファイルに記録しとけば?
my @words = qw(あ い う え お か き く け こ);
my $num = 0;
for $num (0 .. 20) {
$num = $num/2;
print $words[ $num%@words ], "\n";
}
834 :
831:2008/11/30(日) 01:08:25 ID:???
勉強になります
ありがとうございました。
こうだな
my @words = qw(あ い う え お か き く け こ);
{
my $call = 0;
sub _idx {
int($call++/2);
}
}
while (my $val = $words[_idx()]) {
print "$val\n";
}
<input type="text" name="Word">の「Word」の値をformからgetで渡す
ボタンを押して表示されるURLが「test.cgi?page=1?Word=○○」になるようにしたい
<form action="test.cgi?page=1">と書いても?以降は無視されちゃうんですが
何か方法ありますか?
<form method="get" ......
838 :
836:2008/12/09(火) 19:53:00 ID:???
<form method="get" action="test.cgi?page=1">
とやると、URLが「test.cgi?Word=○○」になってしまいます。
「?page=1」を入れるにはどうしたらいいでしょう
<form action="test.cgi">
<input type="hidden" name="page" value="1">
<input type="text" name="Word">
840 :
836:2008/12/10(水) 07:22:57 ID:???
>>839 すみません それだと「test.cgi?page=1&Word=○○」になってしまいます
Wordの前を「?」にしたいので、hiddenではできないかなと思ってたんですが
できるのでしょうか
?を2つて事?それは無理でない?てかなんでそうする必要あるんだろ?
順番的な話だけなら記述する行を逆にすればいい話だけど
842 :
836:2008/12/10(水) 08:45:47 ID:???
既存のCGIの改造なのですが、元のものは
>>839の内容をpostで渡しています。
アクセス数の内訳を把握するためにURLを表示させたいのですが、
同じ内容を表示するにはURL内のpageとWordの前に
それぞれ?がないとだめなようなので。
formの記述でなんとかなるかなと思ったんですが、無理ですか…
他の方法を考えます。ありがとうございました。
初心者ユーザです
プログラムを頂いてActive perl5.6ではしっかり動作したのですが、
5.8.8環境下で一応動くものの、日本語が文字化けして意味不明になります。
ググッた所では日本語の処理方法が違う?見たいな事がチラホラ見えます。
日本語処理で5.6を5.8.8においてそのような違いが有るのでしょうか?
対処方法が有れば、ご教授お願いします;
パッチの置き場所が問題?w
動作環境
5.6 XP ルート設定有り マイコン→ユーザ1→プログラム置き場
5.8.8 XP 設定なし マイコン→Cドライブ→直置き
文字コードがかわった。
5.8対応するならUTF-8前提で書き直したほうがいいと思う。
>>843 いい機会だし、テンプレートでも勉強してみたら?
返信有難うございます
>>844 やはり文字コードが変更されていたんですね;;
書き直し・・・強引に動かす方法無いですかね?(有れば)
無理が有りすぎならプログラム書いた人に相談してきます。
>>845 テンプレート?練習用テンプレで書いてみるって事でいいですか?
急いで探してみます><
まずはそのプログラム見せないとなんとも答えようがない
例えば掲示板スクリプトなどで、
一つのファイルで全部やるよりも、
書き込み.cgi
閲覧.cgi
管理人用.cgi
検索.cgi
などのように、処理の種類ごとに
ファイルを細かく分けた方が、体感軽いとかありますか?
体感じゃわからん程度
では、余り気にしなくても良いですね!
ありがとうございました!
無限ループを回避する方法ってありませんか?
ループごとにカウントしてlastだと管理しにくいので良い方法を探しています
854 :
nobodyさん:2008/12/15(月) 19:30:03 ID:V2NIPW0r
あらかじめ何回ループするか決めておいて
for(0..$num)とでもしとけば?
>>853 なにをしようとしてるのか晒せば良い解が得られるかも
>>853 終了条件を予め決めておく
>>855 人が何をしようが勝手だろ
こんなとこでネタ探しかよ氏ねくず
自己レスかよ…
煽る意味ねえしなあ。
自演じゃないのかもしれんが、無限ループがどういう状況なのか解らんのに、
レスしても混乱するだけだろ。
質問の意図を尋ねることもできないこんな世の中では
デッドロックの検知みたいに無限ループを自動的に発見してブレイクさせる機能が欲しい
864 :
853:2008/12/16(火) 12:06:04 ID:???
皆様ご返信ありがとうございます。
質問の仕方が悪くて申し訳ないです。
例えば配列の値を見るとき、
my $count=0;
for (@array) {
print $_;
$count++;
last if $count>1000;
}
等、終了条件を決めて抜ければいいんですが
ループの度にカウンターを設定してカウントって面倒ですよね?
意図としては
>>861のように、何もせず、あるいはもう少し簡単にブレイクする方法があれば
教えて頂きたいというものでした。
PHPだとmax_execution_timeで実行時間を制限できます。
Perlだとそういったものは無いのでしょうか?
865 :
853:2008/12/16(火) 12:09:30 ID:???
ミスりました
×for (@array) {
○foreach (@array) {
>>864 854氏が既に書いてるが、
for my $i ( 0 .. 999 ){
print $array[$i] ;
}
867 :
853:2008/12/16(火) 12:35:45 ID:???
無駄なループを考慮すると
for my $i ( 0 .. $#array ){
print $array[$i] ;
}
こんな感じでしょうか。
あれれ?配列の場合、無限ループにはなり得ない??
ならないです。
@array=(1,1);
$i=1;
foreach(@array){
print $_;
$array[$i+1]=$array[$i];
$i++;
}
こんな悪戯とかは。
無限ループにうっかり陥ったことってある?
俺は意外と無いんだけど…
873 :
nobodyさん:2008/12/17(水) 10:44:54 ID:JyAZ5ywx
特定URLで与えられるページを定期的にキャッシュして保存するにはどうすればよいでしょうか?
無限ループ内でページ取りに行って
取得できたらファイル保存してスリープ
を繰り返す
875 :
nobodyさん:2008/12/17(水) 11:28:15 ID:JyAZ5ywx
スリープは処理に時間がかかっているとサーバに怒られたりしませんか?
cronとかそういうのがあると聞いたんですが
処理に時間がかかると怒られるサーバって書いてなかったのでとりあえずスリープって
書いた
cron使えるサーバならそれでいける
877 :
nobodyさん:2008/12/17(水) 12:12:50 ID:JyAZ5ywx
どこでも cron 使えるわけではないのですね。なるほど。
2つの場所にある cgi が、十分短い時間だけスリープして相手を呼び出すってどうでしょう?
共用でcron使えるのっていまどき普通なのか?
2つのCGIで呼び合うというのは作ったことがあるができるよ。
システム占有率が目立たなければ問題ないと思う。
cronが使えればそれに越したことはないと思うが
879 :
JyAZ5ywx:2008/12/18(木) 11:54:13 ID:pPcqWUbs
cron は使えないようでした。それではダブル cgi でやってみます (・ω・)ゝラジャ
ファイルへの書き込みについての質問です。
ファイルの先頭に追加書き込みをする処理を行いたいのですが、
読み書きモードで開いて、ファイルを全て配列に読み込み、
unshiftで先端に追加してファイルに書き込みをしなおし、
するやり方と、
上書きモードで新しいファイルに追加を書き込み、
それから読み込みモードで元ファイルを開いて中身を新しいファイルに書き込み、
unlinkとrenameをするやり方では、
どちらの方が良いのでしょうか?
また、この二つ以外にオススメのやり方があれば教えて下さい。
881 :
880:2008/12/19(金) 20:00:28 ID:???
ファイルの中身は1万行とかそういう大量のものではなく、
通常の掲示板の書き込み保存ファイルなどだけを扱うつもりです。
その2つを比べると後者が圧倒的にいいと思うが、
できれば先頭に追加書き込みする仕様を変えるとかは選択肢にないの?
ファイルの末尾に>>で書き込みして、
読み込むときにreverseなどをした方が良いのでしょうか?
>>883の読み込むときとは、
ブラウザでファイルの中身を表示するときのことです。
掲示板でいうと記事一覧表示などです。
書き込みが頻繁にないのなら、最新分は静的な html でもいいんじゃね
書き込みは一番多いところでは大体1分に5〜15回程あります。
読み込みは一番多いところでは1秒に30〜100回程あります。
ただ、少ない時間(朝〜昼など)は読み込みも1分に1度程度になる時期もあります。
静的なhtmlというと、書き込みのたびにhtmlファイルの形に書き出す感じでしょうか。
確かにそうしている掲示板スクリプトなどは閲覧が早いですよね、
そういったことはやったことがないので調べてみます、
難しそうに感じますが試してみます。ありがとうございます。
ログファイルへの書き込み自体は、末尾に追加書き込みをし、
閲覧時にreverseするやり方が良いのですか?
サーバーは専用サーバーを借りております。
ただ私に知識が足りないので、基本的な運用は管理者の方に任せている状態です。
必要なモジュールなどはお願いして入れてもらっている形です。
>>886 CPAN の File::ReadBackwards を使うという手もあります。
何故住人が口を揃えてファイル先頭への追記を忌避するかというと、
必然的にいずれかのステップでファイル全体のコピーを必要とするため、
空間的にも時間的にも効率が悪いからです。
また、読出し負荷を下げるために静的ファイルを利用する際には、
投稿ログファイルのタイムスタンプとキャッシュのタイムスタンプを比較して、
キャッシュのほうが新しければキャッシュをただ投げ返すといった方法もとれるでしょう。
がんばってください。
うむ。Perlコミュは実際的で頼もしい。
Perlでzipを解凍するにはどうしますか?
win環境です。
パスワードセットして解凍するです。
よろしくお願いします。
Perlインストールしたフォルダを”zip”で検索して出たモジュール使うか、
zip解凍ソフトの実行ファイルをオプション付きでPerlからたたく
これで解決
> Perlインストールしたフォルダを”zip”で検索して出たモジュール使うか、
wwwwww
CPAN つかえよwww
~$ find `perl -e "print qq(@INC)"` -iname *zip*
./movies/loli.zip
~$
パスワード付きは、多分、zipコマンド叩くのが早い。
895 :
nobodyさん:2008/12/22(月) 20:16:30 ID:Vaq4WjNP
今掲示板を作ってるんですが、htmlファイルを外部ディレクトリに用意して、読み込んで使いたいと思っています
そこで読み込んだhtmlファイルに変数を埋め込んでcgiから出力したいんです
簡単なデータ構造なら埋め込む方法は何個か思いつくんですが、記事とか記事のタイトルとか、配列やハッシュの配列などをどう処理しようか悩んでます
一般的にはどういう方法を取るもんなんでしょうか
Catalyst + DBIC + TT で完璧。
>>896 素早い回答ありがとうございます
早速ググってみたいと思います
MENTA とか使ってやれよ。
extlib にゴミが大量に入ってて当初のコンセプトはどこにあるのかさっぱりだけどwww
900 :
nobodyさん:2008/12/22(月) 23:07:11 ID:TJyyzWEd
CPANでEncodeモジュールを1.83から2.26に上げようとしているのですがうまくいきません。
all skipped: Perl 5.8.1 or later required
Failed Test Stat Wstat Total Fail Failed List of Failed
-------------------------------------------------------------------------------
t/enc_module.t 2 512 3 2 66.67% 2-3
3 tests and 6 subtests skipped.
Failed 1/24 test scripts, 95.83% okay. 2/5850 subtests failed, 99.97% okay.
make: *** [test_dynamic] エラー 29
/usr/bin/make test -- NOT OK
Running make install
make test had returned bad status, won't install without force
Perlのバージョンを今の5.8.0から5.8.1以上に上げないといけないのでしょうか?
5.8.0 (笑)
902 :
895:2008/12/23(火) 00:34:22 ID:ZaYeCOkc
>>896-899 ありがとうございます
とりあえずのところ、一番わかりやすかったHTML::Templateを使ってみることにしました
できれば勉強のために自分で作ってみたかったんですが、ソースコード見て諦めましたw
903 :
nobodyさん:2008/12/24(水) 03:27:20 ID:DJKrSH/S
掲示板にトリップ機能を付けたいが折れの頭じゃわがんね
なんとか関数と暗号でググると コードとか詳しく説明してあるがイマイチ
それは残念だったね。再来年頑張れ。
>>903 トリップ機能とかwikipedia見ただけでつけれたぞ
906 :
nobodyさん:2008/12/25(木) 00:45:10 ID:eRkadvZc
ん〜ん素人なりに 勉強してみる 今日も掲示板訪問者からトリップ機能まだ〜ぁなんてメールが来ていた。コードをどこに書くのかが分からん
MENTAとか凄くわかるんだけど、でもspeedy_cgiで高速化とかってかなり無理なの?
おれはCatalystとか使える環境でやってるから、レンサバのかたの事情は
よく分からんのだけど、speedy_cgiレベルでもキツい?
speedy_cgiオケなら、初めはCGI::Application(Titanium)でやって
負荷が増えてきたたらspeedy_cgi化するってのがよさそうだけど。
speedy_cgi がどうかしたの?
共有サーバで動かすのは、セキュリティに問題あるんじゃないの?
例えば、mod_perlは同じユーザーで、プロセス使い回しで実行されるから、かなり危険。
SpeedyCGIはどうなの?
おまえらmod_perlite作ってるから少しまたれよ
>>910 待つかどうか判断したいので、まずはリポジトリ晒してもらおうか。
913 :
nobodyさん:2008/12/29(月) 10:09:26 ID:p2M05RZ+
リフレッシュでgoogleに飛ばしたいんですがいろいろやっても飛びません。どう直せばいいんでしょうか。ロケーションならいけるみたいなんですが、リフレッシュで飛びたいんです。
#!/usr/local/bin/perl
print "Refresh: 3;
http://google.com/","\n";
print "Content-type: text/html\n\n";
print "a";
exit;
meta要素で書かないと。
916 :
nobodyさん:2008/12/31(水) 22:39:26 ID:vTUPxBET
レスキューさんのCGIを少し触ってこの場合yahooへ三回クリックされれば次のgooへ三回、その次はgoogleを2回
ってな感じで繰り返すのですがyahooへ三回飛ばしたい場合
if ($count>=0 and $count<=4){
print "Location:$word_5\n\n";
}elsif ($count>=5 and $count<=9){
print "Location:$word_5\n\n";
}elsif ($count>=10 and $count<=14){
print "Location:$word_5\n\n";
三回書くのではではなく
:$word_5 = 3
みたいな感じで数字で回数を指定するにはどう書いたら良いでしょうか?
できたらコピペで使えるような答えが欲しいです・・・お願いします。
http://test.testars.com/link.txt ソース
http://test.testars.com/link.cgi
917 :
916:2008/12/31(水) 22:42:28 ID:???
あ、すいませんこの場合yahooへ9回でした。
$word_5 = 9
みたいに書く方法無いでしょうか?
918 :
916:2008/12/31(水) 22:43:52 ID:???
ち・・ちがったyahooへ15回でした(汗
すいません
#! /usr/bin/perl
use strict;
my @num_url = (
"2,
http://www.yahoo.co.jp/",
"3,
http://www.goo.ne.jp/",
"2,
http://www.google.co.jp/");
my $file = "./count";
my ($fh, $count);
open($fh, "<", $file) or die "error";
$count = <$fh>;
close($fh) or die "error";
chomp $count;
my $num_url;
my $i = 0;
for $num_url (@num_url) {
my ($num, $url) = split(/,/, $num_url);
if ($count >= $i and $count < $i + $num) {
print "Location:$url\n\n";
}
$i += $num;
}
$count++;
if ($count >= $i) {
$count = 0;
}
open($fh, ">", $file) or die "error";
print $fh $count;
close($fh) or die "error";
920 :
916:2009/01/02(金) 13:25:54 ID:???
>>919 ビッグなビッグなお年玉でした。
ありがとうございます、感謝!!
921 :
nobodyさん:2009/01/03(土) 21:24:01 ID:xUjko049
ちょっと質問させて下さい。
cgi掲示板を連ねてレンタル掲示板を作ろうかと検討しています。
そこで、全てのフォルダにある掲示板cgiに広告を表示させたいのですが、
MTみたいなモジュールを使って表示させることを掲示板cgiで可能なのでしょうか?
サーバー内
┏bbs1(レンタル)フォルダ
┣bbs2(レンタル)フォルダ
┣bbs3(レンタル)フォルダ
┣bbs4(レンタル)フォルダ
┣bbs5(レンタル)フォルダ
┣bbs6(レンタル)フォルダ
┣bbs7(レンタル)フォルダ
以下どんどん追加
全てに共通した広告を出す。
また、広告の修正なども、1つを修正すれば全てに反映されるようにしたい。
マルチ乙
>>921 カンタンだろw
できないなら金払って頼めばいい。
924 :
nobodyさん:2009/01/03(土) 23:50:12 ID:xUjko049
>>923 それを聞いてんだろカス!
教えてやる知識ねーならくんなよボケw
質問コーナーでは知識を持ってるものが圧倒的に偉いという事が
バカにはわからないようだ。ww
別に偉くはないが。知識も示してないようだし。
そうか?
教えてもらえないバカは回答得ようと必死でマルチしてるが、
俺は教えなくても何にも困って無いぞ。
>>921 複数掲示板に対応するスクリプトをひとつ用意した方が楽じゃないか?
まあ、ム板にもあったように広告用モジュール作って、読み込ませればいい。
>>924 >教えてやる知識ねーならくんなよボケw
自分に対して「教えてやる」って・・・
まず日本語から勉強じゃまいか?
それ以前に幼児に対するような躾が必要そうだがw
躾入りまぁす(´・ω・`)
>>924 ここの解答者は頭おかしいから期待できないよ
知ってても教えないし
知らないくせに知ってる振りをして質問者を罵倒して楽しんでる
人間として未熟なのが多いよ
2人くらい解答はまともな人居てるけど
気分屋ってとこは他のカス解答者と一致してる
俺だったらbbs0(基本bbsこれはレンタルで使わない)を作って
他のフォルダにあるbbsからbbs0を読み込む
>>931 >924やお前みたいなバカは相手にする気も起きないが
まともな質問者に対してはちゃんと答えてる
お前も過去にマヌケな質問して相手にされなかったクチか?
あと、お前も日本語の勉強し直せw
>>932 あなたの言うまともな質問者なんて極少数だろね
>>924は煽りっぽくなってるけど
わからないから質問してるように思うよ
解答者を煽るためのトラップ質問じゃないよ
俺はどう答えればわからないから答えれないけど
わかるんなら解答してあげてください
>>924 解答者すべてにまともに答えていたらケンカになっちゃうよ
解答がスグに欲しいのはわかるけど
逆切れ書き込むより質問内容を充実させた方がいいと思う
ただし、後だし条件は嫌われるので
やりたいこと全てを一気に質問せずにひとつづつゆっくりまったり
Perlはドキュメントも資料も本も揃っているから、
それでも質問するのは、本当の難問にぶつかった人か、
あるいは異常者。
>>932 そもそもここは重複・隔離スレなんだからまじめに答えるな。
この板の初心者質問スレとム板の質問箱だけで充分だ。
936 :
nobodyさん:2009/01/04(日) 18:12:19 ID:ca/zCwOY
ム板
てどこの板のことでつか?
わかんない奴は来ないでいいよ。
ム板
てどこの板のことですか?
ム板はプログラム
マー板はプログラマー
プログラマー板はマ板な。
ちなみにプ板はプロレス板。
プロ野球は?
942 :
nobodyさん:2009/01/09(金) 15:09:32 ID:sHD2/VBK
今時レンタル掲示板か。
943 :
nobodyさん:2009/01/09(金) 15:30:58 ID:dxaSQaiQ
エラーが全然わからないので、教えてください。
#!/usr/bin/perl
for ($i=1; $i<1000; $i++)
{
if( $i<10 ){
$x = $i * 0.00001;
system( "./実行プログラム $x > Data/data4.0/output000[$i].txt");
}
els if(($i>9) && ($i<100)){
$x = $i * 0.00001;
system( "./実行プログラム $x > Data/data4.0/output00[$i].txt");
}
els if(($i>99) && ($i<1000)){
$x = $i * 0.00001;
system( "./実行プログラム $x > Data/data4.0/output0[$i].txt");
}
else{
$x = $i * 0.00001;
system( "./実行プログラム $x > Data/data4.0/output[$i].txt");
}
}
で、実行すると、
syntax error at ./cycle1.pl line 9, near "){"
syntax error at ./cycle1.pl line 13, near "){"
syntax error at ./cycle1.pl line 16, near "}"
Execution of ./cycle1.pl aborted due to compilation errors.
のようなシンタックエラーが出てしまいます。どこの文法が間違っているのかわからず。
どうか、アドバイスお願いします。
ちなみに、実行プログラムは、具体的なプログラム名が入ります。
>>944 初心者だが、els if は elsif では?
>>945 そうでした・・
教えてくださりありがとうございました。
こんなことで3時間考えてた自分がはずかしーーーーーーーーー
syntax error って言われたらsyntaxをチェックしろよ
プログラムのどこにもsyntaxという文字が見当たりません。
って言われかねないこんな世の中では
>>948 つ さすがにそこまでの阿呆はいないのでは?
極端な例を探せばきりがない。いないなんてありえない。
951 :
nobodyさん:2009/01/11(日) 19:23:36 ID:oQI3lzQf
my $test=1;
if($test){
&left;
}else{
&right;
}
この場合leftへ行きますがこの場合でもrightの内容って
メモリ上に書き込まれるんですか?多分書き込まれますよね・・・?
メモリ上にはsub right{}を解釈した時点で
どなたか知恵を貸して頂けないでしょうか。
今、メールの受信をきっかけにプログラムが動くように、
.forwardを使用したperlスクリプトを組んでいるのですが、
レンタルしたサーバのヘルプに分からない点があり、
そのサーバのヘルプにあるサンプルプログラムすら動かない状況です。
ヘルプには、
「.forward はローカルアカウント(@の左側がユーザー名)へのメールに対してのみ効果を生みます。」
と書いてありますが、この意味も恥ずかしながら良く分からず、
【ユーザ名@取得ドメイン】のメールアドレスにメール送信しても、
指定の.plファイルが動かない状態です。
このスレでお聞きする事では無いかも知れませんが、
どこでお聞きすれば良いのかすら分かりません。
些細な事でもかまいませんので、是非とも教えて下さい。
宜しくお願いします。
具体的にどういう設定したの?
サンプルプログラムが用意されていてそれが動かないなら鯖の中の人に言うしかないね
>954
お返事ありがとうございます。
.forward には、
|/home/ユーザ名/test.pl
test.pl には、
#!/usr/bin/perl
use Jcode;
my($mail) = join("", <>);
open MAIL, ">>/home/ユーザ名/forwarded_mail.txt" or die;
print MAIL jcode(\$mail)->euc;
close MAIL;
となっており、
上記はレンタルサーバのヘルプからの例をコピペしたものです。
要するにメールを受信したら、
それをforwarded_mail.txtに書き込むというスクリプトです。ソースや.forwardを置くディレクトリは間違ってないと思うのですが、
ローカルアカウントのメールに対してのみ効果を生む、という、その意味が知識不足な故、分かりません。
ローカルアカウントのメールアドレス「ユーザ名@取得ドメイン」の、
メールアドレスは送信は出来るけど受信が出来ないアドレスでした。
yahooフリメから↑のローカルアカウントのメールアドレスに、
テストメール送信を行いましたがエラーでyahooに帰ってきます。
しかしローカルアカウントアドレスからyahooにメールすると、
yahooに届くという一方通行となっているみたいです。
何か思い当たる点がありましたら、
どんな些細な事でも良いので教えて頂けたら幸いです。
実行フラグは?
「送信は出来るけど受信が出来ないアドレス」
などという訳のわからないことを言っている状態で、やらないで欲しい。
> 何か思い当たる点がありましたら、
SMTP関連をちゃんと勉強すること。
SMTPのプロトコルやDNSのMXレコード、サーバ上でのdispatchの手順など。
さらには、
>>956 の言うことなど。
思い当たる点だらけ、で、数冊の本になりそうな状態だと指摘しておく。
958 :
nobodyさん:2009/01/12(月) 17:50:00 ID:tJlllgzB
>957
ご指摘ありがとうございます。
自分が今回やりたい事に関係する知識が乏しい事はとても自覚しております。
仕事の関係で全く知識のない分野をやる事になり、全てが手探り状態です。
また、レンタルサーバのヘルプにある.plファイルや.forward等を配置し、
ローカルアカウントへメール送信する。 という作業以外に、
他に色々と知識や作業が必要という事でしょうか。
てっきり、.fowardを置いてローカルアカウントにメールを送れば、
.forwardに指定されている.plが実行されるのかと思っていました。
>>957さんの記事に書いてある事について、しばらく勉強してみようと思います。
ありがとうございました。
他スレで聞いたのですが、スレ違いだったので、こちらで質問させて下さい。
perlで書かれたプログラムをダウンロードしたのですが、
使い方として、
・本体(exxeed.pl)は編集の必要がありません。
・cpiファイルにスクリプトを追記して、動作を指定します。
・起動方法
コンソールから
> perl exxeed.pl hogehoge.cpi
とだけ書かれているのですが、
起動するにはどうすればいいのですか?
コンソールから、の意味が分かりません。
>>960 ググれ粕
WindowsXPだと仮定して
ウィンドウズキー+R
cmdと入力してEnter
cd (Alt+半角)デスクトップ
perl -cw ×××.pl
syntax OK
perl ×××.pl
>>960 コンソールが分からんのにperlをどうやってインストールしたの?
>>962 というわけでそのやり方でもダメな気がする。
>>963 別にWindowsにインストールしたのであればコンソール関係無いし。。。
インストーラーでWindowsにPerl入りますよ、知らないの??
まあ
>>962はWindowsでの話だしUnix/Linuxでは少し変わってくるな。
ん?
>>962のやりかたなら急にプロンプト出てきて粕坊やはびっくりしてわからなくなるんじゃないのカナ
「コンソール」でぐぐると、『ディスプレイとキーボードを指す』と出てくる。
ここで話されてるのは、『コマンドラインインタフェース』という意味での「コンソール」。
Wikipedia読めばわかるが、本来の意味とはちょっと違って使われているわけです。
967 :
960:2009/01/14(水) 19:04:12 ID:???
皆さんありがとうございます。
サーバーにアップして使いたいのですが、
ローカルで実行するプログラムであって、
サーバーで実行することはできないという事ですか?
>>967 perlがどのように動作しているのかよくかんがえるんだ!
なんでこんな無知がこの世に存在しているのかが謎
970 :
960:2009/01/14(水) 20:57:18 ID:???
別スレで質問した際に、シェルから実行すればいいと言われたのですが、
シェルから実行すればサーバー上で実行できると言うことですよね?
でもシェルから、、という意味がよくわかりません。
サーバー上のcronを使うのかと始め思ったのですが、違うみたいですし、、
971 :
nobodyさん:2009/01/14(水) 21:04:34 ID:VxBaEqTh
なんでこんな無知がこの世に存在しているのかが謎
ダウンロードしたのはどういうものなの?
ローカルで実行したいの?CGIから?
973 :
nobodyさん:2009/01/14(水) 21:09:42 ID:VxBaEqTh
少しは書籍読んで勉強くらいしたらどうなんだ。
| | | | | | | | | | || | |
| | | レ | | | | | J || | |
| | | J | | | し || | |
| レ | | レ| || J |
J し | | || J
| し J|
J レ
/V\
/◎;;;,;,,,,ヽ
_ ム::::(l|l゜Д゜)| …
ヽツ.(ノ::::::::::.:::::.:..|)
ヾソ:::::::::::::::::.:ノ
` ー U'"U'
ここは超初心者用。便器の前に連れて行って、チャック開けて
チンコ出すところまでやってあげな。
なるほど。。。了解した☆
>>960さん
サーバへのアップの方法はわかりますか?
>>970 もうちょっと自分で調べる努力しないと、後々つらいと思うけど
とりあえずヒント。
まずあなたがサーバで実行したいPerlのプログラム(スクリプト)を
あなたのパソコンからサーバへコピーしてください。
サーバをパソコンからリモートコントロールするために
通信ソフト(Telnetとかターミナルとかいろんな名前がある)で
サーバに通信できるようにしてください。
サーバと繋がってWindowsのコマンドプロンプトのように
キーボードから命令が打ち込める画面になったら
そこで
>>960にあなたが書いた
"perl exxeed.pl hogehoge.cpi"を入力してください。
運が良ければサーバであなたがダウンロードしたプログラムが動くかもしれません。
これはあくまでもヒントです。具体的な手順は書いていないつもりです。
分からない用語や言葉があれば自分で調べてください。
調べる気がないのなら、あなたにそのプログラムを動かす事は出来ないと思ったほうがいいです。
>>974 釣り針にあえて釣られてみた。
>>975 とりあえずチンコの出し方は書いてみたが
この程度なら自分の服を汚す可能性は高いよな。
止めてっ!出すなら便器に出して!顔は嫌!ですね、わかります。
979 :
960:2009/01/14(水) 22:25:12 ID:???
ありがとうございます<(_ _)>
とりあえず、頂いたヒントを参考にチンポ挿入を試みてみます!!
ガンガレ
入れる時は優しくだぞ、がんがれ☆