トップページ⇒php
1001コメント331KB

【Perl】初心者コーナー Part18

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん02/11/20 22:04ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

CGIだけど、なんか質問ある? Part 8
http://pc.2ch.net/test/read.cgi/php/1032704121/
参考書籍の話題は【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は 【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/

過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0893nobodyさん03/01/08 04:18ID:???
>>892
ありがとうございます。
一行でMACからもUNIXからも取得できますでしょうか?
とりあえず一度やってみます。
0894えり03/01/08 10:27ID:RjcWJJ7/
activeperlをインストールしたのですが、なんか変になってしまって
アンインストールしたいのですがどうすればいいですか?
アプリケーションの追加と削除で削除したのですがperlのフォルダーが残っており
又、フォルダーの中身ものこったままです
0895nobodyさん03/01/08 11:05ID:???
>>894
アンインストールで残ったのはゴミ箱に入れてもOKです。
0896nobodyさん03/01/08 13:03ID:3CJ1U7Io
「辞書」を作りたいんですが、どうすればいいんでしょうか。
たとえば、
テキストファイルに「青」、「うんこ」とあったら
perlで五十音順に並べ替えたりできるんですか?
0897nobodyさん03/01/08 13:05ID:???
>>896
「青」、あお、せい

少なくとも英語版Perlでは大変。
089889603/01/08 14:05ID:???
そうですか、やっぱり大変なんですか。
少なくとも読み仮名が無ければ厳しいんですね。

http://www.mytools.net/cgitools/dictionary0.html
こういうの見つけましたが、構成ファイルが多すぎてセッティングしてません。
089989103/01/08 14:31ID:???
>>892
取得できませんでした。
0900えり03/01/08 15:39ID:RjcWJJ7/
>895
ありがとうございました!!!
0901nobodyさん03/01/08 20:51ID:OEI4EUTr
>>898
kakasiを使えば、ある程度は、正しい読み仮名を付けれるよ。
0902nodody03/01/08 22:13ID:1Pe5J1+N
プログラミングを始めて1ヶ月の初心者なのですが、BBSを自作
してみたいと思っています(スキルアップのために)。

ソースの見やすさを考える以外に気をつけておいた方がいいことが
あればご教授下さい。
Perlを使用します。

(特定の記述法は特に効率が悪いからやめろとか)
0903nobodyさん03/01/08 22:16ID:???
>>902
まぁ、一本書いてみなよ。それにツッコミ入れる方が効率よさそうだ。
0904nobodyさん03/01/08 22:23ID:???
>>902
変数の初めに数字を使用しない。
0905nobodyさん03/01/08 22:24ID:???
>902
ローカルでテストする。
これ、最優先事項。
0906nodody03/01/08 22:26ID:1Pe5J1+N
>>903
マジで見てくださるのですか!?
じゃあ、マッハでつくります。

>>904
ありがとうございます。
気をつけてみます。
0907nobodyさん03/01/08 22:28ID:???
>>906
use strictと-w
0908nobodyさん03/01/08 22:30ID:atnjxi5O
use strictってなに?
参考書に載ってなかった。おしえてくだちい。
0909nobodyさん03/01/08 22:32ID:???
use strictってなんですか?
0910nobodyさん03/01/08 22:32ID:???
マッハで作るって5分とかで作るつもりかよ。
0911nobodyさん03/01/08 22:53ID:???
cgiのmethodのgetで送れるバイト数って決まってるんですか?
0912nobodyさん03/01/08 23:15ID:???
>>911
確か256bytesまで。
それ以上のデータを送りたいならPOSTで。
0913nodody03/01/08 23:15ID:1Pe5J1+N
>>910
いや、少なくとも数日かかると思いますが…。
意気込みってやつですよ。

>>907
use strict と-w 調べて使ってみました。
out という名前でファイルを開いたあと、

print out "文章";
と書くとoutがクォートで囲まれていないという警告が出ます。
そこで

