【Perl 】初心者コーナーPart7
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい
01/09/12 13:04ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。
参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://corn.2ch.net/test/read.cgi?bbs=php&key=988809842&ls=50
CGIの質問はこちら【CGIだけど、なんか質問ある?part3】
http://corn.2ch.net/test/read.cgi?bbs=php&key=988727833&ls=50
過去ログ、その他の役立ち情報は>>2-5を見よう。
0596名無しさん@お腹いっぱい。
01/10/05 11:44ID:Cx9AZXvIJcode.pmを入手して使うと楽。
日本人が作ったやつだけど、CPANにあるっけ?調べてみて。
use Jcode;
my $s = "まあ聞いてくれよ、スレと関係あるからさ。\n";
print Jcode->new(\$s, 'sjis')->utf8;
何がゴミデータかというのはエディタにもよるから。どのエディタ?
0597596
01/10/05 11:46ID:???環境でないとだめだったかも。。。
Windows用ならコンパイル済みのやつがある。
0598名無しさん@お腹いっぱい。
01/10/05 11:51ID:???c:/bin/
こんなの?
0599名無しさん@お腹いっぱい。
01/10/05 12:32ID:???そんなの。unix系は"c:"なしで。
0600名無しさん@お腹いっぱい。
01/10/05 13:07ID:QBNm.OW.ゴミデータってのは、制御コードのようなものとか、
文字コードが判別できないような「F・カ」みたいに表示されて
しまうものとか。そういったデータのことです。
エディタによって表示が違うのはその通りですね(^^;
0601名無しさん@お腹いっぱい。
01/10/05 18:48ID:???$hash{'Micro$oft'} = "VVindovvs";
foreach(keys %hash) {
$data =~ s/$_/$hash{$_}/;
}
print $data;
この場合 "Micro$oft" に含まれる "$" がパターンと見なされて
うまく置換できません。どのような回避方法が考えられるでしょうか?
自分ではパターン文字列でメタ文字と見なされてしまう文字列を
あらかじめエスケープする置換処理を挿入しているのですが
あまりスマートとは思えません。
パターン部の変数展開を一度だけ行ってくれるといいんですが。
「o」では期待した動作が得られませんでした。
0602名無しさん@お腹いっぱい。
01/10/05 18:51ID:???0603名無しさん@お腹いっぱい。
01/10/05 19:22ID:???$data = 'hogehogeMicro$ofthogehoge';
%hash = ( 'Micro$oft' => "VVindovvs", 'hoge' => '[ピー]' );
$re_keys = join('|', map { "\Q$_\E" } keys(%hash));
$data =~ s/($re_keys)/$hash{$1}/go;
print $data;
0604名無しさん@お腹いっぱい。
01/10/05 23:37ID:QBNm.OW.Jcodeをppmでインストールしようとしたら
>Installing package 'Jcode'...
>Error installing package 'Jcode': Read a PPD for 'Jcode',
>but it is not intended for this build of Perl
>(MSWin32-x86-multi-thread)
というメッセージが出てきてしまいました。バージョン違い?
CPAN逝ってきます。
0605名無しさん@お腹いっぱい。
01/10/06 00:32ID:MEgHrhMkうわーん。
http://search.cpan.org/search?dist=Jcode
>FAIL MSWin32-x86-multi-thread
ってのはWinはダメの意でしょうか。かなりしょんぼり。
0606名無しさん@お腹いっぱい。
01/10/06 00:47ID:???すみません。
http://openlab.ring.gr.jp/Jcode/index-j.html
にありました。
0607名無しさん@お腹いっぱい。
01/10/06 08:38ID:xcBMND.sデータを記録する時の区切り文字には定番だったり
慣例のものとかってあるんですか?
よく目にするのが<>だったり\tだったりしますが?
教えてくらはい。
0608名無しさん@お腹いっぱい。
01/10/06 10:51ID:32vtXsHYUNIXみたいに#! /usr/local/bin/perl(コマンドライン?)
というのを使える様にするにはどうすればいいんでしょうか?
ちなみに、perlソフトはActive Perlです。
教えて君初心者ですみません。。
0609名無しさん@お腹いっぱい。
01/10/06 10:56ID:???エクセルとか意識するならCSVは忘れない方がいいんじゃないかな
\tはTSVって言ってCSVの親戚みたいなもんか。。
<>が使われるのは多分BBSとかのログは大抵タグがエスケープされてる
から、デリミタ混入→ミスヒット、の可能性が低くなるからだと思う
0610名無しさん@お腹いっぱい。
01/10/06 11:09ID:xcBMND.sなるほど!<>にはそういう意味があったんですか!
どうもありがとうございます。
TSVってのは知りませんでした。
メモ帳とかで開くとタブで区切っとけば
見やすいからだと思てた・・・。
0611名無しさん@お腹いっぱい。
01/10/06 11:10ID:???入手にちょいと苦労するがむっちゃ便利なプログラムがある。
ベクターで「SOS」を検索してみ。
0612名無しさん@お腹いっぱい。
01/10/06 11:28ID:xcBMND.sこれの事ですかね?
PERLで書いたスクリプトをcなんかの様に実行形式に
コンパイルできるソフトって無いものですか?
あるにはあるけど正確じゃない。みたいな事は耳にするのですが?
どうなんでしょう?
0613名無しさん@お腹いっぱい。
01/10/06 14:14ID:???Cygwin入れたらいい
これで一件落着
0614608
01/10/06 17:41ID:PN8fPnr6それを入れたら良いとか本に書いてあったんですが
ダウンロードサイトに行ってみたら、どうやら金取られるみたいで..
611さんの言うのもダウンロードしたのですが
どうやってパッチを当てるかいまいちわからなくて..。
ほんと、難しいですよね...鬱
0615名無しさん@お腹いっぱい。
01/10/06 18:51ID:???もっと健作白〜〜〜
何をそんなに焦っているのか? 今日納期の仕事してる訳じゃ無いだろ
実際Unixのshellに触る事は回り道でもなんでも無いんだぞ
って9xで使えたかな (・∀・;)??
0616名無しさん@お腹いっぱい。
01/10/06 19:46ID:???http://cygwin.com/setup.exe
これ落とせ
んで、どっかに移動してから起動して、それで適当にサーバー選んで落としてこればいい
0617614
01/10/06 20:26ID:w30D7B7.どうもありがとうございんます。。
どっかに移動して起動して、というのはどういうことでしょうか?
ディスクトップに解凍するのでいいのですか?
あと、大変失礼な質問なのですが
そのファイルは大丈夫なのでしょうか?
拡張子がexeなので心配で...
0618名無しさん
01/10/06 20:36ID:???まずWIN板に行ってファイル操作や圧縮解凍に付いて学びましょう
>あと、大変失礼な質問なのですが
>そのファイルは大丈夫なのでしょうか?
>拡張子がexeなので心配で...
憶測ですが、おそらく616氏はsetup.exeのAUTHORでもcygwin.comのサーバ管理者でも
無いと思われますので何がどう大丈夫なのかは分からないでしょう
0619617
01/10/06 21:58ID:w30D7B7.すみません、実はP検3級のOSはAなんです(w
解凍とかもたまにUGにいくのである程度はわかるのですが
でも、やっぱり深く掘り下げると難しくて。。
一瞬ウィルスだと思ったんですがアドレスが違うみたいですね。
ちょっとexeファイルに過敏になっていたもので..。
もう少し勉強してまた、質問させていただきます。
0620名無しさん@お腹いっぱい。
01/10/06 22:12ID:???0621名無しさん@お腹いっぱい。
01/10/06 22:22ID:w30D7B7.解凍するソフトの種類や拡張子の種類はわかりますです。
0623名無しさん@お腹いっぱい。
01/10/06 23:29ID:tXZdOs1cファイルからデータを読みだし、そのデータを含むHTMLを
ブラウザに表示させるスクリプトを書きました。
TELNETのコマンドライン上から実行すると
狙いどおりの出力をしてくれるのですが、
ブラウザ上からURLを入力して実行すると
500 Internal Server Errorがでてしまいます。
パーミッションなども確認したのですが
おかしなところは見当たりません。
何かチェックすべきところが他にあるのでしょうか。
0624名無しさん@お腹いっぱい。
01/10/06 23:43ID:???0625623
01/10/06 23:46ID:tXZdOs1cHTMLの直前に書きました。
0626名無しさん@お腹いっぱい。
01/10/06 23:51ID:???print "Content-Type: text/html\n\n";
0627623
01/10/06 23:51ID:???でした。自分で書いて気がついた。
助かった〜ありがとうございました。
0628626
01/10/06 23:52ID:???0629たかちゃん
01/10/06 23:54ID:j.NzGGwA初心者ですが、cgiを設置したのに見ると
CGI エラー - 以下のコマンドラインを実行できません : "perl C:\kujira\aska.cgi ", errorcode = 2, No such file or directory
と出るのですが、どうしてでしょうか?
お願いします
おしえてください
0630名無しさん@お腹いっぱい。
01/10/06 23:55ID:???0631名無しさん@お腹いっぱい。
01/10/07 02:00ID:???助けてやって下さい。
0632名無しさん@お腹いっぱい。
01/10/07 02:12ID:???CGI速くするだけなら別の方法もあるよ。
0633名無しさん@お腹いっぱい。
01/10/07 14:43ID:???1番目から10番目を逆順で処理してると思うんですが、
逆順にしてから1番目から10番目を取得するにはどうしたらいいでしょうか。
つまり、
1-30のうち
10,9,8...,2,1ではなくて、
30,29,28...,22,21と取得するということ。
0634名無しさん@お腹いっぱい。
01/10/07 14:44ID:jXvc6whkperlccですか!ありがとうございます。
けどやっぱcとかみたいにうまくコンパイルできないとか
言う話をちらほら聞いた事あるんですけどどうなんでしょう?
>CGI速くするだけなら別の方法もあるよ。
良かったら教えて欲しいっす!!
どんなんでしょう?
0635名無しさん@お腹いっぱい。
01/10/07 15:15ID:???スライスの使えばOK.
(reverse 1..30)[0..9]
0636名無しさん@お腹いっぱい。
01/10/07 15:18ID:???あと、30から21がほしいだけなら、reverse21..30でもいいような。
0637JAPU@愛国戦隊大日本
01/10/07 16:13ID:???for($i = 30; 20 < $i; $i--) としても良いです。
>>634
mod_perl, SpeedyCGI など。Perl の場合は起動と構文解析に時間がかかるので、そのコストをおさえることができます。
0638名無しさん@お腹いっぱい。
01/10/07 16:22ID:???ありがとうございます。
んー。
@read[$hoge .. $moge]を逆順で処理させたくて、
$hoge = 0;
$moge = $hoge + 10;
foreach (reverse @read[$hoge .. $moge]){}
とやってみたのですが、
@readに仮に0-30のリストが入っているとして、
9,8,7,6,5,4,3,2,1,30という処理順になってしまいました。
むむむ…。一体どうすればいいのでしょう…。
0640635
01/10/07 16:30ID:???修正
> 9,8,7,6,5,4,3,2,1,30という処理順になってしまいました。
→ 9,8,7,6,5,4,3,2,1,0,30という処理順になってしまいました。
>>637
書き込んだらレスがついていたので慌ててお礼だけ書きましたが、、、
まず考えたのがそれだったんですが、作っているのが掲示板で、
リストの最後がいくつになるか判断するルーチンは今のところ無いんです。
ありがとうございました。
0641名無しさん@お腹いっぱい。
01/10/07 16:31ID:jXvc6whkサーバーで用いるインタープリタを変えるって事なのかな?
勉強になるです。ありがとうございました。
0642名無しさん@お腹いっぱい。
01/10/07 16:39ID:???実行形式にするのにはPerl2Exeってのもあるんですね。
知ってる人の方がおおいんだろうけど
自分見たいののために報告〜。
0643名無しさん@お腹いっぱい。
01/10/07 17:09ID:Hz5hclI2>→ 9,8,7,6,5,4,3,2,1,0,30という処理順になってしまいました。
いったいどうすれば、そんな処理順に・・・。
それをねらってやるほうが難しい(つーか面倒)なのでは。
0644名無しさん@お腹いっぱい。
01/10/07 17:53ID:???@a = (0 .. 30);
@a = reverse @a[-1 .. 9];
print "@a\n";
0645名無しさん@お腹いっぱい。
01/10/07 21:46ID:XxfLnDlQリネームが一番効果的っての聞いた事あんですけど。
DBMてのを使うのは無しで。
0646名無しさん@お腹いっぱい。
01/10/07 22:17ID:kSNrchYMずーと悩んでるけれど全然スマートな方法が思いつかないッす。
0647名無しさん@お腹いっぱい。
01/10/07 22:27ID:???flockだけど、、evalすらしてない w
>>646
二つしかないならループしなくて良いじゃん?
普通はkeysでkeyの配列作ってその配列をforeachしたり
eachしたり、、
@keys = keys (%hash);foreach (@keys)
while (($key,$value) = each %hash)
0648名無しさん@お腹いっぱい。
01/10/07 22:36ID:kSNrchYMでも、チョット違うかもしんない。
そういう意味でなら、キーがみっつて事になるかな。
$hashref->{1}->{2} = 3;
みたいな。
書き方はこれじゃなくても、何でもいいんで同様のことを実行できる方法ないっすかね。
0649名無しさん@お腹いっぱい。
01/10/07 22:48ID:???0650むぎ茶
01/10/07 22:55ID:???┐(´ー`)┌
┏━━━━━━━━━┓
┃('Д')y ─┛~~ ┃
┃むぎ茶 ┃
┃[email protected] ┃
┗━━━━━━━━━┛
0651名無しさん@お腹いっぱい。
01/10/07 22:58ID:kSNrchYM$hashref->{"key1-1"}->{"key1-2"} = "1-3";
$hashref->{"key2-1"}->{"key2-2"} = "2-3";
while (($key, $value) = each %hash) {
while (($key2, $value2) = each $value->{$key}) {
print $key, "=>", $value->{$key2}, "=>", $value2, "\n";
}
}
こーいうことがしたいの。
0652634
01/10/07 23:03ID:???未だに当初の目的は達成できません。
>>635を参考に>>638のようにしても無理なのですが、
どうすれば良いんでしょう?
0653名無しさん@お腹いっぱい。
01/10/07 23:04ID:???key1 => { key1-1 => 'val1-1' },
key2 => { key2-1 => 'val2-2' },
);
>>651
%$valueね。
0654名無しさん@お腹いっぱい。
01/10/07 23:08ID:???むっちゃありがとー。今夜はぐっすりねれそうだよー。
0655名無しさん@お腹いっぱい。
01/10/07 23:11ID:???0656名無しさん@お腹いっぱい。
01/10/07 23:26ID:???何言いたいのか解らん、上の方で言ってるのでなんで駄目なんだ
@list = reverse (0..30);
foreach (@list){
print "$_\n";
last if($cc == 10);
$cc++;
}
0657名無しさん@お腹いっぱい。
01/10/07 23:30ID:???こうだと推測してみた。正解なら俺をエスパーと呼べ。
@read = (0 .. 30);
$hoge = 0;
$moge = $hoge + 10;
foreach (reverse @read[-$moge .. -1-$hoge]) { print "$_\n"; }
0658名無しさん@お腹いっぱい。
01/10/07 23:32ID:???foreach (reverse @read[-10 .. -1])
はどう?
変数使うなら
$hoge = $#read;
$moge = $hoge+10;
foreach (reverse @read[$moge .. $hoge])
とか。
これは先に後ろ10個取り出してから,逆順にしてる。
>>638は始めの10個取り出してる。
0659658
01/10/07 23:33ID:???0660634
01/10/07 23:45ID:???http://www.geocities.co.jp/MusicStar/2856/bbs.txt
0661名無しさん@お腹いっぱい。
01/10/08 00:04ID:pELG7ByEなんかflockだとするロック破られるとか
書いてあるの読んで気がひけるんですよね。
実際どうなのかはわからないですけど。
皆さんの方法とか教えてくれないですかね?
0662名無しさん@お腹いっぱい。
01/10/08 00:07ID:???foreach ( reverse @read[$page .. $page_end] ) { これは
foreach ( reverse (@read[$page .. $page_end]) ) { こう評価される
つまりケツから10個じゃなくて頭の10個をreverseしてる
先に@read = reverse @read; とでもして
foreach (@read[$page .. $page_end] ){ こうしとけ
0663名無しさん@お腹いっぱい。
01/10/08 00:17ID:???何を破られんのか解らんけど、flockしないなら
rename、simlink、mkdir、辺りの関数で実装するの普通
ここでロック論争始めるとまた色んな信者さんが出てくるから
その辺のスクリプトとか大崎さん所(perlメモ)とか見てくれ
flockよりショボイのは幾らでも組めるが***まともに機能してる***
flock以上のは組めないってのがほんとのところ
0664名無しさん@お腹いっぱい。
01/10/08 00:24ID:???0665名無しさん@お腹いっぱい。
01/10/08 00:54ID:pELG7ByE0666634
01/10/08 01:01ID:???ありがとうございます。
さらに精進します。
みなさま。
ちょっとしつこかったです。反省。
スレ汚しスマソ。です。
恥ずかしいので>>660は削除しときます。
0667名無しさん@お腹いっぱい。
01/10/08 01:02ID:lKBSfyUUこの、自身のREFERERも出さないリダイレクタってどういう原理なんでしょう?
0668名無しさん@お腹いっぱい。
01/10/08 01:05ID:???LWPにレジューム機能は存在しないもよう。
関連モジュール内で"content-range"という文字列を
探したけど該当する機能が見つからなかった。
LWPはでかいから見落としてる可能性もあるけどね。
レジュームしたけりゃ、自分で"Content-Range"ヘッダを付けて
ファイル保存処理をガリガリ書くしかないのかもしれない。
0669名無しさん@お腹いっぱい。
01/10/08 01:22ID:???0670名無しさん@お腹いっぱい。
01/10/08 01:28ID:???見れないしスレ違いだし良くワカラナイけど
HTTP_REFERERはREMOTE_ADDRとかと違ってクライアント側で容易に書き換え
出来るわけ。
で、多分link.cgiがQUERYをラップして変わりに取りに行ってると思う訳
0671667
01/10/08 01:38ID:???ありがとう
それをコードにするとどうなるでしょう?ってのは、たしかにスレ違いですね
こんなCGI探してますスレッドでもう一回聞いてみます
0672名無しさん@お腹いっぱい。
01/10/08 14:19ID:xLWu69kM方法はどの様なのが定番なのでしょうか?
0673JAPU@勉強中
01/10/08 15:04ID:???m//i 使っても良いと思うが。
0674名無しさん@お腹いっぱい。
01/10/08 18:42ID:???そうなんですか…どうも。
とりあえずContent-Rangeとやらを調べてみます。
0675名無しさん@お腹いっぱい。
01/10/08 20:31ID:Kg6GidGEレスありがとです。
やっぱりindexだといったん大文字か小文字にするしか
無いんですかね?
変換のロスで正規表現の方が早くなったり。
0676名無しさん@お腹いっぱい。
01/10/08 20:50ID:/cLj7636検索対象データのコピーを作って、
そっちをあらかじめ大文字か小文字に統一しとくのは?
ディスクスペースは2倍必要だけど。
0677名無しさん@お腹いっぱい。
01/10/08 21:33ID:???けど検索対象のデータが結構ごちゃごちゃしてるんで
これ以上ファイルが増えるとちょっと(^^;
0678名無しさん@お腹いっぱい。
01/10/08 23:35ID:???検索するたびにそんな多数のファイルを開いてると
I/Oに負担かかって氏ぬです。
↑いまは亡き「とほほラウンジ」方式。
0679名無しさん@お腹いっぱい。
01/10/09 00:28ID:???乱発するとダメ?
0680名無しさん@お腹いっぱい。
01/10/09 01:08ID:qw3TKOks�@掲示板の全てcgiで制御する
�A最近の5件ほどhtmlで表示させてそれ以降(ログの表示)は
cgiで制御する
�B書き込むたびに全てhtmlで出力(ページ数は5ページほど)させる
だと�Aが一番サーバに易しいですかね?
0681名無しさん@お腹いっぱい。
01/10/09 01:56ID:???ん? 聞いた事ないけど、何と比べて?
>>680
HTMLは静的、CGIは動的なコンテンツを提供してるって言えばいい?
一年に3人しか書き込まなくてROMが1000万人居るなら2
リロード代わりに見た人間全員が書き込むんなら1、
3は意味解らん、なら1ページに全部吐けば良いじゃん
0682名無しさん@お腹いっぱい。
01/10/09 02:22ID:???0683名無しさん@お腹いっぱい。
01/10/09 02:23ID:???そんでデータファイルは別に作っといてそれから
htmlファイルとして出力しようと思ったんだけど、
書き込みされるたびにhtmlファイルをすべて作り直すのも負担になるな…と。
だけどアクセスされるたびにcgiで処理する�@は論外かなと
まぁ一番一般的だけど。
んじゃ大抵の人間はログなんか読まないからTOPページだけhtmlで
出力しておくかなと思って。rom率とカキコ率で変わってくるけど
チャットじゃないから最初のページはhtmlにした方が効率が良いかと。
…何をいってるのかわからないと。
処理ごとの負担がデータ化されてるページとかあれば楽なんですけどね。
0684名無しさん@お腹いっぱい。
01/10/09 02:47ID:???カキコのカウントもとればなおよし。
0685名無しさん@お腹いっぱい。
01/10/09 02:57ID:???10年前の超オーバーヘッドなSCSIHDD使ってる鯖でHTML化とか言って
ガリガリファイル書き換えまくったら速攻でディスクビジーだろうし
結局鯖のuptimeと相談しながらってなるでしょ? それを一からやりたいなら
止めないけど・・・
で、頭の良い先人が色々考えた結果ROM比30:1ならHTMLの方が良いだろっつて
アナタが今みてるココとか紅茶板があるんすよ
0686名無しさん@お腹いっぱい。
01/10/09 03:19ID:???こういうの知りたかったんです。為になるです。
>684
そうですね。最初は負荷かかっても損して得とれみたいな
かんじで統計とってみようかなと思います。
まぁ一概にはいえないんでしょうけど→30:1
参考にしようと思います。
0687名無しさん@お腹いっぱい。
01/10/09 13:29ID:???書き出すhtmlのサイズにもよるが。
頻繁にアクセスするファイルはバッファに入るだろうし
0688名無しさん@お腹いっぱい。
01/10/09 14:24ID:???頭大丈夫ですか?
@aiueo = "あいう";
if(@aiueo != 0){
foreach (@aiueo){
print "$_";
}
}
配列aiueoに"123"と"あいう"を格納したいのですが、
二つ目のあいうだけしか表示されません。。。
@aiueo = "あいう";
このようにすると値が上書きされてしまいますね・・・(汗
すいません。
後から加えたい場合は必ず
push @formcheck, $Name; か、
unshift @formcheck, $Name; でやらなきゃいけないんでしょうか?
0691名無しさん@お腹いっぱい。
01/10/09 15:20ID:???pushなりunshiftなりしなさい。
push @array, $str;
# そもそも @array = $str というのはどうかと思うぞ。
0692名無しさん@お腹いっぱい。
01/10/09 15:22ID:???@aiueo = "あいう"; これで'あいう'しか入ってないでしょ?
@aiueo = ("123","あいう");
こうしとけ つーかリファレンス嫁
0694名無しさん@お腹いっぱい。
01/10/09 17:05ID:???<br>
0695名無しさん@お腹いっぱい。
01/10/09 17:06ID:???タグ辞書登録してたらクリックしてもうた〜。すんません。
0696名無しさん@お腹いっぱい。
01/10/09 18:24ID:caK9Qd8A方法ないでしょうか?↓みたいなかんじです。
$bb="$aa";
$aa="ほげ";
print "$bb";
これだと何も出力されませんが
出力が ほげ と出るような方法は無いでしょうか?
■ このスレッドは過去ログ倉庫に格納されています