トップページ⇒tech
1001コメント322KB

Perlについての質問箱 34箱目

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2008/01/11(金) 00:07:22
"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。

CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 ttp://pc11.2ch.net/php/ )

CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。

ttp://www.perl.org/get.html
● 2008/01/11現在の最新版: 5.10.0
● 2007/01/11現在の開発版: 5.9.5

前スレ
Perlについての質問箱 33箱目
http://pc11.2ch.net/test/read.cgi/tech/1192463997/

リンク集は>>2-3
過去スレは>>4 あたり
0232デフォルトの名無しさん2008/01/30(水) 00:44:02
ここはお前の哲学を語るスレじゃない。
0233デフォルトの名無しさん2008/01/30(水) 02:18:43
>>231
この"configuration"は「設定」というより、「構成」なんだろうよ。
0234デフォルトの名無しさん2008/01/30(水) 02:56:38
Perlの話をしなさい。
ここは自分の思想を押し付けるスレじゃない。
0235デフォルトの名無しさん2008/01/30(水) 05:11:37
英語が分かるなら英語圏のユーザーに
聞けばいいんじゃねえの?
0236デフォルトの名無しさん2008/01/30(水) 05:27:59
IDが無い板なんだからコテハンつけてほしいな
あぼーんする手間が面倒だよ
0237デフォルトの名無しさん2008/01/30(水) 05:50:31
>>231
ドラゴンボールの中でフリーザが一番好きです まで読んだ
0238デフォルトの名無しさん2008/01/30(水) 08:52:31
>>233
そうなのですか。参考にします。

>>232>>234
とんだ誤解ですね。私は決めつけられた誤解に対して答えただけですよ。
うらむ相手が間違っています。
それに私は私の哲学をどこで語っているんでしょうか。
Perlに関する質問のやりとりのなかで、致命的な誤解が生じてしまったので、
事情説明をしてコミュニケーションの修復を図っただけですよ。
どこにも私の主観・思想が語られておらず、ただ私に関する事実が述べられているのみです。
(もう一度お読みになってみることをお勧めします。)
それなのにその部分だけとりあげて哲学を語っているからスレ違いだとするのは
あまりに早計ではないでしょうか。

>>235
それだけの英語力があるかはやや不安です。
やはり、日本人だから日本語のほうが話しやすいものです。
0239デフォルトの名無しさん2008/01/30(水) 09:00:21
>>238
つうかもっと完結に書く能力はないの?
どうせ「誤解のない詳しく書いてどうのこうの」ってくどくど書くんだろ?
その妙な書き方 前に見たような気がするが…
0240デフォルトの名無しさん2008/01/30(水) 09:10:20
>>238
> うらむ相手が間違っています。
>>232 >>234がお前さんを「うらんでいる」という解釈こそ、この場で最も大きい「とんだ誤解」では。
どこから「うらむ」という発想が出てきたのか、まるで見えてこない。
0241デフォルトの名無しさん2008/01/30(水) 10:03:47
自分がなんで注意されてるかさっぱり理解できない天然さんぽいから放置で。
0242デフォルトの名無しさん2008/01/30(水) 10:28:45
なんという入れ食い
0243デフォルトの名無しさん2008/01/30(水) 10:34:40
>>239
確かに簡潔に書くことは大切ですが、私が簡潔に書く能力がないとするのは論理の飛躍です。
それに、私の文章が簡潔でないというのも偏見ではないでしょうか。
文字数が特別多いわけでもないでしょう。
あと、簡潔に書けるのになぜ簡潔に書かなかったかというと、その必要を感じたからです。
つまり、あらぬ誤解をかけられて、それがために質問者としての目的の遂行に障害が発生したので、
必要なだけの対策を講じたまでです。
そうした些末なことはまさにスレ本題ではないので、>>241の言うように放置をお勧めします。
それから、2chは私は数年前から定期的に利用しているので、私の文章をあなたが見た可能性は否定
できませんが、私の今回の文章を見ただけで、あなたが過去に見た特定の文章の書き手と同一視して
しまうのは早計ではないでしょうか。
そもそも、仮にあなたが過去に見たような気がするというその文章が私のものだったとしても、
だからどうしたというんですか?
発言の意図が見えてこないし、スレ違いもはなはだしいので自重お願いします。