print "out" "文章";

とするとエラーがでて動作しません。
これは無視した方がいいのでしょうか?
091491303/01/08 23:18ID:1Pe5J1+N
エラーは

Error 500
CGI エラー - Content-Type ヘッダが正しくありません。

というエラーです。
0915nobodyさん03/01/08 23:19ID:???
>>912
http〜255文字
0916nobodyさん03/01/08 23:40ID:???
>>914

正直、様々な原因が考えられるエラーだ。
本気でデバッグしてもらいたいなら、
スクリプトをどっかに.txtにしてアップするくらいのことはしろ。
0917nobodyさん03/01/09 00:21ID:???
>>914
ブラウザのエラーを書かれても分からんよ。
Perlが出力するエラーを書いてくれ。
0918>>91603/01/09 00:39ID:ve0CCzFG
http://cgi21.plala.or.jp/~tay/bbs2.txt

にソース(すごく簡略化してありますが、エラーメッセージは同じです)
とエラーメッセージをテキストにまとめてアップしました。

よろしければご教授下さい。
0919nobodyさん03/01/09 00:56ID:???
>>918
open OUT, ">test.dat";
 print OUT $text;
close (OUT);

open IN ,"<test.dat";
 my @a = <IN>;
close (IN);
092091303/01/09 01:01ID:ve0CCzFG
大文字を使用すれば良かったのですね。

ありがとうございました。
0921nobodyさん03/01/09 01:07ID:???
>>918
これと比べてみな。

#!/usr/local/bin/perl -w
use strict;
my $text = <<'EOE';
テスト
です
EOE

open ( OUT, '>test.dat' );
print OUT $text;
close ( OUT );

open ( IN, 'test.dat' );
my @line = <IN>;
close ( OUT );

print "Content-type: text/html\n\n";
print "<html><head><title>test</title></head><body>";

print map { $_,'<br>' } @line;

print "</body></html>";
exit;
0922nobodyさん03/01/09 01:13ID:???
>>918
Perlの文法がどうこう以前に、
変数の名前のつけ方とかをもっとしっかりさせた方がいい。

http://www.rfs.jp/sitebuilder/perl/07/01.html
http://www.rfs.jp/sitebuilder/perl/07/02.html

