【Perl】初心者コーナーPart11
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/03/27 12:53ID:wAXxxOxPいらっしゃーい、Perlの「コーディング」で困ってる人のスレです。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。
参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://pc.2ch.net/test/read.cgi/php/988809842/
CGIの質問はこちら【CGIだけどなんか質問ある Pert 5.01 】
http://pc.2ch.net/test/read.cgi/php/1015127347/l50
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
過去ログ、その他の役立ち情報は>>2-10を見よう。
0182nobodyさん
02/04/03 13:59ID:???use warnings ;
皆さん使ってます?
0183
02/04/03 15:35ID:7cQZbwjHフォームで取得した情報を、テーブル内に表示しようとすると
並び順がめちゃくちゃになってこまっています。これを順番に表示するにはどうしたら
よいでしょうか?
名前 → 本文
メールアドレス → 名前
本文 → メールアドレス
#フォームデータの復元
foreach $pair (split(/&/, $query)) {
($key, $value) = split(/=/, $pair);
# 文字のデコード
$value =~ tr/+/ /;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;
$FORM{$key} = $value;
0184nobodyさん
02/04/03 16:05ID:???>>1から引用
> 1:自分はこう言う事がしたい。
> 2:それでこんな風にやってみたが・・・
> 3:それだとこんなエラーが出て上手く行かなかった。
肝心の「何がしたいか」を書かないでまともな返事を期待するなよ。
アンタのやりたいことは多分これだと思うが。
-- begin code --
print { $file{fh} } $str
-- end code --
0185nobodyさん
02/04/03 16:06ID:???Hashってのはそういう仕様なんだよ。
順番に表示したきゃsort keys %hashやTie::IxHash、DB_FileのDB_BTREEでも使えや。
0186183
02/04/03 16:18ID:7cQZbwjHどうも有難うございました。そういう仕様なのですね。納得です。
勉強してまた、出直してきます。
0187nobodyさん
02/04/03 16:29ID:???sortを使ってハッシュの中身を整列してから表示するという手もある。
0188183
02/04/03 16:38ID:???ところで、hash は順番めちゃくちゃに表示っていうのは
毎回ランダムに順番が代わるのでしょうか?それとも何か規則性あるんですか?
0190nobodyさん
02/04/03 16:54ID:???順番は変化します。
基本的には恐らくハッシュ値の順とかだろうけど、同じハッシュ値の場合は
格納した順によって変化するはずなので、同じ順番に並ぶことを
期待しない方がいいと思う。
以上適当な解答なので、どうしても気になるならPerlのソースコードでも
見て確かめてください。
ハッシュについてはC言語のアルゴリズムの本をみればよく分かると思う。
0191nobodyさん
02/04/03 17:09ID:???モジュールで整列できる物がある。
・・・以前JAPUさんに教えてもらったのにログが見つからない。(涙
0193nobodyさん
02/04/03 18:34ID:???<input type=hidden〜〜〜>
で渡す。
0194nobodyさん
02/04/03 18:39ID:???〜〜.cgi?comment=sage
ってするか、フォームボタン作って
<input type="hidden" name="comment" value="sage">
ってする。もしくはjavascript使って併用することもできる。
あとはクッキー使う方法もある。削除パスワードとか。
0195192
02/04/03 18:44ID:???<input type="hidden" 〜
で解決しました。皆様方に感謝です。
0196nobodyさん
02/04/03 21:56ID:???なんですけど
package test ;
sub new {改行多すぎて省略}
sub a
{
my ( $self ) = shift ;
my ( $str ) = @_ ;
print "$self->{test} ### $str\n" ;
}
sub b
{
my ( $self ) = shift ;
my ( $str ) = @_ ;
# a( $str ) ;
a( $self , $str ) ;
#ここの引数の数と
}
package main ;
my $test = new test() ;
$test->a( "call a" ) ;
#ここの引数の数
$test->b( "call b" ) ;
exit ;
メインから呼ぶとき、
$test->a( "call a" ) ;
だけど、メソッドbから、呼ぶときは、
a( $self , "call a" ) ;
と、なっちゃったんだけど、できれば引数の数が変わるのは、避けたいいんだけど、
これは、言語仕様すか?
それとも、記述の仕方間違ってます?
0198nobodyさん
02/04/03 22:16ID:???$self→a("call a");
ってやりなされ。
0200nobodyさん
02/04/04 01:44ID:???漏れは、
$FORM{$key} = $value;
push(@FORM_ORDER,$key);
てな感じでキーの順序を覚えておいて、
foreach(@FORM_ORDER) {...}
で回すだす。
0201nobodyさん
02/04/04 10:04ID:???0202春虫
02/04/04 15:04ID:???print TMP "$no<>$data1<>$data2<>$date\n";
open(DATA,"$file") || &error("$fileが変!");
while (<DATA>) {
print TMP $_;
記事に$noを振りたいんだけど$noを1づつ増やして
いきたいのですが・・・どうも上手くいきません。
Perlの先輩方々よいアドバイスをください・・・
感じとしては$fileの1行目を読み込んで
$noに+1をする感じでいいのでしょうか。。。
0203nobodyさん
02/04/04 15:16ID:???もう少しわかりやすく。
何をやりたいかよくわからない。
0204202
02/04/04 15:22ID:???書き込みにNoをつけたいんです;−;
1番目記事,2番目の記事って感じに。
0206nobodyさん
02/04/04 15:25ID:???ログにナンバーを振るのでなく、表示の際にナンバーを振っていく方がいいと思うが
それじゃダメなのかな?
0207202
02/04/04 15:35ID:???0208誰かもっとスマートな方法教えて
02/04/04 16:00ID:???open(TMP, ">$tmp") || &error("$tmpが変!");
$tmp = <DATA>;
$tmp =~ /^(\d+)<>/;
print TMP ($1+1) . "<>$data1<>$data2<>$date\n$tmp";
while (<DATA>) {
print TMP $_;
0209nobodyさん
02/04/04 16:00ID:???http://www.nn.iij4u.or.jp/~nabe/osietekunn.html
君はなかなかの教えてクンだ。
だが今一歩足りないな。
もっと無意味な情報をこれ見よがしに提示し、
自分の考えを捻じ曲げて喚き散らし、
狂ったように答えを催促すれば誰しも認める第一級教えてクンになれるゾ!
0211fdg
02/04/04 19:45ID:ggon4ynD儲かる出会い系ビジネス
月収100万円オーバー!!
HP作成できない初心者でも安心して運営
出会いサイトシステムをサーバーごとレンタルします
運営者様には無料で宣伝ソフトもお付けします
1.携帯メール自動生成一括送信ソフト
2.高性能メールアドレス収集ソフト
3.サーチエンジン・掲示板一括自動ソフト
http://www.voo.to/2ch/
0212 ◆Ihiuc0j.
02/04/04 23:14ID:zyOMuMfg例えば
--------------------------------------------------------
test(@DATA1,$data,@DATA2);
sub test{
local(@DATA,$data,@DATA2) = @_;
}
--------------------------------------------------------
のようなソースの場合local(@DATA)に全てのデータが入ってしまいます。
色々試行錯誤したのですが、なかなか望む結果は得られませんでした。
で、ポインタ(リファレンス)渡しでやったみたのですが
ポインタ自体は受け渡せたのですが、そこから配列を丸ごと参照する方法がわかりません。
($data->[x]のように一個一個要素を取り出せば上手くいきました)
何かスマートな方法はないでしょうか?
0214nobodyさん
02/04/04 23:19ID:???0215nobodyさん
02/04/04 23:35ID:???0216 ◆Ihiuc0j.
02/04/04 23:37ID:zyOMuMfgうお、あっさり出来たΣ(゜っ゜
サンクス!
0217nobodyさん
02/04/04 23:49ID:???0218nobodyさん
02/04/05 00:24ID:???sub test(\@\$\@);
test(@data, $data, @data2);
sub test(\@\$\@){
local(*ary, *scl, *ary2) = @_;
# ...
}
0219nobodyさん
02/04/05 01:24ID:zs6TJzXIreturnで値を返すときも内部では参照を返しているのでしょうか?
0220nobodyさん
02/04/05 01:30ID:9ypevpefプロトタイプ野郎を見たいので。
0221nobodyさん
02/04/05 01:39ID:???サブルーチン内でmy宣言した変数をreturnできることを考えればわかるだろ!
このうすらハゲが!
0222nobodyさん
02/04/05 01:54ID:???バレタ!?(;゚д゚|||
0223
02/04/05 03:00ID:don7TGy+ヒアドキュメントを含む部分をサブルーチンにしたい場合、どうしてますか?
0224nobodyさん
02/04/05 03:37ID:???意味がよくわからないけど,こういう事?
&foo(<<" HERE-DOC");
here-document
HERE-DOC
インデントに使用した文字(タブとか)も判定に使われる.
perldataのScalar value constructorsを読むと参考になると思う.
0225
02/04/05 04:11ID:don7TGy+英文は読みませんでしたけど、コードの例見たらわかりました。
英文って読む気がしないんですけど、
やっぱり読むほうが普通なんでしょうかね。
0227nobodyさん
02/04/05 04:24ID:???英語が読めると(Perlに限らず)世界は確実に広がる.
読もうとしなければいつまでも読めないまま.
読むスピードはそのうち速くなるから,頑張り過ぎない程度に気軽に読むのが良いかと.
知っている内容が多いperldocは読み易かったよ,おれの場合.
0228nobodyさん
02/04/05 07:21ID:???お前に能書き垂れられる筋合いじゃネーヨ
何様だオマエ???(゚Д゚)
0229Dream ★
02/04/05 07:27ID:???わかっていてもなかなかね。
英語の読解力付けたいんじゃなくて、Perlで目的の
処理が出来たらいいわけなんで、ついつい。。。
0230nobodyさん
02/04/05 07:52ID:???漏れの場合、UNIXのmanを読むうち、いつのまにか
マニュアル英語だけは読めるようになってたよ。
構文が単純だからかねぇ。
もちろん日本語訳があれば、そっちを先に見ます。
0231nobodyさん
02/04/05 08:07ID:???少しは英語に慣れるんじゃない?
たまにRandal L. Schwartzが答えるね。
0232nobodyさん
02/04/05 15:16ID:cQRjW2rJeffective perlはなかなか評判は良いようですが、こちらのほうはどうでしょう?
近くの本屋に売っていないもので、具体的内容が確かめられません。
0233nobodyさん
02/04/05 15:18ID:???0234727
02/04/05 16:11ID:Oqnvheagけっこう高額だそうですね。
0235nobodyさん
02/04/05 16:38ID:7CGZnUtFこのようなログがtail -fで流しているのですが
Apr 5 16:33:08 udp xxx.xxx.xxx.xxx(139) -> xxx.xxx.xxx.xxx(139)
だけ表示させるperlスクリプトを作りたいと思っています。
初めてperlでスクリプトを作るのでヒントいただけたら助かります。
何かヒントになるスクリプトないでしょうか?
拡張としてはxxx.xxx.xxx.xxxのIPアドレスをgethostbyaddrつかって
ホスト名に出来るようにしていきたいと思っています。
0238235
02/04/05 16:53ID:7CGZnUtFwhile(<STDIN>){
print;
}
まずなにからやっていけばいいのかが解ってないレベルです。
もうしわけないです。
配列にデータを入れていかないといけないのか?とか
基本的な所から解ってないです。
発想ができてない状況なのでとりあえずこういうのをやってみろとか
ありましたら是非ともよろしくお願いします。
0239nobodyさん
02/04/05 17:09ID:???#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello world!!";
まずここから。
0240nobodyさん
02/04/05 17:13ID:???なんでCGIになってるんだ?
0241nobodyさん
02/04/05 17:14ID:???0242nobodyさん
02/04/05 17:30ID:???open(TAIL, "tail -f tmp.log |") or die;
while(<TAIL>) {
if (/^(\w+ \d+ \d+:\d+:\d+ ).+(udp )(\d+\.\d+\.\d+\.\d+)(\(\d+\)) -> (\d+\.\d+\.\d+\.\d+)(\(\d+\))/) {
print "$1$2$3@{[host($3)]}$4 -> $5@{[host($5)]}$6\n";
}
else {
print $_;
}
}
sub host {
my $host = gethostbyaddr(pack("C4", split(/\./, $_[0])), 2);
return $host ? "[$host]" : '';
}
0243235
02/04/05 18:11ID:7CGZnUtFありがとうございます。
ゆっくり勉強していくつもりだったんですがいきなり答えが。
でもこのままだと少し問題があったので多少いじりました。
#!/usr/bin/perl
use strict;
open(TAIL, "tail -f /var/log/filter.log |");
while(<TAIL>) {
if (/^(\w+ \d+ \d+:\d+:\d+ ).+(denied )(\w+ )(\d+\.\d+\.\d+\.\d+)(\(\d+\)) -> (\d+\.\d+\.\d+\.\d+)(\(\d+\))/) {
print "$1$2$3$4@{[host($4)]}$5 -> $6@{[host($6)]}$7\n";
# print $3;
}
else {
print $_;
# print $3;
}
}
sub host {
my $host = gethostbyaddr(pack("C4", split(/\./, $_[0])), 2);
return $host ? "[$host]" : '';
}
正直use strict や (pack("C4", split(/\./, $_[0])), 2);のあたりが
まったくわからないのですが勉強させていただきます。
本当にありがとうございました。
0244235
02/04/05 18:15ID:7CGZnUtF0245nobodyさん
02/04/05 20:32ID:???/$keyword/
のようにすると、$keyword の内容が2バイト文字で、その中の一文字に
「\」とか「|」が混じってると普通に検索できません。
なにかいい方法ありませんか?
0246nobodyさん
02/04/05 20:42ID:???アクセスカウンタをDBMつくろうとしているのですが、↓みたいな方法にしたら
うまく表示されませんでした、どの部分に問題があるのかもしわかりましたら
教えて頂けると助かります。宜しくお願いします。
$dat = './dat/dbm_counter';
#ファイルを開いて変数に代入
if (!tie %COUNT, SDBM_File, $COUNT, O_CREAT|O_RDWR, 0666) {&error('File Not Open');}
$COUNT('now') = ++$COUNT('now');
$now = $COUNT('now');
untie %COUNT;
0249nobodyさん
02/04/06 21:30ID:???DBMなんぞよりPerlの勉強をしたほうがいいね。
0250nobodyさん
02/04/06 21:39ID:???-c check syntax only (runs BEGIN and CHECK blocks)
syntax error at - line 5, near "$COUNT("
syntax error at - line 6, near "$COUNT("
- had compilation errors.
0253nobodyさん
02/04/06 21:58ID:???0254248
02/04/06 22:03ID:???if (!tie %COUNT, SDBM_File, $dat ,$COUNT, O_CREAT|O_RDWR, 0666) {&error('File Not Open');}
$COUNT{'now'} = ++$COUNT{'now'};
$now = $COUNT{'now'};
untie %COUNT;
>>250
そのsyntax error っていうのが、今使っているサーバだとでてくれないので
間違いを見つけるのが大変なのですが、何をすれば表示されるのですか?
0255nobodyさん
02/04/06 22:06ID:???use CGI::Carp qw(fatalsToBrowser);
つか、大丈夫ですか、と質問する前に試したらどうだよ。
だがもちろん共用サーバではやるなよ。
0258nobodyさん
02/04/06 22:25ID:???0259nobodyさん
02/04/06 22:45ID:b9SW2YHj----test.txt-----
ABC DEF GHI
ABCDEFGHI JKL
AB CD EF GH
-----------------
だと
3
2
4
と表示したいのです。
私が作ってみたのが
open(IN,"test.txt");
@data = <IN>;
my @kazu = split(/\s/,$_);
print scalar @kazu
close(IN);
なのですが上手く動きません。
上記動作をするにはどうすればよろしいでしょうか?
お教え願えないでしょうか。
0260259
02/04/06 22:46ID:b9SW2YHjprint scalar @kazu;
でした。; が抜けてました。
でも 考えているようには動きません。
0261nobodyさん
02/04/06 22:51ID:???オマエ$_とか<IO>の意味わかってないだろ。
今回は教えてやるから、何か一つマトモな本を読む(そして理解する)ことをおすすめするぞ。
open IN, "test.txt";
print scalar(split), "\n" while <IN>
close IN;
0263259
02/04/06 22:52ID:b9SW2YHj事故レすですみません。
出来てしまいました。
open(IN,"test.txt");
@data = <IN>;
foreach(@data){
my @kazu = split(/\s/,$_);
print scalar @kazu;
}
close(IN);
でしたね。すみません。
0265259
02/04/06 22:54ID:b9SW2YHjありがとうございます。
ただいま勉強中です。
0266nobodyさん
02/04/06 22:56ID:???open(IN,"test.txt");
while(<IN>){
split(/ /,$_);
print "$#_\n";
}
close(IN);
これでどうかしら?
0267266
02/04/06 22:58ID:???0269nobodyさん
02/04/06 23:00ID:???0270259
02/04/06 23:01ID:b9SW2YHj<IO>とは何の事でしょうか?
Input,Outputでしょうか。
$_ は STDINファイルハンドルから読み取ったものを、
変数で指定しなかった場合に、戻り値を自動的に代入する変数という事でOKでしょうか?
良かったらお教え下さい。
0272nobodyさん
02/04/06 23:19ID:???IOがInput/Outputってのはよしだが、
ここでは"IO"ってのは"X"と同じく、「何らかのファイルハンドル」って意味で使った。
で、俺が言いたかったのは<>(ヤマカッコ演算子)のこと。
<IO>でファイルハンドル"IO"から一行または全行読み込み、
whileなどの中ではデフォルトの代入先として$_が使われる、と。
試しに
<IO>;
とだけしても$_にはなにも読み込まれない。
で、$_ってのは幾つかの演算子/関数においてのデフォルトの使用変数。
>>261で示した"scalar(split)"のsplitの第二引数も$_なのでこんなこともできる。
(ちなみにデフォルトの第一引数は' 'だ。)
つーようなことが>>259のコードを見て理解しているとは思えなかったわけだ。
そんだけ。もう寝る。
0273nobodyさん
02/04/06 23:28ID:???今まで、「不等号の記号」とか言ってて、わずらわしかったんだよな・・・
0274nobodyさん
02/04/06 23:30ID:???それくらいなら「小なり大なり」と家YO!
0275259
02/04/06 23:34ID:b9SW2YHjおっしゃるとおりで、理解できていません。
これから勉強します。
丁寧なご説明有り難う御座いました。
0276nobodyさん
02/04/06 23:48ID:cii4pUwI絶対パスで書くとエラーが出ます。
例えば
<!--#exec cgi="../a.cgi"-->
ならOKですけど絶対パスで
<!--#exec cgi="www/usr/a.cgi"-->
だとエラー出ます。(↑の絶対パスは例)
絶対パスは間違ってないはずなんですが。
それとも間違ってるからエラーなんでしょうか。
0278nobodyさん
02/04/06 23:58ID:???$new = time();
($sec, $min, $hour, $day, $mon, $year) = localtime($new);
とした、$monは+1しないといけないのに、
$dayはそのままでもいいんですか。
そういう仕様にした理由ってなんでしょ。
0279nobodyさん
02/04/06 23:58ID:cii4pUwIいや、だから例、って念を押してるじゃん・・
例が思いつかなかったからそう書いたんだけど
/home/aaa/public_html/a.cgi
これって絶対パスですよね?こういう指定をやってもエラー出る。
http://www.aaa.com/a.cgiでもエラー。
0280nobodyさん
02/04/06 23:59ID:rWktCpba相対パス
0282nobodyさん
02/04/07 00:01ID:???■ このスレッドは過去ログ倉庫に格納されています