>>240
うらむという表現は「敵対的な言い方をされる」という表現に置換することも可能です。
要するに、表現方法の問題です。
そもそも、仮に、私が>>238で「とんだ誤解」といったときに最大な過ちが私の表現方法
にあったのだとしても、>>232>>234が誤解をしていることには何ら変わりがありません。

>>241
具体的にどんな点で私が注意されるべきなのでしょうか。
もっとも、>>241が私に向けた発言でないことは明白ですが。
0244デフォルトの名無しさん2008/01/30(水) 10:39:18
にゃーにゃー
0245デフォルトの名無しさん2008/01/30(水) 10:42:17
日本語として成立しなくなったら釣りも終わりだな。
0246デフォルトの名無しさん2008/01/30(水) 10:54:08
しねばいいのに・・・
0247デフォルトの名無しさん2008/01/30(水) 12:47:15
日本語の得意な朝鮮人が来てますねwww
0248デフォルトの名無しさん2008/01/30(水) 12:52:09

895 名前:デフォルトの名無しさん[sage] 投稿日:2008/01/07(月) 02:32:27
頭が悪いのに口だけは達者な馬鹿の典型だなw
0249デフォルトの名無しさん2008/01/30(水) 13:13:01
会社で嫌われてんだろうなぁ・・・
0250デフォルトの名無しさん2008/01/30(水) 13:15:37
>>243
早くインストールしろよw
0251デフォルトの名無しさん2008/01/30(水) 13:18:17
>>243
> そうした些末なことはまさにスレ本題ではないので、>>241の言うように放置をお勧めします。