こんなのでも読むべし。
0923nobodyさん03/01/09 02:51ID:j8Nogs/U
ime.nuってどうやってるんですか?
ime.nu/hoge.jp/だったらime.nuのあとにhoge.jp/というフォルダを作っているんですか?
それとhttp://ime.nu/test.com/
からtest.comをどうやって取得しているんですか?
リファは無理っぽいです。
0924nobodyさん03/01/09 03:55ID:???
>>923
#!/usr/bin/perl
use strict;
my $buf_size = 256;
my $query = substr $ENV{PATH_INFO}?$ENV{PATH_INFO}:$ENV{QUERY_STRING},0,$buf_size;
$query =~ tr{-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#}{}cd;
$query =~ s{^/+}{};
print <<HTML;
Content-type: text/html;charset=Shift_JIS\r\n\r
<html><head><title>jump</title></head><b><a href=${query}>${query}</a></b><br>
別のサイトにジャンプしようとしています。宜しければ上記のリンクをクリックしてください
HTML
__END__
092592303/01/09 04:11ID:???
>>924
なぞが解けました。
ありがとうございました。
0926nobodyさん03/01/09 09:35ID:???
>>911
以前実験したことがありますが、IE6では約2000bytes、Netscape7では約8000bytes送れました。
ネスケでは、Apacheから
400 Bad Request
Your browser sent a request that this server could not understand.
Size of a request header field exceeds server limit.
とか
414 Request-URI Too Large
The requested URL's length exceeds the capacity limit for this server.
request failed: URI too long
とか言われますた。
0927nobodyさん03/01/09 10:32ID:???
ロックファイルがついていないスクリプトにロックファイルつけること
できますか?教えてください。
0928nobodyさん03/01/09 10:57ID:???
ファイルをつけるなんて造作ないです。
0929nobodyさん03/01/09 13:35ID:???
>>927
できるよ。
0930初心者03/01/09 13:46ID:???
教えてください。

cgiページの最上部にサイト共通のヘッダを表示したかったので

<!--#include file="header.html"-->

と記載しましたが、そのままコメント文として出力されました。
この場合はどんな方法を使用すればよいのでしょうか?
0931nobodyさん03/01/09 13:59ID:???
>930
Perlとは一切関係ないので該当スレへ行ってください。
SSIスレとかかな?
Apacheの設定スレの方がいいかな?
どのスレへ行けばいいかわからないからと言って、マルチポストはするんじゃないぞ。
0932nobodyさん03/01/09 14:11ID:???
>>930
open(IN, "<header.html");
my @header = <IN>;
close(IN);

<!--#include file="header.html"-->
の代りに
@header
とでもしておけYO
0933nobodyさん03/01/09 14:27ID:???
>>930
CGIでSSIは使えません。
同じことをするスクリプトを記述してください。(>>932みたいに)
0934nobodyさん03/01/09 14:46ID:???
>>933
漏れの自鯖ではCGI出力からでもSSI記述は使える。
レンタル鯖では見ないけどなー。
093592703/01/09 15:10ID:???
>>928
>>929
教えてください。ログがふっとぶことが多いので…よろしくお願いします。
0936nobodyさん03/01/09 15:31ID:???
>>935
検索サイトで
「排他制御 Perl」
で検索汁。。
0937nobodyさん03/01/09 15:33ID:???
>>936
Perlで排他制御を行うにはシンボリックリンクをフラグとして使いましょう。

とかまじめに書いてるサイトもあるので要注意だな。
0938nobodyさん03/01/09 15:53ID:???
特にsymlink関数が要注意だとは思わんが
マルチタスクでの排他処理は要注意。
0939nobodyさん03/01/09 16:21ID:???
getでパラメータを送るときに、
http://www.hoge.co.jp/hoge.cgi?str=あいうえお
こんな風に日本語を引数にしてもいいんでしょうか。
試したらうまくいったんですけど。
なんか、検索エンジンとかでは、入力するとurlエンコードって言うんですかね、
そうなって訳のわからない文字に変換されますよね。
ああいう風にしなくてもいいんですかね、という事です。
0940nobodyさん03/01/09 16:51ID:???
>>939
良し悪しで言えば・・・悪し。

フォームでGET送信すれば自動的にエンコードしてくれるけど
直リンでの固有文字はその文字コードを使用していないと文字化けまくり。
しかも文字中に&や=などの区切り文字など混じった場合に対処出来なくなる罠。。

World Wideを意識しないでローカル派なのであればどうぞ。
0941nobodyさん03/01/09 17:15ID:???
>>939
もちろん必須です。理由はRFCで決まっているから。で良いと思われ。
特定のアルファベットと記号以外を全部%16進の形式にするだけなので割と簡単です。

formのinput要素とかはブラウザが変換する義務を負うので無視して良いです。
0942nobodyさん03/01/09 17:18ID:???
>>940
なぁ?

URLエンコードしてもそのエンコード前の文字コードに対応してなかったら結局化けると思うんだけれど。
あなた論理だと英語以外送っちゃいけないことに・・・。

SJIS -URLエンコード-> URLエンコードされたSJIS -URLデコード-> SJIS

0943nobodyさん03/01/09 17:35ID:???
>>942
現状ではまだ英数文字以外のURLは送るべきではない。

http://www.hoge.co.jp/hoge.cgi?str=あいうえお

書かれていたこのURLはただの例にすぎないが
URLを伝える過程(Webだけではなく)で文字化けしていては
第三者がURLを辿っていけない状況は多分にある。

そのURL先が文字化けしているか、はまた別の話。
0944nobodyさん03/01/09 17:46ID:???
掲示板とかで、記事を投稿されたときに、改行を多く入れられてしまった時のために、
「改行が2つ続いたら、それは改行1個に置き換える」をしたいんですが、
$value =~ s/\r\n\r\n|\r\r|\n\n/\n/g;
これじゃダメっぽいです。なぜでしょうか。
0945nobodyさん03/01/09 17:55ID:???
>>944
$value =~ s/\n{2}/\n/g;
0946nobodyさん03/01/09 18:00ID:???
>>944
改行とおぼしきものを一旦違うものに置き換えてからってどうかしらん?
$value ~= s/\r\n|\r|\n/<br>/g;
$value ~= s/(<br>)+/$1/g;
とか。
他の凡例は >>946
094794603/01/09 18:01ID:???
>>946
自滅鬱
0948nobodyさん03/01/09 18:13ID:???
>>944
$value =~ tr/\n//s;
0949nobodyさん03/01/09 18:17ID:???
>>948
それ良さげ
095094803/01/09 18:29ID:???
これだと複数の改行がすべて1つだけになるから、ちょっと質問の内容と違うか。
>>945のほうがいい感じ。
0951nobodyさん03/01/09 18:43ID:???
s/\r//g;
s/\n\n+/\n/g;
0952nobodyさん03/01/09 18:58ID:???
$valueのなかで$wordがあるかどうかを調べることが出来ますか?
0953nobodyさん03/01/09 19:02ID:???

1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
095495203/01/09 19:13ID:???
>>953 すいません。
ちょっと時間が無いので出直してきます。
0955nobody03/01/09 19:39ID:???
>>952
正規表現で探せるよ
$value =~ m/$word/;
0956nobodyさん03/01/09 19:51ID:???
GIFファイルを アニメーションGIFか普通のGIFか判別する方法ないでしょうか?
0957nobodyさん03/01/09 20:27ID:???
>>956
web制作板向きじゃないの。
0958nobodyさん03/01/09 20:36ID:???
>>956
0x21F9
が複数入っとったら・・・っつぅのはどないやろ?
0959nobodyさん03/01/09 20:38ID:???
>>956
http://tohoho.wakusei.ne.jp/wwwgif.htm#AnimatedGIF
0960nobodyさん03/01/09 20:54ID:???
>>958
>>959
どうもありがとう。
0961nobodyさん03/01/09 21:27ID:???
配列@hogeの中に mona と言う言葉がいくつ入ってるか調べるためには
どのようにすればいいんでしょうか?
0962nobodyさん03/01/09 22:28ID:???
>>961
$i = grep /mona/,@hoge; #$i = 個数
0963nobodyさん03/01/09 22:31ID:???
$i = grep {$_ eq "mona"},@hoge;
0964nobodyさん03/01/09 23:50ID:???
10桁の数値を生成するために以下のように記述したのですが、もっとスマートな書き方
(ループのさせ方)がありましたらお教え下さい。

−−−−−ここから−−−−−
#!/usr/bin/perl

for ($a=0; $a<9; $a++) {
for ($b=0; $b<9; $b++) {
for ($c=0; $c<9; $c++) {
for ($d=0; $d<9; $d++) {
for ($e=0; $e<9; $e++) {
for ($f=0; $f<9; $f++) {
for ($g=0; $g<9; $g++) {
for ($h=0; $h<9; $h++) {
for ($i=0; $i<9; $i++) {
for ($j=0; $j<9; $j++) {
$k = $a . $b . $c . $d . $e . $f . $g . $h . $i . $j;
}
}
}
}
}
}
}
}
}
}
−−−−−ここまで−−−−−
0965nobodyさん03/01/10 00:00ID:???
>>964
for($i = 0;$i < 10000000000;$i++)
printf("%010d",$i);
0966nobodyさん03/01/10 00:03ID:???
>>964
AAかとオモタ。
096796403/01/10 00:04ID:???
ふぉ〜!すばらしいです。
>>965さんありがとう御座います。(感謝!)
0968nobodyさん03/01/10 00:18ID:???
>>961

>>962は、「monaを含む要素」の数
>>963は、「monaそのものである要素」の数

この場合質問が複数の解釈を許すからこういうことが起こる。
質問をする方にも、質問をするスキルが求められていると言うことだな。
0969nobodyさん03/01/10 02:37ID:bsKAU3F+
perlスクリプト内で自分自身のファイルのディレクトリパスを知る
にはどうしたらいいのですか?
`pwd`で得ようとしましたが、そのスクリプトを起動したパスになってしまいます。
どうかお願いします。
0970nobodyさん03/01/10 02:46ID:???
>>969
SCRIPT_FILENAME?
0971えせカミ03/01/10 04:30ID:???
perlの言語拡張を使って、ASM言語をエミュレーションできないかと思っています。
例えば)
movf bittimc,w ;1bitタイマカウンタをwに格納し
addlw 2 ;+2
movwf bittimcb ;した値を控えに格納。
といったASM言語の各命令を1関数として
movfについて
sub movf ($$) {
my $freg = shift;
my $fw = shift ;
$REG::W = &LOADF($freg);
}
と定義したとして
movf bittimc,w ;
 のbittimc と wが引数として評価されて当然エラーとなります。
