Perl 初心者コーナー Part23
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/05/16 11:18ID:zDRBc/j4【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 10
http://pc2.2ch.net/test/read.cgi/php/1048686475/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
CGIに依存しないPerlの話題一般/Part2
http://pc2.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は、【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/
過去ログやお勧めサイトは >>2-10
0449440
03/05/26 23:33ID:haPyfOxBそうですね。レスサンクス。
realParseだけなんで中に書きます
0450nobodyさん
03/05/26 23:36ID:x8s60k6pその際、じっくりと頭の中でシステムを描きなさい
そうすればおのずと答えは出てきます
0451nobodyさん
03/05/27 00:16ID:???マジレスするなら……
俺は開発速度を優先するべき状況にいるので、
ライブラリはとことん利用する立場だ。
Perlの場合はモジュールが便利だ。CPANを見るべし。
ライブラリを使えば、ソース自体を短くすることができ、
短いソースは同時にバグの入る確率が少なくなることを意味する。
副次的にバグの絶対数を下げる効果も期待できる。
(ライブラリにバグが入ってたらどうしようもないが、
自分よりも能力のある人間(作者)を信じて突き進むのみだ)
ま、好きにしろい。
0452nobodyさん
03/05/27 00:18ID:LZ3W66wZいると思う。
自分でフォームデコード書くならいらないけど。
0453452
03/05/27 00:22ID:LCoN4Nuw漏れは勉強がてら、
ライブラリに頼らず自分でコード書く。
0454424
03/05/27 00:56ID:tldcRAHy$ORG{'person'}[1]="tanaka"; $ORG{'adana'}[1]="tanachan"; $ORG{'adanaid'}[1]=5;
$ORG{'person'}[2]="takada"; $ORG{'adana'}[2]="takachan"; $ORG{'adanaid'}[2]=2;
$ORG{'person'}[3]="imai"; $ORG{'adana'}[3]="imachan"; $ORG{'adanaid'}[3]=3;
$ORG{'person'}[4]="takenaka"; $ORG{'adana'}[4]="takechan"; $ORG{'adanaid'}[4]=1;
$ORG{'person'}[5]="hirano"; $ORG{'adana'}[5]="hirachan"; $ORG{'adanaid'}[5]=4;
で、
foreach ($key {sort { $ORG{'adanaid'}[$a] <=> $ORG{'adanaid'}[$b] } @ORG{'adanaid'}){
print qq|\$ORG{'person'} = $ORG{'person'} , \$ORG{'adana'} = $ORG{'adana'}, \$ORG{'adanaid'} = $ORG{'adanaid'}<br>|;
}
としたら、
compilation errors.になってしまいます。
思うに、@ORG{'adanaid'}があやしいのかとも思うのですが、
ただしい記法はどうすればいいのでしょうか?
($ORG{'adanaid'}[1], $ORG{'adanaid'}[2], $ORG{'adanaid'}[3], $ORG{'adanaid'}[4], $ORG{'adanaid'}[5])
という意味の配列を表したつもりなのですが・・・
0455動画直リン
03/05/27 01:10ID:77ADrmTJ0456nobodyさん
03/05/27 01:10ID:???http://www.kt.rim.or.jp/%7ekbk/perl5.005/perllol.html
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlref.html
0457454
03/05/27 01:28ID:tldcRAHyあー、それですねー。実は前に読んでちんぷんかんぷんで、
そのままにしてました。。。
しかし、今読んでもちんぷんかんぷん。。。
(わからない用語ばかりで、用語を調べるとよけいにわからなくなる(泣))
もしよかったら、恐縮がですが、
($ORG{'adanaid'}[1], $ORG{'adanaid'}[2], $ORG{'adanaid'}[3], $ORG{'adanaid'}[4], $ORG{'adanaid'}[5])
を配列として表す方法を教えていただけませんjか?
そしたら、演繹的に勉強していきますので・・・。
0458nobodyさん
03/05/27 01:49ID:???データ形式を見直したほうがいいのでは……
それと、$ORG{}[0]の要素が未定義じゃマズいでしょ。それもソートの対象になるんだから。
0459454
03/05/27 01:59ID:tldcRAHyあ、ほんとですね。。。ありがとうございます。
0460nobodyさん
03/05/27 02:25ID:???こういうのは実際に最小限のコードをどんどん書いて実際に
走らせながら理解していくのが一番早いし身につくんだが…。
@list = ('a', 'b', 'c');
$list = \@list; # \ で配列 @list のリファレンスを得る
print $list; # "ARRAY(0xbb1350)" ← $list の中身は配列のリファレンス
print @{$list}; # "abc" ← @{} で配列としてデリファレンス
print @$list; # {} を省略した書き方
# [] で無名配列のリファレンスを作成
# @list のように変数名が無いから「無名」
$list = [ 'd', 'e', 'f' ];
print $list; # "ARRAY(0xbb135c)"
print @{$list}; # "def"
%hash = (a => 1, b => 2, c => 3);
print "$_:$hash{$_}/" foreach sort keys %hash;
# "a:1/b:2/c:3/"
%hash = (a => [0..3], b => [4..7], c => [8..11]);
print "$_:$hash{$_}/" foreach sort keys %hash;
# "a:ARRAY(0xbb1350)/b:ARRAY(0xbb1374)/c:ARRAY(0xbb1398)/"
# $hash{'a'} の中身は配列のリファレンス
print @{$hash{'a'}}; # "0123" ← @{} で配列としてデリファレンス
これでもう分かるよな?
0461457
03/05/27 11:13ID:OknXPD/2リファレンスについて、随分わかってきました。
print @{$ORG{'adanaid'}};
で、配列要素一覧が取り出せることもできました。
ただ・・・もう少しおつきあいねがえませんでしょうか?(非常に恐縮です)
同じりくつで、
foreach ($key {sort { @{$ORG{'adanaid'}}[$a] <=> @{$ORG{'adanaid'}}[$b] } @{$ORG{'adanaid'}) {
print qq|\$ORG{'person'} = $ORG{'person'} , \$ORG{'adana'} = $ORG{'adana'}, \$ORG{'adanaid'} = $ORG{'adanaid'}<br>|;
}
とやったのですが、コンパイルエラーになってしまいます。
print @{$ORG{'adanaid'}}[1]は動くから、そのまま1を$aと$bに変えればいいかと思ったのですが・・・
0462_
03/05/27 11:24ID:???0464nobodyさん
03/05/27 12:10ID:???まず「コンパイルエラー」みたいな曖昧なエラー名はやめよう。
必ず表示されたエラーメッセージを正確に書くこと。
そのソース、実行してみたけど syntax error at hoge.pl line 7, near "})" とか、
あまりに初歩的なミスをやってる。foreach の使い方もヘン。
データの管理法も、あまりソートとかに向いてない形式だから変えたほうがいいと
個人的には思う。
漏れも試行錯誤してみたが、データを一度結合してからソートして、ループ内で
また分割するという非効率な方法しか思いつかなかった。
0465461
03/05/27 13:03ID:???KCatch.pmを使っていたのですが、
コンパイルエラーとしかいってくれなかったので、そういうもんだと思ってました。。。
すみません。
別のものに変えてみようかしら
0466nobodyさん
03/05/27 13:09ID:???kcatchってそういうもんなの?
CGI::Carpを使ってみては。(使い方はぐぐってね)
もっとも、コマンドラインで実行させるのが一番手っ取り早いんだけど。
0467nobodyさん
03/05/27 13:14ID:???0468nobodyさん
03/05/27 13:16ID:???googleで検索して
http://www.google.co.jp/
0469465
03/05/27 13:20ID:???use CGI::Carp qw(fatalsToBrowser);
したら、
「Software error:
Execution of test.cgi aborted due to compilation errors.
For help, please send mail(以下略)」と・・・
なんでだろう
0470nobodyさん
03/05/27 13:33ID:???0471465
03/05/27 13:51ID:???foreachの部分をコメントアウトすると、正常です。
入れると、「コンパイルエラー」だそうです。
------------------------------------------------------------
$ORG{'person'}[1]="tanaka";$ORG{'adana'}[1]="tanachan";$ORG{'adanaid'}[1]=5;
$ORG{'person'}[2]="takada";$ORG{'adana'}[2]="takachan";$ORG{'adanaid'}[2]=2;
$ORG{'person'}[3]="imai"; $ORG{'adana'}[3]="imachan";$ORG{'adanaid'}[3]=3;
$ORG{'person'}[4]="takenaka"; $ORG{'adana'}[4]="takechan";$ORG{'adanaid'}[4]=1;
$ORG{'person'}[5]="hirano";$ORG{'adana'}[5]="hirachan";$ORG{'adanaid'}[5]=4;
#print @{$ORG{'adanaid'}}[1];
print @{$ORG{'adanaid'}};
foreach ($key {sort { @{$ORG{'adanaid'}}[$a] <=> @{$ORG{'adanaid'}}[$b] } @{$ORG{'adanaid'}) {
print qq|\$ORG{'person'}[\$key] = $ORG{'person'}[$key] , \$ORG{'adana'}[\$key] = $ORG{'adana'}[$key], \$ORG{'adanaid'}[\$key] = $ORG{'adanaid'}[$key]<br>|;
}
0472nobodyさん
03/05/27 14:02ID:???syntax error at test.pl line 11, near "}) "
syntax error at test.pl line 13, near "}"
Missing right curly or square bracket at test.pl line 13, at end of line
Execution of test.pl aborted due to compilation errors.
For help, please send mail to this site's webmaster, giving this error message
and the time and date of the error.
うちでやったらこう出たが……(Win2000+ActivePerl5.6.1)
本当に>>469しか出なかったの?
っていうか、あなたの実行環境ってどんなん?
0473463
03/05/27 14:22ID:???・・・汚ねぇソース・・・
$ORG[0] = {
"person" => "tanaka",
"adana" => "tanachan",
"adanaid" => 5,
};
$ORG[1] = {
"person" => "takada",
"adana" => "takachan",
"adanaid" => 2,
};
$ORG[2] = {
"person" => "imai",
"adana" => "imachan",
"adanaid" => 3,
};
$ORG[3] = {
"person" => "takenaka",
"adana" => "takechan",
"adanaid" => 1,
};
つづく
0474463
03/05/27 14:22ID:???"person" => "hirano",
"adana" => "hirachan",
"adanaid" => 4,
};
@tmp = sort { (${ORG[$a]->{adanaid}} <=> ${ORG[$b]->{adanaid}}) } 0 .. $#ORG;
foreach (@tmp) {
print 'person='. $ORG[$_]->{person}. "\n";
print 'adana='. $ORG[$_]->{adana}. "\n";
print 'adanaid='. $ORG[$_]->{adanaid}. "\n";
}
exit(0);
こんな実行結果がお望みですか。
タブは見やすいように全角スペース
0475nobodyさん
03/05/27 14:22ID:Z3njAYJb@{$ORG{'adanaid'}) いっこ括弧閉じが足り無くない?
0477_
03/05/27 14:33ID:???0478nobodyさん
03/05/27 17:02ID:Ahi5sL61Jcodeモジュールの使えないサーバーで
Unicode(UTF-8) -> Shift JISの変換を行いたいのですが
どうすればよいでしょうか?
0482名前はまだ無い
03/05/27 19:39ID:0dveLtbZopen(a,">b");
close(a);
なんかで出来ましたよね。
空フォルダを作りたい場合はどのようにすれば良いのでしょうか?
上の">b"を">c/b"などにしても作ることが出来ませんでした。
どなたかお答えを願います。
0483nobodyさん
03/05/27 19:42ID:???0484名前はまだ無い
03/05/27 20:03ID:???0485469
03/05/27 20:33ID:CEAVaVCK2つのサーバで試したんですけど、syntax error at とかいってくれないですねー。
両方ともFreeBSDなんですけど、関係ないですよねー・・・
0486471
03/05/27 20:35ID:???なるほどーーーです。
変数の一元目にソートするものを持ってくるわけですね。
アルゴリズム考えるのに、foreachのところばかりにとらわれてました。
もっと全体的視点からアルゴリズムを考えないとだめですね。
ありがとうございます。コード参考にさせていただきます。
0487動画直リン
03/05/27 21:10ID:77ADrmTJ0488nobodyさん
03/05/27 22:20ID:???ちょっと呆れた。
鯖で実験すんなよ。
他人の物で無限ループとかのひどいバグがあるかも知れないプログラムを走らせようとするな。
そういうのは、ローカルでしっかりチェックしてから鯖にあげるもんだ。
まずローカルにPerlをインストールすること。(WinならActivePerl)
スクリプトのバグがあるかどうかのチェックは、
1.MS-DOSプロンプトを開き、
2.スクリプトのあるディレクトリまで移動し、
3."perl スクリプト名"と入力する。
CGIを実行しようとすると、うまく行けばHTMLが吐き出されるはずだし、
バグがあればエラーメッセージが出て止まる。
自分の尻拭いは自分でできるようになろう。
0489nobodyさん
03/05/27 23:22ID:???$num = sprintf("%X", 116777215);
のようにして16進数に直そうとすると、全て\xFFFFFFになってしまいます。
どうしたらいいでしょうか?
0490nobodyさん
03/05/28 00:45ID:d/eWTjVeのようになっている配列に対して、anにマッチする要素の
インデックス番号(上の例なら 1, 2, 3 ・・・)を得たいのですが
ループを回さずに綺麗にできる方法はないでしょうか?
0491nobodyさん
03/05/28 00:55ID:???my $count;
my %temp = map { $_, $count ++ } @array;
@result = @temp{grep { /an/ } @array};
こんな感じかなー。インクリメントのあたりが怪しいけど。
0492nobodyさん
03/05/28 01:07ID:???難しく考え過ぎ。
@array = qw( apple orange banana angle tv home );
@result = grep $array[$_] =~ /an/, 0..$#array;
0493nobodyさん
03/05/28 01:30ID:???$number = 16777215(\xFFFFFF)以上の文字;
$num = sprintf(qq{%04X%04X},int($number/0x10000),$number%0x10000);
みたいな。
0494490
03/05/28 01:43ID:???ひたすらgrepかmapを眺めていて、どちらかでできそうだと
思っていたのですが、全く思いつきませんでした。
まだまだ修行不足でした。ありがとうございました。
0495nobodyさん
03/05/28 03:57ID:???それを解説してるページってあります? ぐぐっても見つかんなかった。
0496nobodyさん
03/05/28 03:58ID:???if($name eq "ほげ"){
if($value =~ tr/;<>*|`/&$!#{}:;'"$//){
$error[n] = "エラーだぴょん";
$errorh = "1";
}
}
カタカナなんかもエラーの対象になってしまうのであります。
なんでなの?
0499nobodyさん
03/05/28 04:26ID:???だけ抜き出したいんですけどうまく抜き出せません。他にもゴミ
がついてきます。
#!/usr/bin/perl
while(<STDIN>){
if(/\b[a-z|0-9]{32}\b/){
print;
}
}
どうしたらいいですか?
0501nobodyさん
03/05/28 04:48ID:???したいんですけど無理ですかね。。?もちろん、
空白か行頭、行末にはさまれてはいます。
0503nobodyさん
03/05/28 05:32ID:???おらおらおらおら無駄無駄無駄無駄 by じょうたろう
vizelj f6c08af464e2db2d05988c121db29156
こんな感じです。ハッシュ値ってのは最後の英数字の
羅列です。アルファベットの小文字または数字で構成
されていて長さは32文字固定です。
0505nobodyさん
03/05/28 07:58ID:???if(/\b([0-9a-z]{32})\b/){
print $1;
}
0506nobodyさん
03/05/28 13:22ID:???close(FA);
のように、新規ファイルを作成すると
パーミッションが 0644 になってしまうので
chmod(0777,"file");
のように0777に変えてやってるんですが、うまくいきません。(パーミッション変更出来ない)
サーバによっては上手く行くので、原因はサーバ側の設定でしょうか?
もしそうであれば管理者に相談しようと思うのですが、
それ以外で解決策ありますでしょうか?
やりたい事としては
・新規ファイル、ディレクトリを作成→パーミッションを777にしたい
です。
0508nobodyさん
03/05/28 13:52ID:???現状標準入力から受け取って、ファイルとテキストを切り分けて、ファイルのサイズを取得して
サイズが大きいと蹴ってるのですが、
これだとサーバーに送信された後の処理なので、送信される前になんらか手を打てないしょうか?
0509nobodyさん
03/05/28 13:55ID:???鯖によっては777を禁止してるとこもあるかもしれないな。
755にも変更できないのか?
0510nobodyさん
03/05/28 13:58ID:???うろ覚えで悪いが、送信時にいけなかったっけか?
<input type=hidden name=MAX_FILE_SIZE value="500000">
たしかこんな感じで。
valueに最大ファイルサイズを入れればいいと思う。
ただ、うろ覚えなので確認は自分で。
0512nobodyさん
03/05/28 14:15ID:???umaskとか。
0514nobodyさん
03/05/28 15:06ID:???そうか、PHPだけか…すまんかった。
じゃあちょっと手抜きだが、これでは駄目?
if($ENV{CONTENT_LENGTH} < $max_filesize) {
ファイルがでかかった時の処理
exit;
}
これだとpostされたデータ全体になるので、厳密な画像サイズだけでは無いけど
まあ、大体で制限できるかと。
0515514
03/05/28 15:09ID:???×if($ENV{CONTENT_LENGTH} < $max_filesize) {
○if($ENV{CONTENT_LENGTH} > $max_filesize) {
0516513
03/05/28 15:22ID:???その処理にしようかとも迷ったんですが
同じcgiで画像の添付数やテキストの入力量にかなりバラつきがあるので
やめました
もうちっと試行錯誤してみます。
0517nobodyさん
03/05/28 16:15ID:???print $text;
ってすると qr の仕様らしくて、$text の中に特殊な意味を持つ文字列が入るんですが、
これを取り除く、または取り除いたデータを参照できる方法はないですか?
二重 foreach の中で正規表現は効率悪い、というのをラクダ本で見たので
やってみたのですが、$text そのものを表示して使いたいため
これがネックで困ってます…。
ラクダ本、何か宇宙語のようで読むのが大変ですw
0518山崎渉
03/05/28 17:03ID:???ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。
=〔~∪ ̄ ̄〕
= ◎――◎ 山崎渉
0519nobodyさん
03/05/28 18:02ID:???0522nobodyさん
03/05/28 19:24ID:uwixhF+z改行を取り除きたいのですが、
どのようにすればいいのでしょうか?
改行を取り除くのは
$body =~ s/\n//g;
これでできるのですが、
$bodyの中の1行目から3行目までだけの
改行を取り除きたいと思っています。
0523nobodyさん
03/05/28 19:46ID:???@bodys = split (/\n/, $body);
chomp ($body[0], $body[1], $body[2]);
いくら初心者のためのスレだと言っても、
最低基礎くらい覚えてこい!
0524523
03/05/28 19:51ID:???@head = splice (@bodys, 0, 3);
$body = join ("\n", @bodys);
スマン、俺も、ちゃんと勉強しておく。。。
0525nobodyさん
03/05/28 20:15ID:+jnsOx/qはぁ?じゃマジ初心者はどこいったらいいのよ?
お前スレタイ読んで出直してこいや(w
0526525
03/05/28 20:16ID:???0527nobodyさん
03/05/28 20:29ID:uwixhF+zありがとう。
でも配列使えないんですよ。
ポインタみたいな物使ってるので。
$body_item->{'body'}
これの中身の最初の\nから3つ目の\nまで消したいんです。
0528nobodyさん
03/05/28 20:31ID:uwixhF+z0529_
03/05/28 20:32ID:???0530nobodyさん
03/05/28 20:37ID:???for($i=0; $i<3; $i++){
$body_item->{'body'}[$i] =~ s/\n//g;
}
0532nobodyさん
03/05/28 20:44ID:uwixhF+z>531
ありがとう
use vars
for($i=0; $i<3; $i++){
$body_item->{'body'}[$i] =~ s/\n//g;
}
Unrecognized character \x81 at user_lib/xxxx/xxx.pm line 198.
というエラーが出ます。
0533nobodyさん
03/05/28 20:46ID:???198行目がなんなのかもわからんのに
0534nobodyさん
03/05/28 20:49ID:uwixhF+zuse vars
@body_item->{'body'} = split (/\n/, $body_item->{'body'});
@head = splice (@body_item->{'body'}, 0, 3);
$body_item->{'body'} = join ("\n", @body_item->{'body'});
これだと
Global symbol "@body_item" requires explicit package name at user_lub/xxx/xxx.pm line 196
このようなエラーが出ます。
0535nobodyさん
03/05/28 20:49ID:???0536nobodyさん
03/05/28 20:54ID:uwixhF+z0538nobodyさん
03/05/28 20:58ID:C2cSB0SK↓
http://www.dvd-yuis.com/index2.html
0539nobodyさん
03/05/28 20:58ID:uwixhF+z全然おちょくってないです。
本当に困ってるんですよ。
0540nobodyさん
03/05/28 21:00ID:uwixhF+z0541nobodyさん
03/05/28 21:01ID:uwixhF+z0543動画直リン
03/05/28 21:10ID:52+C0e9R0544nobodyさん
03/05/28 21:12ID:uwixhF+zありがとう
use vars qw(@body_item->{'body'},@head);
@body_item->{'body'} = split (/\n/, $body_item->{'body'});
@head = splice (@body_item->{'body'}, 0, 3);
$body_item->{'body'} = join ("\n", @body_item->{'body'});
これだと
@body_item->{'body'},@head' is not a valid variable name under strict vars at user_lub/xxxx/xxx.pm line 196
こういうエラーが出ます。
0546nobodyさん
03/05/28 21:15ID:???0547nobodyさん
03/05/28 21:15ID:???カンマ区切りじゃなくて、半角スペース区切りだろ
■ このスレッドは過去ログ倉庫に格納されています