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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
"The duct tape of the Internet" こと、Perl についての質問箱です。
"There's more than one way to do it" ということで、
Perl の奥深さについて皆で語り合い、追求してまいりましょう。

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

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

http://www.perl.org/get.html
● 2009/05/30 現在の最新版: 5.10.0

▼ 前スレ
Perlについての質問箱 39箱目
http://pc12.2ch.net/test/read.cgi/tech/1234181856/

リンク集は >>2-3
Perl 日本語処理の基礎の基礎 >>4
過去スレは >>5-6 あたり
2デフォルトの名無しさん:2009/05/30(土) 06:14:51
[プログラミング自体の経験が無い奴はまずココを読め]
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://www.ascii.co.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://search.cpan.org/dist/perl/
perl5.8.x のドキュメント(一部): ttp://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: ttp://www.kt.rim.or.jp/~kbk/perl5.005/
日本語ドキュメント検索: ttp://www.cpan.jp/search.cgi (停止中)
perldoc.jp: ttp://www.perldoc.jp/
perldoc.com: ttp://www.perldoc.com/
3デフォルトの名無しさん:2009/05/30(土) 06:14:58
4デフォルトの名無しさん:2009/05/30(土) 06:15:03
# [Perl 日本語処理の基礎の基礎]
# このレスは、Windows の ActivePerl で日本語処理を行う場合のテンプレートです。
# このレスの内容をそのまま、UTF8 形式のソースファイルに保存して下さい。
# 入出力ともシフト JIS 形式のファイルまたは DOS 窓を想定しています。
# まず、以下の行を先頭に入れて下さい。
use utf8;
use open IO => ":encoding(cp932)";
binmode STDIN => ":encoding(cp932)";
binmode STDOUT => ":encoding(cp932)";
binmode STDERR => ":encoding(cp932)"; # ※1
use Encode;
# 次に、あなたが実行したい処理の内容を入れて下さい。
$file = 'C:/なんたら/かんたら.txt';
open my $fh, '<', encode("cp932", $file) or die $! ; # ※2
print <$fh>;
# 以上の内容は、日本語処理が解らない人でも、とりあえず日本語処理ができてしまう
# おまじないです。条件が異なる場合の対処方法は、ご自分で勉強して下さい。
# 【注】※1. の行を入れると、DOS 窓への日本語出力は簡便になりますが、
# ソースファイル名に非 ANSI 文字が含まれる場合に die 文の出力が失敗します。
# ※2. OS に渡す文字列(ファイル名,dos コマンドのオプションなど)は、
# この例のように cp932 でエンコードする必要があります。
5デフォルトの名無しさん:2009/05/30(土) 06:15:11
6デフォルトの名無しさん:2009/05/30(土) 06:15:14
7デフォルトの名無しさん:2009/05/30(土) 09:10:02
おちんちんかゆい
8デフォルトの名無しさん:2009/05/30(土) 12:58:12
perlって変数は必ずmyつけたレキシカル変数にするのがセオリーなんですか?
9デフォルトの名無しさん:2009/05/30(土) 13:19:55
>>8
「セオリー」の使い方が間違ってるような木が駿河・・・

use strict を宣言すると、変数を my で宣言することを強制される。

スクリプト言語系にありがちな
変数名の単純なタイプミスを事前に防げるわけだ。
必須ではないが、長いスクリプトを書くなら use strict と my は使用した方がいい。
短いスクリプトならどうでもいいいよ。
10デフォルトの名無しさん:2009/05/30(土) 13:21:21
VB の
Option Explicit
みたいなもん
11デフォルトの名無しさん:2009/05/30(土) 14:12:12
短いものならourとか使う必要もないだろうし
12デフォルトの名無しさん:2009/05/31(日) 04:50:06
みんな our って使ってるの?
なんか $::abc って書いてしまう。

明確な理由はあるけど長くなるから書かない。
13デフォルトの名無しさん:2009/05/31(日) 06:08:26
$::abcだとmod_perlの時に困る
14デフォルトの名無しさん:2009/06/02(火) 04:25:48
処理体系にかかわらずPerl内部のtime_t型をlong long intで扱うことは可能ですか?
15デフォルトの名無しさん:2009/06/02(火) 11:11:02
splitで分割したときの挙動でよく分らないのですが

-----------------------
my @a = split(',', ',,,');
print scalar(@a), "\n"; # 「0」と表示される。

-----------------------
my @b = split(',', 'a,,,a');
print scalar(@b), "\n"; # 「4」と表示される。

-----------------------
最初に書いた split(',', ',,,')でなぜ空の配列が返ってくるのが
よく理解できません。

split(',', 'a,,,a'); で4つ返ってくるなら、',,,'なら3つか4つ
返って来そうな感じがするのですが、教えて頂けないでしょうか。
16デフォルトの名無しさん:2009/06/02(火) 11:36:55
>>15
split [pattern [, expr [, limit] ] ]
でlimitを省略すると、最後の空フィールドは返されない。
split(',', ',,,')は全て空フィールドだから空のリストが返ってくるのだと思われる。
17デフォルトの名無しさん:2009/06/02(火) 14:46:37
splitの第一引数がパターンというのは慣れるまで違和感あるな
そっちの方が便利なのは判ってるけど、
普通は区切り文字が決まってるから、
わざわざ遅くなりそうな正規表現で書くのに抵抗がある
18デフォルトの名無しさん:2009/06/02(火) 18:33:33
言語云々以前の問題なんですが
さっきインストールファイルをダウンロードしたんですけど
実行しようとすると
"インストールパッケージを開くことができませんでした。アプリケーションベンダに問い合わせ、
このパッケージが有効なWindowsインストーラパッケージであることを確認してください。"
が出て先に進めないんですけどどうしたらいいんですか?教えてください。
19デフォルトの名無しさん:2009/06/02(火) 18:51:30
壊れてるんじゃね
MD5チェックサムとかあれば試してみれば?

まあブラウザのキャッシュ消してからDLし直せばいけると思うけど。
20デフォルトの名無しさん:2009/06/02(火) 20:18:14
>>19
perlのバージョンを落としたら 5-10-0 1004 (?)から 5-10-0 1005
に変えて実行したらできました
なんだったんでしょうか・・・
21sage:2009/06/02(火) 20:19:04
すいません20ですが
1005から1004でした
1レス無駄にしてすいませんでした。
22デフォルトの名無しさん:2009/06/02(火) 22:33:52
>>20
ダウンロードの時にファイルが壊れたんだろ。
23デフォルトの名無しさん:2009/06/03(水) 00:26:58
>>16
ありがとう御座います。
最後の空フィールドは返されないって仕様なんですね。
24デフォルトの名無しさん:2009/06/03(水) 02:19:01
my @member = qw/あ い う え お/;
print $member[0],"\n";
print $member[4],"\n";

これを実行したんですが、
結果が




と表示されるはずが

あ い う え お

と表示されるんですがなぜなんですか?
25デフォルトの名無しさん:2009/06/03(水) 02:22:42
デバッグすればわかる
26デフォルトの名無しさん:2009/06/03(水) 02:34:56
2chからスクリプトをコピペしたら謎のエラーで動かなくて、
ちょうどそれが漢字の取り扱いで困ってた時だから、
インデントの全角スペースがエラーだと言われてるのに暫く気付かなかったことがある
27デフォルトの名無しさん:2009/06/03(水) 06:54:49
>>24
「あ」と「い」の間が全角スペースになってるだろ。
>>26
俺は全角スペースは下線が出るようにエディタの設定をいじってる。
0とOも0に斜線がつくなどマ向けのフォントを使用。
28デフォルトの名無しさん:2009/06/03(水) 11:46:45
全角スペースは薄く四角で表示するようにしてたけど、
うざいから止めたな
.plの時だけ設定しとこう
29デフォルトの名無しさん:2009/06/03(水) 12:21:21
use LWP::Simple;
use threads;
for(1..10){
push @A,threads->new(sub{get"http://www.2ch.net/"})
}
for(@A){$_->join}

このコードのどこが間違ってるんでしょう?
30デフォルトの名無しさん:2009/06/03(水) 12:51:22
間違ってなくない?
31デフォルトの名無しさん:2009/06/03(水) 12:55:42
pushの最後にセミコロン忘れてるとか?
32デフォルトの名無しさん:2009/06/03(水) 12:59:26
>>31
おい・・・
33デフォルトの名無しさん:2009/06/03(水) 13:08:47
DDoSの試みなんじゃねえの。
3429:2009/06/03(水) 13:12:55
前スレでレスしようとしたら規制食らっちゃってできなかったんだけど
29のコードをcygwinの上で実行するとsegmentation faultが発生します。
cygwinの上でのPerlではスレッドは使っちゃいけないということにして
おいた方がいいのかな?めんどくさいけどC#ならこんなことはないので
35デフォルトの名無しさん:2009/06/03(水) 23:10:22
うだうだ書いてる暇があったら、実行環境をかけよ。
女か?
36デフォルトの名無しさん:2009/06/04(木) 00:07:32
前に threads で遊んでたとき、初めは29みたいな書き方してたけど何か不具合が出て
threads::joinable なものだけ join() するように書き換えた記憶がある。
不具合の詳細は忘れた。

ていうか、use Socket で直接投げるよりはウェイトかかるけど、撃つな。
37デフォルトの名無しさん:2009/06/04(木) 03:45:10
たまに思うのだが、
最後はセミコロン無しでもいいよ、って仕様になんか意味があるんだろうか。

ワンライナー?
38デフォルトの名無しさん:2009/06/04(木) 04:01:53
区切りなんだから、無いのが正解
pascalとかは、余分なセミコロンはエラーになる
39デフォルトの名無しさん:2009/06/04(木) 05:43:50
セミコロン区切りのCSVで、行末にセミコロンが無いのと同じ
40デフォルトの名無しさん:2009/06/04(木) 06:14:32
>>37
Larry Wallは、
for(1..10){print}
みたいな書き方ができるから、とも言ってた。
41デフォルトの名無しさん:2009/06/04(木) 06:16:46
逆に、
$a = {
 'abc' => cde,
 'fgh' => ijk,
 'lmn' => opq,
};
の余計なカンマは(Larry Wallが個人的に)推奨している。
4237:2009/06/04(木) 07:26:48
なるほどなあ。

>41
それが出来ない文法って、軽くイラッ☆と来るよな。
昔のCのenumとか。
4329:2009/06/04(木) 11:18:53
ActivePerlでやったらなんの問題もなかったです
パスの扱いだけは注意が必要ですが
Windowsでは今度からなるべくこっち使うことにします
44デフォルトの名無しさん:2009/06/04(木) 17:34:13
コンマが余計でもokなのって多数派?
45デフォルトの名無しさん:2009/06/04(木) 17:47:59
多数かどうかは知らんが、嬉しい配慮ではあるな。
46デフォルトの名無しさん:2009/06/04(木) 19:22:20
>>44
コンマは余らせない方針の人って見たことないよ。
47デフォルトの名無しさん:2009/06/05(金) 01:36:59
Perlのコミュニティってなんかこあい><
知識の少ない学生がおいそれと入っていっても歓迎される…少なくとも冷遇されないもんなんでしょうか

共有されてる情報は欲しいんだけど一歩を踏み出せないです
48デフォルトの名無しさん:2009/06/05(金) 02:14:00
言語仕様だけ見ても、上手い書き方がピンと来ないケースが多いんだよな
試行錯誤した末に、最適の書き方が出来るように最初から作られてることに気付く
Cとかの固い言語では有り得ない
49デフォルトの名無しさん:2009/06/05(金) 02:23:05
cのパーサはコンパイラの授業を取った学生なら作れなきゃ不可だけど、
perlのパーサは無理だよね。
50デフォルトの名無しさん:2009/06/05(金) 08:19:06
>>48
Cはコンパイラに都合のいいようにできてるから。
Perlは書く人主体で設計されており、本来コンパイラには不要な冗長性も
沢山含まれてるから当然と言えば当然。
51デフォルトの名無しさん:2009/06/05(金) 09:49:29
prel の祖先は ed などのテキストエディタだからな。
ed に sh が合体したみたいなもん。
進化の系譜を書くとすると、こうなる。

ed --> sed --> awk --> perl
   sh ------------+