この関数への引数を評価無しで関数にその文字を渡すような事を出来ないでしょうか?
’’で囲って文字列として指定すれば良いのですが極力実際のASMコーディングを生かしたいと、、
わがままですね。。。
0972 03/01/10 08:40ID:1IvfvcLa
>>969
use File::Basename;
use Cwd 'abs_path';
my ($name,$path,$suffix) = fileparse($0);
my $abs_path = abs_path($path);
print "($name,$path,$suffix),$abs_path\n";
0973nobodyさん03/01/10 08:41ID:0QU3xkA6
>>969
$0 : 実行している perl スクリプトのファイル名。
$0 に代入を行なうと、ps(1) プログラムが参照する引数領域を変更する。

覚え方:
sh や ksh と同じ。
ttp://www.cec.co.jp/usr/hasegawa/Docs/perl-jman/perl-4.019/perl_169.html#SEC234
0974nobodyさん03/01/10 10:03ID:???
フォームのパラメータ取得処理についてなんですけど、
今は普通に手書きの
if($ENV{ 'REQUEST_METHOD' } eq "POST"){
 read(STDIN, $QUERY_DATA, $ENV{'CONTENT_LENGTH'});
}else{
 $QUERY_DATA = $ENV{'QUERY_STRING'};
}
省略、
をやっています。初めて覚えた時このやり方だったんで。
CGI.pmといのを使うやり方もあるみたいなんですが
どっちでやった方がいいとかあるんでしょうか。
こっちの方が効率がいいとか、バグが無くなるとか。
0975 ◆hMJAPH9PWA 03/01/10 12:50ID:???
>>971
プロトタイプを(**)にする。
そうすると裸のワードを受け付けるようになる。
…なんだけど、movf bittimc, w;としたときに
たとえばbittimcというサブルーチンが事前に宣言されていたり、
予約語だったりするとうまくいかないので注意してね。

