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

Perlコーディング初心者質問スレ Part 61

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2010/06/05(土) 21:11:10ID:???
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

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

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

お勧めサイトは >2 以降

前スレ http://pc11.2ch.net/test/read.cgi/php/1251989472/
0002nobodyさん2010/06/05(土) 21:11:34ID:???
[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: ttp://www.site-cooler.com/kwl/perl/

[本]
リャマ: ttp://www.oreilly.co.jp/books/4873111269/
駱駝: ttp://www.oreilly.co.jp/books/4873110963/
Effective Perl: ttp://ascii.asciimw.jp/books/books/detail/4-7561-3057-7.shtml
クックブック: ttp://www.oreilly.co.jp/books/4873112028/
Perl ベストプラクティス: ttp://www.oreilly.co.jp/books/4873113008/
Perl Hacks: ttp://www.oreilly.co.jp/books/9784873113142/

[オンラインマニュアル]
最新のドキュメント: ttp://perldoc.perl.org/
perl5.8.xのドキュメント(一部): ttp://www.kt.rim.or.jp/~kbk/perl-5.8/
perldoc きまぐれ訳: ttp://fleur.hio.jp/perldoc/
perldoc.jp: ttp://www.perldoc.jp/

[モジュール]
CPAN: ttp://search.cpan.org/
河馬屋二千年堂: ttp://homepage3.nifty.com/hippo2000/

[テクニック]
Perlメモ: ttp://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: ttp://homepage1.nifty.com/nomenclator/perl/
Perlの小技: ttp://homepage3.nifty.com/hippo2000/perltips/index.htm

[Perl5.8Unicodeメモ]
ttp://www.namazu.org/~tsuchiya/perl/perl-5.8.html
ttp://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
0003nobodyさん2010/06/05(土) 22:24:44ID:???
>>1乙
と、前スレ993
>&send_item2() の第1引数で $m を渡してるのに、第3引数で $m の中身の一部分を送ること自体が無駄。
$m と、 %m は別物だ。
第三引数 $m{wea} とかは明かに、ハッシュの値だ。$m と混同すんな。
0004nobodyさん2010/06/05(土) 22:44:10ID:BPQlnKOc
レファレンスがわからなくて疲れてるオイラにどなたか応援の一声をノタム。(;´Д`)
0005nobodyさん2010/06/05(土) 22:53:46ID:???
つ[ユンケル]
0006nobodyさん2010/06/05(土) 23:37:59ID:WMYKbA0D
>>4
わからないのは何がわからないの?
0007nobodyさん2010/06/05(土) 23:43:44ID:???
リファレンス=オブジェクトの理解で乗り切った

あとデリファレンスって言葉がこの先頻出してくると思うが、
これがメンバ変数にアクセスする行為そのもの

実際、この先出てくるであろう、オブジェクトでもリファレンスを使って
実装されてる
0008nobodyさん2010/06/05(土) 23:48:40ID:???
(;><)
0009nobodyさん2010/06/06(日) 00:26:23ID:???
リファレンスとか文字で言われると分からないが、説明を読むと多用してることに気が付いた。
でも改めて説明されても分からないwww


$cnofig = {
  'array' => [0, 1, 2, 3, 4, 5],
  'hash' => {'first' => 0, 'third' => 3},
  'scalar' => 'monyumonyu',
};

print $config->{'array'}->[1];
1

print $config->{'hash'}->{'third'};
3

print $config->{scalar};
monyumonyu

基本こんな感じでしか使ってない。

初期化してない段階では

$config->{'array'} = [0, 1, 2, 3];

みたいな代入でいいのかな?
わっかんないやw
0010nobodyさん2010/06/06(日) 08:13:05ID:???
リファンレス=ポインタもどきだろ……
0011nobodyさん2010/06/06(日) 10:59:04ID:???
もどきっつかそのものじゃね
0012nobodyさん2010/06/06(日) 11:11:23ID:???
>>11
もどきだろjk
0013nobodyさん2010/06/06(日) 11:37:51ID:???
女子高生だろ常識的に考えて
0014nobodyさん2010/06/06(日) 11:48:13ID:???
ところで前スレからなんですがNet::DNSが使えないと
やっぱりホスト名の逆引きはできませんか
0015nobodyさん2010/06/06(日) 13:40:08ID:???
なかったら入れればいいじゃん
0016前スレ9212010/06/06(日) 16:41:21ID:+nevgJE6
sub hokan {
my $target = shift;

if ($m{is_full_g}) {
$mes = "$max_depot_g個までしか保管することはできません";
return;
}

if ($weas[$m{wea}][1] eq $target) {
$npc_com = "$items[$m{ite}][1]を倉庫にいれました\n";
my $send_id = unpack('H*', $m{guild});
if (-f "$guilddir/$send_id/depot_g.cgi") {
open (OUT,">> $guilddir/$send_id/depot_g.cgi");
print(OUT "1<>$m{ite}<>\n");
close(OUT);
$m{ite} = 0;
}
}
elsif ($arms[$m{arm}][1] eq $target) {
$npc_com = "$items[$m{arm}][1]を倉庫にいれました\n";
my $send_id = unpack('H*', $m{guild});
if (-f "$guilddir/$send_id/depot_g.cgi") {
open (OUT,">> $guilddir/$send_id/depot_g.cgi");
print(OUT "2<>$m{ite}<>\n");
close(OUT);
$m{arm} = 0;
}
}
0017162010/06/06(日) 16:48:18ID:+nevgJE6
elsif ($ites[$m{ite}][1] eq $target) {
$npc_com = "$items[$m{ite}][1]を倉庫にいれました\n";
my $send_id = unpack('H*', $m{guild});
if (-f "$guilddir/$send_id/depot_g.cgi") {
open (OUT,">> $guilddir/$send_id/depot_g.cgi");
print(OUT "3<>$m{ite}<>\n");
close(OUT);
$m{ite} = 0;
}
}

if ($npc_com) {
&get_depot_cg;
return;
}

$mes = qq|どれを倉庫にいれますか?<br />|;
$mes .= qq|<span onclick="text_set('@ほかん>$weas[$m{wea}][1] ')">$weas[$m{wea}][1]</span> / | if $m{wea};
$mes .= qq|<span onclick="text_set('@ほかん>$arms[$m{arm}][1] ')">$arms[$m{arm}][1]</span> / | if $m{arm};
$mes .= qq|<span onclick="text_set('@ほかん>$ites[$m{ite}][1] ')">$ites[$m{ite}][1]</span> / | if $m{ite};
$act_time = 0;
}

&send_item2を無くして自分で分かるように直に書いてみたのですが
結果は変わらずエラーのままでした。
$guilddir/$send_id/depot_g.cgiには書き込まれましたが
$m{ite} = 0;が実行できないみたいです。どうすればいいんだろ・・・orz
0018142010/06/06(日) 18:04:21ID:???
レンタルサーバなんだけどどうにかなるかな
0019nobodyさん2010/06/06(日) 18:33:08ID:???
local::lib使えば入る
0020nobodyさん2010/06/06(日) 18:42:10ID:???
>>17
@itesと、@itemsどっちかがtypoだ。
これ↓、前のバージョン用に整理した奴。
sub hokan {
my $target = shift;
if ($m{is_full_g}) { $mes = "$max_depot_g個までしか保管することはできません"; return; }
# 構造が同じ二次元配列を、別名で三つ作る必要あんの?
# $items[$m{ite}][1]とどっちが正しいの?
my @keys = qw( wea arm ite );
my %hash = ( wea => $weas[$m{wea}][1], arm => $arms[$m{arm}][1], ite => $ites[$m{ite}][1], ) ;
# if ~ elsif は、やることが同じなら
# for( next if 条件 ; 処理 ; last ) に纏められる
# typo も減らせるからそちらお勧め
for my $i ( 0 .. $#keys ){
next if $hash{$keys[$i]} ne $target ;
$npc_com = "$hash{$keys[$i]}を倉庫にいれました\n";
# $m{$keys[$i]}はsend_item2内で使ってないよ?渡すの?それでも
&send_item2($m, $i + 1, $m{$keys[$i]});
$m{$keys[$i]} = 0;
last ;
}
if ($npc_com) { &get_depot_cg; return; }
$mes = qq|どれを倉庫にいれますか?<br />|;
for my $key ( @keys ){
next if ! $m{$key} ;
$mes .= qq|<span onclick="text_set('@ほかん>$hash{$key} ')">$hash{$key}</span> / | ;
}
$act_time = 0;
}
0021nobodyさん2010/06/06(日) 20:19:37ID:???
エラー内容もさらしてごらん
さすがにソースだけでは辛い
0022nobodyさん2010/06/06(日) 20:28:17ID:???
前スレ含め、これ以上汚されるの勘弁。
(今回の明かに)typoが原因のエラーとか、そんなん自分で解決すべきだ。
0023nobodyさん2010/06/06(日) 20:31:29ID:???
こんな短い部分さらすだけで、スパゲッティーソースなことが分かるなぁ・・・
0024nobodyさん2010/06/06(日) 20:58:46ID:???
スパゲッティでも芸術的なぐらい短ければ神コードに昇華するのにね
0025nobodyさん2010/06/06(日) 21:05:19ID:???
それはスパゲッティとは言わん。
0026nobodyさん2010/06/06(日) 21:09:11ID:???
じゃあ可読性が著しく低いコードと言い換えようか
0027nobodyさん2010/06/06(日) 22:58:20ID:???
それゴルフ
0028nobodyさん2010/06/06(日) 23:18:35ID:???
>>22
つか、お前なんでこのスレ見にきてんの?
0029nobodyさん2010/06/07(月) 06:28:10ID:???
定数を定義することはできます?

constとかdefineみたいな。
0030nobodyさん2010/06/07(月) 06:50:44ID:???
>>28
勉強と回答しにだが?

普通は「エラーコードを晒せ」ってのに賛成だが、
これ以上、この人の質問が増えて何かメリットあるか?
リライトしてる様なもんだぞ?
ちなみに前スレ985、このスレ>>3、>>20は俺だ。
大嘘(perl的に間違った物)答えられるのにも辟易すんだよ、
この手の質問には。

>>29
core module の "CONSTANT"
CPAN module の "Readonly"
を使う。
0031nobodyさん2010/06/07(月) 09:00:06ID:???
サブルーチン呼び出しに&をつける人が今も生き残っているって
すごいな。

&ありとなしは同じじゃないので良い子は真似しないようにね。
0032nobodyさん2010/06/07(月) 09:12:11ID:7ToGpYbm
>>6
『概念』かな。
どうしてこういう概念が必要なの?Perl独特みたいだけど。
リファレンスに代入せずとも今まで通り、変数に代入するんじゃダメなの?
0033nobodyさん2010/06/07(月) 09:12:52ID:???
>>16
weaを扱ってるはずなのにiteを操作してたり、コードが混乱してるように見える。
まず、このサブルーチンで何をやりたいのか文章にしてくれ。

> 1: 自分はこういう事がしたい。
0034nobodyさん2010/06/07(月) 09:31:22ID:???
へ〜、&呼び出しには弊害があったんだね
0035nobodyさん2010/06/07(月) 10:17:21ID:???
へぇ? サブルーチンはsub 名前{ 処理 }で作って、
&名前; で呼ぶものだと思ってたけど、今は違うのですか?
ネットで拾ってきたプログラムをちょこっと改造するぐらいのことしかしてないんですが
KENT Webとかに代表される一般に出回っているものって、殆んど古いものばっかりなんですかね。
使っている鯖の仕様みたらperl5.8.9なので、そんなに古いほうじゃないみたいですが。
0036nobodyさん2010/06/07(月) 10:19:23ID:???
動けば何でも良いよ
perlなんて道具に過ぎないんだからさ
0037nobodyさん2010/06/07(月) 10:33:31ID:???
あと、jcode.plが古いとか前スレにあったけど、
今もあちこちの掲示板とかで、使っているcgiはかなり多い。
むしろ最新の書き方のほうが、使えない鯖もあるので少数派。
ここではバカにする人がいるけど、事実だから。
0038nobodyさん2010/06/07(月) 10:46:01ID:???
Basic認証でのログアウトの仕方
http://shorindo.com/tech/tech0002.html

#!/usr/bin/perl
print <<EOF;
HTTP/1.0 401 Unauthorized
WWW-Authenticate: Basic Realm="valid users only"
Content-Type: text/html

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD><TITLE>401 Authorization Required</TITLE></HEAD>
<BODY>
<H1>Authorization Required</H1>
</BODY>
</HTML>

を試したんだが、
malformed header from script. Bad header=HTTP/1.0 401 Unauthorized
で動かない(Internal Server Errorになる)
これ、使えないスクリプトを堂々と載せてるの?ぐぐるとここへリンク張ってるとこもいくつかあるんだけど。
0039nobodyさん2010/06/07(月) 11:27:42ID:???
そりゃそれじゃあ動きませんてば
ちゃんと最後のEOFまでコピペってくださいねー
0040nobodyさん2010/06/07(月) 11:36:32ID:???
EOFのあとの改行までね
0041nobodyさん2010/06/07(月) 11:45:47ID:???
>>39
いやそれだとそのエラーメッセージにはならないと思うよ。
nphスクリプトになってないんじゃないか? ファイル名間違えたとか?
0042nobodyさん2010/06/07(月) 12:34:10ID:???
すまんEOFがないのはコピペミスだ。実際はちゃんと入ってます。
ファイル名もあってます。
さっぱりわからんが、ApacheのVerによってエラーになったりするのだろうか。2.2.15だけど。
0043nobodyさん2010/06/07(月) 12:45:35ID:???
何故かもっかいやったらできた
わけわからんが解決
0044nobodyさん2010/06/07(月) 14:01:12ID:???
>>9
俺もリファレンスワカラン部類なんだけど、それ二次ハッシュとどう違うの?

>>31
ソースくれ。
&の有無関係なくmod_perlだと動かん事しか知らん。
0045nobodyさん2010/06/07(月) 14:14:32ID:???
>>44
&については perlsub 参照。

ttp://perldoc.jp/docs/perl/5.10.0/perlsub.pod の 「サブルーチンは、
明示的な & というプリフィックスを付けて呼び出すことができます。 」
あたりから読んでくれ。

動作の違いは抜きにしてもいまはつけない方が普通だな。
■ このスレッドは過去ログ倉庫に格納されています