【Perl】初心者コーナー Part16
■ このスレッドは過去ログ倉庫に格納されています
00013PIO ◆3pIoOHKo
02/09/15 15:11ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 6 (その2)
http://pc.2ch.net/test/read.cgi/php/1025930486/
参考書籍の話題は【【Perl,CGI】参考書籍 第2版】
http://pc.2ch.net/test/read.cgi/php/988809842/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
スクリプトの改造依頼は 【スクリプト改造工房 Part4】
http://pc.2ch.net/test/read.cgi/php/1012839651/
過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0381380
02/09/25 02:38ID:???ecuはeucね。
ソースの中では間違ってない。
0382nobodyさん
02/09/25 02:44ID:???質問とは関係ないけどforeachは配列操作で回数指定ならforかと
どっちでも動くのを承知で使うにしてもやっぱforかと
0384373
02/09/25 02:48ID:???そうなんです。
>>375-379
よくわからないのは、openされた$fileから
何の変数に入れていることになるんですか?
print; はprint "$_"; ということですか?
0385nobodyさん
02/09/25 02:52ID:???>print; はprint "$_"; ということですか?
そう。
print; = print STDOUT "$_";
0387373
02/09/25 02:55ID:???while (<IN>);
は
while ($_ = <IN>);
ですか?
0389nobodyさん
02/09/25 03:07ID:???0390nobodyさん
02/09/25 03:13ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
0391nobodyさん
02/09/25 04:52ID:???は
if ($a eq "xxx" or "yyy") {
と同じ意味?
0392nobodyさん
02/09/25 05:10ID:???全然違う。
0393nobodyさん
02/09/25 05:23ID:???というような記述があって、サブルーチンに飛んでいるのですが
これは⊂と全く同じ意味なのでしょうか
\の意味がわかりません
前者はサブルーチンfooのリファレンスを取得して$barに代入。fooは呼ばない。
後者はサブルーチンfooを呼んでその戻り値のリファレンスを$barに代入。
STDOUTじゃなくてselectされてるハンドルだし
print;≠print STDOUT "$_";
print;≒print STDOUT $_;
print;=print $_;
じゃない?
0399nobodyさん
02/09/26 01:48ID:???「if (($a eq "xxx") or ($a eq "yyy"))」は
$aの内容が「xxx」または「yyy」の時だけ真(true)だが
「if ($a eq "xxx" or "yyy")」は
「yyy」の結果が必ず真(true)になるから常に真(true)になってしまう。
0400.....
02/09/26 02:39ID:???log2.dat
log3.dat
・
・
・
log100.dat
という名前のファイル群を次々開いてすべての行を一個の配列にさせることって可能でしょうか?
自分でサブルーチンに挑戦してみたけどうまくいかなかった…
0401nobodyさん
02/09/26 02:41ID:???0402nobodyさん
02/09/26 05:46ID:???for(0 .. 100){
$hoge++;
open(IN,"log$hoge.dat");
$numo. = <IN>;
close (IN);
}
print "$numo";
0403nobodyさん
02/09/26 05:54ID:???------------------------------------------------------------------------
CGIWrap encountered an error while attempting to execute this script:
Error Message: Exec format error
Error Number: 8
This message usually indicates there is a problem with the script itself. The owner of the script needs to check the #! line for correctness.
↑こんなエラーが出てしまって一向にBBS設置できないんですが
どーしてなんでしょうか?
0404nobodyさん
02/09/26 06:41ID:???CGIの話はこちらへ。
http://pc.2ch.net/test/read.cgi/php/1032704121/l50
0405nobody
02/09/26 11:41ID:???$hoge = 'mona giko morara';
$piyo = ( $hoge =~ /mona/ ); #1
@foo = ( $hoge =~ /mona/ ); #2
@bar = ( $hoge =~ /(mona)/ ); #3
print $piyo @foo @bar;
は、
1 1 mona
なんですが、#1,#2 はマッチした数、@barはマッチした文字列が入る
のですか?
あと、配列の要素数は @foo や $#foo で分かりますが、
ハッシュの要素数はどうやって調べますか?
0406nobodyさん
02/09/26 12:00ID:???requireされたライブラリの中のサブルーチンはrequireしたプログラムに関係なくても
全部ロードされますか?
0407nobodyさん
02/09/26 12:09ID:???#1 はスカラーコンテキストで評価しているので、マッチしたかどうかが
真偽値 (1 か "") で返される。
#2 はリストコンテキストで評価し、且つパターン中にカッコが含まれない
ので、マッチした場合は (1) というリストが返される。
#3 はリストコンテキストで評価し、且つパターン中にカッコが含まれる
ので、カッコにマッチした部分から成るリスト値 (この場合は ("mona"))
が返される。
…と、駱駝本に全てハッキリ書いてある。
ハッシュの要素数は keys をスカラーコンテキストで評価。
$foo = keys %foo;
>>406
Yes.
0409nobodyさん
02/09/26 12:29ID:???ライブラリには使わないサブルーチンも入っているものだと思うのですが、
極論すると動作を早くするには呼び出すサブルーチンだけのファイルを作って
requireするか、全部1つのファイルに書けってことになりますか?
0412nobodyさん
02/09/26 17:06ID:???スカラー変数のデータをバイト単位で操作するにはどうすれば良いのでしょうか?
例えば$aのデータが16進で01 02 03 04 05 06 07 08 09の9バイトの場合に
0x03を0xddで置き換えたり、任意のバイトを削ったりということです。
substrを使って置き換えようとしたら、置き換え文字が10進数換算の文字列に
なってしまい(0xdd なら"221"で0x32 0x32 0x31へ)上手くいきませんでした。
0415412
02/09/26 20:36ID:???アドバイスどうもです。
やりたいことはバイナリエディタで見た場合次のように
変更したいということです。
スカラー値をファイルに書きだしてバイナリエディタで見ています。
変更前16進表示:01 02 03 04 05 06 07 08 09
↓
変更後16進表示:01 02 dd 04 05 06 07 08 09
\xddでsubstrすると、文字通り次のようになってしまいました。
01 02 5C 78 64 64 04 05 06 07 08 09
0416nobodyさん
02/09/26 21:02ID:pOKoAU+F■ファイル名またはパス名に日本語を使用していると上手くアップロードできません。
■半角アルファベットのみならアップロードできます。
--- 入力フォーム ここから------------
<FORM ACTION="./upload.cgi" method ="POST" ENCTYPE="multipart/form-data">
<INPUT TYPE="file" name="file_name" ><br>
<input type="submit" name="upload" value="アップロード">
</FORM>
--- 入力フォーム ここまで------------
0417416
02/09/26 21:03ID:pOKoAU+F$common = getParameter();
$filename = $common->{param}->{file_name};
$file="";
while($bytesread = read($filename, $buffer, 2048)) {
$file .= $buffer;
}
open(OUT, "> ./$ファイル名");
print(OUT $file);
close(OUT);
exit;
sub getParameter() {
my $this;
$cgi = new CGI;
for my $name ($cgi->param) {
if (@{$cgi->param_fetch($name)} > 1) {
$this->{param}->{$name} = $cgi->param_fetch($name);
} else {
$this->{param}->{$name} = $cgi->param($name);
}
$this->{param}->{$name} = jcode->set(\$this->{param}->{$name}, "sjis")->euc;
}
return $this;
}
---- upload.cgi ここまで ------
0418416
02/09/26 21:04ID:pOKoAU+Fコメントにすると、日本語ファイルでも普通にアップロードできるので
変換するとファイル名が変わってしまうせいかと思い、代わりに
$filenameをsjis→eucに変換して試してみたのですが、何故かダメでした。
どうも、readした際にうまく取得できていないみたいなんですが。
理由のわかる方、同様の経験がある方、いらっしゃいましたら教えてください。
(長くてゴメンなさい)
0419nobodyさん
02/09/26 21:09ID:???sub hd { join ' ', map unpack('H2', $_), split //, $_[0] }
$bin = "\x01\x02\x03\x04\x05";
print hd($bin);
print "\n";
substr($bin, 2, 1) = "\xdd";
print hd($bin);
>>416
無用なトラブルを避けたいなら、パスやファイル名に
日本語 (というか多byte文字) を使わない方がいい。
サーバ/ブラウザ双方の環境によって全然違ってくる。
CGI.pm 使った事ないんで、その辺どの程度対応
してるのかは知らんが。
0421nobodyさん
02/09/26 21:26ID:???君のソースをコピペきぼんぬ。
>>416
元の文字コードがsjisではないのではないかと言ってみるテスト。
uploadはとりあえず置いといて、ファイル名に入れた文字列と
そのときの$cgi->param('filename')を書いてみてくれんか。
0422412=415
02/09/26 21:50ID:???今いろいろ探っていたのですが、最初は
$replace_character = \xdd;
substr($buffer, $rep_position, 1) = $replace_character;
413-414を見たときにはシングルクオートで囲んで、
$replace_character = '\xdd';
substr($buffer, $rep_position, 1) = $replace_character;
420を見てダブルクオートで、やっと上手くいった次第です。
$replace_character = "\xdd";
ダブルクオートでも最初と同じ結果だろうと思って確かめていませんでした。
うーん、自分自身 ダブルクオートを使ったときの意味合いが良く解っとりません。
0423412=415
02/09/26 21:56ID:???最初は0xddを使っとりました。
$replace_character = 0xdd;
0424nobodyさん
02/09/26 22:33ID:???sjis→euc変換をしているところをコメントにし、
$filename の変換は、
> while($bytesread = read($filename, $buffer, 2048)) {
> $file .= $buffer;
> }
よりも後にしてみるとどうよ?
0425メモがわりにカキコ
02/09/26 23:20ID:???列じゃないです。"" を overload してファイル名っぽく
見せているだけの、ひみつのパッケージ (Fh) に bless
されたリファレンスらしい。
0426nobodyさん
02/09/27 01:44ID:HP3sTChTuse vars qw($aaa,$bbb,$ccc);
これで'$aaa,$bbb,$ccc' is not a valid variable name under strict varsエラーがでます。
普通の変数名だと思うのですが何がいけないのでしょうか。
0427nobodyさん
02/09/27 01:47ID:TZvB0TqN821 : :02/09/27 01:44
ё[No.3121] お知らせ by 地蔵 2002年09月27日 (金) 01時02分57秒【この記事にレス】
比ヤングについての情報をお持ちの方、連絡ください
現在警察に相談中です
今後の処理を円滑に進めるために彼の連絡先等を教えていただけるとありがたいです
ご協力お願いします
http://obuchi.naikaku.com/angriffbbs/dempa.html
0429nobodyさん
02/09/27 02:37ID:???$a = "Win98";
$b = $a;
$b =~ s/Win/Windows/;
とすればうまくいったが、もっとシンプルな書き方はありますか?
0430nobodyさん
02/09/27 02:44ID:???0431nobodyさん
02/09/27 02:47ID:???430のような回答はやめてください。
0432nobodyさん
02/09/27 03:32ID:???俺は430じゃないけど回答してもらっといてやめてくれとは何様?
429に対する答えが430じゃ間違ってるとでも?
意図したものじゃないとして、自分の例が悪かったという思考が何故働かない?
>良い回答は良い質問から。
0434nobodyさん
02/09/27 03:44ID:???$aは何が入ってくるかわからないものとしてください。
"Win95"かもしれないし"Win2000"あるいは"WinXP"かもしれない。それ以外かもしれない。
0435nobodyさん
02/09/27 03:57ID:???分からん時は目で確かめる。
print join '/', (0xdd, '\xdd', "\xdd", '\n', "\n", '');
>>429
($b = $a) =~ s/Win/Windows/;
0436nobodyさん
02/09/27 04:58ID:EoYu/tZy英語にはない表記のアルファベットなど、「英語以外の表記や機種依存
文字」が使用された場合、それらを全て「*」という文字に変換したい
のですが、その場合の方法を教えて下さい。宜しくお願いします。
0437hmk
02/09/27 05:17ID:???例えばこんなのでいいのか?
0438yahooo!!アダルト
02/09/27 05:31ID:YxOmbJ3N0439nobodyさん
02/09/27 06:25ID:nnok+0boあ、それだけでよかったのですか。ありがとうございます。
初心者まるだしの質問で申し訳ありませんが、この場合、数字以外の
「#」「$」「~」などの記号はそのまま表記されますよね?
宜しくお願い致します。
0440nobodyさん
02/09/27 07:12ID:???手元にテスト環境が無いのかい?
自分で確認した方が、人に聞くより早いし、
相手を手間取らせずにすむよ。
YES・NOで答えられる質問は、特にそう。
実際に試したうえで、分からない点が出てきたら、
また質問してね。
※ ちなみに質問の答はNO
[^a-zA-Z0-9 ] が何を表しているか、考えよう。
0441nobodyさん
02/09/27 08:34ID:???わかんないからな…
JIS避けはこんな感じ?
s/\x1b\x24\x40(.*?)\x1b\x28\x4a/'*' x length($1)/eg;
んでその他と。
s/[^\x00-\x7e]/*/g;
0443hmk
02/09/27 15:45ID:???ttp://www.din.or.jp/~ohzaki/perl.htm
ここの「文字の正規表現」が参考になると思われ。
儂がPGやってた頃には、ここをよくみてますた。
>>441 >>442
#/usr/bin/perl -Lsjis こんなオプションつけると、
2バイト目を気にしなくてもよくならなかったっけ?
間違ってたらスマソ。
0444nobodyさん
02/09/28 01:46ID:iyuQXvIdつけようと考えています。
以下のようなものなのですが、Perlで作成しても
負荷が大きかったりとか、問題ないでしょうか?
現在300件ほどのデータがあって、
一件当たりが400文字(2バイト文字換算)程度です。
月に数件ずつ増える予定です。
サイトへのアクセス数は、現在一日に100回くらいです。
ただし、検索機能を使う人はもっと少ないと思います。
ホストはプロバイダのものを使用します。
(何サイトが一台のマシンを利用しているのかなどはわかりません。)
スクリプトの仕様は、まだ決めていませんが、
マッチ数が10件程度に小分けして表示するなど、
軽くなるようにはするつもりです。
どういうCGIが、高負荷でプロバイダからお叱りを受けるものなのか、
わかっていないので、作成する際に注意する点をお教えください。
0445nobodyさん
02/09/28 01:57ID:???チャットのように秒単位で絶えずアクセスし続けているようなCGIでもなければ怒られる事はないかと。
あとCPUを1秒以上使用したスクリプトは強制停止させられるところなどもあるので
その辺が目安かも。
ただプロバイダのサーバは基本的にかなり重いのでファイルロックがしっかりしてないと
あっさりログが飛ぶかも。
0446nobodyさん
02/09/28 02:28ID:???CGI配布サイトなどの掲示板スクリプトなどが、
ログを少なめにしたりしているので、
ひょっとして掲示板のログ100件程度でも辛いのかな? などと
考えていましたが、アクセスが重なる時がマズイんですね。
>マッチ数が10件程度に小分けして表示するなど、
>軽くなるようにはするつもりです。
深く考えずに書いてしまいましたが、
これってマッチしないとファイルの最後まで
検索しつづけますね。
便利でかつ軽いというものが思いつかないのですが、
項目別にログファイルを分けて、検索する対象を限定するなど、
いろいろ考えてみようと思います。
ありがとうございました。
0447nobodyさん
02/09/28 02:37ID:???全文検索なんだからそれで良いんじゃないの?
ファイル開く前に条件を整理して軽い条件からindexで流して
一気に対象を絞り込むとか。
0448nobodyさん
02/09/28 03:01ID:???#!/usr/bin/perl
main:{
printf("Hello, world.\n");
exit(0);
}
0449444
02/09/28 03:49ID:???言われてみればそうですね。
それに、現状では巨大なデータベースというわけでもないですし、
アクセス数も大したものじゃないですし、
負荷について考えすぎのような気もしてきました。
一応いろいろと公開されているソースも読んでから(C言語の方が多いのかな?)、
作成してみます。
0450nobodyさん
02/09/28 10:52ID:???今、勉強しているのはフォームからデータを受け取り、
そのデータをメールで送信するプログラムなのですが、
メールの送信プログラムで
MIMEエンコード→メールヘッダ作成→メール送信(SENDMAIL)の流れは
みなさんどのように記述されてますか?
ネット上にUPされてるソースを見てるのですが、
いろいろな書き方があってどういう風に書けばいいのかがいまいち
よくわかりません。
ひとことアドバイスお願いします。
また、最近先人がつくられたソースを見てて思ったことなのですが
ライブラリ(例えば今回で言えばmimew.plとか)を
使ったものもあれば、使ってないものもある。
あれは『使わなくても書ける』とか『使った方が楽』とか
そういうレベルのものなのでしょうか?
別に使ったから処理が早くなる、遅くなるとかいったレベルではないんですよね?
(フォームデコードのやり方がやっと最近わかったのですが、cgi-lib.plを使うという方法も知ったので)
抽象的な質問ですみません。
0451nobodyさん
02/09/28 12:19ID:???プログラムなんて、要求仕様、開発者の技術レベルやポリシー、
開発期間などによって千差万別になって当たり前。
そういった諸条件さえしっかり把握できれば、必要な機能や
処理の流れは自ずと決まってくる。
人の書いたソースを読む時は、それが作られた背景も考慮に入れよう。
ライブラリやモジュールの類は「楽ができる」という以外に、
「理解し切れてない処理を正しく行ってくれる」という恩恵がある。
チャレンジは大事だが、あなたが mimew.pl の中身と同等以上の
コードを書けない内は、自分で書こうなんて考えちゃいけない。
スピードを気にするのは、処理内容とMIMEの仕様を理解してからだ。
0452nobodyさん
02/09/28 18:54ID:BrjfrQHT500個のファイルの最終更新時間を調べて配列にしたいのですが、
500ファイル全部statするのと、更新されるたびに最終更新時間を記録して
それを読み込むのとどちらの方が効率がいいと思いますか?
よろしくお願いします
0454某スレ68
02/09/28 19:23ID:9nQPxW7pabcdefg
を
a b c d e f g
みたいにするのってパールで簡単にできますか。
行の操作じゃないからなんか難しそう。
短くかけっかなー。
0455nobodyさん
02/09/28 19:23ID:???0456nobodyさん
02/09/28 19:28ID:???use Jcode;
print Jcode->new('abcdefg')->tr('a-zA-Z','a-zA-Z');
0457某スレ68
02/09/28 19:49ID:9nQPxW7pややこしくてすみません。
スペースを入れていくということです。
0458nobodyさん
02/09/28 19:49ID:???for ($i=1; $i<(length); $i+=2){
substr($_, $i, 0)= ' ';
}
print;
0459nobodyさん
02/09/28 20:02ID:???0461某スレ68
02/09/28 20:05ID:9nQPxW7pとにかく、短くできるようですね。
有難うございました。
0462すみません。某スレ68
02/09/28 20:14ID:9nQPxW7pabcdefg
% perl -e 'for ($i=1; $i<(length); $i+=2){substr($_, $i, 0)= \' \' ; } print;' hoge
とワンライナーで書きたいんですけど、
パーサーエラーと叱られます。
{}ってワンライナーでは禁止されているのですか?
0463nobodyさん
02/09/28 20:43ID:???perl -pe'$_=join" ",split//' hoge
0464nobodyさん
02/09/28 23:42ID:yZr0Nm9j本当にありがとうございます。m(_`_)m
0465データベース
02/09/29 01:20ID:???にある『検索専用データベース Ver2』
を使ってcsvファイルに含まれているデータの内容を取り除いてhtml上で繁栄
させる事ってできないでしょうか?
例
\pict\map\0001.gif
の「\pict\map\」の部分を取り除いて「 0001.gif 」だけ表示する
当方CGIの初心者で命令文の仕組みが全然把握できないので
「制作者に直接お願いしろやゴルァ」とか言わないで宜しくお願い致します。
急ぎの用なのでバージョンアップ待ちする訳にも行かず困っております。
0468nobodyさん
02/09/29 03:28ID:???少なくとも、
自分で調べてコード書いてみて、
間違ったままで良いからコピペして
どう直したら良いですか?
くらいしなきゃ、教える方も教えにくい。
「初心者だから」は通用しない。
初心者だからで言い訳するなら、はじめからCGIは触るな。
0469nobodyさん
02/09/29 04:28ID:GXYgNgIm@list = split(//, "abcdefg")
空の正規表現で分割すると,一文字ずつに分かれた配列が返る
join(" ", @list)
空白でつなぐ
ってこと。
0470nobodyさん
02/09/29 09:57ID:Xgxp2+Gpchomp(@array);
でいいけど、逆に 配列の値すべてに \n をつけたい場合はどうすればいいですか?
for で地味にループさせる以外に便利なものがあったら教えてください。
for($i=0;$i<=$#array;++$i){
$array[$i] .= "\n";
}
これよりスマートな記述キボンヌ
0471nobodyさん
02/09/29 10:02ID:NgmswZArmap {$_.="\n"} @array;
0472nobodyさん
02/09/29 10:05ID:NgmswZAr$_.="\n" for @a;
のほうがよかった。
0473nobodyさん
02/09/29 10:30ID:Xgxp2+Gpうぉお、すげぇ、ここまで短くなるんだな。サンクス子
0474nobodyさん
02/09/29 10:43ID:u41sQpPiそれを書き込む関数dbm_wがあって、
両方ともハッシュのリファレンスを渡してやるのですがdatasetはハッシュを返すようになっています。
なので%bufとか適当に経由しないといけないのですが、簡潔に済ませる方法はあるんでしょうか?
%buf = &dataset(\%in);
&dbm_w(\%buf, "chardata");
0475nobodyさん
02/09/29 11:21ID:???dbm_w({ dataset(\%in) }, "chardata");
でどう?
&dataset の仕様がいまいちよく分らないけど。
0476nobodyさん
02/09/29 12:12ID:Xgxp2+Gpmy $val = '';
のように書いて初期化しますが、これが複数になったとき、
my ($val,$aaa,$aho) = '';
とやっても、先頭の $val しか初期化されませんよね?だから
my ($val,$aaa,$aho) = ('','','');
と書けばよいかもしれませんが、これだと変数が100個になったら大変なので、
なにかよい方法がないです?
もっとも、変数100個なんて作らないんですが、
なんか、こういう記述って、いやなので、、
スマートな記述キボンヌ
0477nobodyさん
02/09/29 12:16ID:???0478nobodyさん
02/09/29 12:20ID:Xgxp2+Gpということは、初期化しなくても、勝手に初期化されるということ?
cとかでは、初期化しないと、ゴミが入ってるじゃん?
perl は my で宣言したときに、ゴミは入らないの?
0479nobodyさん
02/09/29 12:41ID:???通常は気にせず my $val; でいいが、
「未定義 (undef)」と「空文字列 or 0」は別物なんで注意。
{ my $val; print 1 if defined $val }
{ my $val = undef; print 2 if defined $val }
{ my $val = 0; print 3 if defined $val }
{ my $val = ''; print 4 if defined $val }
{ my($foo, $bar) = ('',''); print 5 if defined $bar }
{ my($foo, $bar) = (); print 6 if defined $bar }
0480nobodyさん
02/09/29 14:18ID:???my ($val,$aaa,$aho) = ('')x3;
でどう?
0481nobodyさん
02/09/29 15:22ID:???#!/usr/bin/perl
use Socket;
$port = 80;
$ipaddress = inet_aton("www.asahi.com");
$address = pack_sockaddr_in($port,$ipaddress);
socket(SOCKET,2,1,0);
connect(SOCKET,$address);
select(SOCKET);
$ |= 1;
select(STDOUT);
print SOCKET "GET /index.html HTTP/1.0\r\n";
print SOCKET "HOST: www.asahi.com";
print SOCKET "\r\n\n";
while(<SOCKET>){
print $_;
}
exit;
これで標準出力に表示されるはずなんですが表示されませんどうしてでしょうか?
■ このスレッドは過去ログ倉庫に格納されています