他は、使用するシンボルを全て
use constant symbol => 'symbol';
として定数としておくという手もあるかな。
097691303/01/10 16:49ID:???
ようやく掲示板基礎部分ができましたので報告します。

http://cgi21.plala.or.jp/~tay/2chbbs/bbs.txt
↑がソースファイルです。

WIN2000、anhttp、ActivePerl5.6の環境下で動作確認済みです。
お時間がありましたら問題箇所(多すぎるとは思いますが)の指摘を
お願いいたします。
0977nobodyさん03/01/10 16:55ID:???
>>976
#▼グローバル変数は頭を大文字にして区別
my $value;
my $name;
my @query;
my $query;
our %Form;
our $Write;

うそつき・・・。
0978nobodyさん03/01/10 16:57ID:???
>>977
#▼JAVASCRIPT(クッキー読み出し・書き込み用)

そんなもん使わずとも$ENV{"HTTP_COOKIE"}に入ってるよ。
デコードはQUERY_STRINGのときとほぼ同じ。
0979nobodyさん03/01/10 21:12ID:???
>>974
直書き:関数呼び出しのオーバーヘッドとか汎用性を考慮しなくて良い分早いであろう。
CGI.pm:少なくともバグの発生を他人のせいにできる。
0980nobodyさん03/01/10 21:21ID:???
掲示板を作ったのですが、ログファイル(sjis保存)を読み込むとき、
"ス"など2バイト目が\x5c(\記号)の文字だとエスケープされてしまい、
結果的に文字化けしてしまいます。
文字コードはそのままsjisを使う前提で、何か良い対処方法はありませんでしょうか。
0981nobodyさん03/01/10 21:26ID:???
>>980
読み込むだけならエスケープはされないはず。
どういう処理をしてるのか、もうちょっと具体的に。
0982nobodyさん03/01/10 21:32ID:KddZS+XL
>>976
use strictでエラーを出さないようにすればいいっていうものじゃない。