オマエガナ
0252デフォルトの名無しさん2008/01/30(水) 13:23:42
祭りと聞いて(ry
0253デフォルトの名無しさん2008/01/30(水) 13:32:31
ごめんなさい。釣りでした。
0254デフォルトの名無しさん2008/01/30(水) 13:39:22
続きまだぁ?
0255デフォルトの名無しさん2008/01/30(水) 13:50:44
Perlでは珍しいタイプの狂人だな
0256デフォルトの名無しさん2008/01/30(水) 16:52:12
この無駄な冗長さはコボラー
0257デフォルトの名無しさん2008/01/30(水) 21:53:12
珍しく伸びてると思ったら
…珍しくもないか
0258デフォルトの名無しさん2008/01/30(水) 22:51:58
それに、あと、つまり、それから、そもそも、

こんな接続詞が多用されている時点で
簡潔に書けてない事がよく分かるな。
0259デフォルトの名無しさん2008/01/30(水) 23:22:35
みんな、楽しそう。
0260デフォルトの名無しさん2008/01/31(木) 00:11:09
あーこんな文章をどこかで見たことがあると思ってたらアレだ
精神病の人が医者に「これこれで私は精神病じゃないです」って言ってるのにそっくりなんだわ
たとえばこれとか
ttp://www.so-net.ne.jp/vivre/kokoro/psyqa1331.html
0261デフォルトの名無しさん2008/01/31(木) 00:16:37
3行でおk
0262デフォルトの名無しさん2008/01/31(木) 00:43:52
ス
レ
違い
0263デフォルトの名無しさん2008/01/31(木) 02:25:46
なぜこのスレに、精神異常者チェイサーズが集結しているのか?
0264デフォルトの名無しさん2008/01/31(木) 11:37:30
後に現れるのは、もちろんキティガイ
0265デフォルトの名無しさん2008/01/31(木) 20:03:28
エンターキーを押さなくてもキーボードから
一字だけ入力を受け付けたいときはどうすればいいでしょうか?
0266デフォルトの名無しさん2008/01/31(木) 20:08:05
>>265
っ[Term::ReadKey]
0267デフォルトの名無しさん2008/01/31(木) 20:19:17
できました。ありがとうございました。
0268デフォルトの名無しさん2008/01/31(木) 22:23:46
$count = $x =~ tr/0-9/0-9/;
で数字の桁数を数えられるようですが、どういう仕組みなのか分かりません・・・
くだ質の類だと思いますが、よろしくお願いします。
0269デフォルトの名無しさん2008/01/31(木) 22:47:50
tr演算子は置換した文字の数を返す
0270デフォルトの名無しさん2008/01/31(木) 22:48:16
$xの数字を同じ数字に置換して,置換した回数を$countに入れてる.
$xが数字だけなら桁数と一致するわな.
0271デフォルトの名無しさん2008/01/31(木) 23:32:10
目からウロコが落ちた。確かに数えられるねぇ。
でもなんか違う気がする。
0272デフォルトの名無しさん2008/01/31(木) 23:46:35
面白いコードと実用的なコードには差があるからな。
0273デフォルトの名無しさん2008/02/01(金) 00:59:15
できるこたできるけど中身が数字列の場合に限るし
それが保証されてるならlengthでもいい気はする。
0274デフォルトの名無しさん2008/02/01(金) 03:09:51
>>273
my $num = '-123,456';
print $num =~ tr/0-9//, "\n"; # 6
print length $num; # 8
0275デフォルトの名無しさん2008/02/01(金) 08:49:13
実戦での桁数は計算で出すよね
0276デフォルトの名無しさん2008/02/01(金) 10:18:25
計算てw
0277デフォルトの名無しさん2008/02/01(金) 11:53:20
n進数の桁数は計算だすよ
0278デフォルトの名無しさん2008/02/01(金) 11:54:25
>>274
いや数字だけの列と保証されてる場合よ。
0279デフォルトの名無しさん2008/02/01(金) 12:08:24
電話番号やカード番号みたいに、ハイフンがあったりなかったりのチェックで・・
・・・文字数だけじゃあんまり意味ないか
02802682008/02/01(金) 14:12:06
trは置換した文字列を返すんですね。
処理の順番も勘違いしてました。↓の順番なんですね
$count = ( $x =~ tr/0-9/0-9/ );

ありがとうございました。
0281デフォルトの名無しさん2008/02/01(金) 14:25:00
「置換した文字列」ではない。
置換もしくは削除した文字数を返す。
0282デフォルトの名無しさん2008/02/01(金) 14:32:45
while ($x =~ m/\d/gs) { $count++ }
02832682008/02/01(金) 14:41:11
>>281
書き間違えでしたスイマセン
0284デフォルトの名無しさん2008/02/01(金) 15:47:47
重箱の隅だけど、
tr/a/a/
ってのは置換したことになるの?
0285デフォルトの名無しさん2008/02/01(金) 16:05:17
やってみろ。
0286デフォルトの名無しさん2008/02/01(金) 17:08:30
tr/hoge/hage/

の hoge にマッチした回数でいいんじゃね?
0287デフォルトの名無しさん2008/02/01(金) 18:12:45
>>284
文法上は置換する(したことになる)が、実際の置換は行われない。
tr/X// や tr/X/X/ は対象に含まれるXを数える為の記述で、この場合には対象が
左辺値である必要もない。

perl -le "print q/123,456/ =~ tr/0-9a/0-9a/" # エラーにならない
perl -le "print q/124,456/ =~ tr/0-9a/0-9b/" # エラーになる
perl -le "print int(1234.56) =~ tr/0-9a//" # エラーにならない
0288デフォルトの名無しさん2008/02/01(金) 21:17:49
ちょっと自分で試してみればすぐ答えが出るのに。
なんで試さないのかなぁ。
もしかして、ナイコン?
0289デフォルトの名無しさん2008/02/02(土) 13:24:32
確かにわけわからん
レスを書くよりキーを叩く回数が少ないのに。
0290デフォルトの名無しさん2008/02/02(土) 13:55:00
重箱の隅とか言いつつperlバイナリのソースコードのレベルの話を求めてるんじゃね?
0291デフォルトの名無しさん2008/02/02(土) 15:24:02
% perl -MO=Deparse -e 'print q/aaaaa/ =~ tr/a//'
print 'aaaaa' =~ tr/a//;
-e syntax OK
% perl -MO=Deparse -e 'print q/aaaaa/ =~ tr/a/a/'
print 'aaaaa' =~ tr/a//;
-e syntax OK
0292デフォルトの名無しさん2008/02/02(土) 17:10:44
5.00503だと 'aaaaa' =~ tr/a// は
Can't modify constant item in character translation
と怒られてdieした。5.6.1なら置換回数が返された。
0293デフォルトの名無しさん2008/02/03(日) 23:24:30
質問です。
だいぶ前に書かれたライブラリ(*.pl)が現役で動いているとします。
色々な箇所で使われているため、(動いている限りは)できるだけこれを修正したくありません。

このライブラリの中に、以下のようなサブルーチンがあります。

  sub Func
  {
    local *data = $_[0];

    #ハッシュにいろいろ詰め込む
  }

このサブルーチンは、以下のように呼び出すようにとサンプルコードが示されています。

  local %hash;
  &Func(*hash);

これを呼び出し側だけでもlocalを排除しようと、以下のように書き換えました。
実行してみた結果、ちゃんと動いているように見えます。

  my %hash;
  Func(\%hash);

この場合、
1.呼び出し元だけを書き換えることに意味はあるのか?
2.あるとしたら正しい書き方は?(cron、CGI、mod_perlで動かすことを想定)

よろしくお願いします。
0294デフォルトの名無しさん2008/02/04(月) 02:17:53
バージョンによる
0295デフォルトの名無しさん2008/02/04(月) 02:25:32
>>293
一般論としては、その修正で得られるのが自己満足だけなら、さわらないことをお勧めする。
0296デフォルトの名無しさん2008/02/04(月) 10:16:16
>294
あ、バージョン書き忘れてました。

 Perl 5.005
 Apache/1.3.28 (Unix)
 mod_perl/1.29

※下2つはCGIやmod_perl動作時のもの。


>295
自分がlocalの挙動をきちんと理解していないこともあり、予期せぬバグを生み出す原因になるので
なるべくmyで統一したいと考えています。

それに、そのサブルーチンを呼ぶときだけlocalなのも変かなーと。

0297デフォルトの名無しさん2008/02/04(月) 10:21:10
>>296
> 自分がlocalの挙動をきちんと理解していないこともあり、予期せぬバグを生み出す原因になるので
> なるべくmyで統一したいと考えています。

そんな変質的行為に突入する前に、localの挙動をきちんと理解しろ。
0298デフォルトの名無しさん2008/02/04(月) 10:41:31
localだと値を追いかけるのが面倒で……。
0299デフォルトの名無しさん2008/02/04(月) 11:08:20
基本的にはそれで正しく動くはず。
ただ、1.2.の問いがあるから「書き換える必要はないんじゃないの?」って言われてるわけで。
0300デフォルトの名無しさん2008/02/04(月) 11:38:30
ありがとうございます。

ライブラリの方を修正したいけど……中途半端に手を出したら悲惨なことになりそう……
0301デフォルトの名無しさん2008/02/04(月) 11:52:29
古いライブラリをmod_perlで使おうとは思わないなぁ
0302デフォルトの名無しさん2008/02/04(月) 12:18:11
古いライブラリをmod_perlで使うんじゃないんです
古いライブラリがmod_perlで動いてるんです……
0303デフォルトの名無しさん2008/02/04(月) 12:22:08
自分なら、そんな動作よくわからない関数mod_perlで使わないが・・・
なんかラッパー関数作ってそっち使うようにしてけば
そのうち古い関数は淘汰されるんでは?
0304デフォルトの名無しさん2008/02/04(月) 12:51:20
まあ、その少しずつやってます……。
0305デフォルトの名無しさん2008/02/04(月) 13:53:56
他人の書いたperlの読みにくさは異常
書き換えるよりも書きなおしたほうが早いことさえある
0306デフォルトの名無しさん2008/02/04(月) 14:38:28
読みながら書き直したりする。

以前、「どう見てもPrologです。本当にありがとうございました」な
プログラムをもらったことがある。
0307デフォルトの名無しさん2008/02/04(月) 18:33:33
よくわからない物はよくわかるようになるまで触らない方がいいとは思うな。
localが気になるならコメント添えてここはこういう理由って記述しときゃ後で見たときにもわかるし。
せめてそのライブラリの流れ把握できるくらいになってからでないと。
0308デフォルトの名無しさん2008/02/04(月) 19:53:07
localの98%くらいはmyにしてしまっても問題なくね?
0309デフォルトの名無しさん2008/02/05(火) 00:06:02
いや、97%くらいだろ。
0310デフォルトの名無しさん2008/02/05(火) 05:09:26
動いてんならいじるなよ
0311デフォルトの名無しさん2008/02/05(火) 18:09:00
懸念してるのは想定外の2%だか3%のバグの発生だからな。
上でも言われてるがいじるメリットが自己満足だけなら俺もそのままのがいいとは思う。
0312デフォルトの名無しさん2008/02/05(火) 20:11:35
Exporter が import を強制的にexportしなくなったのって、
仕様変更はいつから?
実装変更は、perl 5.9から?
0313デフォルトの名無しさん2008/02/06(水) 00:30:23
人狼ってゲームのCGI設置したいんだけど(nifftyに)
できなくて質問CGIが動かないんだけど、以下エラー
Wed Feb 06 00:22:09 2008 Client Abort 2-- detected during CGI/SSI process
Wed Feb 06 00:22:10 2008 Warning: Connection closed and CGI process ID=400 still alive
Wed Feb 06 00:22:11 2008 Warning: Connection closed and CGI process ID=400 still alive
Wed Feb 06 00:22:12 2008 Warning: Connection closed and CGI process ID=400 still alive
Wed Feb 06 00:22:14 2008 Warning: Connection closed and CGI process ID=400 still alive
Wed Feb 06 00:22:15 2008 Warning: Connection closed and CGI process ID=400 still alive
Wed Feb 06 00:22:16 2008 Warning: Connection closed and CGI process ID=400 still alive
Wed Feb 06 00:22:18 2008 Warning: Connection closed and CGI process ID=400 still alive
Wed Feb 06 00:22:19 2008 Warning: Connection closed and CGI process ID=400 ・・・・・・
以下の文法あやしい?
sub sub_lock {
# 1分以上古いロックは削除する
if (-e $lock_path) {
local($mtime) = (stat($lock_path))[9];
if ($mtime < time - 60) { &sub_unlock; }
}
local($retry) = 5;
# mkdir関数式ロック
while (!mkdir($lock_path, 0755)) {
if (--$retry <= 0) { &error('LOCK','LOCK is BUSY'); }
sleep(1);
}
$sys_lockflag=1;
}

ニフティで設置してる人いたからできるとは思うんだけども誰か助けて(;;)。。。
0314デフォルトの名無しさん2008/02/06(水) 01:18:29
鼬害です
0315デフォルトの名無しさん2008/02/06(水) 03:27:35
>>1 の冒頭くらい読んでね。
ここはプログラムの板でってCGIの板じゃないよ。はい移動。
http://pc11.2ch.net/test/read.cgi/php/1176143582/
0316デフォルトの名無しさん2008/02/06(水) 16:20:24
Perlって数ヶ月書かないだけでかなり忘れるんだけど、
おまいらPerlは毎日のように書いてるの?
俺のような記憶力弱いやつはPythonに替えるべき?
0317デフォルトの名無しさん2008/02/06(水) 16:22:52
$str =~ tr/a-z/A-Z/g;

として小文字を大文字に変換しようとしてますが、

Bareword found where operator expected〜

とか言ってエラーになります。
何度ググってもこれであってるぽいんですが…。わけがわかりません助けて。
0318デフォルトの名無しさん2008/02/06(水) 16:26:31
その前後が問題なんじゃないの?
0319デフォルトの名無しさん2008/02/06(水) 16:29:44
>>317自己レス
gをなくしたら通りました。g使えないの?
ぐぐってでてきた複数の例で使われてるんだけど。
試したVerは5.8.2と5.8.8。
0320デフォルトの名無しさん2008/02/06(水) 16:31:36
tr///はcdsだけみたいね
0321デフォルトの名無しさん2008/02/06(水) 17:01:29
uc($str);
0322デフォルトの名無しさん2008/02/06(水) 17:26:53
>>316
そんな毎日やるわけないけど
忘れたらリファレンスのページとか参考にすりゃいんじゃないの?

>>319
gはm s // だけのはず。
tr y は>>320
似てるけど一応動作は別もんだからね。
0323デフォルトの名無しさん2008/02/06(水) 18:47:07
>>316
Pythonでも、クラスのメソッドとか多くて覚えられないけどね。
ただ、Pythonに乗り換えたらPerlには戻れないと思う。
0324デフォルトの名無しさん2008/02/06(水) 20:38:28
>>316
使うときはWebサイトか昔書いたソースを見ながらやってる
0325デフォルトの名無しさん2008/02/06(水) 22:47:26
>>316
毎日とは言わないが、けっこう頻繁に使ってるな。
1回しか使わないような使い捨てスクリプトは perl で書いてる。
何度も使うのはCやjavaやVBやVBScriptや・・・・
perl って便利ですよ。
バッチファイルみたいに手軽にかけて、バッチファイルよりも遥に高度な処理ができるからね。

perl が嫌われてる理由を俺なりに考えてみた。
・漢字(ShiftJIS)に対応していない
・サーバアプリに向かない(CGI は負荷が重い)
・ソース丸見えだから業務アプリに向かない(納品できない)

でも使いようによっては超強力だよ。
0326デフォルトの名無しさん2008/02/06(水) 22:56:53
perlって嫌われてるのか?
ところでperlで自分で書いたものって一月も前に書いたものは修正したくてならなくなるんだがwww
0327デフォルトの名無しさん2008/02/06(水) 22:58:19
> 漢字(ShiftJIS)に対応していない
Encode.pmがあるじゃない
> サーバアプリに向かない(CGI は負荷が重い)
Hatena, Mixi, その他探せば色々あると思うんだけど

Perlが糞な理由はOOPやリファレンス回りの小汚い記法と
省略の美学(笑)によって解読不能なコードが書けるからだろう

きちんと書けば(『Perlベストプラクティス』みたいに)大分ましだが
Perlの特長を削いでる感じがするね
0328デフォルトの名無しさん2008/02/07(木) 00:21:34
>>325
>ソース丸見えだから業務アプリに向かない
暗号化する仕組みがあるよ。
0329デフォルトの名無しさん2008/02/07(木) 00:33:04
個人で使うならRubyかPythonのほうが幸せになれる?
0330デフォルトの名無しさん2008/02/07(木) 00:46:13
>>329
個人で使うだけなら、迷わずPerl。

まぁ、好き好きだけどね。
0331デフォルトの名無しさん2008/02/07(木) 00:57:31
理由はユーザーが多いから?年期の入った言語ゆえにソースが転がってるから??
後発の言語のほうが練られてそうなんですが。
初学者なんでこのままマスターしようか乗り換えようか迷ってるのですわ。
■ このスレッドは過去ログ倉庫に格納されています