52デフォルトの名無しさん:2009/06/05(金) 15:26:21
>>51
ちょっとその図には賛同しかねる。そんな単純な話じゃないと思うが。
53デフォルトの名無しさん:2009/06/05(金) 16:33:35
じゃぁ、おまいが図を示せ。待ってるぞ。逃げるなよ。
54デフォルトの名無しさん:2009/06/05(金) 16:40:50
こんなところであっさり示せたら「単純な話じゃない」という意見が嘘になるのでは。
55デフォルトの名無しさん:2009/06/05(金) 17:05:59
sed --> awkはまちがい
56デフォルトの名無しさん:2009/06/05(金) 18:16:23
こまけぇこ(ry
57デフォルトの名無しさん:2009/06/06(土) 01:47:23
パーツを教えてやるよ。あとは自分で考えな。
sed C awk sh -->
58デフォルトの名無しさん:2009/06/06(土) 03:20:39
sed --+--> perl --> php
C  --+
awk --+
sh  --+

簡単簡単
59デフォルトの名無しさん:2009/06/06(土) 03:58:27
おまえら全然ちげーよ
これくらい常識で考えたら素人だってわかんだろーが
金 --> 銀 --> perl -->プレゼント
こうだよ!
60デフォルトの名無しさん:2009/06/06(土) 07:28:53
perlの鬼があらわれた!
61デフォルトの名無しさん:2009/06/06(土) 16:37:00
えーと、桃太郎伝説?
62デフォルトの名無しさん:2009/06/06(土) 18:13:19
おまいら、よっぽどやることないんだな。
63デフォルトの名無しさん:2009/06/06(土) 18:51:03
if ($a == 1) {$a = 0}
は、どうして
if $a == 1 {$a = 0}
と書けないんだろう
紛れないと思うんだが
64デフォルトの名無しさん:2009/06/06(土) 18:56:59
$a = 0 if $a == 1;
65デフォルトの名無しさん:2009/06/06(土) 19:02:26
{$a = 0; $b = 0} if $a == 1;
はできないけどな
66デフォルトの名無しさん:2009/06/06(土) 20:33:09
>>63
if $a == $b{$a = 0}
は紛らわしくない?
67デフォルトの名無しさん:2009/06/06(土) 21:19:22
$a=$a==1?0:$a;
68デフォルトの名無しさん:2009/06/06(土) 21:55:37
$a == 1 && $a = 0;
69デフォルトの名無しさん:2009/06/06(土) 22:15:38
指定したディレクトリにあるファイル、ディレクトリを全部他のディレクトリへ移動しようと思っています
また、移動先にファイル、ディレクトリがあったばあいは再帰的にマージしたいです現在はlinuxのmvコマンドを呼んでなんとかしてるんですが、
指定したディレクトリの最後が同一でない場合なんかに対応してないし、マージ機能を持ってないし、持ち悪い処理がいっぱいあってダメダメな感じです
こういうディレクトリの処理を簡単にできるモジュールはありますか?
70デフォルトの名無しさん:2009/06/06(土) 23:00:53
>>63
ツッコミ所は色々あるが、たとえば、

if sub {$a = 0};

っていうことされたら困るだろ。subと{}は結合力が最も強い「項」であるので先に結合してしまう。
従って無名関数への参照が条件とコンパイラが解釈してしまう(んで構文エラー)。

loop_or_condition(xxx){yyy}の()と{}はセット。
71デフォルトの名無しさん:2009/06/06(土) 23:07:26
>>70
通るが。
perl -e "print 'ok' if sub { $v = 1 }; print qq/\n/"
72 ◆TWARamEjuA :2009/06/06(土) 23:38:05 BE:2613964-BRZ(10072)
>>71
そりゃ通るでそ。。。
$ perl -e 'if sub {$a = 0}'
syntax error at -e line 1, near "if sub "
Execution of -e aborted due to compilation errors.
73デフォルトの名無しさん:2009/06/06(土) 23:53:02
>>71
話読んでた?それは通るよ。 >>70で言う所のyyy loop_or_condition xxx構文じゃんかそれ。
74デフォルトの名無しさん:2009/06/07(日) 00:12:44
>>70
いまいち理解できんけどそれじゃ

if(sub){$a = 0}

って文になるんじゃね?
sub のところに任意の関数をいれるってなら話は分かるが無名関数のくだりがようわからん
75デフォルトの名無しさん:2009/06/07(日) 00:19:16
( )を必須にするんじゃなくて、
紛れない限りは通すのがperlらしい気がする
76デフォルトの名無しさん:2009/06/07(日) 00:32:20
>>74
確かに。式中のsubは{...}が必須っぽいから
if sub {...} はエラーで当然だし、通すには if sub {...} {...} って書けばいいだけ

まぁ、これとは別に、ifに括弧を必須としている曖昧な構文が存在することは間違いないだろうけど
77デフォルトの名無しさん:2009/06/07(日) 06:22:44
>>74
Perlの文法には「優先順位」ってのがあってだな。
「項」の結合は何よりも優先されることになっているのよ。
これはPerlの一貫した言語仕様。だから、

if sub {$a = 0}

は、残念ながらif (sub {$a = 0})と解釈されることになる。
Perlはそういうものなので、変な例外があると余計ユーザが混乱する。
これを覆したいなら自分で新しく言語作ってそこでやって下さい。

>>75
>>70に紛れるケースを示したが?

>>76
> まぁ、これとは別に、ifに括弧を必須としている曖昧な構文が存在することは間違いないだろうけど
詳しく。
78 ◆TWARamEjuA :2009/06/07(日) 09:03:53
79デフォルトの名無しさん:2009/06/07(日) 12:10:20
>>77
いや、そういうことじゃなくて

if sub {$a = 1}

が意図してることが

if(sub){$a = 1}

となるんじゃないかと思った
それだったら普通に最初から通らんよね?
それで、例えば
foreach(@hoge){
if rmtree {$a = '/'}
}

なら言ってることが理解できるって話
80デフォルトの名無しさん:2009/06/07(日) 12:43:09
んで結局何の話だったんだっけ
81デフォルトの名無しさん:2009/06/07(日) 14:09:47
次のバージョンで括弧なくてもいいことにしても、互換性は失われないよな
82デフォルトの名無しさん:2009/06/07(日) 15:36:22
Perl では未だ、bareword が非推奨ながら、しかしデフォルトで許されています。
従って、

if bareword { ... };

などとした時、名前空間に bareword() が存在すると、見た目の曖昧さを生じます。

# 個人的に Perl に限れば括弧が必須でなくなっても書いてしまう気はします。
83デフォルトの名無しさん:2009/06/07(日) 15:59:06
>>82
いや、それ議論からずれてる。
84デフォルトの名無しさん:2009/06/07(日) 17:59:41
今やってるプロジェクト、

 KENTを彷彿とさせる、Perl4なコード
 いかにもPerlって感じの、省略の美学バリバリのコード
 Cライクなコード
 オブジェクト指向っぽいコード

が混在している……。もうやだ……。
85デフォルトの名無しさん:2009/06/07(日) 18:51:54
そんなもん屁の河童にこなしてこそPerl Wizard
86デフォルトの名無しさん:2009/06/07(日) 21:34:42
>>85
Perl歴15年、同意です。
87デフォルトの名無しさん:2009/06/07(日) 22:15:58
Perlなんて大キライ!
仕事だから、仕方なくやってるだけなんだからね!
88デフォルトの名無しさん:2009/06/08(月) 01:55:34
自分で作る
という方向性だと、簡単な方がいいし、
他人に作らせる
だと、オブジェクト指向バリバリになる

まあ、オブジェクト指向だからといって、
タイプ数を増やさなければならないという法は無いのだが
89デフォルトの名無しさん:2009/06/08(月) 17:26:46
可読性を取るのか効率を求めるか
今後このコードはどうゆう使われ方、扱われ方をされるのか・・・

ざっくり言えばニーズにマッチしたモノを作れるようになりたい

ってかこれって様々な言語、いや職種にすら限らない仕事一般の話だな
90デフォルトの名無しさん:2009/06/08(月) 19:36:47
ディレクトリを取得する際、
$cur_dir = Cwd=getcwd() . "\\";

で取得しているのですが、ディレクトリ名に"("が含まれていると
それ以降の文字列が取得できなくなってしまうのですが、
対処法はありますでしょうか?
9190:2009/06/08(月) 19:58:53
しまった文がぜんぜん足りてない・・・

>>90はその変数に格納された内容にバッチファイルのアドレスを足して
system($bat_pass);
みたいな形で使用しています。
(までしか認識さず、実行できない状態になっております。
92デフォルトの名無しさん:2009/06/08(月) 20:17:16
ん?
use Cwd;
print $0, "\n", getcwd(), "\\\n";

C:\test(1)\test.pl
C:/test(1)\
93デフォルトの名無しさん:2009/06/08(月) 20:41:23
文字列の連結の演算子 '.' を誰も使わない
94デフォルトの名無しさん:2009/06/08(月) 20:46:54
>>89
迷った時は保守性の高いほう。
性能とのトレードオフが生じる時(いまどきそんなに多くない)はベンチマークで測定して、看過できないボトルネックが解消できると分かった場合にのみコメントの上チューニング。
大抵は迷っているので大抵は保守性の高いほうを選ぶ。
そうしない部分のほうを特例扱いにしてコメント及びドキュメントで注意喚起しておく。
経験上それが最も安く付く。
経験上そうもいかないことも多いが。
95デフォルトの名無しさん:2009/06/08(月) 20:49:31
>>93
アレには若干のオーバーヘッドがあるのです。
本当に連結してひとつの文字列に変化させたい場合には使います。
96デフォルトの名無しさん:2009/06/08(月) 21:35:25
>>94
スクリプトの使用期間が1ヶ月で、特急の受注でも同じ書き方するか?
規模にもよるが、俺だったら少々スパゲティでもいいから納期優先するな。
1ヶ月の間だけなら多少のスパゲティの内容の把握くらいできる。
97デフォルトの名無しさん:2009/06/08(月) 22:27:31
すいませんperl初心者です。
ある二つのテキストファイルがあって、
ファイルAは名前と住所
田中東京
佐藤千葉
鈴木埼玉
のようにあって、
もうファイルBは
田中
鈴木
など名前だけがあります。

ファイルAから、ファイルBに名前がある人の所(上の礼では「田中東京」)などと
とりだしたいのですが・・・どのようにしたらよいでしょうか・・・。
マッチングやgrepを考えたのですがうまくいかないので。
実際は生物の遺伝子名で膨大なのでPerlなどプログラムを書かなければならないのですが・・・・
98デフォルトの名無しさん:2009/06/08(月) 23:04:43
>>97

ファイルBから1行読んで
あとはファイルAを1行づつ読んではファイルBから読んだ1行と先頭一致するかどうかだけでは?
99デフォルトの名無しさん:2009/06/08(月) 23:40:20
それAはともかくBも膨大だったらちょっと苦しくないか?
100デフォルトの名無しさん:2009/06/08(月) 23:54:54
>>97
何がどう「うまくいかなかった」のか書かないと返事のしようがないな。
とりあえず自分が書いたコードをさらせ。
101デフォルトの名無しさん:2009/06/09(火) 00:23:10
>>97
田中と東京に区切り文字はないの?
あれば区切ってデータベースにでも突っ込んで少しずつ検索すればいいんじゃね?
102デフォルトの名無しさん:2009/06/09(火) 01:08:19
情報少なすぎ
マッチングやらgrepとか言っといて初心者だとか
どうやったらうまくいかなかったのかとか
取り扱いデータは改変されてるし

聞きたいならネタ隠すなよな・・・
103デフォルトの名無しさん:2009/06/09(火) 02:09:50
>>97
ちなみに、

> 実際は生物の遺伝子名で膨大なのでPerlなどプログラムを書かなければならないのですが・・・・

こういう用途は古くからPerlが多用されていた分野だから、十分なライブラリと
ノウハウの蓄積があるぞ。
104デフォルトの名無しさん:2009/06/09(火) 08:28:37
DB入れれば一番簡単
105デフォルトの名無しさん:2009/06/09(火) 10:28:42
>>96
そもそも普通に書いてスパゲティになるのはおかしいw

たしかに書いてくるコードがことごとくスパゲティの奴って
いるんだが、どうしてできるのか不思議でしょうがないよ。
素直に書く方が圧倒的に楽だろ?
106デフォルトの名無しさん:2009/06/09(火) 11:04:49
素直厨w
107デフォルトの名無しさん:2009/06/09(火) 12:14:52
Encodeモジュールの質問です。
shiftjisで書かれたファイルから文字列を読み込んで、utf8でdecodeした場合、文字列の内容は復旧できないのでしょうか?
utf8でencodeしても元の文字列には戻らなくて困っています。
サンプルです。test.txtはshiftjisで書かれています。

use Encode;
open IN, "test.txt";
my $str = <IN>;
print $str;
my $miss = decode 'utf8', $str;
my $recover = encode 'shiftjis', $miss;
print $recover ;

コマンドプロンプトで実行しても元に戻りません。
108デフォルトの名無しさん:2009/06/09(火) 12:27:58
shift-jisのファイルをutf8でdecodeしてまともになると思うほうがどうかしている。
109デフォルトの名無しさん:2009/06/09(火) 12:52:06
テンプレ読めよアホウ。
110デフォルトの名無しさん:2009/06/09(火) 12:56:37
>>108
アホ
111デフォルトの名無しさん:2009/06/09(火) 14:44:32
use lib "lib";
use App::Config;
で、自作のpmを使いたいんだけど上手く読めない…。
Configにsub testって関数があって
print test(); ってやると

Undefined subroutine &main::test called at index.cgi line 11.

ってなる。
App::Config::test();ならちゃんと動く。
ちゃんとuse App::Config;って書いたのになんでエラーが出るんですか?
分かる方たすけてください!!

112デフォルトの名無しさん:2009/06/09(火) 15:11:35
>>111
うまくエクスポートされていないだけだろ。
113デフォルトの名無しさん:2009/06/09(火) 15:16:18
>>112
どおいうことですか?
是非詳しく教えてください!
114デフォルトの名無しさん:2009/06/09(火) 15:18:01
>>111
Exporter 使ってる?
つかってるならlib 以下のディレクトリとパッケージ名がマッチしてない予感
115デフォルトの名無しさん:2009/06/09(火) 15:26:02
>>114
つかってないです。
116デフォルトの名無しさん:2009/06/09(火) 15:27:08
WindowsXP Pro
BlackJumboDog
ActivePerl 5.10.0 Build 1005
の環境で行ってます。
117デフォルトの名無しさん:2009/06/09(火) 15:32:37
packageの後にExporterでシンボルをエクスポートする必要がある。
Exporterのマニュアル見れ。
118デフォルトの名無しさん:2009/06/09(火) 15:55:04
>>117
えええ、いままでこんなことしてなかったのに…
ありがとうございます。
全てのサブルーチンをエクスポートするとした場合には
@EXPORT = qw(sub1 sub2 sub3 ...);って永遠に書かなきゃダメですか?
それと、use constantで定義した定数とかもuse Config;したところで
使えるようにしたいのですが、そういった場合はどうすればいいですか?
require使ったほうが早いですかね?
119デフォルトの名無しさん:2009/06/09(火) 16:02:36
気のせいでした…
今までApp::Config::test();ってアクセスしてました(汗。
とっても勉強になりました!ありがとうございました!
120デフォルトの名無しさん:2009/06/09(火) 16:13:08
>>118
> 全てのサブルーチンをエクスポートするとした場合には
そんな変なことをしたいのだったら、そもそもpackageするなよ。
121デフォルトの名無しさん:2009/06/09(火) 16:37:47
どうしてもやりたければ

our @EXPORT = grep {defined &{$_}} keys %Hoge::;

とでもしとけばいいんでね? 勧めないが。
122デフォルトの名無しさん:2009/06/09(火) 20:15:39
>>47
PHPのほうがいいよ
123デフォルトの名無しさん:2009/06/09(火) 21:40:55
>>122
彼にPHPを勧める理由がわからん
124デフォルトの名無しさん:2009/06/09(火) 22:01:39
>>47
Pythonのほうがいいよ
125デフォルトの名無しさん:2009/06/10(水) 06:56:38
PHPコミュニティの方が厨房が多い。
Perlコミュニティはオッサンばっかりだ。
Rubyコミュニティは若いがなんかキモイ。
126デフォルトの名無しさん:2009/06/10(水) 12:42:05
html::template 2.9の使い方が書いてある日本語サイトとかないですか?
127デフォルトの名無しさん:2009/06/10(水) 13:57:08
新しいモジュールを使う度に解説を探すけど、
日本語でまともなのが見つかった試しがない
128デフォルトの名無しさん:2009/06/10(水) 14:29:27
古い版の日本語マニュアルを見つつ、適当に差分を探すのがいいんじゃない?
129デフォルトの名無しさん:2009/06/10(水) 14:32:53
解説かけるぐらいの人になると英語マニュアルで足りるので
よっぽどのモチベーションがないと日本語の解説って作られない
気がする。
130デフォルトの名無しさん:2009/06/10(水) 15:13:17
ドキュメントの翻訳は、きちんと制度化しておかないと、元の更新に追従するのが
困難という法則。



131デフォルトの名無しさん:2009/06/10(水) 17:10:15
簡単な部分は英語でも簡単に読めるし、
ニュアンスが微妙な部分は訳さずに原語を残した方がいい

結局、訳す意味がない
132 ◆TWARamEjuA :2009/06/10(水) 18:07:04 BE:2940293-BRZ(10072)
実際に動かしてみてから英文マニュアルやチュートリアルを眺めてみると、Jojoに英文が解せるようになってくるかと。
133デフォルトの名無しさん:2009/06/10(水) 18:18:15
古ぼけた翻訳があることは、翻訳がないことより悪い。
134デフォルトの名無しさん:2009/06/10(水) 18:18:57
つかよドキュメント文章、そんな難しくない多い。
でもよたくさん読む日本語速い
135デフォルトの名無しさん:2009/06/10(水) 21:10:38
優秀サンプルあればドキュメント要らない
136デフォルトの名無しさん:2009/06/10(水) 22:10:54
それはそうだね
cpanのドキュメントとかも、サンプルコードがあれば、ほぼ目的は達成できるしな
137デフォルトの名無しさん:2009/06/10(水) 22:18:26
簡単な英文なら頑張れば読めるけど、検索とかが自分には難しいッス…
138デフォルトの名無しさん:2009/06/11(木) 00:07:42
googleが記号を無視してくれるせいで、
特定の使い方について調べように見つからない
139デフォルトの名無しさん:2009/06/11(木) 00:47:39
優秀なマニュアルは英語も簡単
この英文難しいなって感じたらそれはマニュアル書いた奴が説明下手ってことにしてる
140デフォルトの名無しさん:2009/06/11(木) 01:09:55
>>138
Perlの調べ物はググる前にperldoc
ドキュメントのどこに書いてるかも分からないなら目次から見当つければいい
http://search.cpan.org/dist/perl-5.10.0/pod/perltoc.pod
http://search.cpan.org/dist/perl-5.10.0/pod/perl.pod
141デフォルトの名無しさん:2009/06/11(木) 06:49:30
>>138
青らくだ買え
142デフォルトの名無しさん:2009/06/11(木) 17:21:13
書籍は買ったほうがいいよ〜
場合によっちゃ使い勝手はネットより良いw

Perlバリバリ使えるけど本なんか買ったことねーよって人いるかな?
おいらは駱駝とクックとエフェクティブくらいしか持ってない
143デフォルトの名無しさん:2009/06/11(木) 18:30:10
ラクダは買ったけど、ほとんど読んでないな
リャマは続と併せて結構読んだ

でも一番読んだのは、フクロウだな。
144デフォルトの名無しさん:2009/06/11(木) 20:57:58
フクロウっつーと正規表現だっけ?
145デフォルトの名無しさん:2009/06/11(木) 21:13:09
>>142
perldocより青らくだ買えとは言わないが、
「本はネットがあるからいらない」って人は考えを改めた方がいい。
本でしか手に入らないものもあるし、ネットだと不便な情報もある。
146デフォルトの名無しさん:2009/06/11(木) 21:26:33
本ってそんなに売れてないのか
147デフォルトの名無しさん:2009/06/11(木) 22:21:38
>>146
じゃあなんでAmazonがブイブイ言わせてるんだ?
こないだも村上春樹が速攻で100万部突破したそうじゃねーか。
148デフォルトの名無しさん:2009/06/11(木) 22:31:58
>>147
Amazonは本だけじゃないよ
村上春樹は、かなり異例。出版業はかなりやばいよ
149デフォルトの名無しさん:2009/06/11(木) 22:48:20
>>148
Amazonは元々本が出発点だ。手を広げただけ。
そりゃ媒体が増えたからある程度は仕方ない。
音楽産業の凋落よりはマシだろ。
150デフォルトの名無しさん:2009/06/11(木) 22:51:04
>>149
そんなの誰でも知ってるだろ。何得意げに語ってるの?
Amazonがブイブイ言わせてるのは、書籍の売り上げじゃないっていう話だろ?
151デフォルトの名無しさん:2009/06/11(木) 22:51:34
ブログを見ると、
「献本でもらった」「献本でもらった」「献本でもらった」
「献本でもらった」「献本でもらった」「献本でもらった」「献本でもらった」
「献本でもらった」「献本でもらった」「献本でもらった」
ばかりなので、本を買う気なくした。
152デフォルトの名無しさん:2009/06/11(木) 22:53:35
>>151
dan?
あれは仕方ない
153デフォルトの名無しさん:2009/06/11(木) 22:55:19
もっと悪い例を出してそれよりマシとか言い訳するようになったら、
あとは人生転落するだけ。
154デフォルトの名無しさん:2009/06/11(木) 23:07:44
つーか書籍の売上は落ちてるけど、1995年がピークだっただけで、
80年代に比べれば売上は今の方が大きい。
近視眼的な数値だけみてヤバイヤバイと騒ぐのは愚か。
155デフォルトの名無しさん:2009/06/11(木) 23:15:19
>>154
80年代と比べたら、出版数自体が大きく違う
つまり、売れないから一杯出すのスパイラルになってるんだよ
156デフォルトの名無しさん:2009/06/11(木) 23:16:07
ここへの質問にしても、その質問に答えをもらったとしても、
その後あんたどうすんの?と言いたくなるような質問が多い。

一冊本を通読した方がよっぽど近道だと思うんだが。
157デフォルトの名無しさん:2009/06/11(木) 23:30:05
>>152
いや、danに限らず、新しい本が出た前後、あるいは出る前に
その本について触れているブログを見ると、「献本でもらった」
ばかりという現象さ。
158デフォルトの名無しさん:2009/06/12(金) 00:26:04
基礎の本はネットで間に合うから買ったことない
Effective Perlは買った
あれはいい本だ
159デフォルトの名無しさん:2009/06/12(金) 05:58:35
>>155
昔はいっぱい出版しても置くとこがなかった=売れなかった。
今はロングテールがそれを下支えしてる。
それはどうでもいいとして、現在一定の売上が上がってる以上、
「本が売れてない」って話は違うだろ。

>>158
青らくだくらいは通読しといた方がいいと思うけどな。
perldoc通読する気にはならんだろ。
このスレには青らくだにちゃんと書いてあるような単純なことで騒ぐやつが多すぎる。
160デフォルトの名無しさん:2009/06/12(金) 08:07:45
>>159
お前さんは出版業界の人なのけ?

一般的にニュース等で言われてたり、実際に出版業倒産が相次いでたり
そういう事実を否定してまで、「売れてる」と主張する根拠は?
161デフォルトの名無しさん:2009/06/12(金) 08:47:46
>>146
うん、全然売れなくなったな。
コンピュータ関係の本は、もう終わりだと思う。
162デフォルトの名無しさん:2009/06/12(金) 11:52:28
.plはポーランドのドメインです
163デフォルトの名無しさん:2009/06/12(金) 18:18:44
http:// にはマッチしなくて
ttp:// にマッチするってどんな風に書けばいい?
164デフォルトの名無しさん:2009/06/12(金) 18:21:18
(?<!h)ttp://
165デフォルトの名無しさん:2009/06/12(金) 18:47:06
ちなみに新聞も売上げヤバイよ
166デフォルトの名無しさん:2009/06/12(金) 20:16:28
コンピュータ関係の書籍は、ずっと縮小を続けている分野だよ。
167デフォルトの名無しさん:2009/06/12(金) 20:21:31
小説もね。
東野圭吾とか、今回の村上春樹とか、一部の売れっ子作家以外が殆ど売れない。
そこそこ売れる作家 というのが昔に比べてとても減った。

昔に比べ、どんどん娯楽というかエンターテイメントの多様化が進んでるから仕方ない。
168デフォルトの名無しさん:2009/06/12(金) 22:59:13
なんのスレやねんここ
169デフォルトの名無しさん:2009/06/12(金) 23:14:48
まあ、「本なんていらね。webに全部書いてある」とか言う人間は、
どんな入門書にも答えが書いてあるような質問を
こんなとこでするな、ということだ。

答える方も時間の無駄だし、質問してわかった気になっても全然身につかない。
無駄の相乗。
170デフォルトの名無しさん:2009/06/12(金) 23:17:42
sub hoge{
 my $self = shift;
 my $func = shift;
 &{$func($self)}
}

こんな感じで変数に入ってるメソッド名を実行したいのですが、
継承ができる書き方を教えてください
171デフォルトの名無しさん:2009/06/12(金) 23:39:19
>>170
$self->$func();
…って事ではなく?
172デフォルトの名無しさん:2009/06/12(金) 23:56:30
>>171
いけました。ありがとうございます。

sub hoge{
 my $self = shift;
 my $Function = {};
 $Function->{'hoge'} = shift;
 no strict 'refs';
 #$self->{$Function->{'hoge'}};#ここがわからない
}

実際のコードだとこんな感じなんですが、
一時変数に代入したら{}とか気にせずにいけたんですね。

ちなみに、一時変数使わない場合の書き方とかあるんでしょうか?
後学のためにご存じでしたら教えて欲しいです。
173デフォルトの名無しさん:2009/06/13(土) 00:27:49
>>172
http://perldoc.jp/docs/perl/5.10.0/perlobj.pod
> 矢印の右側は典型的にはメソッド名ですが、メソッド名や
> サブルーチンリファレンスが入った単純スカラ変数も使えます。

あとperlrefとperlmodくらいは通読しとくといいよ
http://perldoc.jp/docs/perl/5.8.8/perlref.pod
http://perldoc.jp/docs/perl/5.10.0/perlmod.pod
174デフォルトの名無しさん:2009/06/13(土) 00:29:35
>>172
らくだ本を買おう!
175デフォルトの名無しさん:2009/06/13(土) 00:33:34
>>173
素敵なマニュアルまで紹介して頂いて重ね重ね感謝します
隅々まで全部読んできます
176デフォルトの名無しさん:2009/06/13(土) 01:19:50
はぁ・・・出版業界よろしくPerl界の凋落もここまできたか・・・

1にマニュアル
2にgoogle
3,4が無くて
5に2ch

だろーが!
177デフォルトの名無しさん:2009/06/13(土) 01:55:53
らくだ高いっつの
178デフォルトの名無しさん:2009/06/13(土) 02:07:30
勉強する代わりに本を集めまくる。
そういう強迫神経症的逃避法が存在する。

179デフォルトの名無しさん:2009/06/13(土) 02:36:22
5.6ベースで二分冊な第3版を今から買うくらいなら、
5.00xベースの改訂版(第2版)の古本でも買って、
新しい情報はperldocで追いかけた方がいいかもな
http://www.amazon.co.jp/gp/offer-listing/4900900486/

実際押さえるべき基本的な部分は5.00xの頃から大差無いし、
細かいところは第3版だと古いしね
180デフォルトの名無しさん:2009/06/13(土) 03:13:14
でも大半は既に知ってることのような
読んでないから実際にはウロコ落ちまくりかもしれないけど
181デフォルトの名無しさん:2009/06/13(土) 05:17:02
Perlのテキスト処理で質問があります。
個人のデータ(苗字、名前、性別、住所、部署等)が載ったテキストを処理し、
特定の苗字で、性別が男の場合はその人のデータをすべて削除し、
それ以外はすべて出力するといったようなコードはどう組めばよいのでしょうか?
例えば、
鈴木 一郎 男 東京都大田区〜、営業部
鈴木 花子 女 千葉県浦安市〜、総務部
といったデータが存在した場合、鈴木花子はテキストに残るが、
鈴木一郎に関する全データは削除される、という処理です。
他の苗字の人のデータは性別関係なくすべて出力されますが、鈴木という苗字で男性のデータはすべて削除します。

どなたかご教示よろしくお願いします。使用環境はUNIXです。
182デフォルトの名無しさん:2009/06/13(土) 05:58:14
>>181
Perlでリクに答えるスクリプトを作るスレ
http://pc12.2ch.net/test/read.cgi/tech/1086143976/
183デフォルトの名無しさん:2009/06/13(土) 05:59:59
>>182
ありがとうございます。
こちらに書いてみます。
184デフォルトの名無しさん:2009/06/13(土) 12:12:11
OpenOfficeのオートフィルタでいいんじゃね
185デフォルトの名無しさん:2009/06/13(土) 14:28:58
>>181
grep -v ' 男 ' data.txt > result.txt
186デフォルトの名無しさん:2009/06/13(土) 15:54:39
鈴木 花子 女 青森県男鹿市~、男性用出版物販売業
187デフォルトの名無しさん:2009/06/13(土) 21:32:13
残念だがその行はちゃんと残るよ。
188デフォルトの名無しさん:2009/06/13(土) 21:53:58
やるならこうだよな。

鈴木 男 女 東京都千代田区

膨大なデータ扱ってると何起こるか分かんないからな。
189デフォルトの名無しさん:2009/06/13(土) 23:59:32
それは理想的ではあるが現実的ではないという
190デフォルトの名無しさん:2009/06/14(日) 01:10:05
おかまは残りますか?
191デフォルトの名無しさん:2009/06/14(日) 08:38:53
ァからンまでの全部のカタカナのリストをsjisで作る時に、
@kana = ('ァ', 'ア', (中略), 'ン');
とやるのと同じことをもっと賢くやらせるにはどうすれば?
192デフォルトの名無しさん:2009/06/14(日) 10:30:17
>>191
sjisならこれでok
@kana = (map {pack "S" , $_} (0x8340 .. 0x8393) );
193デフォルトの名無しさん:2009/06/14(日) 11:00:28
んー、
print "@kana";
すると
@・A・B・C・D・E・F・G・H・I・J・K・L・M・N・O・P・Q・R・S・T・U・V・W・X・Y・Z
・[・\・]・^・_・`・a・b・c・d・e・f・g・h・i・j・k・l・m・n・o・p・q・r・s・t・
u・v・w・x・y・z・{・|・}・~・・・< c ャ с ・ ・ ・ 宴 潟 泣 激 鴻 祉 純
帥 巣 茶 塔
こんなんなるよ?
194デフォルトの名無しさん:2009/06/14(日) 11:15:26
んー、

$ perl | nkf -w
print (map {pack "S" , $_} (0x8340 .. 0x8393) );
@アィイゥウェエォオカガキギクグケゲコゴサザシジスズセ
ゼソゾタダチヂッツヅテデトド ナニヌネノハバパヒビピフブプヘベペホボポマミ$

先頭1バイトが欠けてる上に「ン」まで行ってないなこれ。ちょっと調べる暇ない。ごめん。
195デフォルトの名無しさん:2009/06/14(日) 11:33:24
これでどーだ
print join("\n", map {pack "n" , $_} (0x8340 .. 0x836f , 0x8380 .. 0x8393) );
196デフォルトの名無しさん:2009/06/14(日) 11:37:39
原因:
・使ってる環境がビッグエンディアンなのを考慮してなかった。
・カタカナに飛び地があるのを知らなかった。

ビッグエンディアンの問題は環境依存すると思うからよしなに。
197デフォルトの名無しさん:2009/06/14(日) 12:35:16
map {pack "n" , $_} (0x8340 .. 0x837e , 0x8380 .. 0x8393);
これでいけました
"n" かー。そういえば前にも使った。意味はよく判らない。
198デフォルトの名無しさん:2009/06/14(日) 13:00:49
utf8フラグが憎い
199デフォルトの名無しさん:2009/06/14(日) 13:38:26
じゃあ取れば良い。
200デフォルトの名無しさん:2009/06/15(月) 19:39:11
質問させていただきます。

HTML::Templateを使用しているのですが、TMPL_LOOPはハッシュしか扱えないのでしょうか?
配列を回したいのですが、方法がわかりません。

やりかたがあれば、方法を教えていただけると助かります。
201デフォルトの名無しさん:2009/06/15(月) 22:37:31
え? むしろハッシュって回せたっけ?
202デフォルトの名無しさん:2009/06/15(月) 23:52:42
甘いな
配列を使えばハッシュも回せるよ
203201:2009/06/16(火) 02:16:15
そんなマジレスされても…
204デフォルトの名無しさん:2009/06/16(火) 09:06:57
ハッシュの配列しかまわせないと言うのが正解。

[{ x => ..., y => ...}, { x=> ..., y => ... }, ...]

そして内側のハッシュのキーがTMPL_LOOPのループ内で
見える変数名になる。

ただの配列 @hoge = (1, 2, 3) みたいので回したければ
適当に変数名を決めてやってこれを

[ { x => 1 }, { x => 2}, { x => 3} ]

のように変換すればいいので、

[ map { { x => $_ } } @hoge }

とかでいいんでね。
205デフォルトの名無しさん:2009/06/16(火) 10:18:19
結局>200の意図は何だったのかしら? >204かねえ?

206デフォルトの名無しさん:2009/06/17(水) 13:03:19
>>120
なにをいっているのかよくわからなかったですけど
今理解できました!!packageしないとuseしなくてもuse lib "lib"してるから
勝手に読んでくれるのですね!?
ありがとうございました!!
207cmu04e234.cncm.ne.jp :2009/06/17(水) 13:24:25
Perlについて質問させていただきます

現在、Perlの勉強をしているのですが、ファイルを分割した際の処理がわかりません。
変数の定義を別ファイルにて行おうと考えているのですが、requireすると変数のスコープが呼び出し元まではいらないのか、うまくいきません。
変数を定義したファイルをrequireして実行してみると
Global symbol "$logfile" requires explicit package name at ./admin.cgi line 179.
このようなエラーが多量にでています。

変数定義はmyでもourでも行ってみました。
どうか助言頂ければと思います。
208デフォルトの名無しさん:2009/06/17(水) 13:46:05
>>207
裸のlogfileを使おうとしてるね。その場合は、

----------- test.pl ----------
use strict;
our $a;
require 'test2.pl';
print $a;
----------- test2.pl ---------
$a = 1;
1;

とすればスコープが届くようになる。ourはこうやって使う。
myはファイルをまたいでスコープを持つことはできない。
209デフォルトの名無しさん:2009/06/17(水) 13:54:18
>>207
変数定義ファイルをスクリプトじゃなくてモジュールにしてExporterを使う

------
210デフォルトの名無しさん:2009/06/17(水) 15:46:07
皆様ありがとうございます。

>>208様にご解説いただきましたとおり、ourを呼び出し元のファイルに設定することで
エラーを出ないようにすることはできたのですが、requireする側のファイルに
use strict;
をすると、変数宣言をしていないためエラーが出てしまいます。

これを解決する方法はありませんでしょうか?
211デフォルトの名無しさん:2009/06/17(水) 17:19:16
> use strict;
> をすると、変数宣言をしていないためエラーが出てしまいます。

質問が良く分からんのだが、以下のは動くぞ。

--------- test.pl ----------
use strict;
our $a;
require 'test2.pl';
print $a;
--------- test2.pl ---------
use strict;
$a = 1;
1;

コードとエラーメッセージ晒してみ。
212デフォルトの名無しさん:2009/06/17(水) 17:35:58
つーかバージョン違いの挙動のような気がするから、>>211を打ち込んでみて
エラーがでるかどうかと、perl -v | head -2の結果をよろ。
213デフォルトの名無しさん:2009/06/17(水) 18:58:17
>>211
$aだからエラーが出ないだけじゃ?
214デフォルトの名無しさん:2009/06/17(水) 20:28:34
--------- test.pl ----------
use strict;
our $var;
require 'test2.pl';
print $var;
--------- test2.pl ---------
use strict;
our $var;
1;

自分も過去試行錯誤したんだけど結局こうするしかなかった。
include的な動作をさせたいならopenでファイルを読んでevalするしかないと思う。
215デフォルトの名無しさん:2009/06/17(水) 20:29:31
$aと$bの恐怖ktkr!!
216デフォルトの名無しさん:2009/06/17(水) 20:30:39
--------- test2.pl ---------
use strict;
our $var = 1;
1;
の間違いです。
217デフォルトの名無しさん:2009/06/17(水) 22:02:51
>>214
our取っ払って$varを$main::varに置き換えても同じことなのは
理解してる?

requireがどうしても必要だという場面が想像できない。
218214:2009/06/17(水) 22:28:07
>>217
明示的に指定しない場合は必ずmainになるとは限りません(mod_perl環境下など)。
この場合ourを使ってグローバルな領域へアクセスするのが安心・確実で
そうでない場合__PACKAGE__やcallerを使って管理しなくてはいけないので
自分の場合はバグの温床になりやすかったです。
仰るとおりこうしなければならない局面は少なく代替案はいくらでもあると思いますどね。
219デフォルトの名無しさん:2009/06/17(水) 22:41:35
>>218
> 明示的に指定しない場合は必ずmainになるとは限りません(mod_perl環境下など)。
だからー示したテストスクリプトの場合だよ。

グローバル領域をやたらと必要とするのは設計のまずさ故だと思う。
バグの温床になるとか言ってるから、正しい使い方はしていないと思われ。
220デフォルトの名無しさん:2009/06/17(水) 22:42:32
Filter::Macro
221デフォルトの名無しさん:2009/06/17(水) 23:09:32
もうさ
FOO=hoge
BAR=hage
みたいなtxtfile用意して読んで分割してハッシュにぶちこんだら?
CGI臭いけどww
222デフォルトの名無しさん:2009/06/17(水) 23:23:25
>>221
それjson/yamlで。
223デフォルトの名無しさん:2009/06/17(水) 23:53:45
>>219
提示したテストスクリプトでの場合を書いてますが。
誤った使い方は論外ですがグローバルが必要なケースは少なくありません。
バグの温床云々は貴方の提示したやり方だとバグの温床になりやすいので
私が提示したやり方の方がそうなりにくいと説明したまでです。
ポイントポイント全てで伝わって無くて残念です
224デフォルトの名無しさん:2009/06/18(木) 00:29:43
なんか知らんがrequire一発で設定取り込めるぜ!
みたいなのに固執してないか?
225デフォルトの名無しさん:2009/06/18(木) 01:39:13
グローバル変数にせんでも、ふつうにmyで定義したスカラーとかハッシュに読み込めばいいと思うが
グローバル変数はできれば使いたくない
226デフォルトの名無しさん:2009/06/18(木) 05:59:41
なんでuse使わんの?
227デフォルトの名無しさん:2009/06/18(木) 06:37:19
>>223
能力ないのに口だけは達者な一番面倒なタイプのプログラマだな。
228デフォルトの名無しさん:2009/06/18(木) 07:16:48
>>223
お前、テストスクリプトまで書いてくれたヤツに
礼もなしにその重箱の隅つつきはねーだろ。
Camelの例示だって裸の$varが出てきたら暗黙に$main::varを
前提としてるぞ。
229デフォルトの名無しさん:2009/06/18(木) 08:23:29
our語る上で重要な部分で例示の限定的な状況下でも明らかな間違いなのに
重箱の隅ってレベルじゃないだろ。
それにどう勘違いしたら馬鹿な例示に感謝するって話になんだよ
230デフォルトの名無しさん:2009/06/18(木) 09:54:04
ourも$main::varも使ったことないな

グローバル変数なんか使わなくても、共通定数(変数)クラスみたいなの作ればいいし
隠蔽性ってOOPの基本だぜ
231デフォルトの名無しさん:2009/06/18(木) 16:01:04
>>229
その間違いっていうのを詳しく。
232デフォルトの名無しさん:2009/06/18(木) 16:48:15
---- test.pl ----
use strict;
require 'config.pl';
print config::param('hoge');
print config::param('fuga');
---- config.pl ----
package config;
use strict;
sub param {
 return (
  hoge => 'abcdefg',
  fuga => '12345',
 )[$_[0]];
}
1;

設定を1つに纏めたいなら、ourとか考えずに上記のようにしろ。
万が一の確立で、そんな面倒なソースがまわってきたら嫌だ。
233デフォルトの名無しさん:2009/06/18(木) 17:11:11
>>232
TMTOWTDI。
エラーが出るっつーから出ないようにしただけじゃん。
ourだってourで出来ないっつーからourで出来る例示をしたんだろ。
最低限の質問には答えてるんでね?最適解を出すのが質問の内容なら話は別だけどさ。

っていうかこの人最初にありがとうって言ってね?それで充分だろ>>228
234デフォルトの名無しさん:2009/06/18(木) 17:15:17
>>229
詳しく。
235デフォルトの名無しさん:2009/06/18(木) 17:23:35
なんか>>229>>223が粘着してるだけな気がする。相手にすんな。
236デフォルトの名無しさん:2009/06/18(木) 17:52:01
http://hogehoge.com/hogehoge.htmlのhogehoge.comの部分を抽出する正規表現を書きました

$url = 'http://hogehoge.com/hoge.html';
$serverName = ($url =~ m(http://(.*?)(/|$)))[0];

このコードを別の書き方で書けないでしょうか?
$)が何かの変数だと解釈されてしまい以下のインデントがずれてしまいます。
237デフォルトの名無しさん:2009/06/18(木) 17:59:03
238236:2009/06/18(木) 18:19:01
>>237
そんな方法があったんですね。
うまくいきました。
即レスありがとうございました。
239デフォルトの名無しさん:2009/06/18(木) 19:39:56
print "status: ";
sleep(5);
print "good";

status: が表示され5秒後にgoodが表示されて欲しいのですが、
これを実行すると5秒後にstatus: goodとまとめて表示されてしまいます。
調べてみた所$|=1にすればバッファリングが無効化され逐一フラッシュされるという事が分かりました。
しかしバッファリングを無効化したいのはここだけで、プログラムの他の部分では普通にバッファリングさせたいのです。
なので$|=1としたあと$|=0としなおさなければいけません。手動でflushする事は出来ないのでしょうか。
240デフォルトの名無しさん:2009/06/18(木) 20:07:38
>>239
#!/usr/bin/perl -w
use strict;
use IO::Handle;
my($count, $flush) = (0, 3);
for (split //, $ARGV[0]) {
  print and sleep 1;
  ++$count % $flush or STDOUT->flush;
}
__END__
241デフォルトの名無しさん:2009/06/18(木) 20:24:56
>>240
出来ました。
ありがとうございました。

use IO::Handle;

print "status: ";
STDOUT->flush;
sleep(5);
print "good";
242デフォルトの名無しさん:2009/06/19(金) 01:28:35
めんどいなあ
もっと手軽にフラッシュできればいいのに
243デフォルトの名無しさん:2009/06/19(金) 05:55:58
sub flush {$|=1;$|=0;}

print "status: ";
flush();
sleep(5);
print "good";
244デフォルトの名無しさん:2009/06/19(金) 11:49:33
Perlで日本語(shift-jis)の文字列を扱いたいんですが、
use Encode;として、後は入力された物を正規表現なんかで置換したりする前に全てdecode("shiftjis",$hoge)とすれば問題は起きないのでしょうか?
245デフォルトの名無しさん:2009/06/19(金) 12:17:45
>>232
それ無名配列の一つ目を表示してるだけじゃね?
246デフォルトの名無しさん:2009/06/19(金) 12:49:17
Win32::GUIで作成した画面に、バックグラウンド処理の結果を定期的に
表示させようと思っていますが、実装方法がわかりません。
設計レベルでは以下のようにしようと思っています。

・ウィンドウを生成する
・バックグラウンド処理を実行させる
・バックグラウンド処理は1ループ終わるたびに処理結果を
 ウィンドウに書き込む
・ウィンドウは停止ボタンの押下によりバックグラウンド処理を停止させる。
 また、開始ボタンにより再度バックグラウンド処理を開始させる。

以上よろしくお願いします。
247デフォルトの名無しさん:2009/06/19(金) 13:14:00
>>244
>>4

入出力のときに変換して内部ではutf8文字列で扱う
ように統一したほうが楽だよ。置換のときだけdecode
なんて混乱の元。
248デフォルトの名無しさん:2009/06/19(金) 16:47:27
文字列としてもsjisで取り扱って、コードもsjisで書くのが一番素直なんだけどな
最初にeucで書くことに逃げた奴がいるから、perlで対処されずに逃げ続ける羽目になる

2byteコードなのかそうでないのかは区別できるように設計されてるコードなんだから、
たまに認識できない文字があるのはperl側の手抜きに過ぎない
既にCPUは十分に速いんだから、まじめに処理しる
249デフォルトの名無しさん:2009/06/19(金) 17:04:45
日本語でおk
250デフォルトの名無しさん:2009/06/19(金) 17:09:12
>>245
本当だw
プロのプログラマーであるような事を言っておいて配列とハッシュの区別つかない初心者レベルとはひどすぐるw
251デフォルトの名無しさん:2009/06/19(金) 17:31:18
レスの内容なんていい加減で当たり前、それが2chの書き込み・・・!
だが・・・それでも
100%の確信をもって書く!それがP板住人の気概ってもんさ
252デフォルトの名無しさん:2009/06/19(金) 19:34:26
半可通がウソを教え、詳しい人は、その気もないのに時間もないのに、
ウソを正すことを強いられる。

ネットが本質的にウソと怒りと攻撃性に満ちあふれる世界となる理由だな。
253デフォルトの名無しさん:2009/06/19(金) 19:39:56
出るところに出たら通じないから、こういう場所で頑張るわけだしね。
254デフォルトの名無しさん:2009/06/19(金) 21:51:36
各言う俺も礼儀正しく何も分からない初心者のように質問した後、
舌の根も乾かないうちに偉そうなこと書くよ。

というわけでどちら様か>>246を答えてくださらないでしょうか?
さもなければもうらくだかクックブックを参照するしか・・・
255デフォルトの名無しさん:2009/06/19(金) 21:59:19
参照すれば?
256デフォルトの名無しさん:2009/06/19(金) 22:13:51
またunixでしかうごかんよプギャーとかのってそうで怖くて・・・
257デフォルトの名無しさん:2009/06/19(金) 22:23:22
「書籍を一通りあたってみましたが、わかりませんでした。だから質問します」
ならわかるけど、なんで逆なんだろうな。
258デフォルトの名無しさん:2009/06/19(金) 22:53:29
これがゆとりってやつか
259デフォルトの名無しさん:2009/06/19(金) 22:59:59
自分で調べる
⇒時間がかかる
⇒⇒人件費がかさむ
⇒⇒⇒上司ににらまれる

他人に聞く
⇒即、解決。おわり。
260デフォルトの名無しさん:2009/06/19(金) 23:01:05
モチは餅屋っていうじゃん
261デフォルトの名無しさん:2009/06/19(金) 23:37:29
>>259
ところがその「時間がかかる」の部分でついでに身につくあれやこれやが
とてつもなく大きいんだよな。実力の半分以上はそれで付くってくらいに。

だから、特定の問題一つの解決までの道のり「だけ」を比較しても、あまり意味が無い。
上を繰り返すことで減少していく立ち止まりが、下ばっか選んでいると一向に減らないという点で、
トータルでは上のほうがロスタイム少なかったりするんだな。しかも下は嘘つかれ易いし。
もちろん、自分一人で延々悩んでいても埒が開かない場面ってのもあるけれど。

>>260
でもこの場合は質問者も餅屋だから。餅屋としての修行態勢は整えておこうよっていう。
262デフォルトの名無しさん:2009/06/19(金) 23:39:58
>>260
> モチは餅屋っていうじゃん

金払う気あるってこと?
263デフォルトの名無しさん:2009/06/19(金) 23:50:21
ここじゃ誰も金はらってないだろ
264デフォルトの名無しさん:2009/06/19(金) 23:52:07
とりあえず楽しても身につかないから
成長したかったら努力しろ
265デフォルトの名無しさん:2009/06/19(金) 23:52:50
人にただ働きさせて自分の仕事を肩代りさせようという魂胆だったわけだ。
266デフォルトの名無しさん:2009/06/20(土) 00:01:20
>>261
青いな
その理屈はせいぜい社会人3年目くらいまでだろ。
何をするにもコストは発生する。成果物が明らかである以上、コストは
最小に抑えるにこしたことはない。
267デフォルトの名無しさん:2009/06/20(土) 00:09:12
gtk-demoのdialog.plをwperlで実行するとちゃんと動くのですが、
ppでexe化して実行すると下記のようなエラーが出ます。
解決する方法どなたか教えていただけないでしょうか?

C:\Documents and Settings\takeshi\デスクトップ\dialog>pp dialog.pl -o dialog.exe -l Glib.dll -l Cairo.dll -l Gtk2.dll -M Glib -M Cairo -M Gtk2
C:\Documents and Settings\takeshi\デスクトップ\dialog>"C:\Documents and Settings\takeshi\デスクトップ\dialog\dialog.exe"
GLib-GObject-CRITICAL **: g_object_steal_qdata: assertion `quark > 0' failed at script/dialog.pl line 94.
GLib-GObject-CRITICAL **: g_object_set_qdata_full: assertion `quark > 0' failed at script/dialog.pl line 94.
Can't locate object method "signal_connect" via package "Gtk2::Window" at script /dialog.pl line 100.
268デフォルトの名無しさん:2009/06/20(土) 00:10:28
>>265
仕事してる人間がここに書き込んだことあるの?
269デフォルトの名無しさん:2009/06/20(土) 00:10:29
お前ら当たり前の話しすぎ
270デフォルトの名無しさん:2009/06/20(土) 00:13:29
>>266
つまり勉強始めて3年以内に「自分でやるコスト<人にやらせるコスト」まで
スキルアップできなかった奴は金で解決しろって事だよな。
271デフォルトの名無しさん:2009/06/20(土) 00:19:10
違います
3年やって駄目な奴は辞めて下さい
272デフォルトの名無しさん:2009/06/20(土) 00:28:06
ちがう。
車輪、それも質の悪い奴を再発明しまくっているのに自覚のない
オナニー野郎は悪害だから辞めて下さいという意味
273267:2009/06/20(土) 00:51:44
なんかスレ違いだったようです
失礼しましたm(__)m
274デフォルトの名無しさん:2009/06/20(土) 01:30:48
聞けば済むことと、自分で見つけることに意義があることがある
優秀な教育者は、それを見極めて教えたり教えなかったりするが、
多くの先輩はそんなことは考えておらず、面倒なら教えないし、気が向けば教える
275デフォルトの名無しさん:2009/06/20(土) 02:25:57
勤務時間中に勉強なんかするな!

勉強は学校でするもんだろ?
会社は、勉強した成果を発揮する場所であって
勉強する場所ではない!

おまえは給料ドロボーかっ!
276デフォルトの名無しさん:2009/06/20(土) 03:53:34
なんだ、このスレにはニートしかいないのか
277デフォルトの名無しさん:2009/06/20(土) 04:06:28
>>265
最近プロっぽい人が初心者相手に親切に教えてくれてんじゃん。
278デフォルトの名無しさん:2009/06/20(土) 04:08:32
265じゃなくて>>268だった。
貴重な時間割いて教えてくれてるんだから感謝しないとな。
279デフォルトの名無しさん:2009/06/20(土) 04:11:17
perlの案件なんて基本的にないんです
280デフォルトの名無しさん:2009/06/20(土) 06:09:50
同期を取るためにプロセス間でIO::Fileなんかのインスタンスを共有したいです
黒魔術的な所業で可能だったりしませんでしょうか
あれば他のことにも応用できそうでいいかんじではないでしょうか
281デフォルトの名無しさん:2009/06/20(土) 06:23:34
POEに投げる、じゃいかんの?
282デフォルトの名無しさん:2009/06/20(土) 06:54:21
>>279
増えてきてる実感だけど。
PHPが大きいプロジェクト抱えすぎて破綻寸前なイメージがある。
PHPのフレームワークはフリーウェアをインストールした状態では
重くて使い物にならないしな。

まあCatalystも重いんだけど。Catalyst>>>>PHPのフレームワーク、だし。
283デフォルトの名無しさん:2009/06/20(土) 08:02:02
>>274
そんな当たり前なこと偉そうに語るな

このスレは、それでも聞いちゃう人のスレ
そんな質問を見たり、答えたりして楽しむ人のスレ
284デフォルトの名無しさん:2009/06/20(土) 08:03:19
>>279>>282
会社によるし、規模にもよる。
285デフォルトの名無しさん:2009/06/20(土) 11:05:44
画像を分割するモジュールはありませんか?
ImagerとかGDとかImageMagickという画像編集のモジュールがあることは知っていますが、それ以上のことは知りません
286デフォルトの名無しさん:2009/06/20(土) 14:33:11
>>281
ググってみました
今やろうとしてることにはたすきに長すぎる感がありますが面白そうですね
そっちに興味が移りました
ありがとうございます
287デフォルトの名無しさん:2009/06/20(土) 15:36:25
バッチファイルの案件なんて基本的にないんです
だからバッチファイルが書けなくても困りません
288デフォルトの名無しさん:2009/06/20(土) 19:19:25
>>285
ImageMagickでcloneしてcropなりchopすれば見た目は分割になるImageMagick
289デフォルトの名無しさん:2009/06/20(土) 20:56:01
>>285
画像の分割って画像編集なわけだが
ImagerとかGDとかImageMagickを使ってみればいいじゃん
290デフォルトの名無しさん:2009/06/21(日) 12:22:24
>>278
感謝するべきプロの書込ってこれのこと? >>208 >>232
スコープの話するのに$a使うような馬鹿がプロのわけないだろ。
232なんかourは使うなって書いたコードがour使うよりも劣る糞コード。しかも意図通り動作しない。
真偽を判断する事が出来ない初心者にあたかも上級者であるよう装って馬鹿な事を教えるような奴は
感謝するどころか消えて欲しい。
291デフォルトの名無しさん:2009/06/21(日) 17:58:54
>>290
何故、そんな明らかなtypoに、レスして熱くなってるんだ?
もうちょっと本質について、語ってみろよ。

>>208が$aでは無く$varで、>>232が[$_[0]]では無く{$_[0]}だとしたら
何が問題で、>>290ならどう解決するかを語って欲しいものだ。

どうでもいいようなtypoを偉そうに煽るだけのような奴こそ消えて欲しい。
292デフォルトの名無しさん:2009/06/21(日) 19:03:51
typoの意味を間違えてるね。
293デフォルトの名無しさん:2009/06/21(日) 19:09:25
「本質」
294デフォルトの名無しさん:2009/06/21(日) 19:24:17
=>って書けば連想配列になると思っちゃったんだろうね。カンマと同じなのに。
291さんはPerl歴何ヶ月ですか?
295デフォルトの名無しさん:2009/06/21(日) 19:38:02
>>291=KENT
296デフォルトの名無しさん:2009/06/21(日) 20:01:18
>>211
どうでもいいようなtypoで自ら$aの罠にはまってるという。もはやギャグとしか思えんw
297デフォルトの名無しさん:2009/06/21(日) 22:17:37
Perlerの内紛が醜いインターネットですね
298デフォルトの名無しさん:2009/06/21(日) 23:41:10
学生さんたちがきたんだろ
299デフォルトの名無しさん:2009/06/22(月) 00:29:59
無知で失礼な奴は2chだろうがリアルだろうが叩かれるからなぁ
300デフォルトの名無しさん:2009/06/22(月) 01:02:55
HTML::Templateで
$hoge->param( TEST => @test);
$hoge->param( TEST2 => $test2);
としていた場合、
<TMPL_LOOP NAME=TEST>
<TMPL_VAR NAME=TEST2>
</TMPL_LOOP>
みたくすると、LOOPの中ではTEST2が呼び出せません。
呼び出す方法はありませんか?
301デフォルトの名無しさん:2009/06/22(月) 01:20:03
>>292
http://e-words.jp/w/E382BFE382A4E3839D.html
>>292-299
で、誰も問題に答えない…と(w
302デフォルトの名無しさん:2009/06/22(月) 01:46:33
何が問題かって配列に対して{$_[0]}したら構文エラーで動きませんよ。
配列やハッシュの基本的な事覚えたいならオライリーから出てるはじめてのPerlマジお勧めです
303300:2009/06/22(月) 01:55:19
解決しました globalフラグを建てればいいのですね。
304デフォルトの名無しさん:2009/06/22(月) 02:05:32
@aの要素を得る書き方が、
@a[0]でなく$a[0]なのは、言語仕様のバグとしか思えない
305デフォルトの名無しさん:2009/06/22(月) 02:41:42
分かりづらいですよね。Perl6では@a[0]になるらしいけど。
結局typo修正したちゃんと動くコードは教えてくれないのかな
306デフォルトの名無しさん:2009/06/22(月) 03:01:20
>>304
> @a[0]でなく$a[0]なのは、言語仕様のバグとしか思えない

スカラーだから$になるでしょ。
307デフォルトの名無しさん:2009/06/22(月) 16:35:51
>>304
@a[0]は、@aから要素0を取り出した配列って意味になるだろ。
結果ほぼ同じになるけど。
308 ◆TWARamEjuA :2009/06/22(月) 17:34:08
ハシュのスライスは、はじめ判らなかった。。。@Perlfaq4#How can I remove duplicate elements from a list or array?
hash slice: @hash{ @array } = ();
309デフォルトの名無しさん:2009/06/22(月) 18:38:57
判る必要なんかない覚えればいいんだから
310デフォルトの名無しさん:2009/06/22(月) 18:43:50
>>301
リンク先見たけど「僕は馬鹿です^^」って宣言してるの?
311デフォルトの名無しさん:2009/06/22(月) 19:28:25
=~ m//のオプションであるmやsはそれぞれ何の頭文字なんでしょうか。
multiとsimultaneous?

>perldoc -f regular expressionとしてみましたが見当たりませんでした。
ご存知の方教えて欲しいです。
312デフォルトの名無しさん:2009/06/22(月) 19:32:21
perldoc perlre ですよ。
313デフォルトの名無しさん:2009/06/22(月) 20:11:11
multiple lineとsingle lineという事でした。
しかしperlreという言葉は思いつきませんでした。
どうやらPerlにおける正規表現の実装を総括した名前のようですね。

>>312さんありがとうございました。
314デフォルトの名無しさん:2009/06/22(月) 20:38:21
($a) = /(pattern)/;
みたいなことをして、マッチすればそれが$aに入るけど、
マッチしなかったら何もせずに$aを保存、みたいな書き方ってできない?
315デフォルトの名無しさん:2009/06/22(月) 20:48:46
if elseで書けばいいんじゃね?
316デフォルトの名無しさん:2009/06/22(月) 20:48:53
$aを保存の意味がわからん
317デフォルトの名無しさん:2009/06/22(月) 20:57:21
>>313
perldoc perl
318デフォルトの名無しさん:2009/06/22(月) 21:10:05
>>314
/(pattern)/ and $a = $1;
319デフォルトの名無しさん:2009/06/22(月) 21:42:20
さて問題
>>314のコードでマッチしなかった場合$aには何が入ってるでしょう
320デフォルトの名無しさん:2009/06/22(月) 21:58:54
321デフォルトの名無しさん:2009/06/23(火) 00:57:15
>>318
1個ならそれでも大差ないけど、
($a, $b, $c, $d) =
みたいな書き方が出来るのに、$1, $2, $3, $4とあんまり書きたくない
322デフォルトの名無しさん:2009/06/23(火) 01:09:04
do { (my @tmp = /(pattern)/) and ($a, $b, $c, $d) = @tmp; }
($a, $b, $c, $d) = @{[/(pattern)/]} || ($a, $b, $c, $d);
323デフォルトの名無しさん:2009/06/23(火) 01:15:14
だから$aを保存の意味がわからんつってんんだろ
324デフォルトの名無しさん:2009/06/23(火) 01:30:44
保存=preserve
割と基本的な概念だ
325デフォルトの名無しさん:2009/06/23(火) 01:41:22
KENTはここ来んなよ。
326デフォルトの名無しさん:2009/06/23(火) 01:47:37
いえーい、ケント・デリカットさん見てるー?
327デフォルトの名無しさん:2009/06/23(火) 01:49:12
質問スレなんだから、判らない人は黙ってればいいのに
328デフォルトの名無しさん:2009/06/23(火) 02:19:40
$kosuu = "1,000";
$kakaku = "2,500";

$kosuu =~ s/\,//g;
$kakaku =~ s/\,//g;

print "$kosuu\n$kakaku\n\n";

# 複数の変数に対して同条件の置換を行いたいのですが
# なにか簡潔な方法はありますか?もしあれば教えてください。
# ($kosuu,$kakaku) =~ s/\,//g;ではできませんでした。
329デフォルトの名無しさん:2009/06/23(火) 02:26:24
$$_ =~ s/\,//g for(\$kosuu, \$kakaku);
330デフォルトの名無しさん:2009/06/23(火) 02:27:25
map { s/,//g } ($kosuu, $kakaku);
331デフォルトの名無しさん:2009/06/23(火) 02:35:43
あれだけ無様な姿晒しといてまた書き込みするわけなかろうて
332デフォルトの名無しさん:2009/06/23(火) 03:05:14
>>329
リファレンスは知っているだけで全く使っていませんでしたがこういう使い方が出来るんですね。
$_ =~ s/\,//g for($kosuu, $kakaku);でも動くようなんですが、これでは何かまずい事があるんでしょうか。

>>330
map知りませんでした。配列処理に役立ちそうです。

お二方レスありがとうございました。
333デフォルトの名無しさん:2009/06/23(火) 04:02:42
>>332
forは参照渡しだからリファレンスにする必要はない。
334デフォルトの名無しさん:2009/06/23(火) 09:53:21
$_ が参照じゃないのってどんな時?
335デフォルトの名無しさん:2009/06/23(火) 12:06:33
>>334
繰り返し処理以外の用途で使われている時。
繰り返し処理の際は「エイリアス」として働くが、
それ以外の時は単に省略時の「ターゲット」となるだけ。
http://perldoc.jp/docs/perl/5.10.0/perlvar.pod#item__ARG
336デフォルトの名無しさん:2009/06/23(火) 14:20:24
perlでwindowsでタイマーイベント発生させるにはどうすればいいのでしょうか?
Time::HiResのalarmとか試みましたが貴様のプラットフォームではつかえねーよと拒否られました。
または定期的に処理を実行させる方法でもいいです(その場合時間経過と共に実際の時計との
差が広がらないのが条件です)

よろしくお願いします。
337デフォルトの名無しさん:2009/06/23(火) 14:25:37
>>336
定期的にというのが、分以上なら
cronNTとか使えばだろうだろう

あとは、
全体を

$time = 5;
for(;;) {
sleep($time);
(処理)
}

としたものを起動するとか。
これは、5秒置きに実行してるわけじゃないので注意。
あくまでも処理が終わってから、5秒置いて、再度実行してるだけね。
338デフォルトの名無しさん:2009/06/23(火) 14:44:50
>>337
レスありがとう御座います。
定期的は秒ですね。
ちなみに後者のが時間がたつにつれてずれが大きくなっていく可能性がある実装の典型ですね。
cronNTというのは初耳なのでちょっと調べてみます。
339デフォルトの名無しさん:2009/06/23(火) 17:31:02
>>335
while(<in>) は?
340デフォルトの名無しさん:2009/06/23(火) 18:03:51
その考え新しいな
341デフォルトの名無しさん:2009/06/23(火) 18:17:59
あー、ファイルが同時に更新されるってか。そらあったら便利だ。
342デフォルトの名無しさん:2009/06/23(火) 18:27:36
行単位で伸び縮みするのは怖い
343デフォルトの名無しさん:2009/06/23(火) 18:31:10
>>336
なんでそんなに厳密な間隔で実行させたいの?
344デフォルトの名無しさん:2009/06/23(火) 19:27:45
>>343
時計描画したいからです。
345デフォルトの名無しさん:2009/06/23(火) 19:29:22
あほだろ
346デフォルトの名無しさん:2009/06/23(火) 19:30:56
じゃなくてタイマーでした
347デフォルトの名無しさん:2009/06/23(火) 19:50:00
つまり、
0:59→0:58→0:57 ・・・
って感じに表示したいってことかな?

だったら、タイマーイベントを使うなんてのはアプローチからして間違ってる。
現在の時刻(から求められた文字列)をループさせて表示させる方がいい。

my $start = 60;
my $startTime = time();

while(1) {
my $past = time() - $startTime;
printf "%d", $start - $past: (ここ、CRで同行表示に出来るよ)
exit if $past <= $start;
}
348デフォルトの名無しさん:2009/06/23(火) 19:59:13
ちょっとミスがあったので改訂版

my $start = 60;
my $startTime = time();
while(1) {
my $past = time() - $startTime;
printf "%d\r", $start - $past;
exit if $past >= $start;
}

これで60〜0まで、同じ行でカウントするよ
描画ってのがラインとか図形って意味なら、printfの行を、図形を描画するルーチンに変えればいいだけ。
349デフォルトの名無しさん:2009/06/23(火) 21:27:54
while(1)でまわしっぱですか。
CPU食いすぎじゃないですか?
350デフォルトの名無しさん:2009/06/23(火) 21:38:02
じゃあ間をとってタイマーイベントでシステム時刻を取得して描画でええんちゃうん?
351デフォルトの名無しさん:2009/06/23(火) 21:54:28
だから結局タイマーイベントなんですよね?
んでタイマーイベントの発生のさせ方がわからんのですよ。
352デフォルトの名無しさん:2009/06/23(火) 21:58:18
だからそこは Time::HiRes::alarm(ry
while(1) の高速ぐるぐるが嫌だったら Time::HiRes::sleep 辺りで寝かせればどう?
353デフォルトの名無しさん:2009/06/23(火) 22:02:03
やってみりゃ分かるが、そんなことでCPUは食わない
while(1)で回し続けるなんて、デーモンじゃ普通にやること。

$pastが変わらなかったらprintしない方がいいけど、
そういうこと言いだすとコードが複雑になっていくか
354デフォルトの名無しさん:2009/06/23(火) 22:09:20
>>353
sleepは必須だけど、デーモンってのは当にwhile(1)
355348:2009/06/23(火) 22:17:34
my $start = 60;
my $startTime = time();
my $pastOld;
while(1) {
select(undef, undef, undef, 0.1);
my $past = time() - $startTime;
exit if $past > $start;
printf "%d\r", $start - $past;
$pasOld = $past;
}

これでいいかい?
なんつーか、考え方だけをシンプルに書いただけだから
細かい制御は自分で考えてくれよ
356348:2009/06/23(火) 22:18:56
あーまたぬけた。

my $start = 60;
my $startTime = time();
my $pastOld;
while(1) {
select(undef, undef, undef, 0.1);
my $past = time() - $startTime;
exit if $past > $start;
printf "%d\r", $start - $past if $pasOld == $past;
$pasOld = $past;
}
357348:2009/06/23(火) 22:20:54
おっと。また訂正。つーかもう寝る。

if $pastOld != $past;

$pastOld = $past;
358デフォルトの名無しさん:2009/06/23(火) 22:55:58
なぜかsleepやselectいれると表示されないんですよね。
最後に想定した時間に終了するので動いてはいるっぽいですが。
まぁタイマー表示は飾りみたいなもんなのでtimeつかって
定期的に描画するとします。
ありがとうございました。
359デフォルトの名無しさん:2009/06/24(水) 00:02:12
flush
360デフォルトの名無しさん:2009/06/24(水) 03:33:12
my $start = 60;
my $startTime = time();
$|=0;
while(1) {
#        sleep(1);
        my $past = time() - $startTime;
        printf "%d\r", $start - $past;
        exit if $past >= $start;
}

このコードは秒が描画されるけどsleepのコメントアウト外すと描画されなくなるね。
不思議。なんででしょうか?環境依存?:This is perl, v5.8.8 built for MSWin32-x86-multi-thread
361デフォルトの名無しさん:2009/06/24(水) 05:53:51
>>360
普通に表示される。
This is perl, v5.8.6 built for i386-freebsd
コンソールが追いついてないんじゃない?
362デフォルトの名無しさん:2009/06/24(水) 09:48:09
学校の宿題だろうけど、LinuxなりBSDなり使ってやれば?
363デフォルトの名無しさん:2009/06/24(水) 10:03:05
なぜ$|=0なん? やるんなら $|=1だろ。バッファに
たまっちゃうよ。

sleep(1)をとるとものすごい勢いでprintされるから
すぐにバッファあふれて描画されるだろうけど、
そうじゃないと1秒に一回2,3バイト書くだけなので、
全部バッファにたまっちゃう。終了時にまとめて
出たのも多分一瞬でシェルのプロンプトに上書き
されて見えなくなるだろう。
364デフォルトの名無しさん:2009/06/24(水) 10:07:19
flush
365デフォルトの名無しさん:2009/06/24(水) 11:15:09
>>363
\rでflushされるんじゃなかったっけ?
366デフォルトの名無しさん:2009/06/24(水) 12:08:31
>>365
\nならされるけど。
367デフォルトの名無しさん:2009/06/24(水) 16:34:42
この手のコードは $|=1; するのがセオリー。
なのに、あえて、わざわざ $|=0; してるのは、何か理由があるのか?
たぶん、意味も知らずにコピーしてきたコードなんだろうな。
もういちど、1行1行、意味を考えながらコーディングしようよ。
368360:2009/06/24(水) 16:38:10
>>361 This is perl, v5.8.8 built for i486-linux=gnu-thread-multiでも再現するなぁ。
>>362 俺タイマーの質問者じゃないよ。

>>363
あぁなるほど、バッファがあふれているんですか。
\rすると以降の文字が上書きされ始めるからバッファがあふれることは無いと思っていたけど、
それは表示上だけの問題で実際のバッファの中には%d\rが積もり積もっていくんですね。

$|=1だとsleepの有無に関わらず表示されるのは分かりきった事ですが、
$|=0にするとsleepの有無で表示結果が変わってしまうのが気になりました。
そこを示す為に原文に無い$|=0を書き足したんですが言葉足らずでした。

よく分かりました。レスどうもありがとうございました。
369デフォルトの名無しさん:2009/06/24(水) 16:53:58
俺はそのタイマーの質問者ですが、学校の宿題じゃないです。
windowsならどこでも実行可能なプログラムを作成する選択肢として
PerlでPARつかうのが楽なのでPerlを選んだというセオリーです。
370デフォルトの名無しさん:2009/06/24(水) 17:27:43
Cで書けバカ
371デフォルトの名無しさん:2009/06/24(水) 17:46:13
PerlとJavaしかしらんので^^;
372デフォルトの名無しさん:2009/06/24(水) 17:48:16
なんという俺
373デフォルトの名無しさん:2009/06/24(水) 17:52:56
timerってどうやって実装すんのがいいのかな〜
      ↓
猫でもわかるをみる
      ↓
なるほどWM_TIMERがきたらWM_PAINTを呼ぶのか。
Perlでもそれくらい楽勝で真似あるよな。
      ↓
みあたんねーおかしいな。じゃぁPerlでは同じことするとき
いったいどうやるの?

というセオリーです。
374デフォルトの名無しさん:2009/06/24(水) 18:06:00
PerlとCじゃレベルが違うだろ・・・
375デフォルトの名無しさん:2009/06/24(水) 18:11:42
Unix/Cなら割と問題ないけどね。

Win32APIだったらWin32::API使ってゴソゴソ作るか、
CPANでWin32系のモジュール漁るしかない。
376デフォルトの名無しさん:2009/06/24(水) 18:45:23
へたくそな説明ですみません。変数に数値は入っているようにみえて、
実際には数値が入っていない事ってあるのでしょうか?

メインとなる「index.cgi」と他のモジュールを分けて使いっています。
最初に別のファイルでPOST/GETデータをエンコードさせ、
「return %hash;」の形で下記ように戻しました。

%reEnc = ENC::enc();

そのファイルを再び下記のように別のファイルに渡しました。

fileLoad::FileSet(\%reEnc);

その後に見た目上は滞りなく処理が進むのですが、
サーバーのログには下記のようにエラーが出てしまいます。
(※確かにエラー行では"reEnc"からデータを取り出し"$value"に入れてます。

index.cgi: Use of uninitialized value $value in string eq at fileLoad/FileSet.pm line *.

当然何かおかしいと思い色々と弄っていたのですが、基本となる「index.cgi」上で、
「%reEnc」のデータを「print」してみたのですが、それは画面上には表示されます。
しかし、if構文で処理させようとすると、その数値が「ない」と判断されてしまいます。

print $reEnc{'pointA'}; ← これは「pointA」の値がちゃんと表示される。
if(!$reEnc{'pointA'}){ print "ない";} ←しかしこの構文では「ない」が表示されてしまう。

でも、何故か表示上は最後まで処理がされてしまうのです。これは一体全体何故でしょうか?
どう考えてもいろいろ駄目な感じはしますが、何カ所かでエラーチェックはかけていますし、
その数値が無ければファイルが呼び出せない「はず」の部分も存在します。
が。何故か処理が進んでしまうのです…。解せぬ。ということで、ご教示願いしまう。
377デフォルトの名無しさん:2009/06/24(水) 19:09:28
>>376
0が入ったんじゃね〜の〜
378デフォルトの名無しさん:2009/06/24(水) 21:01:19
肝心のエラー行のコードが書いてないって一体なんなの
379デフォルトの名無しさん:2009/06/24(水) 22:07:40
>>377
最初それをやっていて、「自分大馬鹿」と思っていたのですが、
アルファベットにしても同じでした。

>>378
エラー行というほどの物でもなく、>>>376にある通りに、
画面に表示させると表示ができる。
変数として使おうとすると、何故か存在しなくなるのです。
もしかしたら別ファイルにあるサブジェクトに渡すところで、
何かしらの問題がでているのではないかとも思ったりと…。
380デフォルトの名無しさん:2009/06/24(水) 22:22:17
>(※確かにエラー行では"reEnc"からデータを取り出し"$value"に入れてます。

だからここのコード晒さないのが質問者の態度か?
答えて欲しいなら勝手な判断でネタ隠すな
381デフォルトの名無しさん:2009/06/24(水) 22:23:46
>>379
use strict してないから変数名間違っててもわかんないとか?
なんにせよどこでデータがとんでるかプリントデバッグしたらわかるんじゃね?

>別ファイルにあるサブジェクト
別モジュールのサブルーチンの事だよな?
382デフォルトの名無しさん:2009/06/24(水) 22:24:07
WebProgへ誘導しないのは暇つぶしに使おうとしてるのか?
383デフォルトの名無しさん:2009/06/24(水) 22:34:29
$reEnc{'pointA'} = "UNKO";
print $reEnc{'pointA'};
if(!$reEnc{'pointA'}){ print "ない";}

「UNKO」とだけ表示される。「ない」は表示されない。
384デフォルトの名無しさん:2009/06/24(水) 22:41:03
>>383
うん、正しいね
385デフォルトの名無しさん:2009/06/25(木) 02:30:33
「ない」だけじゃなく、変数も表示させてみろよ。
386デフォルトの名無しさん:2009/06/25(木) 08:41:45
>>385
何言ってんだお前
387376:2009/06/25(木) 11:35:53
さて…ソースも出さない、>>1も読めない愚かな>>376は、
>>382の発言でようやく色々なモノに気付き旅に出ます…。
スレ汚しすみませんでした。"Perl"の質問じゃねぇよ。コレ…。
388デフォルトの名無しさん:2009/06/25(木) 19:13:11
ハッシュを使ってデータ処理をしているのですが
ハッシュのキーは同じで値を区別したいので三つのハッシュを使って
データの処理を行っています。データ処理の結果を表示するときに困っています。

具体的にはデータファイルの書式が
aho,34,23,32
baka,31,22,11
manuke,32,22,11
aho,22,22,33
となっており3つのカンマでデータがそれぞれ区切られてます。
そこで1列目(aho,baka,manuke)をキーにして2列目、3列目、4列目の値を
3つのハッシュ(%a,%b,%c)を使って縦方向に足し算しています。
ファイルの終わりにきたら結果を表示するために
foreach $name (sort keys %a){
print "$a[$name]";
}
としてひとつひとつハッシュの値を表示してるのですが、
できればforeachの中に%bと%cのハッシュ値を%aの値と同時に表示したいのですが
どうすればいいでしょうか?


389デフォルトの名無しさん:2009/06/25(木) 19:31:43
考え方が変。

$hash->{aho} = \ qw/34 23 32/;
$hash->{baka} = \ qw/31 22 11/;
$hash->{manuke} = \ qw/32 22 11/;

for $n (0..3) {
for $name (keys %$hash) {
print $hash->{$name} , $hash->{$name}->[$n];
}
}
390デフォルトの名無しさん:2009/06/25(木) 19:32:53
あ、出したい形が違うかな?
その場合は、for文順序逆で。
391デフォルトの名無しさん:2009/06/25(木) 19:33:42
>>388
どんなことがしたいのかよくわからん。

aho,34,23,32   →34+23+32を出力
baka,31,22,11  →31+22+11を出力
manuke,32,22,11→32+22+11を出力
aho,22,22,33   →22+22+33を出力

こういう事?
392デフォルトの名無しさん:2009/06/25(木) 19:37:26
いや単純に
foreach $name (sort keys %a){
 print "$a[$name] $b{$name} $c{$name}\n";
}
でよくね?
393デフォルトの名無しさん:2009/06/25(木) 19:40:16
何がしたいかわからんな

現状のソースを貼って、同じ結果になるより良い方法を教えて下さいと書くべき
394デフォルトの名無しさん:2009/06/25(木) 19:53:32
>>391
すいません。
期待する出力としては

2列目の値を足し算
aho:34,22  →34+22を出力
baka:31   →31を出力
manuke:32  →32を出力

3列目の値を足し算
aho:23,22  →23+22を出力
baka:22   →22を出力
manuke:22  →22を出力

4列目の値を足し算
aho:32,33  →32+33を出力
baka,11  →11を出力
manuke:11 →11を出力

これの結果として
aho,56,45,65
baka,31,22,11
manuke,32,22,11
を得たいです。

単純に>>392さんの方法でできました。
お騒がせしました。
395デフォルトの名無しさん:2009/06/25(木) 21:10:46
重複する行の項目を足し合わせて1行にしたいって事か。
解決したなら良かった。
396デフォルトの名無しさん:2009/06/26(金) 14:08:44
cpanでPlaggerインストールしようとしたら途中でハングしました。
以下ハング箇所最新5行のログです。

C:\strawberry\perl\bin\perl.exe "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib\lib', 'blib\arch')" t/*.t
t/100_load.t ...... ok
t/110_compare.t ... ok
t/120_single.t .... ok
t/200_bl_ex.t ..... 5/22 ※5からすすみません。もう何十分か経過しています。

メモリ使用量をみると、じわじわと増加しています。
これがリークなのかテストしているのか分かればいいのですが。
このまま待つべきでしょうか?

ちなみに環境はXPsp2のstrawberry perlです。
397デフォルトの名無しさん:2009/06/26(金) 14:40:32
>>396
もうちょっと何のモジュールのテスト中かわかるぐらいのログを貼って
欲しかったが、これ?

ttp://rt.cpan.org/Public/Bug/Display.html?id=40185

NFSなんてつかってないだろうから無視して先に進むのもありかな。
398デフォルトの名無しさん:2009/06/26(金) 14:55:41
それです。更にさっきのログの上数行がこれです。

Writing Makefile for File::NFSLock
cp lib/File/NFSLock.pm blib\lib\File\NFSLock.pm
C:\strawberry\perl\bin\perl.exe "-Iblib\arch" "-Iblib\lib" File-NFSLock.spec.PL File-NFSLock.spec
BBB/File-NFSLock-1.20.tar.gz
C:\strawberry\c\bin\dmake.EXE -- OK
Prepending blib/arch and blib/lib of 38 build dirs to PERL5LIB; for 'test'
Running make test

では無視するにはどうすればいいのでしょうか?ctrl+cでいいんでしょうか?
399デフォルトの名無しさん:2009/06/26(金) 19:23:11
とっくにctrl+c実行しています。終了です。
400デフォルトの名無しさん:2009/06/26(金) 19:41:18
$|=1;
print `grep aaa *.txt`;

みたいなことをして、結果を逐次表示させたいんだけど、
全部終わってからに一気に表示される
本当は
print $result = `grep aaa *.txt`;
みたいにしたいけど、とりあえずその前段階で詰まってる
なにかいい方法は無いかな

環境はXPでactiveperl
401デフォルトの名無しさん:2009/06/26(金) 20:15:50
>>400
パイプでどうだ。

open(GREP, "grep aaa *.txt |") or die;
while (<GREP>) {
print $_;
}

1行ずつは無理だけど。grepの出力バッファサイズごとに、ドカッ、ドカッ、と出てくるはず
402デフォルトの名無しさん:2009/06/27(土) 00:27:12
んー
がんがん出力がある状態だと大差ないけど、
ちょろちょろとしか出力が無いと、結局最後に全部まとめて、みたいなことになる
403デフォルトの名無しさん:2009/06/27(土) 01:17:05
open(GREP, "| grep aaa *.txt") or die;
そういう時はパイプを前に付けるといいよ。何でかは誰かが答えてくれる。
404デフォルトの名無しさん:2009/06/27(土) 01:35:08
パイプを前て
意味が判らない
でもちゃんと動いている
405デフォルトの名無しさん:2009/06/27(土) 02:34:34
すげえ
406デフォルトの名無しさん:2009/06/28(日) 00:38:13
$|=1;
print 1+2;

みたいなことをして、結果を逐次表示させたいんだけど、
全部終わってからに一気に表示される
本当は
1 2 3
みたいに表示したいけど、なぜか 3 だけ表示されて困ってる
なにかいい方法は無いかな

環境はXPでactiveperl
407デフォルトの名無しさん:2009/06/28(日) 02:09:01
>>406
> $|=1;
> print 1+2;
だけなら 3 だけ表示されるに決まってるけど?
「逐次表示」させたくてどんなコードを書いてるのかを晒さなきゃ。

試しに
$| = 1;
for (1..3) { print $_, " "; sleep(1) }
というコードで実行したら、ちゃんと1秒ごとに1 2 3が順次表示されました。
408デフォルトの名無しさん:2009/06/28(日) 02:25:56
まぁ、そのなんだ・・・アレだな
409デフォルトの名無しさん:2009/06/28(日) 04:27:54
>>406
それ1+2が計算されてその結果の3が出てるんだよ。

$|=1;
print "1 ";
sleep(1);
print "2 ";
sleep(1);
print "3";
410デフォルトの名無しさん:2009/06/28(日) 11:53:46
>>406
print 1..3;
411デフォルトの名無しさん:2009/06/28(日) 12:03:51
おまいらは>>406>>400の改変と知って釣られてるクマーなのか?
412デフォルトの名無しさん:2009/06/28(日) 13:00:53
釣りを警戒してない善意のスレだと、こんなんでも釣れるもんだな
413デフォルトの名無しさん:2009/06/28(日) 19:28:24
しししまった、釣られた
414デフォルトの名無しさん:2009/06/28(日) 22:44:27
3レス読めば忘れるんかい
415デフォルトの名無しさん:2009/06/28(日) 23:09:14
釣りよりも、馬鹿が出現する方がよっぽど頻繁だしな
単にもっと馬鹿が来ただけの話
416デフォルトの名無しさん:2009/06/28(日) 23:22:41
>>415
えっ?
417デフォルトの名無しさん:2009/06/29(月) 12:42:08
すみませんが教えてください。

下記のコードの3行目と5行目が何をしているのかわかりません。

特に3行目の@{ $form_data{$name} }っていう書き方を見たことがないので
どういう配列を作っているのかがわかりません。

なぜrefで判定する必要があるのかもわからないので
詳しい方教えて下さい。


if(exists $form_data{$name} ) {
if(ref $form_data{$name} ) {
push @{ $form_data{$name} } , $value;
  } else {
$form_data{$name} = [$form_data{$name} } , $value ];
  }
else {
$form_data{$name} = $value;
}
418417:2009/06/29(月) 12:50:47
$form_data{$name}がリファレンスだった場合は、
たとえば、$form_data{$name}の値が0x1919だったら
3行目で@0x1919っていう名前の配列を作っているということなんでしょうか?

その辺がいまいちわからないのです
419デフォルトの名無しさん:2009/06/29(月) 13:19:48
perldoc perlreftut の説明やサンプルを見てみるといいよ
420デフォルトの名無しさん:2009/06/29(月) 13:24:46
>>418
ダンプして調べればいいだけ
421デフォルトの名無しさん:2009/06/29(月) 13:26:32
ようは配列に入れてるだけだろ
422デフォルトの名無しさん:2009/06/29(月) 13:42:49
無名配列
423デフォルトの名無しさん:2009/06/29(月) 13:43:11
>>417
my %form_data = (
  a => 'b',
  c => [ 'e' ],
);
こういう感じのハッシュがあった時に$nameがcだとすると、$form_data{'c'}は配列のリファレンスだから
ref $form_data{$name}は真になる。
で、その配列の次の要素に$valueを入れたいから3行目の書き方になる
push @{ 配列のリファレンス }, value
要は@{ 配列のリファレンス }が配列を表してる。@arrayと同じだと思えばいい。
push @array, value
と同じ。

で、$nameがaだとすると、ref $form_data{$name}は偽になるので5行目にいく
bをそのまま残したいから配列のリファレンスを作って、その次の要素にvalueを入れてる

つか、配列かどうかを考えるならわかりやすいように2行目を
ref $form_data{$name} eq 'ARRAY'
って俺なら書くな。HASHの場合がないからこういう書き方なんだろうけど。

リファレンスわからないなら
my $array_ref = [0, 1, 2];
for (@{ $array_ref }) { warn $_; }
my @array = (0, 1, 2);
for (@array) { warn $_; }
とか、簡単なのを色々実行して実際に試したらいいよ。
use Data::Dumper;
print Dumper 変数;
ってやると変数がリファレンスかどうかもわかるし
424デフォルトの名無しさん:2009/06/29(月) 13:44:47
>>417

if( !exists $form_data{$name} ) {
  $form_data{$name} = $value;
} elsif( ref $form_data{$name} ) {
  my $ref = $form_data{$name};
  push @$ref, $value;
} else {
  my $ref = [];
  push @$ref, $form_data{$name};
  push @$ref, $value;
  $form_data{$name} = $ref;
}

上記のようにした場合、どこが不明なのか?
その不明な部分をperldocから参照しろ。
425417:2009/06/29(月) 15:56:25
423
よーくわかりました
ありがとうございます。

426デフォルトの名無しさん:2009/06/29(月) 18:30:23

あるCGIプログラムを実行したところ
Can't locate CGI/Carp.pm と出ました。

どうやら
use CGI::Carp qw(fatalsToBrowser);
でエラーが出るようです。

ところが、
find `perl -e 'print "@INC"'` -name '*.pm' -print
でモジュール一覧を見たら
/usr/lib/perl5/5.8.0/Carp.pm
とCarp.pmが入ってるようです。
こんな事ってあり得るのでしょうか?
また、どのようにしたら、エラーが起こらず動作するようになりますか?

RHE3 perl5.8.0 です

427デフォルトの名無しさん:2009/06/29(月) 19:36:10
428デフォルトの名無しさん:2009/06/30(火) 01:07:28
な、なんだってー!?
429デフォルトの名無しさん:2009/06/30(火) 01:33:10
CGI::CarpはPerl5.4からコアモジュールなので特別な事をしない限り
入ってるはずなんだけどな。
/usr/lib/perl5/5.8.0/CGI/Carp.pm
が存在するのなら動作しているスクリプトで@INCにちゃんとディレクトリが
含まれているか確認した方がいいと思う。
あとset uidしてtaint modeになってる場合は@INCに制限が掛かる。
430デフォルトの名無しさん:2009/06/30(火) 05:16:49
Perlでファイルのロックの方法をいろいろ調べています。
flockが一番手軽で確実そうだと思ったのですが、どこを見ても環境に依存してしまうためあまり使われていないとの記述がありました。

具体的に動作しない環境はどのようなものになるのでしょうか?
現在Perlコードを動作させる予定のターゲット環境は複数あるのですが、基本的に全てGNU/Linux(一番古いもので、RedHat7.0位)か*BSD(FreeBSDかNetBSD)になります。
Perlのバージョンは、全て5以降になります。

このような環境でも、使用できない場合などございますでしょうか?
431デフォルトの名無しさん:2009/06/30(火) 05:48:03
ウェブのレンタルスペース(特に無料のもの)じゃなければ、問題ない気がする
432デフォルトの名無しさん:2009/06/30(火) 06:28:30
ttp://d.hatena.ne.jp/hide-K/20090619/1245401465 を見て
YAMLでシリアライズ/デシリアライズする実験をしていました
以下に示した上のコードを端末から実行したところ、Undefined subroutine &main:: called at -e line 7. と言われました
下のコードを実行したときはちゃんと "hello\n" が表示されました
$yamlをダンプした結果は上下とも、sub{ print "hello\n"} が入っていました(なぜか下では use strict 'refs' が頭に入っていました)が、
$obj2 = YAML::Load($yaml); の後のタイミングでダンプしてみると 上のコードでは hello => undef でした
違いは use strict のみだと思うんですが、どうして下で hello が undef になるようなことが起こったのでしょうか

my $obj = { hello => sub { print "hello\n";}, name => "hgoe"};
use YAML; $YAML::UseCode = 1;
my $yaml = YAML::Dump($obj);
warn $yaml;
my $obj2 = YAML::Load($yaml);
$obj2->{hello}->();

use strict;
my $obj = { hello => sub { print "hello\n";}, name => "hgoe"};
use YAML; $YAML::UseCode = 1;
my $yaml = YAML::Dump($obj);
warn $yaml;
my $obj2 = YAML::Load($yaml);
$obj2->{hello}->();
433デフォルトの名無しさん:2009/06/30(火) 09:10:23
>>430
unix系OSでローカルファイルシステムならまず大丈夫。

NFSで共有したファイルを複数のホストからロックする
とかいうときには問題になりやすいけど。
434デフォルトの名無しさん:2009/06/30(火) 09:19:49
>>430
>>433に同意。flockはNFSを使わないBSD/SystemV/Linux系ならまず大丈夫。
NFSの場合はlockfを使うんだっけか。
Windowsは知らん。
435デフォルトの名無しさん:2009/06/30(火) 14:33:20
文字列が漢字・ひらがな・(カタカナ)を含んでいるかどうか判定するにはどうすればいいですか
436デフォルトの名無しさん:2009/06/30(火) 14:43:12
文字コードによる

UTF-8なら、Unicodeブロックでぐぐれ
437435:2009/06/30(火) 18:58:36
Shift-JISです
UTF-8へエンコードしてからUnicodeブロックを用いて検索しましたが、エンコード周りでうまくいかなかったようでダメでした
代わりにShift-JIS用の正規表現ライブラリ「ShiftJIS::Regexp」を見つけてそれを使って解決しました
438デフォルトの名無しさん:2009/06/30(火) 23:28:30
環境に依存しないファイルロックならロックファイル方式がいいよ!
CGIじゃ常識だよ?
439デフォルトの名無しさん:2009/07/01(水) 00:36:45
Q.環境が限定出来るので簡単・強固なflockを使うのは問題ないか?
A.環境に依存しないファイルロックならロックファイル方式がいいよ!CGIじゃ常識だよ?
440デフォルトの名無しさん:2009/07/01(水) 06:34:53
>>438
ロックファイル?OSによっちゃロックに失敗するぞ。
symlinkかディレクトリ作る方が強固。
http://www.din.or.jp/~ohzaki/perl.htm#File_Lock
441デフォルトの名無しさん:2009/07/01(水) 07:47:41
>GNU/Linux(一番古いもので、RedHat7.0位)か*BSD(FreeBSDかNetBSD)
とターゲットを限定しているけど、どうせ開発・デバッグはWindowsでやるんだろ?
悪いクセをつけないためにも、OSに依存するような実装は避けた方がいいよ。
「今さえよければいいんだ、将来どうなっても知らない。明日のことは明日考えればいいんだ。」
そんな気持ちじゃダメだな。
442デフォルトの名無しさん:2009/07/01(水) 07:50:21
OSに依存しないファイルロックなんてできないわけだが…
443デフォルトの名無しさん:2009/07/01(水) 08:18:45
ファイルハンドルを変数にするのと、FILEみたいなのにするのとでは
どうちがうのですか?
444デフォルトの名無しさん:2009/07/01(水) 09:04:17
> とターゲットを限定しているけど、どうせ開発・デバッグはWindowsでやるんだろ?

そんな馬鹿な
445デフォルトの名無しさん:2009/07/01(水) 09:14:33
>>443
前者は任意のスコープを取り得るが、後者はlocalスコープしか取れない。
446デフォルトの名無しさん:2009/07/01(水) 12:44:44
>>441
> どうせ開発・デバッグはWindowsでやるんだろ?
自分がそうなんですね、分かります。
447デフォルトの名無しさん:2009/07/01(水) 22:32:53
wordpadでCGI書いてるタイプですねw
448デフォルトの名無しさん:2009/07/01(水) 22:45:05
use strict;

my $func1 = 'Fuge';
my $func2 = 'Hoge';

no strict "refs";
*{"$func1"} = \&{"$func2"};

Hoge;
Fuge();        #これを上のやつみたいに()省略して呼ぶにはどう書けばいいんでしょう

sub Hoge{
        print 'hogehoge';
}
449デフォルトの名無しさん:2009/07/01(水) 23:22:10
*{"$funk1"}= sub { $funk2 };
こんな感じでは無理?
実験してないから知らんけど
450デフォルトの名無しさん:2009/07/01(水) 23:30:37
レスありがとうございます。
どうにも上手く動かない模様です。
451デフォルトの名無しさん:2009/07/02(木) 02:09:17
無理。つうか、いまどきシンボリックリファレンスなんか使うな
452デフォルトの名無しさん:2009/07/02(木) 09:28:48
>>448
コンパイル時にサブルーチンだとわかってないとbaar wordに
なってしまいカッコは省略できない。そもそも元のプログラムじゃ
sub Hogeの定義が遅いのでHoge;もエラーになるだろ。

1. Fuge;の呼び出しより前の位置でBEGINブロック内でやる。

BEGIN {
*{"$func1"} = \&{"$func2"};
}

2. Fugeという名前がわかってるんだからプロトタイプだけでも宣言しておく。

sub Fuge;
453デフォルトの名無しさん:2009/07/02(木) 17:49:44
>>452
完璧な解答ありがとうございます。
どちらの方法でもうまくいきました。
454デフォルトの名無しさん:2009/07/03(金) 22:35:55
再帰アルゴリズムを用いて5!の計算結果を求めたいのですがなぜか値が返されません。
print "func(5)"; #5×4×3×2×1

sub func()
{
(my $n) = $_;

if($n = 1){
return 1;
}
else{
return $n * func($n);
}
}
455デフォルトの名無しさん:2009/07/03(金) 22:37:42
釣り針だらけに見えて仕方がない。
456デフォルトの名無しさん:2009/07/03(金) 22:47:08
宿題は自力で。
457デフォルトの名無しさん:2009/07/03(金) 22:55:47
454です。おかしなとこがあったので一部修正しました。
#!/usr/bin/perl

$ans = func(5);
print "$ans"; #5×4×3×2×1

sub func()
{
(my $n) = $_;

if($n == 1){
return 1;
}
else{
return $n * func($n-1);
}
}

exit;
458デフォルトの名無しさん:2009/07/03(金) 23:01:46
釣られてやる。
> (my $n) = $_;
ここがおかしいからマニュアルをよく読みなおせ。
あとは問題ない。
459デフォルトの名無しさん:2009/07/03(金) 23:09:38
ヒントありがとうございます。おかげさまで謎が解けました。
subルーチン内では特殊変数$_ではなく配列にコピーされるんですね。

#!/usr/bin/perl

$ans = func(5);
print $ans; #5×4×3×2×1

sub func()
{
(my $n) = $_[0];
if($n == 1){
return 1;
}
else{
return $n * func($n-1);
}
}

exit;
460デフォルトの名無しさん:2009/07/03(金) 23:11:20
>>459
宿題やる。

・コード
$ans = add(1,5);
print "$ans";
・結果
6

関数addを定義してみ。
461デフォルトの名無しさん:2009/07/03(金) 23:14:41
>>450

#!/usr/bin/perl

$ans = add(1,5);
print $ans;

sub add()
{
(my $n1, my $n2) = ($_[0],$_[1]);
return $n1 + $n2;
}

exit;
462デフォルトの名無しさん:2009/07/03(金) 23:15:28
アンカみすりました>>460です
463デフォルトの名無しさん:2009/07/03(金) 23:20:19
my ($n1, $n2) = @_

でいいよ。きもい。
464デフォルトの名無しさん:2009/07/03(金) 23:34:46
sub add() {〜}

は「引数なしの関数」だぞ。use strict; ではエラーになる
値渡しの引数を2個とる関数は

sub add($$) {〜}

と書く
465デフォルトの名無しさん:2009/07/03(金) 23:35:32
>460
$ans = add(1,5);
print $ans;

sub add() {
 return $_[0]*10-$_[1]+1;
}
466デフォルトの名無しさん:2009/07/03(金) 23:42:19
無難に sub add { } にしとけばいいのに
467デフォルトの名無しさん:2009/07/03(金) 23:59:21
>460
sub add($$)
{
my $n1 = shift @_;
my $n2 = shift @_;
return $n1 + $n2;
}

sub add($$)
{
return $_[0] + $_[1];
}

sub add(){
my $wa = 0;
foreach(@_){
$wa += $_;
}
return $wa;
}

sub add(){
my($n1,$n2) = (shift, shift);
return $n1 + $n2;
}

sub add(){
my $n1 = pop;
my $n2 = pop;
return $n1 + $n2;
}
468デフォルトの名無しさん:2009/07/04(土) 00:08:46
>>460

sub add(){
  shift;
  shift;
  return 6;
}
469デフォルトの名無しさん:2009/07/04(土) 00:16:04
>>468
return 6ってwww
ドンだけ決めうちww
470デフォルトの名無しさん:2009/07/04(土) 00:17:11
配列について質問です。
@array = ('aiueo',"hoge",'muge');
配列の各要素に'aiueo''hoge''muge'が格納されてますが、
この後使い終わって不要になったら
@array = ();
とすることで中身を空にできます。
C言語のmallocみたいにOSからメモリ借りて使い終わったらfreeで返す
のと似てるんですが、実際のところどうなってるんですか。
@array = ()とすることでメモリが溜めていたメモリが解放されるんだと
思っていいです?
471デフォルトの名無しさん:2009/07/04(土) 00:29:31
>>470
NO
472デフォルトの名無しさん:2009/07/04(土) 00:38:37
>>470
メモリは解放されないけど、基本的には正しい。
参照しなくなったデータはガベージコレクションの対象になる。
ただし、C言語のfreeしてもOSに返すわけじゃないし、freeしてもプロセスの
使用メモリサイズが減ることもない。
473デフォルトの名無しさん:2009/07/04(土) 00:41:06
>>469
perl ではないが、実際これに近い例があった訳だがw
程度の差はあれ、よくあるケースだよね。

>>460 のテストケースだけだったら、彼等ならやりかねない。
474デフォルトの名無しさん:2009/07/04(土) 18:33:24
無名配列や無名ハッシュは値を渡すときなどに使うのはわかるのですが、無名関数の使い道がいまいちわかりません

具体的にどういうときにつかうのでしょうか?
475デフォルトの名無しさん:2009/07/04(土) 21:01:43
例えば関数をプロットするような関数とか?

sub plot ($$$$){
my ($fn, $min, $max, $step) = @_;
for ($min; $min <= $max; $min += $step){
for (my $num = &$fn($min); $num > 0; --$num){
print '*';
}
print "\n";
}
}

&plot(
sub{
my $x = $_[0];
return $x * $x;
},
1, 5, 2 #1〜5まで2刻みで無名関数にデータを渡してプロットさせる
);
476デフォルトの名無しさん:2009/07/04(土) 22:15:50
>>475
そういうのをやるときは、「関数が渡される引数」のプロトタイプを"&"にしとくとカッコイイよ

sub plot(&$$$) { #最初の引数を"&"に変えた
my ($fn, $min, $max, $step) = @_;
for (my $num = $min; $num <= $max; $num += $step) { print '*' x $fn->($num), "\n"; }
}

plot(sub { return $_[0] ** 2; }, 1, 5, 2); # >>475と同じ呼び出し方
plot { return $_[0] ** 2; } (1, 5, 2); # こういう省略形でも書けてうれしい
477デフォルトの名無しさん:2009/07/05(日) 16:39:51
配列の要素を、カンマ区切りでスカラーにしたいのですがどのような方法がありますでしょうか?
( "foo","bar","baz",)
とあったとすると、
"foo,bar,baz"
としたいです。

私が考えたのは、foreachでカンマ区切りで文字列結合をしていく方法ですが、他に方法があればと思い質問させていただきました。
478デフォルトの名無しさん:2009/07/05(日) 16:44:13
Windows XPの端末からサーバに対してSSHで接続してコマンドを実行する
Perlプログラムを作っているのですが、下記のようなエラーが出てうまく動きません。

Can't locate Net/SSH/Perl.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .)
test_ssh.pl内の「use Net::SSH::Perl;」の行でエラー出てます。

PPMを使ってNet-SSH(ver0.09)をインストールしてますが、何が悪いのか良く分かりません。。どなたかご教授願います。
ActivePerlはv5.10.0です。
479デフォルトの名無しさん:2009/07/05(日) 16:52:50
>>477
join
480デフォルトの名無しさん:2009/07/05(日) 16:55:32
>>477
ずばりjoin

print join(",", ("foo", "bar", "baz",));
481デフォルトの名無しさん:2009/07/05(日) 16:57:09
配列のリファレンスを渡す関数があるのですが、スカラー値をスマートにその関数に渡す方法はありませんか。
482デフォルトの名無しさん:2009/07/05(日) 16:59:56
>>478
単に Net::SSH はあっても Net::SSH::Perl がないんじゃないの?
ttp://search.cpan.org/dist/Net-SSH-Perl/
483477:2009/07/05(日) 17:00:41
>>479, 480
何か簡略した記法があるかと思い質問させていただいたのですが、まさにまんまの関数が用意されていたのですね・・。
助かりました。ありがとうございます。
484デフォルトの名無しさん:2009/07/05(日) 17:11:16
>>481
スカラーを渡したら「要素数1の配列のリファレンス」とみなすってことか?
485デフォルトの名無しさん:2009/07/05(日) 17:21:19
>>484
どうせつめいしたらいいのかわからないのですが、現在は
my @array = ( $scalar)
hoge( \@array);
とクッションをおいてわたしているのですが、スマートな方法はありませんか。
486デフォルトの名無しさん:2009/07/05(日) 17:22:23
hoge([$scalar]);
487デフォルトの名無しさん:2009/07/05(日) 17:28:11
>>481
よく分からんけど書いてみた

my $ref = [qw(foo bar)];
my $scl = 'hoge';

huga($ref);
huga($scl);

sub huga($){
my @ary;

ref $_[0] eq 'ARRAY' ? push @ary, @{$_[0]} : push @ary, $_[0];

print join ', ', @ary;
print "\n";
}
488デフォルトの名無しさん:2009/07/05(日) 17:37:01
どう受け取るかじゃなくてどう渡すかでしょ。
>>481が知りたかったのは>>486だと思うよ。
489デフォルトの名無しさん:2009/07/05(日) 17:49:15
>>487>>481>>484だとした場合の解答だな
あとは>>481の意図が>>486なのか>>487なのかってことだ
490デフォルトの名無しさん:2009/07/05(日) 20:04:47
>>486の方でした。
>>487もありがとう
491デフォルトの名無しさん:2009/07/06(月) 00:41:00
おまいらアンカー使い過ぎ
492デフォルトの名無しさん:2009/07/07(火) 14:23:27
既出の問題なのですがぐぐってもわからなかったので質問させてください。
perlとMechanizeのバージョンを上げたところ内部でUTF-8に自動変換
されるようになったようでEUCで書かれたサイトからGETしても
$mech->content()するとUTF-8にデーコードされた内容が返ってきます。

とりあえず一部応急処置的に「$mech->response->content()」
とやる事で受け取る側の処理は問題なくなったのですが
$mech->field("hoge"=>"EUCコードの文字");
とやるとEUCコードがUTF-8に変換されて自動送信され
相手側の方で文字化けした状態で表示されます。
UTF-8ではなくEUCコードでPOST or GETしたいような場合はどのようにすればよいでしょうか?
493デフォルトの名無しさん:2009/07/07(火) 19:43:25
リファレンスの先も含めて、変数が配列かスカラーかハッシュかを調べる方法はありませんか?
494デフォルトの名無しさん:2009/07/07(火) 19:47:54
ref
495デフォルトの名無しさん:2009/07/08(水) 10:59:03
CGIの制作を行おうと思っているのですが、ファイルのコピーについてわからないことがあります。

サンプルスクリプトを見ていると、画像のアップロードを行った後にFile::Copyにてファイルをディレクトリにコピーしているのですが、コピーしているということは元ファイルがあるのでしょうか?
それともCGIの引数で渡されたものが、メモリに格納されているだけでディスク上にはなく、メモリからコピーしていると考えていいのでしょうか?
496デフォルトの名無しさん:2009/07/08(水) 11:07:08
モジュールが標準モジュールか、自分でいれたモジュールかを調べる方法はないでしょうか?perldocを見てみたのですが、そのような記載はないようでした。
また、perldocに振られている番号の割り当てを調べたのですが、一覧がありませんでした。
番号の一覧を書いているサイトはありませんでしょうか。
497デフォルトの名無しさん:2009/07/08(水) 11:07:59
new CGI されて生成されたオブジェクト周辺の
ファイル出力を見てみ
498デフォルトの名無しさん:2009/07/08(水) 11:16:13
インストール直後のディレクトリを走査しときゃいいんじゃない?
499デフォルトの名無しさん:2009/07/08(水) 11:18:27
>>495
File::Copyはファイルからファイルにコピーしかしないので、
そこに到達する前のどこかでファイルに書いているんだろう。
例えば標準のCGIモジュール使ってたら自動的にやってくれる。
500デフォルトの名無しさん:2009/07/08(水) 11:19:48
>>496
Module::CoreList使うのは?
501496:2009/07/08(水) 11:59:03
>>498, 500
ありがとうございます。
私が行いたいことを書いてなかったので、うまく説明ができていなかったようですので、さいど書き込みをさせていただきます。

私が行いたいことは、現在Perlを利用したプログラムを作成しているのですが、あるモジュールがどのバージョンから標準モジュールとして取り入れられているかがしりたいです。
これは、そのプログラムの動作環境としてPerl単体のバージョンの表記を行いたいためにかんがています。
502デフォルトの名無しさん:2009/07/08(水) 12:31:15
どのバージョンからコアモジュールになったか調べられる
Module::CoreListがコアモジュールになったのはPerl5.8.9からです。
503デフォルトの名無しさん:2009/07/09(木) 02:41:19
ABCDEFGHI・・・・   と表示させたいので
for(65..90){
  my $i = sprintf "%X", $_;
  print "\x"."$i";
}
としてみたのですが、 [NULL]41[NULL]42[NULL]43・・・・・
と表示されてしまいます。(\xと数字がペアになってくれない)
何か良い方法はありませんか?
504デフォルトの名無しさん:2009/07/09(木) 02:50:07
for(65..90){
print pack 'C',$_;
}
505デフォルトの名無しさん:2009/07/09(木) 02:58:05
print chr for (65..90);
506デフォルトの名無しさん:2009/07/09(木) 05:44:24
print chr for 65..90;
507デフォルトの名無しさん:2009/07/09(木) 11:02:16
処理速度を速くするテクニックにはインライン展開以外になにがありますか?
508デフォルトの名無しさん:2009/07/09(木) 11:35:33
最適化でググれ
509デフォルトの名無しさん:2009/07/09(木) 12:15:24
>>507
まずはプロファイラでどこに時間がかかってるか調べること。
話はそれからだ。
510デフォルトの名無しさん:2009/07/09(木) 15:50:23
>>507
設計からやり直す。
511デフォルトの名無しさん:2009/07/09(木) 17:37:34
>>507
漏れに委託する
512デフォルトの名無しさん:2009/07/09(木) 17:42:59
>>507
マジレスするとマシンに金かける。
513デフォルトの名無しさん:2009/07/09(木) 17:44:50
>>507
新幹線の中で実行する
514デフォルトの名無しさん:2009/07/09(木) 17:47:40
>>513
相対性理論によると、移動中の物体を地表から観測すると移動中の物体は
時間がゆっくり進んでいるように見えるはずだが。
515デフォルトの名無しさん:2009/07/09(木) 18:07:52
>>508-510
うは…手厳しい…
ガチでシステムの処理速度を改善しようってわけではなく、
とりあえず最適化ってやつの練習をしてみようと思いたった次第です
自作セッション管理モジュールで実験したところそれなりに高速化できたと思われるので、
更なる高速化を目指し、インライン展開以外に何か劇的に改善するためのポピュラーな手法がないのかなと…
516デフォルトの名無しさん:2009/07/09(木) 18:11:05
それは距離間も関係する

500m 先を 300km で走る新幹線よりも
1m 先を 100km で走る自動車の方が速い
517デフォルトの名無しさん:2009/07/09(木) 18:12:51
Perlのコードを手動でインライニングしてんの?
ただのアホだろ
518デフォルトの名無しさん:2009/07/09(木) 18:19:26
ベンチ取りながら地道にいじってみるとか。
519デフォルトの名無しさん:2009/07/09(木) 18:24:40
ラクダ本の24章Perlの常識はオススメ。
520デフォルトの名無しさん:2009/07/09(木) 18:37:26
うちのラクダ本2nd Edition(´・ω・`)
521デフォルトの名無しさん:2009/07/09(木) 22:18:34
>>515
おそらくあなたの書くコードは、インライン展開なぞするまえに
やるべきことが100くらいあるはず。
522デフォルトの名無しさん:2009/07/09(木) 23:07:34
>>507
インライン展開すると速くなるってのは自分で調べたの?
523デフォルトの名無しさん:2009/07/10(金) 19:19:49
>>504-506
できました
ありがとうございました
524デフォルトの名無しさん:2009/07/10(金) 22:11:41
winのactiveperlで、
文字列をバイナリで読み込んで、
$str =~ /[\x00-\x1f]/
という表示できなさそうな文字チェックをした時に、
\x1a を含んだ文字列がしれっとパスしてしまいますが、何故ですか
525デフォルトの名無しさん:2009/07/11(土) 00:12:02
>>518
ありがとうございます
とりあえずやってみてます
mapのほうがforeachより速かったのはビックリでした

>>519
やっぱりラクダ本は必要ですか。。。
Perl6のが出るまで我慢しようかと思ってましたが。。。

>>522
そうです
どこかで聞きかじってはいたんですが、具体的にどうすれば展開されるかは調べるまで知りませんでした
526デフォルトの名無しさん:2009/07/11(土) 00:15:01
>>524
その文字列をバイナリダンプしたら、含まれてる筈の\x1aが無かったりしないか?
とりあえず再現コードくらいは書け。
527デフォルトの名無しさん:2009/07/11(土) 00:18:11
>しれっとパス

他人にもわかるように書けよ
528デフォルトの名無しさん:2009/07/11(土) 00:34:50
>>524
チェックしてない
529デフォルトの名無しさん:2009/07/11(土) 05:13:18
>>524
なんかのミスだろ。Perlは0x1Aを特別視しないし。

#!/usr/bin/perl

$str1 = "123". chr(0x1a);
$str2 = "123";

print "str1 has 0x1a\n" if $str1 =~ /[\x00-\x1f]/;
print "str2 has 0x1a\n" if $str2 =~ /[\x00-\x1f]/;
__END__
% perl test.pl
str1 has 0x1a
_
530デフォルトの名無しさん:2009/07/11(土) 05:33:22
あれ
現象だけを抽出したサンプルを書こうとすると、ちゃんと動く

多分、getc 周りだったんだと思う
531デフォルトの名無しさん:2009/07/11(土) 09:02:10
>>530
> 現象だけを抽出したサンプルを書こうとすると、ちゃんと動く

それは質問する前に最低限しておくべきことだろ。
自分は正しいと思う心が原因不明のバグの一番の発生源だからな。
532デフォルトの名無しさん:2009/07/11(土) 10:54:26
>>529
うちも問題なく動いた

% cat > a.pl
#!/usr/bin/perl
$str1 = "123". chr(0x1a);
$str2 = "123";
print "str1 has 0x1a\n" if $str1 =~ /[\x00-\x1f]/;
print "str2 has 0x1a\n" if $str2 =~ /[\x00-\x1f]/;
__END__
^C

% perl a.pl
str1 has 0x1a
533デフォルトの名無しさん:2009/07/11(土) 11:09:34
どうでもいいけど ^C じゃなくて ^D 使おうな
534デフォルトの名無しさん:2009/07/11(土) 13:37:11
535デフォルトの名無しさん:2009/07/11(土) 14:10:03
で、Perlで複数のファイルから参照する変数をひとつのファイルにまとめる場合、どうするのがいいの。
536デフォルトの名無しさん:2009/07/11(土) 14:33:15
>>535
よく分からんけどモジュール化して使うとこで use してやればいいんじゃないかな
537デフォルトの名無しさん:2009/07/11(土) 14:51:43
>>536
だな。簡単なコード書いてみた

#---------------------- main.pl
use strict;
use MyData;

print "$scalar\n";
print "@array\n";
print "@{[%hash]}\n";

#--------------------- MyData.pm
package MyData;
use strict;
use Exporter;
our @ISA = qw(Exporter);

our $scalar = 1;
our @array = (1 .. 5);
our %hash = (foo=>6, bar=>7);

our @EXPORT = qw($scalar @array %hash);

1;
538デフォルトの名無しさん:2009/07/11(土) 19:34:54
他にないの。

変数が数十になると、めんどいじゃないか。
539デフォルトの名無しさん:2009/07/11(土) 20:03:57
なんでそんな変数ばかり公開する必要があるんだ
540デフォルトの名無しさん:2009/07/11(土) 20:25:40
>>208辺りの人がまだ気にしてるのか。
541デフォルトの名無しさん:2009/07/11(土) 20:34:25
なんだ、前にこんな楽しいやりとりがあったのか
ていうか、>>209で答が出てるじゃん
こういうのは、フツーの方法を使っとけばいいんだよね
542デフォルトの名無しさん:2009/07/12(日) 00:43:02
>>538
ハッシュにして渡せばそんなにたくさん渡さなくていい上にグローバルな変数だってことが一目瞭然
543デフォルトの名無しさん:2009/07/12(日) 00:43:30
とゆうことは変数を設定するコードを書かなくても変数が設定されるよなコードを書けばいいんだな?
wizardでも難しいぞこれ
544デフォルトの名無しさん:2009/07/12(日) 04:26:30
>>232でプロの方が教えてくれてるじゃん。
現行スレの過去レスくらい読めよ
545デフォルトの名無しさん:2009/07/14(火) 11:49:36
@ISA
アイサってなにさ、とずっと思ってた。イズアだったのか
546デフォルトの名無しさん:2009/07/14(火) 12:29:33
最初に思いついた答えにしがみつき、他の可能性を考えもしない > バグ生成機
547デフォルトの名無しさん:2009/07/14(火) 13:57:30
長い処理を fork するってのは有効な手段だとは思いますが、
fork したプロセスが正常に終わったのかとか、まだ起動中なのかとか、
調べるための手段ってあるんですか?

手前の日記スクリプトで検索の機能付けたんですが、現状2000ほどの
テキストファイルを総スキャンして検索するとタイムアウトが起きてしまいます。
なので今は投稿したエントリを検索用の1つのファイルにまとめて逃げては
居ますが、この現状を打破したいと考え、その前段階として fork にて伺いました。
548デフォルトの名無しさん:2009/07/14(火) 14:22:06
>>547
基本的にはwaitすれば子プロセスの終了コードが$?に入る

でもシグナルの設定とかいろいろ面倒なこともあるから、
perldocでperlipcを読みながらちょっとずつ練習するといい
549548:2009/07/14(火) 14:25:04
>>547
まさか2000のファイルを総スキャンてレンタルサーバでのな話?
だったら無謀なのでやめれ。ファイルスキャンはIO負荷が高すぎ
自分のマシンでならご自由に
550デフォルトの名無しさん:2009/07/14(火) 17:53:56
>>548
perlipc っていうキーワードを元にあっちゃこっちゃうろついてみます m(_ _)m

自鯖です
P!!! 1GHz ってのも、なかなか辛くなってまいりました orz
素直に DB にぶちこんだほうがいいんですかね・・・
ただ 512MB のマシンに DB とか自滅するようなもんだし困ったもんですw
551デフォルトの名無しさん:2009/07/14(火) 18:33:25
>>550
> 素直に DB にぶちこんだほうがいいんですかね・・・

全文検索エンジンインストールすればいいだけだろ。
552デフォルトの名無しさん:2009/07/14(火) 18:54:16
>>550
車輪の再発明みたいなことをするなよ
553デフォルトの名無しさん:2009/07/14(火) 20:35:54
っていうけど車輪の再発明せずにどうやってスキルをあげると言うんだ
554デフォルトの名無しさん:2009/07/14(火) 20:51:09
車輪を観察するんだ
555デフォルトの名無しさん:2009/07/14(火) 21:28:10
>>553
なにも車輪を再開発しなくても、車輪を実現した考え方を盗めばいい。
556デフォルトの名無しさん:2009/07/14(火) 22:11:41
>>553
車輪をばらしてもっかい組み立てるんだよ。
再開発もいい勉強にはなるが、結果には繋がらない。
既存の車輪を見て愕然とするのが落ち。
557デフォルトの名無しさん:2009/07/15(水) 11:33:43
車輪の再開発は有効
それすらやらないやつほどイレギュラーに弱い
558デフォルトの名無しさん:2009/07/15(水) 12:38:21
仕事ならなにやってんだよってとこだが、勉強なら大いにやるべきだな。
やっぱり手を動かしてから見ると理解の深さが違うしね。
559デフォルトの名無しさん:2009/07/15(水) 12:58:16
車輪の再開発と車輪の再発明を混同するやつは優秀なバグ生成者

560デフォルトの名無しさん:2009/07/15(水) 13:08:25
>>559
言葉遊び
561デフォルトの名無しさん:2009/07/15(水) 14:36:06
>>559
プログラマは一語一句を正確に読みとってこそだというのはその通りだが、
しかし、「開発」と「発明」の違いがわかっていないバカもいるぜ。
562デフォルトの名無しさん:2009/07/15(水) 15:01:40
と自演
563デフォルトの名無しさん:2009/07/15(水) 15:10:39
さーて 今日もPerlで発明するか
564デフォルトの名無しさん:2009/07/15(水) 15:43:15
さーて 今日もPerlを発明するか
565デフォルトの名無しさん:2009/07/15(水) 15:45:02
なにこのスレ
566デフォルトの名無しさん:2009/07/15(水) 16:07:06
@INCについて質問です。
@INCがどのように組み立てられるか知っている方がいたら教えてもらえますか。
perl本体をコンパイルした時に@INCが決まると思うのですが、以下のようにコンパイルしたところ、

$ sh Configure -des \
-Dcc='gcc' \
-Doptimize='-O2' \
-Dinc_version_list=none \
-Dcf_email='root@localhost' \
-Dperladmin='root@localhost' \
-Dotherlibdirs=/usr/local/lib/perl5/i686-linux:/usr/local/lib/perl5

@INCの中に2重で読み込まれるpathが出てきました
$ ./perl -e 'print join "\n", @INC'
/usr/local/lib/perl5/5.10.0/i686-linux
/usr/local/lib/perl5/5.10.0
/usr/local/lib/perl5/site_perl/5.10.0/i686-linux
/usr/local/lib/perl5/site_perl/5.10.0
/usr/local/lib/perl5/i686-linux
/usr/local/lib/perl5/5.10.0/i686-linux
/usr/local/lib/perl5/5.10.0
/usr/local/lib/perl5
.
# 以下の2つが重複しています。
/usr/local/lib/perl5/5.10.0/i686-linux
/usr/local/lib/perl5/5.10.0

で、既にインストール済みのperl5.10.0が同じ@INCなのでこれを読み込んでいるのかな?
と想像しているのですが、実際にどういう動きをしているのかわからないので質問しました。
重複しないようにコンパイルする方法はありますでしょうか?
というか、そもそも何で重複したのかがわからないのです。
567デフォルトの名無しさん:2009/07/15(水) 16:08:25
あるディレクトリにperlスクリプトファイルとそれ以外のテキストファイルなどが混在しています。
ファイルの先頭行が
#! /usr/bin/perl
で始まるファイルにだけ実行属性を付与(chmod +x)したいのですが、良い方法はありますか?
568デフォルトの名無しさん:2009/07/15(水) 16:14:37
>>567
普通にやればいいじゃん
569デフォルトの名無しさん:2009/07/15(水) 16:19:19
>>567
perl -e '<>; `chmod +x $0` if qr(^#!/usr/bin/perl);' *

とか?動くかしらんけど。
570デフォルトの名無しさん:2009/07/15(水) 16:37:23
>>569
残念ながらうまくいきませんでした。が、とても参考になりました。後は自力でなんとかなりそうです。ありがとうございました。
571デフォルトの名無しさん:2009/07/15(水) 17:21:24
perlのソースだからってperlでやらなくてもw
572566:2009/07/15(水) 17:41:30
/usr/local/lib/perl5/5.10.0/i686-linux
/usr/local/lib/perl5/5.10.0
が@INCに重複する件ですが、この2つのディレクトリが存在する時に起こるみたいです

2つのディレクトリを消して実行してみると@INCは重複しておらず、
mkdirで空のディレクトリを作成すると@INCが重複してしまう。

どういう仕組みになってるのかわからなくて気持ち悪いのと、何で中途半端な順番で重複するのかというのと。。
573デフォルトの名無しさん:2009/07/15(水) 18:20:56
ソースを読まずに仕様を突き止めるクイズでもやってるの?
574デフォルトの名無しさん:2009/07/15(水) 18:50:17
my ($tmpDATE, $tmpKEN, $tmpHALL, $tmpTICKET, $tmpPROGRESS, $tmpMEMBER, $tmpNOTE) = split(/\t/, $line);

たとえばこんな感じで split した際に、$tmpHALL が空だった場合に '-' を入れておくような感じにできますか?

今は強引に
$tmpHALL = '-' if !$tmpHALL;
$tmpNOTE = '-' if !$tmpNOTE;
とかやってます orz
575デフォルトの名無しさん:2009/07/15(水) 19:01:47
これでちょっと楽になるかな?
my ($tmpDate, …略…) = map { ($_ eq "") ? "-" : $_ } split(/\t/, $line);

データに"0"がないことが確実なら
… map { $_ || "-" } …
でもいいけど、たいてい"0"が入ってきて破綻するw
576デフォルトの名無しさん:2009/07/15(水) 19:13:40
あ〜、なるほど。そういう書き方か。

データには 0 は 100% 無いので、この書き方使わせてもらいます m(_ _)m
577デフォルトの名無しさん:2009/07/15(水) 19:18:32
perl6の//演算子があれば楽なんだけどね
578デフォルトの名無しさん:2009/07/15(水) 19:20:33
>>577
それはundefにしか反応しないだろ
579デフォルトの名無しさん:2009/07/15(水) 19:55:12
正規表現のメタ文字を一括エスケープする関数ってある?

phpだと以下。
http://www.php.net/manual/ja/function.preg-quote.php
580デフォルトの名無しさん:2009/07/15(水) 19:57:36
そんなものないが、単に\Q...\Eで囲えばいい。
581デフォルトの名無しさん:2009/07/15(水) 20:02:52
quotemeta
582デフォルトの名無しさん:2009/07/15(水) 20:15:21
>>580 >>581
サンクス!
583デフォルトの名無しさん:2009/07/15(水) 21:04:17
>>577
× perl6
○ perl5.8.10以降
http://search.cpan.org/dist/perl-5.10.0/pod/perl5100delta.pod#Defined-or_operator

どちらにしろundefではなく空文字列だから使えない。使うならeqかlength
584デフォルトの名無しさん:2009/07/15(水) 21:05:18
× 5.8.10
○ 5.10.0
だな、すまん
585デフォルトの名無しさん:2009/07/15(水) 23:30:24
最初の設計の段階で、
なんで '0' を通しちゃう仕様にしたんだろうな
586デフォルトの名無しさん:2009/07/16(木) 00:23:43
その疑問より、なんでいまだにPerl使いつづけてるんだろうな? という
疑問の方が、より妥当。
587デフォルトの名無しさん:2009/07/16(木) 00:25:54
>>586
なんとなく
588デフォルトの名無しさん:2009/07/16(木) 01:02:42
trueとfalseとして、'1'と'0'が使えることにあんまりメリットを感じない
589デフォルトの名無しさん:2009/07/16(木) 01:08:21
>>586
正直それは思う。
なんか古い馴染みのスナックみたいだな。いまさら別の店に浮気すんのもアレだし。
でもPerl6が出たら、Pythonに乗り換えようかなw
590デフォルトの名無しさん:2009/07/16(木) 01:38:03
もう何をやるにもオブジェクト指向だから、
どうせ何を使ってもそこそこ面倒くさい
591デフォルトの名無しさん:2009/07/16(木) 09:31:52
>>585
0をfalseにしないと、数値コンテキストで偽がなくなっちゃうから。

そして'0'を偽にしても、ファイルの末尾が0で終わって改行がないという
特殊な場合以外、発生しうる問題は全て回避可能だとLarry Wallが判断したから。

>>586
PHPが腐りかけのミカンみたいになってきてる上、
PerlはCatalystとMooseが来てCPANが異常に充実してきてるので、
Webプログラミング界隈はいずれPerlに再移行すると読んでるのだが。
ここんとこPerl関連のコミュニティもなんかやたら熱いし。
592デフォルトの名無しさん:2009/07/16(木) 10:38:03
アフォでもコーディング出来てアフォでも高速に動かせる仕組みが無いと
Perlに回帰することは無いよ
593デフォルトの名無しさん:2009/07/16(木) 10:42:10
改行コードの0x0Aだけを使いたいのだけど
win版じゃ無理?外部ファイルから読み込んでも0D0Aになってしまう
594デフォルトの名無しさん:2009/07/16(木) 13:52:03
595デフォルトの名無しさん:2009/07/16(木) 16:43:10
数値コンテキストで偽がなくなると困るの?
596デフォルトの名無しさん:2009/07/16(木) 17:35:07
今さらなくなったら困るだろ
while (--$count) { ... } とかを
while (--$count != 0) { ... } みたいに書き換えなきゃならない
597デフォルトの名無しさん:2009/07/16(木) 18:15:52
ああ、それは確かに困る

「ゼロになるまで」はループの基本だしな
598デフォルトの名無しさん:2009/07/17(金) 03:30:36
その条件ならfor使うかなあ、俺
599デフォルトの名無しさん:2009/07/17(金) 03:36:25
カウンタは増えたり減ったりするから、for では書けないな
600デフォルトの名無しさん:2009/07/17(金) 08:05:40
>>599
for( $count = 10; $count > 0; $count--){}
for( $count = 0; $count < 10; $count++){}
で何か問題あるのか?>>598はforeachの略じゃないと思うぞ
601デフォルトの名無しさん:2009/07/17(金) 08:58:48
perlのforとforeachは同じだろうが
602デフォルトの名無しさん:2009/07/17(金) 12:09:09
そ ん な か っ た る い こ と

い ま さ ら で き る か よ !
603デフォルトの名無しさん:2009/07/17(金) 12:09:54
その条件ならjavaに乗り換えるかなあ、俺
604デフォルトの名無しさん:2009/07/17(金) 12:10:36
その条件ならドットネットwに乗り換えるかなあ、俺
605デフォルトの名無しさん:2009/07/17(金) 12:11:27
その条件ならCOBOL(死語)に乗り換えるかなあ、俺
606デフォルトの名無しさん:2009/07/17(金) 12:48:56
foreachって書いたことないな
607デフォルトの名無しさん:2009/07/17(金) 12:58:52
>>599
for (1..$loopcount) で間に合う場面も多いだろ。
ループ中にループ変数が不規則な変化をするような場合には使えないけど。
608デフォルトの名無しさん:2009/07/17(金) 17:57:49
print foreach(@array);

とかしない?
609デフォルトの名無しさん:2009/07/17(金) 18:08:27
>>607
だから増えたり減ったりって書いてあるだろ
610デフォルトの名無しさん:2009/07/17(金) 18:17:08
>>608
print for(@array);

ならする
611デフォルトの名無しさん:2009/07/17(金) 18:35:35
print foreach 0..9;
とか
for my $i (0..9) { print $i }
とか
foreach ($i = 0; $i < 10; $i++) { print $i }
って動くんだw
612デフォルトの名無しさん:2009/07/18(土) 05:57:18
print for (@ary);
って
print @ary;
とどう違うの?
613デフォルトの名無しさん:2009/07/18(土) 06:11:30
$,とか$\
614デフォルトの名無しさん:2009/07/18(土) 11:07:08
>>612
printじゃなくせばわかる
615デフォルトの名無しさん:2009/07/18(土) 13:57:42
open(F,"text");

print <F>;
print <F>;
print <F>;

2回目以降何も表示されないのだれけど毎回openしないとだめなの?
変数代入せずにprintしたいんだけど
616デフォルトの名無しさん:2009/07/18(土) 14:06:36
一回目でEOFになるからな
617デフォルトの名無しさん:2009/07/18(土) 14:32:41
my @arr = <F>;
618デフォルトの名無しさん:2009/07/18(土) 15:03:04
cpanからのインストールについて教えてください。

cpanからXML:RSSをインストールしたが、いざuse XML::RSSを使うと、
Can't locate XML/RSS.pm in @INCとエラーになる。

じゃあインストールされていないのかと >cpan i /XML:RSS/で調べると、
モジュールの一覧が出てくるのでインストールは出来ているみたい。

ただしperldoc XML::RSSで調べるとNo documentation found for "XML::RSS".
と出るので、何らか問題はあるみたい。

どうしたらいいでしょうか?
619デフォルトの名無しさん:2009/07/18(土) 15:39:00
>>618
なぜそういう事態に至っているのか調べる
620デフォルトの名無しさん:2009/07/18(土) 15:53:05
モジュール一覧にインストールされている事を示す記号がついていないというオチだろうな。
621デフォルトの名無しさん:2009/07/18(土) 16:38:07
\0って0x00じゃないの?
0x00はどうやtって出すの?
622デフォルトの名無しさん:2009/07/18(土) 16:54:30
自己解決しました
スミマセン。
623598:2009/07/18(土) 18:02:55
forとforeachは何となく使い分けてるなあ。
やってることは同じだし、Perlの美学からは外れてるかもしれないけど。

>599
カウンタがループ中でも増減するという状況なら、
自分も while を使うかもしれない
624デフォルトの名無しさん:2009/07/18(土) 19:43:47
foreachを使ったことがない
625デフォルトの名無しさん:2009/07/18(土) 20:34:17
ぐちゃみそparser言語の筆頭たるPerlにしては、珍しく冗長な記述だから
気になるんだよね>forとforeach
626デフォルトの名無しさん:2009/07/18(土) 20:41:35
「forでもforeachでもどっちでもいいっす」というぐだぐだこそPerlの真髄
627デフォルトの名無しさん:2009/07/18(土) 22:09:29
初歩的な質問なんですが、
perlで組んだプログラムはhttpサーバーを通さないと動かせないの?
628デフォルトの名無しさん:2009/07/18(土) 22:23:07
httpアプリならhttpサーバを通さないと動かない。
httpじゃ無いアプリならhttpサーバを通さなくても動く。
629デフォルトの名無しさん:2009/07/18(土) 22:54:04
>>628
テストコードもろくに書かない主義ですか。
630デフォルトの名無しさん:2009/07/18(土) 22:58:35
>>629
馬鹿なの?
631デフォルトの名無しさん:2009/07/18(土) 23:11:21
632デフォルトの名無しさん:2009/07/18(土) 23:18:06
>>630
おいおい・・・・
いまどきコード書いてはブラウザリロードして開発してるわけ?
その分じゃ開発手法もレガシーだろうから、相当工数損してるな。
633デフォルトの名無しさん:2009/07/18(土) 23:37:45
ねぇ、なんでそんなことでマジレスしてんの?
634デフォルトの名無しさん:2009/07/18(土) 23:47:55
>>629
その「テストコード」とやらは、httpアプリなの?
635デフォルトの名無しさん:2009/07/18(土) 23:57:27
>>632
perl ならその程度のテストが一番お似合いだとおもうけど。
636デフォルトの名無しさん:2009/07/19(日) 00:00:10
>>635
おまえは死ぬまでブラウザリロードしてろw
637デフォルトの名無しさん:2009/07/19(日) 00:14:23
すんません、教えてください。
ブラウザでリロードする以外に、どんな開発手法がありますか?

あと、「perlとはCGIなり、CGIとはperlなり。perlとはCGIの代名詞である」
って認識で合ってますよね?
638デフォルトの名無しさん:2009/07/19(日) 00:39:36
>>637
板違い
639デフォルトの名無しさん:2009/07/19(日) 00:42:24
>>637
合ってるような合ってないような
今時のPerlは、mod_perlプログラミングだから。
mod_perlがあることで、PHPに対して優位性を保ってると言える。

テストコード云々の話は、ブラウザで結果を確認しなくてもいいような
ドライバのようなもの作るという話でしょ。PerlやWebに限った話でもない。
640デフォルトの名無しさん:2009/07/19(日) 00:43:07
>>636
オートリロードしてくれるように設定できるの知ってる?
641デフォルトの名無しさん:2009/07/19(日) 01:18:57
>>640
マジックコード埋め込んでテスト楽になったと喜んでたら、
そのままリリースして、リロード繰り返すページになってしまって顰蹙、
という話ですね。わかります。
642デフォルトの名無しさん:2009/07/19(日) 01:36:09
だめだこりゃ
643デフォルトの名無しさん:2009/07/19(日) 01:42:08
>あと、「perlとはCGIなり、CGIとはperlなり。perlとはCGIの代名詞である」
>って認識で合ってますよね?
⊂ミ⊃^ω^)アウアウ
644デフォルトの名無しさん:2009/07/19(日) 03:49:53
コナミコマンドですね わかります
645デフォルトの名無しさん:2009/07/19(日) 04:36:26
お前はあまりにもわかりすぎる。
646デフォルトの名無しさん:2009/07/19(日) 06:08:32
mod_perl もCGIだコノヤロー!
647デフォルトの名無しさん:2009/07/19(日) 07:55:16
Perlスクリプトが$ENV{HTTP_REFERER}を期待していた場合、そのPerlスクリプトは、
CGIに依存してる。

use CGI;はCGIに依存してる。
648デフォルトの名無しさん:2009/07/19(日) 08:20:43
>>634
モジュールを叩くCLIだろjk。

>>637
CLIでデバッグ
Catalystで言うscript/app_server.plなどで動作チェック。
t/*.tでロジックに瑕疵がないかチェック
完成したなと思ったらhttpd+ブラウザで連結テスト。

Apacheとブラウザリロードで開発してるとかいう奴はServerError出たらどうしてんの?
Apacheのログわざわざ見るわけ?malformed headerとか出てたらどーすんの?
原因がSQLエラーだったら今度はsqllog見るわけ?
泣けてくるな。いつの時代だよ。

> あと、「perlとはCGIなり、CGIとはperlなり。perlとはCGIの代名詞である」

PerlはPHPと違ってWebプログラミング言語ではないよ。親和性が高かっただけ。
あとCGIとは何かWikipediaでも何でもいいから勉強しなされ。

>>647
> Perlスクリプトが$ENV{HTTP_REFERER}を期待していた場合、そのPerlスクリプトは、
> CGIに依存してる。

え?REFERERは元々ブラウザのオレオレ実装だろ。
ttp://hoohoo.ncsa.illinois.edu/cgi/env.html
649デフォルトの名無しさん:2009/07/19(日) 08:35:50
PerlがCGIの代名詞なのは、まあいいかなと思う自分がいる。
最近CUIツールにしか使ってないけど。
650デフォルトの名無しさん:2009/07/19(日) 08:58:18
>>648
> In addition to these, the header lines received from the client, if any,
> are placed into the environment with the prefix HTTP_ followed by the header name.
651デフォルトの名無しさん:2009/07/19(日) 09:12:25
>>650
おお。これは失礼した。
652デフォルトの名無しさん:2009/07/19(日) 09:19:00
> Apacheとブラウザリロードで開発してるとかいう奴はServerError出たらどうしてんの?
> Apacheのログわざわざ見るわけ?malformed headerとか出てたらどーすんの?

use CGI::Carp qw(fatalsToBrowser);

> 原因がSQLエラーだったら今度はsqllog見るわけ?

use DBI;
use DBD::***;
my $dbh = DBI->connect("……") or die $DBI::errstr;
$dbh->prepare($sql_euc);
die $dbh->errstr if $dbh->errstr;
これでそのとき投げたSQLとともにエラーがブラウザ上から見えます。

もっとも動かす前に perl -wc しとくのがいいけど、実行時エラーはわからないから。
いきなりサーバで動かすと、うっかり無限ループになってあわててsshでログインして
プロセス殺したこともあるけどorz
653デフォルトの名無しさん:2009/07/19(日) 10:29:44
板違いだろうが。お前等全員池沼か?
654デフォルトの名無しさん:2009/07/19(日) 11:53:04
perl は sed の発展系と思っているオレは異常か?
655デフォルトの名無しさん:2009/07/19(日) 12:13:23
>>654
元々がawkの代替で、その後sedだのCだのshだののいいとこどりした言語だからな。
656デフォルトの名無しさん:2009/07/19(日) 12:16:10
>>652
それなりに工夫はしてるわけだ。
例えば1つモジュールをいじったら、波及するページを
全部表示させて毎回連結テストしてるわけ?
657デフォルトの名無しさん:2009/07/19(日) 12:18:33
>>648
>CLIでデバッグ
perl を .NET でデバッグできるんですか。知らなかった。
もう少し調べてみます。ありがとう。

>完成したなと思ったらhttpd+ブラウザで連結テスト。
でも結局は httpd で実行してブラウザでリロードしてんじゃんwww

>>627
>perlで組んだプログラムはhttpサーバーを通さないと動かせないの?
ま、それが正しいってことだな。
658デフォルトの名無しさん:2009/07/19(日) 12:41:12
>>657
ググり直せカス
659デフォルトの名無しさん:2009/07/19(日) 13:11:35
UTF-8の旧字をISO-2022-JPに変換したい。どうやったら変換できるの?
以下はエラーします。

#!/usr/bin/perl

use Encode ;

my $char = "" ;
Encode::from_to($name,"utf8","euc-jp",Encode::FB_XMLCREF ) ;
print $char ;

660デフォルトの名無しさん:2009/07/19(日) 13:17:18
なぜ"euc-jp"なのw
661デフォルトの名無しさん:2009/07/19(日) 13:17:54
>>659
訂正。エラーってのは日本語のミスです。コードが出ます。

あと6行目の$nameは$charの間違いm(_o_)m
662デフォルトの名無しさん:2009/07/19(日) 13:19:26
>>660
すまん。いろいろ試行錯誤している途中のものを出してしまいました。
6行目は以下ですm(_o_)m
Encode::from_to($char,"utf8","iso-2022-jp",Encode::FB_XMLCREF ) ;
663デフォルトの名無しさん:2009/07/19(日) 13:45:56
ソースコードを utf8 で保存してないとか?
664デフォルトの名無しさん:2009/07/19(日) 13:46:33
>>663
それはないですm(_o_)m
665デフォルトの名無しさん:2009/07/19(日) 14:23:33
from_toはencode/decodeの組み合わせと同じらしいから、
とりあえずencode/decodeがちゃんと動いてるか確認してみては

use Encode ;
my $utf8 = sprintf("%c%c%c", 0xE3, 0x81, 0x82); # UTF-8で"あ", 適当に変えてみて
my $octet = Encode::decode("utf8", $utf8); # 内部コード。たぶんUTF-8と同じ

my $sjis = Encode::encode("sjis", $octet);
my $eucjp = Encode::encode("euc-jp", $octet);
my $iso2022 = Encode::encode("iso-2022-jp", $octet);

print "utf8: ", unpack("H*", $utf8), "\n"; # e38182
print "octet: ", unpack("H*", $octet), "\n"; # e38182
print "sjis: ", unpack("H*", $sjis), "\n"; # 82a0
print "eucjp: ", unpack("H*", $eucjp), "\n"; # a4a2
print "iso2022: ", unpack("H*", $iso2022), "\n"; # 1b244224221b2842
666デフォルトの名無しさん:2009/07/19(日) 14:53:53
>>659
その字って、JIS X 0208にもJIS X 0212にも含まれてない文字なのでは?
自分なら(JIS X 0113に対応している)NKF ver2.0.7以降に投げて変換してもらう。
もしかしたらEncode::JIS2Kモジュールが使えるかも。
667デフォルトの名無しさん:2009/07/19(日) 15:13:24
水色エリアはJIS X 0208 (1990) to Unicode 漢字コード表に存在しないコードです
http://charset.7jp.net/jis.html

「驕vは水色ですね
668デフォルトの名無しさん:2009/07/19(日) 15:31:07
>>648
> PerlはPHPと違ってWebプログラミング言語ではないよ。親和性が高かっただけ。

ちがうな。あのタイミングで他に適切なのが無かっただけだ。
669デフォルトの名無しさん:2009/07/19(日) 16:27:26
へぇ〜
PerlはWebプログラミング言語ですか、そうですか。
670デフォルトの名無しさん:2009/07/19(日) 16:33:01
また読解力の無い奴が恥かきに来たな。
671デフォルトの名無しさん:2009/07/19(日) 16:42:43
> Perlは〜ではない
> ちがうな

否定の否定、つまり肯定だよな。
どう考えても、「PerlはWebプログラミング言語ですぅ!」とほざいてるキチガイにしか見えない。
672デフォルトの名無しさん:2009/07/19(日) 16:48:31
邪魔
673デフォルトの名無しさん:2009/07/19(日) 16:56:47
674デフォルトの名無しさん:2009/07/19(日) 16:57:46
「「Web言語ではない」かつ「Webとの親和性が高い」」の否定は
「「Web言語である」または「Webとの親和性が高くない」」だ
つまり「Webとの親和性が高くない」が>>668の真意であるなら
「Web言語である」という命題はおまえの存在と同じぐらいどうでもいい
675デフォルトの名無しさん:2009/07/19(日) 17:34:32
小学生並の読解力を披露したあと何をどう言い繕えば格好が付くか、
必死に考えた結果がその駄文すか。
676デフォルトの名無しさん:2009/07/19(日) 20:23:19
ppppppppppとか
aaaaaaaaaaみたいに
同じ文字が10個続いてるのにマッチする
正規表現を教えてくださいな
677デフォルトの名無しさん:2009/07/19(日) 20:32:43
p{10}
678デフォルトの名無しさん:2009/07/19(日) 20:46:45
すいません…
aaaaaaaaaaにもbbbbbbbbbbにも!!!!!!!!!!にも
マッチするやつが欲しかったんです
679デフォルトの名無しさん:2009/07/19(日) 20:51:13
後方参照使うしかないな
680デフォルトの名無しさん:2009/07/19(日) 20:51:23
(.)\1{9}でとりあえず動くかな。何か変だが。
681デフォルトの名無しさん:2009/07/20(月) 12:53:55
>>657
お前その思考回路と読解力でプログラム書けるのか?

用語はググれ。完全に世に遅れを取ってるぞ。
つーか.NETがどーのっていちゃもん自体ググって調べたんじゃないか?
その知識のなさを見ると。

> でも結局は httpd で実行してブラウザでリロードしてんじゃんwww
Webアプリケーション作ってるのにWebで確認しないアホがいるか。
しかしテストにリロードは原則不要だ。

>>perlで組んだプログラムはhttpサーバーを通さないと動かせないの?
> ま、それが正しいってことだな。

CGIスクリプトなんかはコマンドラインから起動するとそっちのモードに切り替わるように
設計しないか普通?俺はめっきりCGIスクリプト書かなくなったから良く覚えてないけど、
use CGIしたら自動的にそうなったりしなかったっけ?
682デフォルトの名無しさん:2009/07/20(月) 13:55:55
知らないならレスしないでください
683デフォルトの名無しさん:2009/07/20(月) 13:57:55
>>682
分かったよ調べたよ。
use CGI qw(-debug);
でコマンドラインから実行できる。これで文句ないだろ?
684デフォルトの名無しさん:2009/07/20(月) 13:59:16
タイムスタンプ見ればわかると思うが30秒で調べてレスまで書けるような
ごく簡単なことなんだがな・・・。お前ら大丈夫?
685デフォルトの名無しさん:2009/07/20(月) 14:49:48
じゃぁ、まとめる。

質問:
 perlで組んだプログラムはhttpサーバーを通さないと動かせないの?

こたえ:
 コマンドラインから実行できる

満足かい?
おまいら一生、コマンドラインで動く掲示板、コマンドラインで動くショッピングカートで
遊んでな!
686デフォルトの名無しさん:2009/07/20(月) 14:49:58
>>665,666,667

ありがとう。

nkf --oc=ISO-2022-JP-1 で所望の変換をしてくれるようです。

Perlではこれに相当するライブラリは無いってことですかね。以下では
変換できずにコードが出力されてしまいました。

Encode::from_to($char,"utf8","iso-2022-jp-1",Encode::FB_XMLCREF ) ;

ちなみに665の実行結果は以下です。

utf8: efa79c
octet: dc
sjis: 3f
eucjp: 3f
iso2022: 3f
687デフォルトの名無しさん:2009/07/20(月) 14:58:20
結局さ、汎用のライブラリを使うと、こういうときに困っちゃうんだよな。
ライブラリの作成者がメンテナンスを放置しちゃうと。
プログラミングの経験の浅い人は、ナニがなんだかわからない現象に悩まされる。
ライブラリを信用しきっちゃってるからな。
688デフォルトの名無しさん:2009/07/20(月) 15:21:14
かと言って自力で作ろうとすると、車輪の再開発は無駄とか言われるんだぜ?
689デフォルトの名無しさん:2009/07/20(月) 15:29:00
それはたぶん情報が瞬時に伝わるみたいな仮説を前提とした理論上では無駄だってこと
690デフォルトの名無しさん:2009/07/20(月) 15:40:22
目的とした動作をするライブラリが無いのなら、
再発明でも再開発でもないだろう。
691デフォルトの名無しさん:2009/07/20(月) 15:43:06
再開発と再発明の区別がつけられない奴は優秀なバグクリエータ
692デフォルトの名無しさん:2009/07/20(月) 15:44:49
汎用のライブラリを自分で修正すると言う発想が出てこないところが怖い。
693デフォルトの名無しさん:2009/07/20(月) 15:52:49
はっきり言って、CGI.pmとEncode.pm周りはいじりたくない。
694デフォルトの名無しさん:2009/07/20(月) 16:08:53
>>691
言葉遊び
695デフォルトの名無しさん:2009/07/20(月) 17:01:30
発明は「発見して明らかにすること」なのだから、プログラムに関しては
「再発明」ってのは無いだろうw
その時点で再発明とか言ってる時点でアレ
696デフォルトの名無しさん:2009/07/20(月) 17:05:28
「車輪の再発明」とその言葉の使い方から解説しないといかんのか?
697デフォルトの名無しさん:2009/07/20(月) 17:12:24
多分おまえが言おうとしてることは再開発
698デフォルトの名無しさん:2009/07/20(月) 17:31:51
えと、お前ら語源知らないわけ?
reinvent the wheelの訳語だから、「車輪の再発明」の方が正しい。
存在しないと思って新たに作っちゃってるつもりの状態を再発明と表現したんだろ。
一応常套句だから、「車輪の再開発」はいいまつがいかもじり。
あると分かっていて、ソースの汚さや遅さや、単に後学のためにわざと再開発することはある。
699696:2009/07/20(月) 17:36:23
俺か?
"reinventing the wheel" 日本語訳は「車輪の再発明」。
同じ技術や同じ物が作られるときに、比喩として使われる慣用句だな。
慣用句に突っ込まれても困るわけだが。

と、書いてたら出遅れた。
700デフォルトの名無しさん:2009/07/20(月) 18:01:58
wikipedia 大活躍wwwwwww
701696:2009/07/20(月) 18:08:55
>>700
それで、理解できたか?
702デフォルトの名無しさん:2009/07/20(月) 18:47:07
おまえがwikipedia駆使のクセにwwwwww
703デフォルトの名無しさん:2009/07/20(月) 18:52:43
704デフォルトの名無しさん:2009/07/20(月) 19:12:32
よく話がループしますよね。
705デフォルトの名無しさん:2009/07/20(月) 19:27:24
Strawberry PerlでPPM使うときに設定とかっている?
どうみてもsite/libにファイルが増えてない・・・
706デフォルトの名無しさん:2009/07/20(月) 21:23:20
>>700
車輪の再発明は語源も含めてらくだ本に何度も出てくるだろ・・・。
なんつーレベルの低いスレだよ。
707デフォルトの名無しさん:2009/07/20(月) 21:24:43
>>706
>>560以降、この件でレスしてる奴全部レベル低いよ
お前もな
708デフォルトの名無しさん:2009/07/20(月) 22:08:26
まっかw
709デフォルトの名無しさん:2009/07/20(月) 22:09:10
>>1-1000
全部真っ赤
710デフォルトの名無しさん:2009/07/21(火) 00:28:15
何をやっても「再発明」と冷たく言われる最近の若者哀れ
711デフォルトの名無しさん:2009/07/21(火) 02:10:00
CGIを作っているのですが、<input type="file" name="file">の扱いがよくわかりません。
ファイルが入力されているかいないかの判別を、definedで判別できるかと思ったのですが、
$cgi = new CGI;
if( defined( $cgi->param( "cgi"))) {}
これだと、いつもifの中にはいってしまいます。
わたしが謝ったコードを書いているのでしょうか?
今は、
if( 4 < length( $cgi->param( "cgi")))
で処理していますが、通常はどのような条件分岐を行うのでしょうか?
(上記の条件分岐は、ファイルをzipファイルをアップロード対象としているため、拡張子の分のファイル名を4文字と考えています。
712デフォルトの名無しさん:2009/07/21(火) 02:53:28
713デフォルトの名無しさん:2009/07/21(火) 03:04:43
>>712
ありがとうございます。
defined等の関数の知識が足りていないのかと思いこちらに書き込みをさせていただいたのですが、
ご指摘いただきましたので、移動させていただきます。
714デフォルトの名無しさん:2009/07/22(水) 20:01:38
自分のIPを調べて$hostに入れるにはどうすればいいですか?
715デフォルトの名無しさん:2009/07/22(水) 20:07:05
ルーターやら絡んでわからない時は
Dynamic DNSのサイトから取ってたな
もっといい方法があるんだろうな
716デフォルトの名無しさん:2009/07/22(水) 20:10:27
>>714
確認くん
ttp://www.ugtop.com/spill.shtml

とか

診断くん
ttp://taruo.net/e/
717デフォルトの名無しさん:2009/07/22(水) 20:20:21
ローカルIPアドレスなら

use Sys::Hostname;
my $ipaddress = join(".",unpack("C4",gethostbyname(hostname())));
print "$ipaddress\n";
718デフォルトの名無しさん:2009/07/22(水) 20:27:23
my $str = `ifconfig eth0 |grep "inet addr:"`;
$str =~ s/addr:(.+)\s?//;
my $host = $1;
719デフォルトの名無しさん:2009/07/22(水) 20:45:52
$1を空にするには
720719:2009/07/22(水) 20:47:09
解決しました
721デフォルトの名無しさん:2009/07/22(水) 20:49:39
LWPつかってmixiをブログシステムのように扱えますか?
722721:2009/07/22(水) 20:51:02
解決しました
723デフォルトの名無しさん:2009/07/22(水) 20:52:58
__DATA__を2個以上作りt(ry
724723:2009/07/22(水) 20:54:04
解決しました
725デフォルトの名無しさん:2009/07/22(水) 21:28:14
>>718
うちはbge0だよ(´・ω・`)
726デフォルトの名無しさん:2009/07/22(水) 21:32:02
>>718
どんだけ力技だよw
727デフォルトの名無しさん:2009/07/24(金) 17:22:36
Perlのインデント幅って推奨値はありますか。
728デフォルトの名無しさん:2009/07/24(金) 17:24:13
4
729デフォルトの名無しさん:2009/07/24(金) 17:33:53
4といわれているが,実際は2でも8でもいい。
730デフォルトの名無しさん:2009/07/24(金) 17:39:28
>>727
Tabにしとけ。
相手が勝手に好きな隙間にするから。
731デフォルトの名無しさん:2009/07/24(金) 17:52:57
Perlでは
my $var1, $var2, $var3;
というふうに書けないんでしたっけ。
my $var1;
my $var2;
my $var3;
と書くしかない?
732デフォルトの名無しさん:2009/07/24(金) 17:53:47
my ($var1, $var2, $var3);
733デフォルトの名無しさん:2009/07/24(金) 17:57:30
>>732
さんくす
734 ◆TWARamEjuA :2009/07/24(金) 18:33:34 BE:2941439-BRZ(10072)
局所化された変数ならば、、、
my %var = (
'1', "なんたら", # なんたら
'2', "かんたら", # かんたら
'3', "ちんたら", # ちんたら
);
と描きたくなる衝動が。。。
735デフォルトの名無しさん:2009/07/24(金) 19:19:18
my $found;
for my $x (@list) {
 if ($x eq 'foobar') {
  $found = $x;
  last;
 }
}
というコードを、よりかっこよく書く方法があれば教えてください。
ちなみにRubyなら
found = list.find {|x| x == 'foobar' }
だそうです
736デフォルトの名無しさん:2009/07/24(金) 19:25:38
package Foo;
sub f {
 print "f()¥n";
}
sub g {
 print "g()¥n";
}
というのがあったとして、これを使う時は
use Foo;
Foo::f();
Foo::g();
のようにして使いますよね。
これを、Foo::f()ではなくf()だけで使えるようにするにはどうしたらいいでしょうか。
よろしくお願いします。
737デフォルトの名無しさん:2009/07/24(金) 19:30:35
for (@list) { $_ eq 'foobar' && $found = $_ && last }
738デフォルトの名無しさん:2009/07/24(金) 19:37:35
>>735
初めに見つけたら抜ければいいの?正しい挙動がよくわからないけど、

use List::Util qw( first );

my $found = first { $_ eq 'foobar' } @list;

かなぁ?
739デフォルトの名無しさん:2009/07/24(金) 19:38:26
>>736
ttp://search.cpan.org/~ferreira/Exporter-5.63/lib/Exporter.pm

つーか、普通はそんな使い方しない。
コンストラクタ用意して、

my $instance = Foo->new;
$instance->f;

ってしなさい。その後に上のExporterみなさい。
740デフォルトの名無しさん:2009/07/24(金) 19:48:21
それバカっぽい。何かのオブジェクト指向言語の猿マネ。
741デフォルトの名無しさん:2009/07/24(金) 19:56:16
>>739
あれ、パッケージって必ずインスタンスオブジェクトにしないといけないんでしたっけ?
単に名前空間として使いたいだけだったんですが。
#そして、その名前空間を一部破りたいというだけの話なんですけど。
742デフォルトの名無しさん:2009/07/24(金) 20:04:56
>>741
Exporter使えばできるけど、それはきもいから今はあまりやらない。
743デフォルトの名無しさん:2009/07/24(金) 20:12:29
>>736
#!/usr/bin/perl

package Foo;
f();
g();
__END__

>>735
for $found (@list) {/^foobar$/ and last}
だと動かないんだよなぁ。

>>739
$foo::bar()を使わないって・・・。

>>740
お前Exporter使ってるモジュール使用禁止な。
744デフォルトの名無しさん:2009/07/24(金) 20:34:05
>>741
キモチワルイ方法でよければこういう手もある。

Foo.pm
=============
#!/usr/bin/perl
package Foo;

sub f{print "f()\n";}
sub g{print "g()\n";}

package main;
sub AUTOLOAD {
our $AUTOLOAD;
$AUTOLOAD =~ s/.*:://g;
eval("Foo::$AUTOLOAD()") if eval(qq(exists &Foo::$AUTOLOAD));
}
1;
__EOF__
745デフォルトの名無しさん:2009/07/24(金) 21:16:28
>>736
じゃあ俺もキモイ方法。use Foo;さえいらない

use strict;
f();
g();
exit;
package Foo;
sub f { print "f()\n"; }
sub g { print "g()\n"; }
BEGIN { *::f = \&f; *::g = \&g; }
746デフォルトの名無しさん:2009/07/24(金) 21:26:17
>>742-745
すみません、みなさんのやり方がさっぱり理解できないです。

やりたいことをもう一度整理します。

まずすでにFoo/Bar.pmというファイルがあり、こんな内容になっています。
これは変更することはできません。
package Foo::Bar;
sub f { ... }
sub g { ... }
sub h { ... }

そして、手元のスクリプトでやりたいのは、パッケージ名をつけずにf()やg()を使いたいということです。
ここで、Foo::Bar以下のすべての関数ではなく、指定した関数だけを使いたいんですが、できますか。
(ここでpackage Foo::Barとするとすべての関数が対象となるので好ましくない)
use Foo::Bar;
f();
g();

もしPythonをご存知の方がいれば、from pacakge import f, g ということがやりたい、といえばわかってもらえるでしょうか。


747デフォルトの名無しさん:2009/07/24(金) 21:29:05
いいからExporter使えカス
748デフォルトの名無しさん:2009/07/24(金) 21:33:05
>>746
> from pacakge import f, g

use Foo qw(f g);
みたいにしたいならExporter使うのが正道。
Exporterキモチワルイとか言ってる奴はほっとけ。

Exporter perl export_ok辺りでググればサンプルと解説が
出てくるはずだから。
749デフォルトの名無しさん:2009/07/24(金) 21:49:35
>>748
どうもありがとうございます。
でもこの方法だと、Exporterを使うようにFoo/Bar.pmを変更しないといけないんですよね。
今回はそれができないんです。困った。
Pythonだとパッケージ側では特になにもする必要がないんですけど、Perlだとパッケージ側でいろいろ準備が必要なんですね。
750デフォルトの名無しさん:2009/07/24(金) 21:52:05
>>749
お前、ちゃんと>>739のURL見たのか?
751デフォルトの名無しさん:2009/07/24(金) 22:04:37
>>750
え、Bar/Foo.pmに手を加えずにインポートする方法ってあるの?
知らないんだけど。ドキュメントも読んだけど。ちなみに>>749ではない。
752デフォルトの名無しさん:2009/07/24(金) 22:07:31
>>749
普通にFoo::Bar::f();じゃどういう風に都合が悪いんだ?
何を困ってるのか分からないとこっちが困る。
753デフォルトの名無しさん:2009/07/24(金) 22:07:36
>>746
これでどう

use strict;
*main::f = \&Foo::Bar::f;
f();
exit;

package Foo::Bar;
sub f { print "f()\n"; }
sub g { print "g()\n"; }
754デフォルトの名無しさん:2009/07/24(金) 22:15:53
>>752
長すぎて不便。

>>753
おお、これはすごい。関数へのポインタみたい。
ありがたく使わせて頂きます。どうもありがとうございました。
755デフォルトの名無しさん:2009/07/24(金) 22:16:24
elsif が気持ちよくインデントできない
756デフォルトの名無しさん:2009/07/24(金) 23:02:05
if(){
  〜
}elsif(){
  〜
}else{
  〜
}

かな
757デフォルトの名無しさん:2009/07/24(金) 23:45:51
eval {
 die("error message");
}
if ($@) {
 print STDERR, $@;
 exit 1;
}
という処理を書いているんですが、エラーメッセージのうしろに
at /usr/local/tmp/hoge.pm line 2
のようなのが付いてきます。
つまり $@ にファイル名と行番号が付いてくるわけですが、これを取り除くいい方法はありますか。
やはり正規表現でちまちま削除しなきゃいけないでしょうか。
758デフォルトの名無しさん:2009/07/25(土) 00:00:13
Perlでは
new ClassName();
ClassName->new();
のどちらでも書けるようですが、どちらで書いた方がいいのかわかりません。
どっちで書いてもいいのか、それともPerlとしてはどちらか一方がお勧めだったりしますか?
759デフォルトの名無しさん:2009/07/25(土) 00:00:38
>>757
perldoc -f die
に書いてある

>die LIST
>…中略…
>If the last element of LIST does not end in a newline, the
>current script line number and input line number (if any) are
>also printed, and a newline is supplied. …以下略

つまりエラーメッセージの最後に改行を付加すれば行番号などは付かない
760デフォルトの名無しさん:2009/07/25(土) 01:05:57
>>758
->
761デフォルトの名無しさん:2009/07/25(土) 05:01:27
>>757
eval {
 die("error message\n");
} ;
if($@){
 print STDERR $@;
 exit 1;
}
762デフォルトの名無しさん:2009/07/25(土) 05:58:08
>>758
newに限らず、Perlでクラスメソッドを呼ぶ基本的な記法は

  MyClass->myfunc(引数); # 構文(1)

である。もうひとつの

  myfunc MyClass(引数); # 構文(2)

というのは、Indirect Object Syntax(間接オブジェクト構文)と呼ばれる一種のシンタクスシュガーである。

perldoc perlobjによれば、構文(2)を使うとPerlのパーサが困る場合があるらしい。
もちろん普通に new Class(); とか書いてるだけなら問題ないし、こっちの書き方もよく使われるので、
構文(2)にも慣れといたほうがいいとperldoc perlobjは言っている。

まあ、C++とかJavaのユーザーが、newに関して構文(2)を使いたがるのはしょうがないねw
763デフォルトの名無しさん:2009/07/25(土) 06:38:17
>>762
$obj = new Class(); の構文でパーサが困ることは絶対ない。それは言いがかりだ。

別にC++やJava使いじゃなくても知る限りFile::IOなんかは
print $fh 'hello';
って書く人の方が多いね。別に
$fh->print('hello');
でも動くんだが、意外に知らない人が多くてワロタ。
764デフォルトの名無しさん:2009/07/25(土) 06:40:30
>>763
よく読めよ・・・
765デフォルトの名無しさん:2009/07/25(土) 06:54:29
>>759,756
ありがとうございました。
766デフォルトの名無しさん:2009/07/25(土) 07:24:57
package Hoge;
use strict;
$VAR = 1;
sub f {
 print $VAR;
}

というパッケージを作ると

Global symbol "$VAR" requires explicit package name at Hoge.pm line 3.
Global symbol "$VAR" requires explicit package name at Hoge.pm line 5.
Compilation failed in require at hoge.pl line 1.
BEGIN failed--compilation aborted at hoge.pl line 1.

というエラーがでます。$VARにパッケージ名がないということなので、

package Hoge;
use strict;
$Hoge::VAR = 1;
sub f {
 print $Hoge::VAR;
}

とするとエラーは出なくなったのですが、いちいちパッケージ名をつけるのがだるいです。
なんかいい方法はないでしょうか。
767デフォルトの名無しさん:2009/07/25(土) 07:37:55
その例に関して言えば、myつけりゃいいだけだが
768デフォルトの名無しさん:2009/07/25(土) 10:54:34
>>767
ほんとだー

package Hoge;
use strict;
my $var = 1;
sub f {
 print $var;
}

でいけました。ありがとうございます。
でも sub f の中から外のmy変数を参照できたのか。。。ちょっと不思議。
769デフォルトの名無しさん:2009/07/25(土) 11:06:01
何が不思議なのかさっぱりわからん。
770デフォルトの名無しさん:2009/07/25(土) 12:17:29
という事は、これ↓も「ちょっと不思議」なのか?(w
my $var=1;
foreach (@hoge) {
 print $var;
}
771デフォルトの名無しさん:2009/07/25(土) 15:23:05
そういう書き方をすると時々外部から関数を用いて外の変数をいじったときに値が変わらなくてハマることがあるなぁ
あれは何でだろうか…
772デフォルトの名無しさん:2009/07/25(土) 16:28:01
>>768
myのスコープ(いわゆるレキシカルスコープ)について
良く勉強しといた方がいい。思わぬところでコケるぞ。

myとlocalの違いを産業で説明できるようになるまでががれ。
773デフォルトの名無しさん:2009/07/25(土) 17:14:36
>>771
---- test.pl -----
#!/usr/bin/perl
my $a;
sub a{my($b) = @_ ; print $a += $b }
1;
----別ファイル($aのスコープ外)----
#!/usr/bin/perl
require 'test.pl';
package Foo; # パッケージも変えてみる
main::a(1);main::a(2);main::a(3);main::a(4);

何の問題も起きないが?多分スコープについて勘違いしてるだけだと思われ。
774デフォルトの名無しさん:2009/07/25(土) 19:19:32
>>773
今自分でも検証してみた
勘違いはBEGINブロックで宣言した変数がパッケージ内で使えるということだったらしい
今思えばなぜそんな勘違いしたのか謎
775デフォルトの名無しさん:2009/07/26(日) 01:06:42
yourをつけるとどうなる?
776デフォルトの名無しさん:2009/07/26(日) 12:35:48
>>754
Foo::Bar::f()が長くて面倒だという理由で
>>753で解決するとか本気でバカとしか思えないんだが。

単に面倒なだけなら
my $f = \&Foo::Bar::f;
しといて、
$f->();
すりゃいいだろ。
777デフォルトの名無しさん:2009/07/26(日) 12:51:50
>>776
まあ>>736,746,754のようなタイプに何いっても無駄
Exporter::import()だって結局>>753みたいなことやってるにすぎないしなw
778デフォルトの名無しさん:2009/07/27(月) 10:17:38
馬鹿が馬鹿丸出しなコードを書けるのもPerlのいいところ
779デフォルトの名無しさん:2009/07/27(月) 10:32:16
例えば >>778 の書くソースは
どんな言語を使っても汚いように、
それはどんな言語も同じ
780デフォルトの名無しさん:2009/07/27(月) 13:37:14
つ[適材適所]
781デフォルトの名無しさん:2009/07/27(月) 14:11:26
(´・ω・`)
782デフォルトの名無しさん:2009/07/28(火) 00:58:18
>>778
スパゲッティ−ソースもperlなら簡単お手軽に作れる、とか、
もうちょっと言葉を選べよw
783デフォルトの名無しさん:2009/07/28(火) 01:47:21
こんばんは。

perlのテキスト処理について質問です。

[test.txt]
yamada 10
tanabe 20
+40
yamasita 10

というtest.txtに対して行頭に+があるときは前の行に空白を入れて追加して
out.txtというファイルを出力させたいのですがどうすればよいのでしょう。

[out.txt]
yamada 10
tanabe 20 40
yamasita 10
784デフォルトの名無しさん:2009/07/28(火) 03:39:41
実際に動作チェックはしてないけど、こんなかんじかな。
改行コードを空白に置換すればいい。
$unko =~ s/[\r\n]+\+/ +/gs;
785デフォルトの名無しさん:2009/07/28(火) 06:08:43
>>782
オブ脳ないのにJavaで書かれたソースに比べれば
スパゲティの方がまだマシ。
786デフォルトの名無しさん:2009/07/28(火) 06:12:32
my $last = '+';

while(<FILE>){
 chomp;
 print "\n" if $last ~! /^\+/;
 print;
 $last = $_;
}
print "\n";
787デフォルトの名無しさん:2009/07/28(火) 08:40:31
パッケージ内で、次のように変数を使っています。
  $main::hoge1 = 'a';
  $main::hoge2 = 'b';
   ...

この時、JavaScriptでいうwith()の様に、{ } で囲むスコープ内でのみ main:: を省略する書き方は出来ないでしょうか?
788デフォルトの名無しさん:2009/07/28(火) 10:37:39
>>787
必要なとこだけpackageをmainに変えればいいはずだけど、
その根拠がperldocのどこに書いてあったか忘れたので、あくまでも参考ということで

use strict;
package main;
our ($foo, $bar);
hoge::func();
print "foo=$foo, bar=$bar\n";
exit;

package hoge;
sub func {
print "I'm in package ", __PACKAGE__, "\n"; #ここはまだhogeパッケージ
$main::foo = 'a';
package main;
print "I'm in package ", __PACKAGE__, "\n"; #ここからmainパッケージ
$bar = 'b';
}
789788:2009/07/28(火) 10:54:39
実際にやってみたら>>788できなかったw
というわけで次の回答者どうぞ
790デフォルトの名無しさん:2009/07/28(火) 11:31:33
実行してみたら

I'm in package hoge
I'm in package main
foo=a, bar=b

となったから合ってんじゃねーの?

どういう結果を期待してんだ?
791デフォルトの名無しさん:2009/07/28(火) 13:21:24
なんでみんなそんなにパッケージ名省略したがるんだよ。
可読性落ちるだけだろjk。
792デフォルトの名無しさん:2009/07/28(火) 13:37:16
確かに他人様のパッケージの中の変数をパッケージ名を省略したく
なるぐらい参照しなければならないプログラムはどうかと思うな。
793デフォルトの名無しさん:2009/07/28(火) 16:31:59
そのうち、

$obj = new;

でFoo::Barクラスのインスタンスが作れないかって質問が来そうだ。
794デフォルトの名無しさん:2009/07/28(火) 17:54:48
>>788-790
ありがとうございました。無事出来ました。

あと質問なんですが$obj = new;でFoo::Barクラスのインスタンスは作れないでしょうか。
あ、やっぱいいです。 ありがとうございました。
795デフォルトの名無しさん:2009/07/28(火) 22:47:38
パッケージ使いまくるのもまたPerlの1つのやり方だし、そうなると
同じパッケージ名を何百回も書くのは記述性が落ちるどころか
かえって可読性をも落とすだけだと思うんだ
796デフォルトの名無しさん:2009/07/29(水) 06:53:39
>>795
前提と結論に整合性がない
論理的でおk
797デフォルトの名無しさん:2009/07/29(水) 11:23:27
$vars = {'foo': 1, 'bar': 2}
というのがあって、ある文字列が$varsのキーに含まれるかどうかを調べるにはどうしたらいいですか。
my $found = 0;
for my $key (keys %$vars) {
 if ($key eq "foo") {
  $found = 1;
  break;
 }
}
print "found: $found¥n";
というのを短く書きたいです。
798デフォルトの名無しさん:2009/07/29(水) 11:25:52
my $found = $vars->{foo} ? 1 : 0;

でいいじゃん
799デフォルトの名無しさん:2009/07/29(水) 11:28:42
$vars->{foo}が0である場合も考慮するなら、existsかdefined使ってね
800デフォルトの名無しさん:2009/07/29(水) 11:31:58
値がundefである場合も考慮するとexists一択
801デフォルトの名無しさん:2009/07/29(水) 11:32:20
exists $vars->{foo}
でいけました。サンクスです。
802デフォルトの名無しさん:2009/07/29(水) 11:37:05
関係ないけど、
$vars = {'foo': 1, 'bar': 2}
こういう風に書けるんだね。知らなかった。
803デフォルトの名無しさん:2009/07/29(水) 11:38:06
かけないし
804デフォルトの名無しさん:2009/07/29(水) 11:45:18
なんだ かけないのか
805デフォルトの名無しさん:2009/07/29(水) 14:59:09
evalするときに、ファイル名や行番号を指定することはできますか。
Rubyでは文字列をevalするときに、オプションとしてファイル名や行番号を指定できるのですが、
同じことをPerlでしたいので、方法があれば教えてください。
「perl eval ファイル名」でぐぐってもヒットしませんでした。

806デフォルトの名無しさん:2009/07/29(水) 15:08:59
意味がわからん
807デフォルトの名無しさん:2009/07/29(水) 15:25:41
>>805
do
808805:2009/07/29(水) 16:45:24
説明がまずくてすみませんでした。もう一度説明させてください。

たとえば、次のような「hoge.pl」というファイルがあるとします。

1: $s = <<END;
2: package Foo;
3: sub hello {
4: print "Hello¥n";
5: }
6: END
7:
8: eval $s, 'Foo.pm', 1

これを実行すると、evalに渡した文字列が、ファイルFoo.pmの1行目から始まったものとして扱ってくれないかなということです。
この例だとevalはhoge.plの8行目ですが、もし$sの中にエラーがあると、hoge.plにエラーがあったと表示されるのではなく、
あたかもFoo.pmの中にエラーがあったかのようにエラーが表示されてほしいのです。
809デフォルトの名無しさん:2009/07/29(水) 17:40:59
もういちどperl evalでぐぐるべきだな
810デフォルトの名無しさん:2009/07/29(水) 17:44:24
>>809
おまえはもういちど質問の意味を考えるべき
811デフォルトの名無しさん:2009/07/29(水) 19:37:49
>>808
#line?

例.
$s =<<END;
#line 200 "Foo.pm"
pacjage Foo; # <- このtypoは Foo.pm の 200行目のエラーになる
1;
END

eval $s or warn $@;
812デフォルトの名無しさん:2009/07/29(水) 21:19:25
>>810
何様?こいつ
813デフォルトの名無しさん:2009/07/29(水) 22:00:08
>>812
すごく怖いやつだから、逆らわない方がいい。
814デフォルトの名無しさん:2009/07/29(水) 22:34:42
>>808
なんでそんな事がしたいの?
815デフォルトの名無しさん:2009/07/29(水) 22:45:29
質問です。

テキスト(SJIS)で作成した16進データをバイナリに変換したいのですが、

$aaa = pack("H*", @hexdata);
print OUTFILE $aaa ;

みたいな形でやっても上手く行きません。

最大文字列制限とかあるのでしょうか?
816デフォルトの名無しさん:2009/07/29(水) 23:31:33
SJIS
817デフォルトの名無しさん:2009/07/29(水) 23:45:48
>>815
質問の仕方がヘタクソだな。それじゃ相手に伝わらない。
818デフォルトの名無しさん:2009/07/29(水) 23:48:20
>>814
DSLとか作るときには必須だろう
819デフォルトの名無しさん:2009/07/30(木) 00:14:43
質問に的確に回答できないヤツって、すぐ
「なんでそんなことしたいの?」とかレス付けたがるんだよな。
820デフォルトの名無しさん:2009/07/30(木) 00:17:57
>>819
いや。それは違うぞ。

どうしてそうしたいのか?が分かれば、的確な回答が出来る可能性がある
要件定義の鉄則。
821デフォルトの名無しさん:2009/07/30(木) 00:20:58
>>815
とりあえずエスパーで、pack()の書式指定が違ってると言ってみよう

my @hex = ("7761", "6b61", "6e6e", "6169", "3e3c");
my $aaa = pack("(H4)*", @hex);
822デフォルトの名無しさん:2009/07/30(木) 00:38:26
>>819
なんでそんなレスしたの?
823デフォルトの名無しさん:2009/07/30(木) 00:59:30
>>822
「俺はわかってる!」という根拠の無い自信に満ち溢れた学生さんが
ちょっと大きく出ちゃったんです。
824デフォルトの名無しさん:2009/07/30(木) 01:13:18
望みなしだよ
825デフォルトの名無しさん:2009/07/30(木) 02:03:19
どうみても、
>>805=>>808=>>810=>>813=>>819
だろ。察してやれ(w
826デフォルトの名無しさん:2009/07/30(木) 02:09:12
>>813はただの面白レスを狙った人だと思うが・・・

これを同一だと思うような人と飲みに行ったらつまんなそう
827デフォルトの名無しさん:2009/07/30(木) 02:24:04
>>810も別人だろ…
828デフォルトの名無しさん:2009/07/30(木) 02:55:34
渇いた心にヒューモアを
829デフォルトの名無しさん:2009/07/30(木) 11:00:17
#!/usr/bin/perl -w
if ( $ARGV[0] eq "autoconf" ) {
if (`/usr/bin/perl $0` eq "" ) {
print "no\n";
exit 1;
} else {
print "yes\n";
exit 0;
}
}

っていうスクリプトを、引数にautoconfを与えて実行すると
Use of uninitialized value $ARGV[0] in string eq at ./sensirion line 2
と怒られます。最初の行で-wオプションを消すと怒られなくなりますが、
正しい対処法があれば教えてください。
830デフォルトの名無しさん:2009/07/30(木) 11:35:29
「与えずに」の間違いじゃないか?

if (@ARGV and $ARGV[0] eq 'autoconf')
831デフォルトの名無しさん:2009/07/30(木) 12:12:43
モダンPerl入門ってどうですか?
お薦めですか?

モダンPerl入門
http://www.amazon.co.jp/gp/product/4798119172/
832デフォルトの名無しさん:2009/07/30(木) 15:33:45
>>831
もう旧いよ。
833デフォルトの名無しさん:2009/07/30(木) 15:44:47
>>832
最新版は何ですか?
834デフォルトの名無しさん:2009/07/30(木) 21:46:07
>>831
Mooseについて知らなかったりコードをMVCのC(とV)にばっかり書いてるようなら
買うべき。
835デフォルトの名無しさん:2009/07/30(木) 23:35:01
ttp://x68000.q-e-d.net/~68user/net/sample/echo-server-io-socket.pl
を改造してたんですが、昨日から今日のつい先ほどまでブラウザのアドレスバーにローカルホスト入れれば反応してたんですが、しなくなりました。
原因が全く分かりません。試しにActivePerl-5.10.0.1005をインストールし直したのですが解決せず。
もう私の手には負えません、誰か原因がわかる人がいましたら教えていただけませんか?
836デフォルトの名無しさん:2009/07/31(金) 05:40:42
Perlでの質問です。

#!/usr/bin/perl

sub func1{print "func1\n";}
sub func2{print "func2\n";}
sub func3{print "func3\n";}

&func1;
&func2;
&func3;

上記を↓のようにしたいです

for(my $i = 1;$i <= 3;$i++)
{
&func$i;
}

このままだとエラーになるのですが、
このような使い方は可能でしょうか?
837836:2009/07/31(金) 05:49:05
すいません自己解決しました。

for(my $i = 1;$i <= 3;$i++)
{
eval "&func$i";
}

上記でできました。
838デフォルトの名無しさん:2009/07/31(金) 09:54:48
Perlなんて使われてない言語勉強してどうするんだよ?
839デフォルトの名無しさん:2009/07/31(金) 09:57:09
最近は、小さい会社だと使われてないね
840デフォルトの名無しさん:2009/07/31(金) 10:00:55
大きい会社でも使われてないね。
841デフォルトの名無しさん:2009/07/31(金) 10:05:00
プログラミング言語の20や30使えて当たり前だと思うが...
842デフォルトの名無しさん:2009/07/31(金) 10:09:44
>>837
それはセキュリティの穴になりやすいから気をつけて
843デフォルトの名無しさん:2009/07/31(金) 10:10:32
mixi、livedoor、DeNAなんかはPerlがメインだな
844デフォルトの名無しさん:2009/07/31(金) 10:20:07
>>840
大きい会社のことなんか知らない、零細企業の社員のくせにw
845デフォルトの名無しさん:2009/07/31(金) 10:21:51
>>844
ははは。俺は大きい会社でも小さい会社でも天才プログラマーとして活躍したんだがな。お前らみたいのと一緒にするんじゃない。

846デフォルトの名無しさん:2009/07/31(金) 10:29:55
>>836
配列使えよ。

@func = (
sub { print "func1\n"; },
sub { print "func2\n"; },
sub { print "func3\n"; },
);

foreach (@func) {
$_->();
}
847デフォルトの名無しさん:2009/07/31(金) 12:30:53
FreeBSDとか入れたら最初から入ってるから
手軽で便利だから何気なく使ってる
848デフォルトの名無しさん:2009/07/31(金) 12:32:07
>>843
アマゾンもperlらしいな
最近はどうか知らないけど
849デフォルトの名無しさん:2009/07/31(金) 12:38:11
シーサーもだな
「大きい会社」なのかどうかは知らないが。

YAPC::Asia Tokyoとか、Shibuya Perl Mongersとか行くと
Perl支持企業の多さや、社員レベルので企業の枠を超えたパイプの太さに感心する
850デフォルトの名無しさん:2009/07/31(金) 12:42:24
古い会社は昔Perlで書いた資産を大量に持ってるから、そうそう他の言語に移住できまい
851デフォルトの名無しさん:2009/07/31(金) 13:00:40
COBOLなめんな
852デフォルトの名無しさん:2009/07/31(金) 13:06:28
というより、mixiやライブドアみたいに、上場してるような技術系IT企業の場合
上場までの過程となる、2005年以前でまともなパフォーマンスを発揮出来るWeb系言語は、
PerlとJavaしかなかった。

mod_perl登場&普及以前の2000年〜2003は、Java一択だったが、
Java系企業はスタートダッシュこそ良かったものの、Javaプログラマ不足で
一から教育しなければならず、次第に勢いが鈍りだす。

そうこうしてる間にmod_perlの登場し、元から多かった豊富なPerlプログラマのおかげもあって
ベンチャーが相次いで有名サービスが立ちあげ、どんどん上場していく。
だから、今上場しているような大きいIT企業はPerlが多い。

あくまでもそういう理由で多いだけなので、今後は現在PHPやRubyを採用している会社が
IPOしていく流れが続くはず。最近だとRuby採用のcookpad。
853デフォルトの名無しさん:2009/07/31(金) 13:14:25
年代に関しては、多少認識違いがあるかもしれないが、
言いたいことは、現在上場してるIT企業にPerlが多い理由を書いただけなので勘弁。
854デフォルトの名無しさん:2009/07/31(金) 13:28:48
PHP>>>Python>>Ruby>>>>>|超えられない壁|>>Perl

多数の言語をマスターした俺の感想。
855デフォルトの名無しさん:2009/07/31(金) 13:33:09
でも、Perl以外の選択===車輪の再発明ですよね
856デフォルトの名無しさん:2009/07/31(金) 13:35:42
PHPがトップはないわw
857デフォルトの名無しさん:2009/07/31(金) 13:36:04
>>855
そこそこメジャーな言語なら車輪の再発明は既に済んでいる。
858デフォルトの名無しさん:2009/07/31(金) 13:39:23
>>854
なぜPHPは馬鹿にされるのか
http://pc11.2ch.net/test/read.cgi/php/1240977569/

このスレで活躍してきてください。
ちなみに最終書き込みは、
「別にいいじゃんバカにされても」
です
859デフォルトの名無しさん:2009/07/31(金) 13:42:48
>>856
PHPがどう考えてもトップです。
860デフォルトの名無しさん:2009/07/31(金) 13:45:35
PHPなんて、サーバーサイドJavaScriptだろw
861デフォルトの名無しさん:2009/07/31(金) 13:47:54
PHPと違って、JavaScriptは馬鹿に出来ないけどな
862デフォルトの名無しさん:2009/07/31(金) 13:51:57
>>860
君はPHPの良さを解っていないんだな。PHPで書いたプログラムの滑らかな動きはどの言語もかなわない。
863デフォルトの名無しさん:2009/07/31(金) 13:59:27
滑らかなのは、お前の脳みそだって。
864デフォルトの名無しさん:2009/07/31(金) 14:48:10
PHP はマイナーアップデートの癖にビルトイン関数の挙動を大きく変えてくるから嫌い
865デフォルトの名無しさん:2009/07/31(金) 15:28:38
>>847
> FreeBSDとか入れたら最初から入ってるから

入ってない。
866デフォルトの名無しさん:2009/07/31(金) 15:59:21
>>854がどういう基準の大小関係なのかわからないと何とも言えない。
基準が書いてないから推測になるけど、「HTMLのテンプレートにそのまま感覚で書ける」ってレベルなら
PHPがトップなのも頷けます。
867デフォルトの名無しさん:2009/07/31(金) 17:12:27
>>862
普通にインタプリタで走らせるとフレームワーク激重なんだが。

>>866
そもそもがテンプレートエンジンだからなPHPは。
そういやPHP/FIの実体はPerlスクリプトだったな。
868デフォルトの名無しさん:2009/07/31(金) 17:18:56
>>867
インタプリタで走らせる???
なんか勘違いしてないか?
CGI動作は、コンパイル後実行してるから、インタプリタじゃないぜ?

PHPが糞なのは同意だが。
869デフォルトの名無しさん:2009/07/31(金) 17:41:34
>>868
そりゃ厳密にはそうだが、mod_perlと違って実行時コンパイル型だから
フレームワークなんて使えたもんじゃねーよって話だよ。
汲んでくれ。
870デフォルトの名無しさん:2009/07/31(金) 18:04:52
>>869
なんか君は、いろいろ勘違いや偏見、知識の狭さがあると思う

CGI動作させれば、重いのはPerlだって同じ。
mod_phpで動作させれば、PHPだってmod_perlに匹敵するくらい速い。
そして、mod_phpを使わないPHPは”普通”じゃない
871デフォルトの名無しさん:2009/07/31(金) 19:22:03
そもそも重い処理がコンパイルなわけで
それ自体のスピードは似たり寄ったりじゃないの?
872デフォルトの名無しさん:2009/07/31(金) 19:29:01
>>871
うん、似たりよったり。

ただ、mod_xxxみたいにメモリ常駐型でも一応差は出る
Java>Python>Perl>PHP>>>Ruby
873デフォルトの名無しさん:2009/07/31(金) 19:34:39
PHPは商業ベースのアクセラレータ導入すれば結構速度でるよ。Javaには及ばないけど
874デフォルトの名無しさん:2009/07/31(金) 19:36:14
今本読みながらPerl覚えてるんですけど、ハッシュの用途がさっぱり
本には重要って書いてあるけど、そんな重要なの?
875デフォルトの名無しさん:2009/07/31(金) 19:41:53
>>874
やっと質問が来たw

例えば、
my $hash = {suzuki => 37, kimura => 43, nakamura => 21};
みたいに人の名前をキーに、年齢を持つハッシュがあれば、

my $name = shift;
print "$nameさんの年齢は、$hash->{$name}歳です";

って出来る。これを配列でやるとめんどいでしょ。

というより、ハッシュというのはPerlに限らず、基本的なデータ構造だよ。
876デフォルトの名無しさん:2009/07/31(金) 19:42:32
>>874
今からでも最強言語であるPHPをマスターする事をお勧めする。
877デフォルトの名無しさん:2009/07/31(金) 19:45:13
>>876
ダメな技術者ほど、特定の言語を支持するんだよな
878デフォルトの名無しさん:2009/07/31(金) 19:45:29
そういえばPHPは配列無かったな
これが一番気持ち悪い
879デフォルトの名無しさん:2009/07/31(金) 19:47:57
>>878
ないわけないだろw

ただ、関数で要素の代入するのはキモイ
880デフォルトの名無しさん:2009/07/31(金) 19:49:48
>>876
Perl書ける人ってPHPも余裕で書けると思うけどな
個人的にperlが車のMTでPSPがATってイメージ
881デフォルトの名無しさん:2009/07/31(金) 19:52:54
>>880
s/PSP/PHP/
882デフォルトの名無しさん:2009/07/31(金) 19:53:05
>>877
PHP出来れば、他も出来るんだよ。あとは、Javaもお勧めするけどな。
まあ、俺みたいな天才は殆どの言語をマスターしてるんだがな。

>>880
書けるよ。俺はPerl→PHPだったが、先にPHPを学んだ方が良いという結論に達した。
883デフォルトの名無しさん:2009/07/31(金) 20:01:16
C++→Perl→Java→PHPと来たけど情報さえあれば学ぶ順番はどうでもいいと思う
884デフォルトの名無しさん:2009/07/31(金) 20:01:48
885デフォルトの名無しさん:2009/07/31(金) 20:18:57
何このバトロワスレ。
886デフォルトの名無しさん:2009/07/31(金) 20:25:39
>>879
つーかPHPのarrayはperlの配列とハッシュをまぜたような奇怪なモノだからな。
いまだに慣れん
887デフォルトの名無しさん:2009/07/31(金) 20:26:57
俺も1度構ったけどスレタイ読んで冷静になった方がいい気がする…
888デフォルトの名無しさん:2009/07/31(金) 20:30:58
バトロワだと相手にもしてもらえない底辺PHPerが出張にきました
889デフォルトの名無しさん:2009/07/31(金) 21:43:39
>>870
例えばmod_perlを前提としているCatalystと実行時コンパイルを
前提としているEthnaが根本的に設計思想が違うのを分かってないなお前は。
んで同じ環境でもPHPは圧倒的に遅いんだが。
Perlがモジュールで切り離してるところをPHPは全部抱え込んでるからな。
モジュールやライブラリなしでJSONを一発で読み込んだりセッション管理をやってくれる
プログラミング言語なんてPHPくらいじゃないか?

>>882
> まあ、俺みたいな天才は殆どの言語をマスターしてるんだがな。
これでも眺めて身の程を知れ。
http://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E%E4%B8%80%E8%A6%A7
890デフォルトの名無しさん:2009/07/31(金) 21:44:12
JSONはJavascriptが一発で読み込むなw
アホか俺は。
891デフォルトの名無しさん:2009/07/31(金) 22:21:09
>>890
うん、アホに加え、いろいろ勘違いや偏見、知識の狭さがあると思う
892デフォルトの名無しさん:2009/07/31(金) 22:40:36
>>891
その餌じゃちょっと釣られる気がしない。
893 ◆TWARamEjuA :2009/07/31(金) 23:22:36 BE:2614638-BRZ(10072)
ようするに夏休みだってことだ♪
894デフォルトの名無しさん:2009/07/31(金) 23:50:13
>>889
そのEthnaってのがどういうものか知らんが、CGI動作させるかmod_php動作させるかで
技術的に差があるわけじゃないので、もしCGI動作させる前提で出来てるなら、
CGI動作させるメリットを取ってるだけじゃないのか?

mod_php前提のフレームワークだってあるだろうし。とういうかあって当然だし。
895デフォルトの名無しさん:2009/08/01(土) 04:57:15
手段であるエンピツなんて何でもいいんですよ。 描いた絵が素晴らしければ それが正義なんだすよ
896デフォルトの名無しさん:2009/08/01(土) 08:05:50
>>894
無知乙。
例えばmod_perl+Catalystはモジュールをロードして常駐するタイプなので、
リクエストが来たら即座に対応できる。

mod_phpはコンパイラ起動のコストがないだけで、結局インタプリタが
動くのでオーバーヘッドは変わらない。

そしてPHPにまともに動くサーバー常駐型フレームワークは今のところない。

どっちの言語が優れているかという議論には興味ないが、負荷を考慮して
フレームワークを使うならPerl/RubyはあってもPHPという選択はありえんわ。

フレームワークなしで中規模以上の開発をするという選択もありえんし。
逆にお問い合わせフォームとかならPHPが手軽でいいんじゃね?
897デフォルトの名無しさん:2009/08/01(土) 09:57:18
>>896
お前は何か勘違いしてる
898デフォルトの名無しさん:2009/08/01(土) 11:10:11
昨日から勉強し始めたんですが、PerlでSNSは作れますか?
899デフォルトの名無しさん:2009/08/01(土) 11:17:58
当然作れるけど、板チ
900デフォルトの名無しさん:2009/08/01(土) 11:38:44
作れない。Perlで作るならPHPで作れよ。楽だから。
901デフォルトの名無しさん:2009/08/01(土) 11:40:40
つーか 逆に作れない物を教えてくれ
902デフォルトの名無しさん:2009/08/01(土) 11:49:39
粘着がいるな
903デフォルトの名無しさん:2009/08/01(土) 12:54:11
emacsで、ウィンドウを分割して
一方でコード、一方で実行結果を表示したいです
perl-mode,cperl-modeをdescribe-modeで見てみたけど
そういったコマンドはないみたいなのですが
こういったことは出来ますか?

tuareg-modeやscheme-modeみたいに使えると
開発効率が段違いなんですが
904デフォルトの名無しさん:2009/08/01(土) 13:40:17
この板に居る方からしたら物凄く低いレベルの質問だと思うのですが…すみません。
もしお分かりでしたらお力を貸して頂けたらと思います。

あるtxtファイルを読み込んで、他のtxtファイルに
10行・23文・150文字
という風に出力するプログラムを作ろうとしています。

$data="This is a raining day.It rain all the time.I feel so boring.";

@sentence = split(/\./, $data);

$i=1;
foreach $in1(@sentence){
@word = split(/ /, $in1);
$j=1;
foreach $in2 (@word){
print "第". "$i" . "行の第" . "$j" . "文字は " . "$in2" . "\n";
$j++;
}
$i++;

}

を書き換えたらできると言われたのですが、どの部分に足せばいいのか分かりません…少しいじるとすぐに動かなくなってしまいます。
905デフォルトの名無しさん:2009/08/01(土) 14:26:34
906デフォルトの名無しさん:2009/08/01(土) 15:00:06
Perlの入門書でお勧めの書籍を教えて頂けませんか?お願いします。
907デフォルトの名無しさん:2009/08/01(土) 15:48:29
Perl/tkでWindows用GUIプログラムを作成しているのですが、
○分毎に関数を実行したくてalarm関数を使おうとしたら、
WindowsのActive Perlはalarmが使えないようでできませんでした。
Active Perl 5.8.6 Build 881の環境でalarm使ってみたけど
時間経過しても一切反応無しでした。
WindowsでPerlを使って○分毎に指定の処理を実行させるにはどうすればいいですか?
908デフォルトの名無しさん:2009/08/01(土) 17:57:30
$main_window->after( 360, sub { } );
after使えば出来るよ
909907:2009/08/01(土) 22:04:02
>>908
ありがとうございます。

でも何故か即1度実行するだけで繰り返してくれませんでした…。
ソースは下記です。

#!/usr/bin/perl
use Tk;

my $autoup_flg;
my $timer_id;
my $cnt = 0;

my $main = MainWindow->new;
my $autoup = $main->Checkbutton(-text=>"auto update",
-variable => \$autoup_flg,-command=>\&auto_update)
->grid(-row=>0,-column=>0);
MainLoop;

sub auto_update{
if($autoup_flg == 1){
print "after 10 start\n";
$timer_id = $main->after(10,\&update);
}else{
print "after stop\n";
$main->afterCancel($timer_id);
}
}
sub update{
$cnt++;
print "$cnt loop\n";
}
910デフォルトの名無しさん:2009/08/01(土) 22:21:25
>>909
繰り返すときはafterじゃなくてrepeatでないかい。てかマニュアル読めよ
$timer_id = $main->repeat(10,\&update);
911907:2009/08/02(日) 09:36:18
>>910
できました。ありがとうございます。
オンラインマニュアル(http://www.forum.hell.org.ua/Docs/oreilly/perl3/tk/)
読んでるんですが全く知らない状態だと英語なので見つけにくくて…。
次からもう少し調べてみます。
912デフォルトの名無しさん:2009/08/02(日) 12:55:34
>>906
入門書なんて買わないでネットで探してやればいいじゃん。わざわざ買う必要ない。
基礎覚えたらソースいじったりして勉強。
913デフォルトの名無しさん:2009/08/02(日) 13:42:53
「最近Perlをマスターした人」のレスポンスが求められている。
914デフォルトの名無しさん:2009/08/02(日) 14:18:18
>>913
まあ、後輩だか知り合いだかに入門書は何が良いの?と聞かれても
ラクダしかまともな本がない時代にPerlかじったやつは答えようがないよね。

「初めてのPerl」だとWindows cmd.exeの挙動の違いでたいがいひっかかってるし。
915デフォルトの名無しさん:2009/08/02(日) 17:18:36
>>914
俺なんかまだ英語のらくだしかなかったし、fjですらPerlのまともな
情報は得られん時代だったから役にたたんな。

まあそれでも何とかかけたんだから大丈夫でしょ。

んー、助言するなら、レファレンスに使うならperldocがいい。
日本語訳もたまに転がってる。
普通の人が書いたのは間違ってることが多い。

例えば関数のレファレンスはperldoc perlfunc+検索語 でググれ。

初心者ならperldoc perlintroくらいから読み始めろ。
916デフォルトの名無しさん:2009/08/02(日) 17:28:40
>>836-837
{""}で囲めばできるね

for(my $i = 1;$i <= 3;$i++)
{
&{"func$i"};
}
917デフォルトの名無しさん:2009/08/02(日) 17:58:55
>>915
その時代だったら、UNIXマガジンの解説記事、入門記事で育ったんじゃねえの。
918デフォルトの名無しさん:2009/08/02(日) 18:42:22
ラクダ本の原著は4400円程度で手に入るのに
日本語訳は二冊に分かれてて不便なうえに、
二冊とも買うと10000円超えるってがマヌケだな。
原著をいきなり買って辞書片手に挑戦しながら、
perlと英語の両方の勉強を続けるのが実は一番お得。
自分が知りたい(特殊な)情報は、英語のmlのwebアーカイブで見つかるというパターンが一番多い。
919デフォルトの名無しさん:2009/08/02(日) 18:45:38
そもそも技術本の邦訳ってどうしても英語読みたくない英語アレルギーな人用の本だし。
920デフォルトの名無しさん:2009/08/02(日) 19:45:41
Perl/TkのListboxの既に入力されたデータの変更って
-listvariableで指定した変数or配列の値の変更じゃなきゃできないですか?
Mastering Perl/TkとPerldoc見た感じ、それっぽいメソッドが見当たらなかった…
921デフォルトの名無しさん:2009/08/02(日) 20:19:04
>>917
雑誌類は執筆する側だったな当時は。
さすがにユニマガはないけどUNIXUSERとか。
最近は何も書いてないけど。
922デフォルトの名無しさん:2009/08/02(日) 20:20:23
>>918
> 辞書片手に
PC使えよって思うが。
923デフォルトの名無しさん:2009/08/02(日) 21:47:31
ぶっちゃけ、プログラム組んだ事無い奴がラクダ本読んでも、さっぱり解らなくないか?
924デフォルトの名無しさん:2009/08/02(日) 22:04:08
馬鹿はわからない、馬鹿じゃなければわかる。
925デフォルトの名無しさん:2009/08/02(日) 22:06:03
馬鹿じゃなくても、難しいと思う。
難しいというより、理解の拠り所となる知識が少ないから、見えてこないというか。
そして、そんな人にはリャマ本。
926デフォルトの名無しさん:2009/08/02(日) 23:24:02
>>921
時代認識がめちゃくちゃだぜ、おっさん。
927デフォルトの名無しさん:2009/08/03(月) 00:36:36
perlの情報があんまり無かった頃だったので、
知識の大半はperldocから仕入れたな
日本語訳はあったけど、英語の方が読みやすかったような
928デフォルトの名無しさん:2009/08/03(月) 09:58:19
一応TOEIC600点あるけど、俺は邦訳読むなー
929デフォルトの名無しさん:2009/08/03(月) 13:12:57
>>928
600点しかない、の間違いじゃないか?
そういう俺も600点だが。
930デフォルトの名無しさん:2009/08/03(月) 22:16:01
英語だと、検索と言うか欲しい情報を探すのに手間取る…
これだけはどうしても直らない、どうすればいいんだろう
931デフォルトの名無しさん:2009/08/03(月) 22:20:19
英語のほうが読みやすいっていう人は、英語と日本語で読むスピードが一緒ってこと?
すごいね。
相当のトレーニングをしないとそうはなれないと思うわ。
経験的にかなりの長期間外国にいないと難しいと思う。
932デフォルトの名無しさん:2009/08/03(月) 22:41:29
>>931
リーディングだけに限れば海外経験なくてもネイティブ並みに上達可能だよ。
つかそういう人はザラにいる。知人も毎日日本語よりも英文のフィードの方を読みまくってる。
日本にいても余暇は英文しか読まないって生活は簡単に送れるからね。
933デフォルトの名無しさん:2009/08/03(月) 22:43:18
あと、訳が汚いと原文の方が読みやすいってことはよくあるな。
昔のK&Rとか、最近だとPEAAは誤訳がひどすぎて結局
原文買いなおしたよ。
934デフォルトの名無しさん:2009/08/03(月) 22:52:16
>>931
おまえの能力が劣等なだけ
935デフォルトの名無しさん:2009/08/03(月) 22:59:29
>>932
読むスピードが”同じ”になるのは結構難しいと思うよ。
まあそういう人がいることは確かだが、そういう人はスピーキング、リスニングもかなり上手なことが多い。
発音は別だが。

>>933
訳の問題はあるな。

>>934
はいはいワロスワロス
936デフォルトの名無しさん:2009/08/03(月) 23:08:11
そもそもリーディングでネイティブってことは、100%英語で考えられるって事だから、
スピーキングのスピードや語彙はネイティブと同等でなくてはおかしい。もちろん発音の善し悪しは別問題。

ライティングは「アルファベットを書き慣れる事による書く速さ」とか「英語タイプにどれだけ慣れているか」等
物理的な書く速さに依存するがそれらの基本的にはネイティブと同等であると考えられる。

リスニングは耳の聞き分け能力に依存するのでこれは何とも言えない。
937936:2009/08/03(月) 23:16:34
物理的な書く速さに依存するがそれらの基本的にはネイティブと同等であると考えられる。

物理的な書く速さに依存するが基本的にはネイティブと同等であると考えられる。

の間違いね。「それらの」が余計だった。



補足だが100%英語で、っていうのは頭の中の考えが全て英語なのはもちろん、
思考のスピードもネイティブな言語と同様って意味です。

リーディングでネイティブ並な人はほぼ必ずスピーキングもネイティブ並。
(ほぼ、というのは滑舌が悪くて単語を発音するのに時間がかかる人がいるから。)
逆は成立しない。
米国在住でも文字が読めない人の存在を考えればすぐに分かるが。
なぜならリーディングは文字->単語の認識の変換を行う時間を考えなければいけないから。
これは慣れ。もちろんん日本にいてトレーニングが可能なのは主にこの部分である。

938デフォルトの名無しさん:2009/08/03(月) 23:18:51
>>936
> そもそもリーディングでネイティブってことは、100%英語で考えられるって事だから、

ちがうだろ。
939デフォルトの名無しさん:2009/08/03(月) 23:24:55
>>938
違くないよ。少し考えればわかるだろ。
100%英語で考えられないでリーディングでネイティブなわけないでしょ。

ネイティブっていうのは、
文を見る->文字から単語、文を認識->意味を理解

他の言語を通すと
文を見る->文字から単語、文を認識->翻訳->意味を理解

この「翻訳」が時間の無駄なんだよ。ネイティブはその言語を直接理解できなければならない。
よって思考は全てその言語で行われる必要がある。
もし他言語の思考が入るとしたらそこには必ず翻訳が入っているためそれはネイティブとは呼ばない。


「ちがうだろ」じゃ何も伝わらないよwwちゃんと論理的な反論してね。
940デフォルトの名無しさん:2009/08/03(月) 23:26:58
win32をインストールしたけど、使い方がわかりません。
リファレンス的なサイトを知ってたら教えてもらえませんか?
激しく巨大なわがままを言うと、画像付リファレンスだとパーフェクトです。

941デフォルトの名無しさん:2009/08/03(月) 23:28:02
↑win32::GUI
942デフォルトの名無しさん:2009/08/03(月) 23:32:29
>>939
俺が言ってるのはさ、
毎日英文ばっかり読んでりゃリーディングは完璧に身につくが、
ちょっとした挨拶とか電話の仕方とかジョークの返しとかはネイティブと喋ってないと
身につかないのよ。タイミングとかさ。一人で勉強してたら誰も直してくれないしさ。

まあ、カンバセーションの英語とマニュアル類の英文は別物だということに気づけ。

つかお前文章長いし粘着気味でキモい。
943デフォルトの名無しさん:2009/08/03(月) 23:32:53
944デフォルトの名無しさん:2009/08/03(月) 23:34:17
しまった。質問するタイミングを間違った。
子供が喧嘩をしている時だったか。
945デフォルトの名無しさん:2009/08/03(月) 23:34:26
>>936
> そもそもリーディングでネイティブってことは、100%英語で考えられるって事だから、

誰もそんなこと言っていない件
946デフォルトの名無しさん:2009/08/03(月) 23:36:30
言っとくけど俺ですら翻訳なしで英文普通に読めるぞ。
職業になってるくらいだから、翻訳しながら英文読むとかアホのすること。
ボキャビルが足りないから辞書引く時間で損してるけどね。
947デフォルトの名無しさん:2009/08/03(月) 23:36:58
>>937
> リーディングでネイティブ並な人はほぼ必ずスピーキングもネイティブ並。

ちがうだろ。
948939:2009/08/03(月) 23:37:06
やっぱ理論的な反論は無しかwwwww



今日も俺の大勝利だなwwwwwwwwww
やっぱ「俺は英語できます君」は釣りやすくてウケるwwwwwwwwww
949デフォルトの名無しさん:2009/08/03(月) 23:38:53
>>946
翻訳なしで普通に読むだけなら誰でも出来るだろ。
問題なのは速さ。日本語と同程度に読めなきゃネイティブとは言わん。


>>947
だからまともな反論は出来ないのか?
スピーキングがネイティブ並じゃないならそいつのリーディングはネイティブ並じゃないんだよ。
950デフォルトの名無しさん:2009/08/03(月) 23:40:41
一方的な勝利宣言のあと勝手に逃亡。
おつかれさま。

951デフォルトの名無しさん:2009/08/03(月) 23:41:55
>>949
>>939
> ネイティブっていうのは、
> 文を見る->文字から単語、文を認識->意味を理解

これに反論しただけだが?俺はネイティブじゃないがこのくらい出来るぞ。
952デフォルトの名無しさん:2009/08/03(月) 23:43:53
なにこのスレ
953デフォルトの名無しさん:2009/08/03(月) 23:44:30
>>949
> 問題なのは速さ。日本語と同程度に読めなきゃネイティブとは言わん。
お前な、英語を語るならカタカナ語くらいちゃんと使え。nativeを辞書で引いて来い。
基礎中の基礎単語だろーに。
954デフォルトの名無しさん:2009/08/03(月) 23:47:10
>>943
その検索のしかたとってもいいな。ありと。
使えそうなのはすでに知ってた1サイトしかなかったけど。

どうでもいいけど、次スレのテンプレに中学生禁止を書いておいてほしい。
955デフォルトの名無しさん:2009/08/03(月) 23:49:42
>>950
それ別人なわけだが。。

>>951
> そもそもリーディングでネイティブってことは、100%英語で考えられるって事だから、
これを違うって言ってた人は君?そもそも日本語で考えた時点でネイティブじゃないっていうのは同意したのかな?


>文を見る->文字から単語、文を認識->意味を理解
できるのはいいとして、問題はその速さだから。

これを「日本語と同様の速さで」出来ないと英語を日本語と同様の速さで読むことはできないよ。
つまり、「意味を理解」の時点で英語での「日本語と同様の速度の」思考が必要とされる。

英語で日本語と同様に思考できるなら英語でのスピーキングは必ず日本語と同様になるはずである。
956デフォルトの名無しさん:2009/08/03(月) 23:56:32
>>955
お前、「ネイティブ並みの語学力」を「ネイティブ」だと勘違いしてるようだから、
native辞書で引いて来いって。読んでて恥ずかしい。

あと読むことと喋ることは全然違うから。文語で話す外人いたらキモチワルイだろ。
意味が通じるという点では同意するが、

> リーディングでネイティブ並な人はほぼ必ずスピーキングもネイティブ並。

これは有り得ない。
957デフォルトの名無しさん:2009/08/04(火) 00:26:59
TOEIC受けると、Rだけやたら高くてLは笑うほど低い

世の中の英会話教室はそういう人をターゲットにしてて、
それまでやらなかった分野なんだから簡単に急成長するのは当たり前だけど、
英会話を見に付けても結局活かす場が無い
958デフォルトの名無しさん:2009/08/04(火) 00:27:26
邪魔
959デフォルトの名無しさん:2009/08/04(火) 01:00:57
板間違えたかと思ってスレタイ3回も見直したじゃねーかバカヤロー
960デフォルトの名無しさん:2009/08/04(火) 01:18:34
車輪の再発明の次はPHPの話してたと思ったら次は英語か?
961デフォルトの名無しさん:2009/08/04(火) 01:35:26
エロチャットで大活躍 wow
962デフォルトの名無しさん:2009/08/04(火) 01:42:55
ム板で英語ネタはどこのスレでもなぜか盛り上がる。
963デフォルトの名無しさん:2009/08/04(火) 07:14:20
英語発音違いの論争ならどの板でも1度はかならずやるよ
964デフォルトの名無しさん:2009/08/04(火) 08:10:15
発音違いというか、カタカナ表記で言い争うから質が悪い。
そのうち、からかって「リンゴはアポー」とかレスする奴が出てきたりした頃、
熱くなってた奴らも無意味さに気づいて収束する。
965デフォルトの名無しさん:2009/08/04(火) 11:56:56
ダウンロードカウンタというのは、初心者が作るのは大変でしょうか?
966デフォルトの名無しさん:2009/08/04(火) 12:03:20
WEB?WEBならスレチだけど

考え方さえ間違ってなきゃ、入門書片手に作れると思うよ。

まず、ダウンロードのリンク先をCGIにして
そのCGIで外部ファイルなりDBなりを使ってカウントアップ
その後、ファイルを書きだす。(mime_typeを指定すること)
もしくはファイルにリダイレクトでもいいけど。

とか、そういう感じで。
967デフォルトの名無しさん:2009/08/04(火) 16:20:28
>>966
WEBです;
スレチでしたか、すみませんでした;
それなのに丁寧にありがとうございます。
本を買って頑張ってみます。
968デフォルトの名無しさん:2009/08/04(火) 18:33:59
perでGUIソフト作りたいんだけど
GTKっ使いやすい?
969デフォルトの名無しさん:2009/08/04(火) 18:34:47
>>968
めっさ誤字脱字してる・・・

GTK2使おうと思ってるんだけど
使い勝手とかどうですか?
それとも定番の他のソフトがあるのかな
970デフォルトの名無しさん:2009/08/04(火) 18:47:27
>>969
Perl/Tkが枯れてると思うが、今はGtk2一択じゃねーのかな。
GUIは書かないから何とも言えんが。
971デフォルトの名無しさん:2009/08/04(火) 19:42:30
>>970
レスどうも
やっぱりGtk2の一択みたいですね。
Perl/Tkは知りませんでした、調べてみます
972デフォルトの名無しさん:2009/08/04(火) 23:07:57
Tkは手軽で使いやすいし、機能も豊富で、そのままunixで作ってwindowsで使える。
でも、日本語関係で大変な目に遭う。使うなら日本語の取り扱いからなんとかする必要が出てくる可能性有。
GUIはwindowsじゃないので違和感はあり。

WIN32::GUIは、Tkよりさらに手軽。でもGUIがとっても貧弱。
よくある一般的なGUIや窓を表示する程度だったら最も適切だと思った。

WIN::APIは、あんまやったことないけど、悪い印象はなかった。コーディングはTkよりややめんどい程度。
引数名が直感的じゃなかった。つーか記号みたいなLvに近い?だった。まぁ記号ではないけど。
あと、引数の書き方も見やすく綺麗に書きにくい感は多少だけどあった。

他はやったことナッシング。
973デフォルトの名無しさん:2009/08/05(水) 08:33:46
>>972
丁寧なレスありがとうございます。
順番に試して見ます
974デフォルトの名無しさん:2009/08/06(木) 01:14:17
$url = 'http://www.google.co.jp/search?hl=ja&q=aaa&lr=';
$file = 'AAA.html';
use LWP::Simple;
getstore($url, $file);

この方法じゃ保存できたいんだけど、どうすればいいですか。
975デフォルトの名無しさん:2009/08/06(木) 01:44:43
>>974
どこで不具合が起きているのか突き止めてそれを修正すればいいです。
976デフォルトの名無しさん:2009/08/06(木) 01:48:46
>>974
レスポンスコードが403だからgoogleがlwpのリクエスト受けないのかな。ちゃんと調べてないので何とも言えないけど。
$url = 'http://search.yahoo.co.jp/search?p=aaa&search.x=1&fr=top_ga1_sa&tid=top_ga1_sa&ei=UTF-8&aq=&oq=';
yahooはいけたよ
977デフォルトの名無しさん:2009/08/06(木) 01:51:10
というかですね。
この方法だと保存できるのとできないのがあるみたいで…

そこでなんですけど、htmlを保存できる万能な方法ってないですかね。
978デフォルトの名無しさん:2009/08/06(木) 01:57:28
>>977
use Data::Dumper;
use LWP::UserAgent;

my $url = 'http://www.google.co.jp/search?hl=ja&q=aaa&lr=';
my $file = 'AAA.html';
my $ua = LWP::UserAgent->new( agent => 'bot' );
warn Dumper $ua->mirror($url, $file);
979デフォルトの名無しさん:2009/08/06(木) 01:59:14
>>977
ユーザエージェント偽装すれば

980デフォルトの名無しさん:2009/08/06(木) 12:38:54
Perlでは、eval をつかって try catch のまねごとをしますけど、
catch(FooError ex) { ... }
catch(BarError ex) { ... }
のように例外クラスを指定してcatchするのはどうしたらいいですか。
981デフォルトの名無しさん:2009/08/06(木) 12:54:17
>>980
つErrorモジュール
982デフォルトの名無しさん:2009/08/06(木) 13:14:52
本気で困りました。

-----------------------------------

use strict;
#ちょっと画像データを10進数にしてみる
my $file = "./hogehoge.bmp";
my $count;
open FILE, "$file" or exit;{
    binmode FILE;
    local $/ = \1;
    while(<FILE>){
        $count ++;
        print (sprintf("%03d", unpack("C", $_ )) . ($count % 16 ? " " : "\n")) ;
    }
}close(FILE);

-----------------------------------

正常に動作しません。
症状:
 1:なんか知らんけど改行の位置が乱れる場合がある。
 2:その際、その周辺で高確率でsprintfの整形も乱れる。
 3:プログラムを実行するたびにその位置がランダム。

環境:
 1:windowsXP
 2:ActivePerl5.8.7
 3:秀丸5.01から perl -w <con >con を記入して実行。
983982:2009/08/06(木) 13:46:23
追記
 local $| = 1;
を書くと圧倒的に乱れる箇所が減少しました。
しかしそれでも整形や改行位置が乱れます。
なぜでしょう?

つーかPerlってメモリの使用具合で処理結果が乱れるんですか?
984デフォルトの名無しさん:2009/08/06(木) 14:03:57
my $i = 0;
my $pos;
for my $x (@list) {
 if ($x eq "foo") {
  $pos = $i;
  last;
 }
 $i++;
}
print $pos, "¥n";

という処理をかっこよくかくにはどうしたらいいですか。
Rubyだとこんなかんじ。
pos = list.index {|x| x == "foo"}
print pos, "¥n"

985デフォルトの名無しさん:2009/08/06(木) 14:10:45
>>984
最近見たなと思ったら>>735ですか?
>>738で回答したんだけどその後返って来なくて結局どういう仕様なのかわからん
どういう動きが正しいの?
986デフォルトの名無しさん:2009/08/06(木) 15:16:27
位置情報が欲しいってことだよね?

use List::Util qw( first );

my $pos = first { $list[$_] eq 'foo' } 0..$#list;
my $pos = (grep {$list[$_] eq "foo"} 0..$#list)[0];
987デフォルトの名無しさん:2009/08/06(木) 15:46:49
てすと
988デフォルトの名無しさん:2009/08/06(木) 16:31:20
リストの要素のうち、N番目以降だけを取り出すような関数はありますか。
@list = (10, 20, 30, 40, 50);
@list2 = slice @list, 2; # 3番目以降の要素をすべて取り出す
989982:2009/08/06(木) 16:41:20
オールスルーされましたが自己解決!

>>988
スライス
990デフォルトの名無しさん:2009/08/06(木) 16:55:32
>>989
ありがとうございます。
my $len = @list;
my @list2 = @list[$n..$len-1];
でできました。
スライス使う時には $list[1..3] ではなくて @list[1..3] なんですね。
ここを間違って悩んでました。
991デフォルトの名無しさん:2009/08/06(木) 17:13:57
@list2 = splice @list, 2; # 3番目以降の要素をすべて取り出す
992977:2009/08/06(木) 22:03:08
遅れたけどありがとうです。
993デフォルトの名無しさん:2009/08/06(木) 22:17:30
文字列が表す関数が存在するかどうかを調べることはできますか。

my $name = "map";
my $val = defined &$name;
print Dumper($val); #=> ''

この例だと$valは偽ですが、これが真となるようにできますか。
994デフォルトの名無しさん:2009/08/06(木) 22:38:34
mapは組み込み関数だから云々
995デフォルトの名無しさん:2009/08/06(木) 23:33:10
Test::Simple を使っているのですが、ハッシュを比較する方法がわかりません。

use strict;
use Test::Simple tests => 1;
my $h1 = {'a'=>1};
my $h2 = {'a'=>2};
ok(%$h1 == %$h2); #=> ok


%$h1 と %$h2 は異なるのに、ok(%$h1== %$h2) が成功してしまいます。
どうしてでしょうか。
996デフォルトの名無しさん:2009/08/06(木) 23:36:54
>>995
異なるかどうかを調べていないからでしょう
997デフォルトの名無しさん:2009/08/06(木) 23:42:37
ハッシュをスカラコンテキストで評価するとバケットの使用状況を示す文字列が返る
(cf. ttp://d.hatena.ne.jp/yumatsumo/20071207/1197002522)
'1/8' == '1/8'を評価して、数値コンテキストで評価すると、/以降は無視されて、
1 == 1 を評価して真が返る

Test::Moreのis_deeplyを使って
is_deeply($h1, $h2)
としてやればいい
998デフォルトの名無しさん:2009/08/06(木) 23:47:12
>>997
ありがとうございます。Perlではハッシュが同値かどうかを簡単に調べる方法はないということなんですね。
自分なりに試した結果、ok(Dumper($h1) eq Dumper($h2)) でうまく動作してくれているんですが、この方法でもいいでしょうか。
999デフォルトの名無しさん:2009/08/07(金) 00:21:10
>>998
ハッシュの中身に関数入ってるとうまく動かなくね?
1000デフォルトの名無しさん:2009/08/07(金) 02:39:30
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。