スコープを最小?にしないと、myとかやる価値がない。
use strictは、一生懸命努力してるときに、うっかりミスが
発生することを防ぐ、ためのもの。

open "file" => open FILE
こんなファイルハンドルの使い方がちょっと変なところが数箇所
(my $sec,my $min,my $hour,my $mday,my $mon,my $year) => my ($sec,$min,$hour,$mday,$mon,$year)
(localtime)[0,1,2,3,4,5] => (localtime)[0..5]

lock.datの使い方が変

あと、Use of uninitialized value...の意味は、初期化されていない変数の使用、
っていうことだから。これだけ分かれば直せると思う。
0983えせカミ03/01/10 21:53ID:0QU3xkA6
>>975
おー感謝!
やっぱperlは神だった。。。
098498003/01/10 22:12ID:???
>>981
すみません、勘違いだったようです。。
どうもお手数おかけしました。

そろそろ次スレですか・・・
098597603/01/10 22:37ID:???
レスを下さったお三方、ありがとうございます。

今度は少し時間をかけて直してきたいと思います。

ご指摘、ありがとうございました。
0986Perl 3日目房03/01/11 03:14ID:7w0GJrTJ
とほほのWWW入門にPerl入門しますた。
が、mkdir(filename, mode) でデレクトリを作成できると書いてあるんですが
ファイルの作成については何も書いて無いのです。
試しに toucth(filename, mode)と書いてみましたがエラー。

で、結局新規にファイルを生成するにはどう書けば良いんですか?
0987nobodyさん03/01/11 04:48ID:???
>>986
open
0988nobodyさん03/01/11 08:11ID:???
ファイルが存在しない場合は新しく作成されます。
0989nobody03/01/11 08:27ID:WMCRUM05
質問です。

大量の数値を1つのファイルから読み込み、3〜4カ所の関数で使用する場合、
&work($a,$b,$c)
のようにメイン関数からいちいち引数を渡してやるのと

$main::a
などと大域変数にしてしまうのとはどちらが良いのでしょうか?

なお、読み込んだデータのほとんどは1つの関数でしか使用されません。
0990nobodyさん03/01/11 09:59ID:???
>>989
後者:アホか・
0991nobodyさん03/01/11 11:31ID:hHeUjYJr
アホ質問です。
例えば
$"/dir1/dir2/dir3/file"

てあるときに"file"を取り除いて"/dir1/dir2/dir3"を得るには
どうしたら出来ますか?
ちなみにこの時点で"file"は何かは分かっていません。
0992nobodyさん03/01/11 11:38ID:bB6C4Xxs
m!(.*)/[^/]*!;
print $1;
レス数が950を超えています。1000を超えると書き込みができなくなります。