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
0412nobodyさん
03/05/26 05:19ID:???$data =~ tr/\x0d\x0a//d;
が高速。
0413nobodyさん
03/05/26 06:37ID:qholo4T7ことを考えてるのですがこれって実現可能ですか。
リストで表示させる項目を一つの変数の中にまとめて
"a","b","c"と書いても実行するとリストは"a","b","c"と
繋がって表示されてしまい1項目しかでなかったものでして。
ある人は10個項目でててある人は5項目でてるような
ことがしたいのです。
0415nobodyさん
03/05/26 10:06ID:???言ってる意味がよーわからんので推測でだが、出来る。
ユーザごとに指定した数を指定しておいて、配列をその数だけ
回すなりなんなりでいいんじゃん?
0417nobodyさん
03/05/26 10:20ID:???>>414
添付ファイルはどこに誰が保存しているのか?
そのファイル名はメール内でのファイル名だと思うのだが
>>419
$?
0419nobodyさん
03/05/26 10:36ID:???未だにPerl4の鯖だってあるんだよ。
0420nobodyさん
03/05/26 11:01ID:X5HT6fof$orgid = $line{'orgid'};
$countryid = $line{'orgname_ja'};
$orgname = $line{'orgname'};
っていうのを、後ろの3行をベタにこういう風↑に書かないで、
foreach $value (@orgmaster) {
★ここが不明★ = $line{$value};
}
というようにまわしたいのですが、
★ここが不明★の部分がわかりません。どうすればいいのでしょうか?
0421bloom
03/05/26 11:08ID:gUjk1KcM0424nobodyさん
03/05/26 12:52ID:???$ORG{'person'}[2]、$ORG{'adana'}[2]、$ORG{'adanaid'}[2]
$ORG{'person'}[3]、$ORG{'adana'}[3]、$ORG{'adanaid'}[3]
$ORG{'person'}[4]、$ORG{'adana'}[4]、$ORG{'adanaid'}[4]
$ORG{'person'}[5]、$ORG{'adana'}[5]、$ORG{'adanaid'}[5]
という変数があるのですが、これを、
$ORG{'adanaid'}[n]の値でソートして、例えば、
$ORG{'person'}[2]、$ORG{'adana'}[2]、$ORG{'adanaid'}[2]
$ORG{'person'}[5]、$ORG{'adana'}[5]、$ORG{'adanaid'}[5]
$ORG{'person'}[4]、$ORG{'adana'}[4]、$ORG{'adanaid'}[4]
$ORG{'person'}[3]、$ORG{'adana'}[3]、$ORG{'adanaid'}[3]
$ORG{'person'}[1]、$ORG{'adana'}[1]、$ORG{'adanaid'}[1]
みたいに表示さすにはどうすればいいのでしょうか?
0426nobodyさん
03/05/26 14:22ID:???0427426
03/05/26 14:23ID:???手元のリファレンスには何にもかいてなかったもんで
0428nobodyさん
03/05/26 15:09ID:ave5j164http://www.2ch.net/dir/file.txt
という文字列を、
/dir/file.txt
のようにするにはどちらが効率的なんでしょうか?
# 正規表現のみの場合
$url =~ s/http:\/\/.*?\//\//i;
# 関数も使う場合
$url =~ s/http:\/\///i;
@temp = split(/\//, $url);
shift(@temp)
$url = "/" . join("/", @temp);
0430nobodyさん
03/05/26 15:49ID:???http://flex.ee.uec.ac.jp/texi/perl/perl_54.html
0431424
03/05/26 17:42ID:???たぶん、おっしゃってるのは、そのページの一番最後の
sub reverse { $b cmp $a; }
@harry = ('dog','cat','x','Cain','Abel');
@george = ('gone','chased','yz','Punished','Axed');
print sort @harry;
# 出力は AbelCaincatdogx
print sort reverse @harry;
# 出力は xdogcatCainAbel
print sort @george, 'to', @harry;
# 出力は AbelAxedCainPunishedcatchaseddoggonetoxyz
を参考にできるということなのだと思うのですが、
print sort @george, 'to', @harry; の意味がわかりません。
sort LIST, 'to', LISTなんて書式の意味も、書いてないし。。。
この書式で探したのですが、わかりませんでした。。。
どういうことなのでしょうか?
0432356
03/05/26 20:54ID:???> print sort @george, 'to', @harry; の意味がわかりません。
結果からして、
print sort((@george,'to',@harry));
なんぢゃないかなと逝ってみる震度6弱。
0433nobodyさん
03/05/26 21:08ID:haPyfOxB$n_pass = "$in{'password'}";
# パスワード
$pass = '0123';
if($pass eq $n_pass)
こうするとできるのに、
# パスワード
$pass = '0123';
if($pass eq $in{'password'}")
こうすると、すべてパスワードが違うとでます。フォームから渡せてないんでしょうか?
0434nobodyさん
03/05/26 21:09ID:haPyfOxB↓
if($pass eq $in{'password'})
です。
0435動画直リン
03/05/26 21:10ID:gUjk1KcM0436431
03/05/26 21:21ID:XWjbOab7あー。。。了解すますた。
0438nobodyさん
03/05/26 22:32ID:haPyfOxBえ?&ReadParseって、cgi-libのライブラリのでしょ?
$in{'password'}
こうやったらライブラリいらないんじゃないんですか?
どっちにしてもライブラリはいるんですか?
0439nobodyさん
03/05/26 22:43ID:???なんかねぼけたこと言ってる奴だな……
PerlはCGI専門言語じゃない。
ブラウザのフォームから送られたデータを取得するには、
それ相応のステップをふまなければならない。
なにもしなければ、%inは空のままだ。
当たり前だ。何もしなかったんだから。
顔洗って出直してきなさい。
0440nobodyさん
03/05/26 22:48ID:haPyfOxBそんな・・・
方法を教えてください。お願いします
0441440
03/05/26 22:51ID:haPyfOxB要はPOSTの場合
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
で読み取って、splitできりきざんでやればいいんですね。
0442nobodyさん
03/05/26 22:55ID:???0443440
03/05/26 23:02ID:haPyfOxBそれでもいいんですけど、あんまりライブラリを使うのが好きじゃないんですよ・・・
全部で10行くらいだから中にいれてもいいかな〜って・・
0444440
03/05/26 23:04ID:haPyfOxBcgiを使う側の場合、
・cgiソースは簡潔がいいからライブラリ使う。
・ソースが多少多くてもいいからライブラリはできるだけさける。
どっちがいいんですかね?
0445_
03/05/26 23:09ID:???0446bloom
03/05/26 23:10ID:gUjk1KcM0447nobodyさん
03/05/26 23:24ID:???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に最大ファイルサイズを入れればいいと思う。
ただ、うろ覚えなので確認は自分で。
■ このスレッドは過去ログ倉庫に格納されています