5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん:2006/10/31(火) 14:52:21
"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。

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

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

http://www.perl.org/get.html
● 2006/10/31現在の最新版: 5.8.8
● 2006/10/31現在の開発版: 5.9.3

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

リンク集は>>2-3
過去スレは>>4

2 :デフォルトの名無しさん:2006/10/31(火) 14:53:20
[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www.site-cooler.com/kwl/perl/

[本]
リャマ: http://www.oreilly.co.jp/books/4873111269/
駱駝: http://www.oreilly.co.jp/books/4873110963/
Effective Perl: http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: http://www.oreilly.co.jp/books/4873112028/

[オンラインマニュアル] (追加)
最新のドキュメント: http://search.cpan.org/~nwclark/perl-5.8.8/
perl5.8.xのドキュメント(一部): http://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/~kbk/perl5.005/
日本語ドキュメント検索: http://www.cpan.jp/search.cgi
perldoc.jp: http://www.perldoc.jp/
Perldoc.com: http://www.perldoc.com/

3 :デフォルトの名無しさん:2006/10/31(火) 14:54:50

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

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

[Perl5.8Unicodeメモ]
http://www.pure.ne.jp/~learner/program/Perl_unicode.html
http://www.namazu.org/~tsuchiya/perl/perl-5.8.html
http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html


4 :デフォルトの名無しさん:2006/10/31(火) 14:55:48
[過去スレ]
1 ttp://pc.2ch.net/tech/kako/1017/10177/1017736187.html
2 ttp://pc3.2ch.net/tech/kako/1033/10336/1033688230.html
3 ttp://pc2.2ch.net/tech/kako/1041/10412/1041205885.html
4 ttp://pc2.2ch.net/tech/kako/1048/10485/1048519394.html
5 ttp://pc5.2ch.net/tech/kako/1053/10530/1053053082.html
6 ttp://pc5.2ch.net/tech/kako/1060/10606/1060689008.html
7 ttp://pc2.2ch.net/test/read.cgi/tech/1068051036/
8 ttp://pc2.2ch.net/test/read.cgi/tech/1074151549/
9 ttp://pc5.2ch.net/test/read.cgi/tech/1079114157/
10 ttp://pc5.2ch.net/test/read.cgi/tech/1085564875/
11 ttp://pc5.2ch.net/test/read.cgi/tech/1090889189/
12 ttp://pc5.2ch.net/test/read.cgi/tech/1094579428/
13 ttp://pc5.2ch.net/test/read.cgi/tech/1097851764/
14 ttp://pc5.2ch.net/test/read.cgi/tech/1101649274/
15 ttp://pc5.2ch.net/test/read.cgi/tech/1105953092/
16 ttp://pc8.2ch.net/test/read.cgi/tech/1111034732/
17 ttp://pc8.2ch.net/test/read.cgi/tech/1117870308/
18 ttp://pc8.2ch.net/test/read.cgi/tech/1121804136/
19 ttp://pc8.2ch.net/test/read.cgi/tech/1126977805/
20 ttp://pc8.2ch.net/test/read.cgi/tech/1131286411/
21 ttp://pc8.2ch.net/test/read.cgi/tech/1134327348/
22 ttp://pc8.2ch.net/test/read.cgi/tech/1138519327/
23 ttp://pc8.2ch.net/test/read.cgi/tech/1141742901/
24 ttp://pc8.2ch.net/test/read.cgi/tech/1146022352/
25 ttp://pc8.2ch.net/test/read.cgi/tech/1149259409/
26 ttp://pc8.2ch.net/test/read.cgi/tech/1153412251/
27 ttp://pc8.2ch.net/test/read.cgi/tech/1157874614/


5 :デフォルトの名無しさん:2006/10/31(火) 18:01:24
誰も言ってくれないから自分で言う

>>1

6 :デフォルトの名無しさん:2006/10/31(火) 18:12:14
>>5

罰ゲームで新スレたてて誰も慰みの言葉かけてくれなきゃ腐るわなw

7 :デフォルトの名無しさん:2006/10/31(火) 22:02:46
>>1
いまきただけだけどw

8 :デフォルトの名無しさん:2006/10/31(火) 22:22:30
>>1 お疲れ様

9 :前スレ992:2006/11/01(水) 00:18:14
>>前996
それは遅いと思い込んでいました。ありがとうございました。

10 :デフォルトの名無しさん:2006/11/01(水) 00:19:20
毎行、空行後か判定するよりは、ループを2つに分けた方が効率がいいと思うんだ。
好みによるだろうけど(´・ω・)

my (@head, @body);
while (<FH>) { push @head, $_; last if /^$/m; }
while (<FH>) { push @body, $_; }

11 :デフォルトの名無しさん:2006/11/01(水) 00:23:09
こうか

while (<FH>) { (/^$/) ? last : push @head, $_ }
while (<FH>) { push @body, $_ }

メールの処理かね。

12 :デフォルトの名無しさん:2006/11/01(水) 00:50:04
前スレで学んだことを無理矢理活用w

(/^$/ .. 0) ? push @body, $_ : push @head, $_ while (<FH>);


13 :前スレ992:2006/11/01(水) 00:56:52
すいません、ベンチマークしましたが、どれもあまり差が出ませんでした。また明日いろいろ試してみます。

14 :デフォルトの名無しさん:2006/11/01(水) 01:02:40
>>前スレ973

つ「Win32-IE-Mechanize」
http://search.cpan.org/~abeltje/Win32-IE-Mechanize-0.009/lib/Win32/IE/Mechanize.pm

15 :デフォルトの名無しさん:2006/11/01(水) 01:03:39
# ループを使わない例 (イロモノ)
local $/ = "\n\n";
push @retsu, <FH>;
@hai = split /(\n)/, shift @retsu, -1;

# ネタなので効率とかは知らん

16 :デフォルトの名無しさん:2006/11/01(水) 01:05:22
>>13
誰ひとりベンチなんか計らずにポストしてると思うがなw

17 :デフォルトの名無しさん:2006/11/01(水) 02:26:04
1行目に空行があれば最速w

while (<FH>) {/[^\s]/ ? push (@head,$_) : last;}
@body = <FH>;


18 :デフォルトの名無しさん:2006/11/01(水) 02:39:50
#!/Perl\bin\perl
$file="tes.txt";
$outfile="k.txt";
open (IN, $file) or die "$!";
open (OUT, ">$outfile") or die "$!";
$file = ~s/ABC/XYZ/g;
print out $file = ~s/ABC/XYZ/g;
close (IN);
close (OUT);

全く意味わからんのですが、ファイルを開いてABCをXYZに検索置換してk.txtに保存って
どうやるのだろう

19 :デフォルトの名無しさん:2006/11/01(水) 03:06:42
>>18
>>2

20 :デフォルトの名無しさん:2006/11/01(水) 03:23:06

2つの配列があって10%の確立でどっちかの配列を選ぶプログラムを書きたいんですが、
どうやればいいですか?
エロイ人お願いします。

21 :デフォルトの名無しさん:2006/11/01(水) 03:38:23
>>19ありがとう

while (<TEXTFILE>) {
s/ABC/xyz/g;
print "$_\n";
}

こんな感じの物があった。


22 :デフォルトの名無しさん:2006/11/01(水) 03:39:40
>>20
日本語でおk

23 :21:2006/11/01(水) 03:56:31
できたけど、なんか動かない=できてない

#!/Perl\bin\perl
$CSfile="CSfile.csv";
$TXfile="TXfile.txt";
$outfile="outfile.txt";

open (INTEXT, $TXfile) or die "$!";
open (INCSV, $CSfile) or die "$!";
open (OUT, ">$outfile") or die "$!";

while (<INCSV>) {
# 改行コードの除去
chomp ($_);
# 各行をカンマ区切りで分割
@data = split(/,/, $_);
while (<INTEXT>) {
s/$data[0]/$data[1]/g;
print OUT "$_";
}
}

# ファイルハンドルを閉じる
close(INTEXT);
close (INCSV);
close (OUT);

どこかヘンですか?

24 :デフォルトの名無しさん:2006/11/01(水) 04:05:11
強いて言うなら頭かな?

まあ、上では while (<INTEXT>) { } は一回しか実行されないあたりとか大丈夫かな、っては思う。

25 :デフォルトの名無しさん:2006/11/01(水) 04:11:42
>>23
$TXfileを最初に全部読み込んどけ。

26 :デフォルトの名無しさん:2006/11/01(水) 04:12:24
>while (<INTEXT>) { } は一回しか実行されない

あぁそれですねー

どうすれば、動くようになりますかね?

27 :デフォルトの名無しさん:2006/11/01(水) 04:35:26
>>26
どこに問題があるかは分かった?
INCSVを読んだあとINTEXTの置換に取りかかってて、そこまではまあ悪くない。
けどINCSVの1行目のループでINTEXTを最後まで読んじゃってるでしょう。
ファイルの読み書きにはファイルポインタっていう「しおり」みたいなのがあるのは理解してる?
INTEXTを最後まで読んじゃって「しおり」が最後にあるから、INCSVの2行目からの処理では
INTEXTを先頭から読めないじゃん?ってことね。

そのスクリプトの場合なら「しおり」であるファイルポインタを移動すりゃ思ったように動く。
頑張れ。

28 :21:2006/11/01(水) 04:44:02
ヒントをありがとう!
perlを始めて10時間。なかなか難しいですねぇ
もう少し、がんばってみます!!

29 :デフォルトの名無しさん:2006/11/01(水) 04:48:06
いや、それ直してできたらできたとこで >>23 だと、
$outfile に ($TXfile の行数 * $CSfile の行数) 分のデータが書き込まれそうなんだが、
これはわかってやってるのかね?

って 10時間かよwww

30 :21:2006/11/01(水) 04:55:05
テキストファイル100MB超えました。

ただ、検索置換したいだけなのに・・・・・


31 :20:2006/11/01(水) 05:19:11
20だけど
こういう感じにしてみた。$rateに何パーセントの確立で選ぶ値が入ります。例えば10とか20とか。

でもこれだと絶対にX%の確立で一方が選ばれないんだよね。
誤差が2−4%ぐらいでる。
何か言い方法ありませんか?

sub erabu{

my $rate = shift;

my $divider = $rate/10;
my $seed = 10/$divider;
my $randomInt = int(rand($seed));

if ( $randomInt == 0 )
{
return 0;
}
else
{
return 1;
}

}

32 :デフォルトの名無しさん:2006/11/01(水) 05:50:41
なんだ、今日はやけに初心者が多いな(´・ω・)

33 :デフォルトの名無しさん:2006/11/01(水) 06:31:46
>>31
print文などを使って、変数の値を確認することを勧める

34 :21:2006/11/01(水) 06:54:58
どう書き換えても($TXfile の行数 * $CSfile の行数)が出力されますな・・・



35 :デフォルトの名無しさん:2006/11/01(水) 07:33:46
どう書き換えてもなるならしょうがないな。
それは呪いだよ。

36 :デフォルトの名無しさん:2006/11/01(水) 08:20:32
#>>31
$erabareta = 1 > rand 10;
・・・・しね

37 :21:2006/11/01(水) 08:50:01
のろい( ゜Д゜)<呪呪呪呪呪呪呪呪呪

もうちょっと勉強してみる。

38 :20:2006/11/01(水) 09:15:34
>>36
これ動かないんですが。

39 :デフォルトの名無しさん:2006/11/01(水) 10:07:27
win32::OLEとsamieで IEを操作しようと思うのですが、
アドレスとソースの取得はどのようにやればいいのでしょうか?



40 :キューチャン:2006/11/01(水) 10:37:07
oracle8*0*X 接続用perlモジュールDBD-Oracleをどうやって
手にいれるか知っている人いませんか? 教えてください
最新のものしかみつかりません

41 :デフォルトの名無しさん:2006/11/01(水) 12:05:45
>>32
質問スレなんだから問題ないと思うが。

42 :デフォルトの名無しさん:2006/11/01(水) 12:13:25
>>41
>>1
まぁいいじゃね?とは思うが。

43 :デフォルトの名無しさん:2006/11/01(水) 12:20:19
仲良くperlの話してるならなんでもいいよ。

44 :デフォルトの名無しさん:2006/11/01(水) 14:15:17
ここの「Perlの基礎」の5がわからない。
誰か解答教えて下さい。
ttp://www.ipc.hokusei.ac.jp/~z00104/semi/kadai4.html


45 :デフォルトの名無しさん:2006/11/01(水) 14:35:45
$str[$nn]

46 :デフォルトの名無しさん:2006/11/01(水) 15:03:01
perlのEncodeでiconvのEUC-JP-MSに相当するencodingは
なんていうの?


47 :デフォルトの名無しさん:2006/11/01(水) 17:54:32
>>46 Encode::EUCJPMSをインスコしてperldocでモジュールのドキュメント見ろ

48 :デフォルトの名無しさん:2006/11/01(水) 17:56:03
>>44
北星学園か。俺が昔かかわったことのある学校だなあ。

で、その5ってその手前で作ったのを変更して作れってことだよな?
変更する前のプログラムは作ったのか?


49 :デフォルトの名無しさん:2006/11/01(水) 18:12:42
>>48
これでよろしいでしょうか?

open(IN,"LIST.txt");
while( <IN> ) {
print $_ ; }
close (IN);


50 :デフォルトの名無しさん:2006/11/01(水) 18:25:26
>>47
追加モジュールをインスコしないとだめなんすね。回答ありがとうございました。

このくらい標準で入れといてほしいけどここで言ってもしょうがないか...


51 :デフォルトの名無しさん:2006/11/01(水) 18:45:59
>>49
それが4の答え? とするとそこからして間違いだと思うが。

まず4についてはね、ファイル開くのをいちいち自分で書く必要はなくて、
<>を使うと簡単。

@a = <>;

これだけで引数で指定したファイルまたはファイルを指定しなければ
標準入力からの入力が全部1行づつ @a に入る。文字列の数(行数)は
@a の数だ。これは @a を scalar として扱うだけでいい。これで
行数が出る。

print scalar(@a) . "\n";

で、@a の内容を全部表示するには

print @a;

でできる。

5はもう少し自分で考えろ。


52 :デフォルトの名無しさん:2006/11/01(水) 22:16:51
>>50
日本人だけが使ってるわけじゃないからね。
そもそもEncode関連はサイズ大きいから、必要としていない言語圏の方々からは嫌われてるとか聞いたこともあるし。

それにEncodeを使えば簡単にEncode::EUCJPMSみたいなのが作れるんだから、他言語よりはマシな気がする。


53 :デフォルトの名無しさん:2006/11/01(水) 23:37:58
本当に困っています。
行はいいのだが、列としてのあつかおうとすると
非常にめんどう(表計算ファイルとかのとき致命的)
たとえば2次元配列のリファレンス
$ref = ([ ],[ ], [ ])
があるとするとこれのそれぞれの
要素の第一成分を表示する
簡単な方法はないでしょうか?
print @{$・・@$ref->[0]};
といったかんじでできない?


54 :53:2006/11/01(水) 23:44:18
いままで思いついた
簡単な方法は

foreach (@$ref){
print $$_[0];
}

ぐらいでもこれでもforeachとかかませて色々操作する必要がある
特に列間の計算とかすることになるとこれでは非常に
面倒
なにか一単語で簡潔にあらわせる方法があったはずなんだが・・・
おもいだせない


55 :デフォルトの名無しさん:2006/11/02(木) 00:29:55
print map { $_->[0] } @$ref

56 :53:2006/11/02(木) 00:34:37
ありがと
ただ
@$\のくみあわせで
print @{$・・@$ref->[0]};
といったぐあいに(@{@$ref->[0]}  みたいなかんじ)
で表現できたはずなんだ
どうしてもできない
おしえてほしい

57 :デフォルトの名無しさん:2006/11/02(木) 02:20:21
>>51
他人事ながら親切回答に感激

58 :デフォルトの名無しさん:2006/11/02(木) 08:29:24
>>56
perldoc perllol しても情報はないなぁ
> @part = @{ $AoA[4] } [ 7..12 ];
は単なる slice だし。

そういう方法があれば知りたいもんだ。

59 :21:2006/11/02(木) 08:49:43
#!/Perl\bin\perl
$CSfile="CSfile.csv";
$TXfile="TXfile.txt";
$outfile="outfile.txt";
open (INTEXT, $TXfile) or die "$!";
open (INCSV, $CSfile) or die "$!";
open (OUT, "> outfile.txt") or die "$!";
@lines = <INTEXT>;
$line_amount = @lines + 1; #行数計算
while (<INCSV>) {
chomp ($_);# 改行コードの除去
@data = split(/,/, $_);# 各行をカンマ区切りで分割
for($i=0;$i<$line_amount;$i++){
$lines[$i] =~ s/$data[0]/$data[1]/g;
}
}
print OUT @lines;
close(INTEXT);
close (INCSV);
close (OUT);

なんとなくできましたが、
速度が遅すぎる点と、結果が文字化けしている点がいかんともしがたい。
CSfile.csv=4万行以上・TXfile.txt=2万行程度(検索・置換は全て日本語です)
改善策をご指導ください。

60 :デフォルトの名無しさん:2006/11/02(木) 09:16:50
>>59
置換対象のファイルを@linesに行ごとに入れてループでまわすよりは
全体を一つの変数$linesにいれてまとめて置換した方がたぶん速い。

$lines = do { local $/; <INTEXT> };

文字化けの原因はここに書いてある情報だけではないともいえないが
たぶんEUCかSJISそのままでやってるせいじゃないかと思うので内部は
unicodeにしたほうがいいだろう。全部一緒ならopenプラグマで

use open ':encoding(sjis)';

のようにすればまとめて指定できるはず。


61 :デフォルトの名無しさん:2006/11/02(木) 10:48:08
>>51
どうもありがとう!やってみます!

62 :21:2006/11/02(木) 12:22:58
>>60
文字化けは、解消されました。

速度については、速くはなったと思いますが、それでも遅い感じがします。
perlの限界なのかな・・・・

いろいろありがとうございました!

63 :21:2006/11/02(木) 12:59:25
追記:
次はC言語でやってみたいと思います。
C言語も全くしたことないけど・・・・
速いのかな・・・・

64 :デフォルトの名無しさん:2006/11/02(木) 13:22:15
>>59
問題なのは行数よりサイズだと思うんだが・・・。
ってかそんな遅くなるとかどんなファイル扱ってんだよ('A`)

65 :デフォルトの名無しさん:2006/11/02(木) 13:37:55
>>62
2万行の文字列を4万回置換だからそれなりに時間はかかるだろうな。

4万回s///するのと置換対象の文字列を全部 | でならべて
s/(文字列1|文字列2|...)/$h{$1}/g のようにするのとはどちらが
速いだろうか

あるいは発想を変えて、対応表を適当な有限状態オートマトンに
変換しといて置換対象の文字列を頭から食わすみたいな
アルゴリズムにするのもおもしろいかもしれない。

たとえば ab → d, ac → e

状態0:
aなら状態1へ
bなら状態2へ
それ以外はその文字を出力して状態0へ

状態1:
bならdを出力して状態0へ
cならeを出力して状態0へ
それ以外はaとその文字を出力して状態0へ

みたいな。


66 :21:2006/11/02(木) 14:07:01

(´ヘ`;)

67 :デフォルトの名無しさん:2006/11/02(木) 14:29:13
Cならオブジェクト性能をマクロからミクロまで
自分でコントロールできるから試してみる
価値はあるな>63
OSコールが気に入らなきゃ、その部分を自分で
組み立てたっていいし

68 :デフォルトの名無しさん:2006/11/02(木) 14:29:24
辞書は予めソートしておき、辞書の1文字目がもしtxtに出現しなければ
同じ出だし辞書は全部飛ばし、別の出だし単語へ。

69 :68:2006/11/02(木) 14:32:44
ソートしなくても、連想配列に1文字目該当無しフラグ作る等いろいろ。 $FG{'あ'}=1;

70 :デフォルトの名無しさん:2006/11/02(木) 15:08:23
> 4万回s///するのと置換対象の文字列を全部 | でならべて
> s/(文字列1|文字列2|...)/$h{$1}/g のようにするのとはどちらが
> 速いだろうか

/(文字列1|文字列2|...)/ より /文字列1/ or /文字列2/ or ... って分けた方が早いらしいよ。
・・・って、どれかひとつにマッチしたら他にマッチしない前提なのかな

71 :21:2006/11/02(木) 15:21:50
C言語・・・こりゃ道程が遠いね



72 :デフォルトの名無しさん:2006/11/02(木) 19:45:27
$max_buf = $size - $now_size if $size - $now_size < $max_buf;

これで $now_size が $size より小さければ $max_buf は0になります。
$now_size が $size より大きければ $max_buf には $size より足りない数になります。

どうなるかは解ったのですが、そうしてこうなるのかが解りません。
どういう風に解釈したら良いのでしょう。

<例>
$size = 12
$now_size = 10
$max_buf = 0

<例>
$size = 10
$now_size = 12
$max_buf = -2

73 :デフォルトの名無しさん:2006/11/02(木) 20:06:12
>>72
> $max_buf = $size - $now_size if $size - $now_size < $max_buf;
>
> これで $now_size が $size より小さければ $max_buf は0になります。

ちがう。if文が偽を返しただけだ。





74 :デフォルトの名無しさん:2006/11/02(木) 20:14:27
>>73
ううん。
すみません、良くわかんないです。
ただ、理解する手がかりになりましたので勉強します。
回答をありがとうございました。

75 :デフォルトの名無しさん:2006/11/03(金) 20:42:55
>>59
毎回正規表現をコンパイルしにいってるから遅いとかはないかな?

このサンプルを元に作ってみたら?
日本語がほしけりゃPerl Cookbookを買いましょう。
ttp://www.unix.org.ua/orelly/perl/cookbook/ch01_18.htm


76 :デフォルトの名無しさん:2006/11/04(土) 13:25:02
>>74
> $max_buf = $size - $now_size if $size - $now_size < $max_buf;
これは
if( $size - $now_size < $max_buf ){
    $max_buf = $size - $now_size;
}
と同じです。っていうのは分かってるのかな・・・?


77 :デフォルトの名無しさん:2006/11/05(日) 00:10:10
chompみたいに、引数を省略すると$_を処理するサブルーチンってどう書くの?

78 :デフォルトの名無しさん:2006/11/05(日) 00:22:57
>>77
@_の要素数を見ればいくつパラメタが与えられたかわかるので
適当に分岐なりなんなりすればよい。


79 :デフォルトの名無しさん:2006/11/05(日) 04:24:45
長い文章から正規表現で$1 .. $7まで取り出して使っているのですが、条件式が長くなってしまいます。
途中で改行したいのですが、実際に条件式の途中で改行するとエラーになってしまいます。
解決策を教えてください。

条件式
$hoge =~ /VALUE="(.*?)"(?:.|[^.])*?VALUE="(.*?)".*?VALUE="(.*?)".*?VALUE="(.*?)".*?VALUE="(.*?)".*?VALUE="(.*?)"(?:.|[^.])*>(\d+)(?:\(hugahuga\)|\(hogehoge\))/;

80 :デフォルトの名無しさん:2006/11/05(日) 05:02:16
>>79
"x" をつける

81 :デフォルトの名無しさん:2006/11/05(日) 05:15:00
>>80
できました。
これ便利ですね。

どうもありがとうございました。

82 :デフォルトの名無しさん:2006/11/05(日) 13:16:32
$hoge = "熊のプーさん";
$hoge =~ /プーさん/;

を実行すると

Unmatched [ in regex; marked by <-- HERE in m/プー <-- HERE さん/ at C:\hoge\test.pl

とエラーになります。
パターンの先頭がパー、ピー、プー、ペー、ポーにだとエラーになるようです。

$hoge =~ /\プ\ー/;

エスケープしてもうまくいきません。
どうしてでしょうか?

83 :デフォルトの名無しさん:2006/11/05(日) 13:29:26
>>82
長音(ー)の2バイト目が 0x5B で、'[' (0x5B) として解釈されてしまうからです。
\Q と \E で囲むと、その間の文字列は正規表現として解釈されなくなります。

/\Qプーさん\E/

ではどうでしょうか?

84 :デフォルトの名無しさん:2006/11/05(日) 13:31:59
>>82
全部EUCで書いちゃうのも手かもね。

85 :デフォルトの名無しさん:2006/11/05(日) 17:56:01
SnUploaderについての質問です。
ファイルをアップすると[upxxxx.xxx]という名前に強制的になりますが、
これを[MAQxxxxx.MP4]という様にしたいです。
(xxxxxの部分は、アップされた順に00001,00002,00003という感じに)
どうすれば良いのでしょうか?
また、MP4ファイルをアップしそれを落とそうとしてファイル名のところを
クリックすると、QuickTimeによって再生され、保存することが出来ません。
これを再生されること無く、ファイル名をクリックしただけでDLが始まるようにするのは
どうすれば良いのでしょうか?
分かりにくい文章かもしれませんが、教えてください。お願いします。

86 :デフォルトの名無しさん:2006/11/05(日) 18:59:54
>>85
前半はすれ違い
後半はいた違い

87 :デフォルトの名無しさん:2006/11/05(日) 19:12:36
>>86
え・・・
uploder.cgiの中身を書き換えるんじゃないんですか?
そうだと思ってPerlのスレにに書いたのですが・・・。
もしかして、ここじゃなくてCGIの質問スレに書くべきでしたでしょうか。

88 :デフォルトの名無しさん:2006/11/05(日) 19:55:09
>>87
>>1

89 :デフォルトの名無しさん:2006/11/06(月) 00:06:18
>>87 書き込みするまえに2chの使い方,板とスレのそれぞれのローカルを覚えろ。それまではROMってろ

90 :デフォルトの名無しさん:2006/11/06(月) 00:55:10
そうまで言わなくてもいいだろ

91 :デフォルトの名無しさん:2006/11/06(月) 01:49:21
「親切10回につき罵倒1回」を心がけましょう

92 :82:2006/11/06(月) 02:11:23
>>83-84
\Q, \Eを使って解決しました。
レスありがとうございました。

93 :デフォルトの名無しさん:2006/11/06(月) 04:18:12
printで標準出力に送られた文字列ををログとしてテキストファイルにも保存したいですのですが、
今は下のようにめんどくさいことをしています。何かうまい方法はありませんか?

print "ほげ";
print LOG "ほげ";

print "ふがふが";
print LOG "ふがふが";


94 :デフォルトの名無しさん:2006/11/06(月) 04:33:50
>>93
perl のプログラムでは標準出力に出すだけ。

tee を使ってリダイレクトするか、
単にリダイレクトしてそのファイルを別端末で tail -f する。

95 :デフォルトの名無しさん:2006/11/06(月) 04:54:25
>>93
二穴用のさぶる〜ちん作りゃいいやん

96 :デフォルトの名無しさん:2006/11/06(月) 05:29:48
>>93
open(STDOUT,"|tee log");

97 :デフォルトの名無しさん:2006/11/06(月) 06:20:27
前スレで出ていたIO::Teeとか。

98 :デフォルトの名無しさん:2006/11/07(火) 04:16:20
質問させてください。

  $data { 'Class_A' } [ 0 ] { 'FirstName' } = '太郎' ;

みたいな配列とハッシュを組み合わせた変数を用意しようと思います。
リファレンスとか多次元とかサブルーチンとかごちゃごちゃで混乱してます。


【1】変数の値を生成し、代入したい

  my %data;
    #(略。ループとかDBからの取得とか)
  my %hash;
  $hash{'FirstName'} = '太郎';
  $hash{'FamilyName'} = '田中';
  push ( @data{'Class_A'} , \%hash );
    #(略。ループ終了とか)

と書いてみたのですが、型が違ぇよボケ(意訳)と言われてしまいました。
(実際には、Class_Aや田中、太郎の部分にはデータベースから取得した値が入る)

仕方ないので、

  my @tmp = @data{'Class_A'};

と、あらかじめコピーしておいてから、最後に

  push(@tmp,\%hash);
  @data{'Class_A'} = \@tmp;

一時ファイルの中身を戻すとかやってる始末です。
もうちょっとスマートな方法はありませんでしょうか。

99 :デフォルトの名無しさん:2006/11/07(火) 04:17:50
なお、データベースから読み込んだとき、クラスごとや出席番号順に来るとは限りません。
A組→B組→B組→B組→C組→A組→C組 とかもありえます。
各クラスの生徒数は不明です。


【2】特定のクラスに所属する生徒の情報を取り出したい。
なお、取り出す順番(出席番号)については言及しない。もちろんしてもいい。

  foreach my $key (keys @data{'Class_A'} )

というループを作ってみたのですが、最終的な値(田中とか太郎とか)を取得する方法が分かりません。

  $data{'Class_A'}[$key]{'FirstName'}
  $key{'FirstName'}

など幾つか試してみましたが、全く取得できる気配はありませんでした。
(どちらも「太郎」などの文字列の取得を期待しています)

100 :デフォルトの名無しさん:2006/11/07(火) 04:36:35
>>98
push ( @data{'Class_A'} , ¥%hash );
のところを
push ( @{$data{'Class_A'} }, ¥%hash );
でいいんじゃないか

101 :デフォルトの名無しさん:2006/11/07(火) 04:44:23
>>99
my %data;
#(略。ループとかDBからの取得とか)
my %hash;
$hash{'FirstName'} = '太郎';
$hash{'FamilyName'} = '田中';
push (@{$data{'Class_A'}},¥%hash);

foreach my $class ('Class_A', 'Class_B', 'Class_C') {
 foreach my $student (@{$data{$class}}) {
  print $student->{'FirstName'} . $student->{'FamilyName'} . "¥n";
 }
}


102 :98:2006/11/07(火) 04:48:00
こんな遅くにも関わらずありがとうございます。
これ以上パソコンとお見合いしてると明日(というか今日)の仕事に響くので
検証は夜にでもやりたいと思います。

ほんとうにありがとうございました…… zzz

103 :デフォルトの名無しさん:2006/11/07(火) 07:15:07
既に解決しているようだが質問するときはエラーメッセージは勝手に意訳せずに
そのまま貼るのが基本。


104 :デフォルトの名無しさん:2006/11/07(火) 17:23:16
もうちと解説してみる。
hashやlistの値として、直接 hash や list は格納できないが、リファレンスは格納可能。
従って、
$data{'Class_A'}->[0]->{'FirstName'} = '太郎';
ならOK。しかしややこしいことに、上記は
$data{'Class_A'}[0]{'FirstName'} = '太郎';
と書いても同様に解釈される。これだと表記上、hash の値にlistが
格納されているように見えるが、実際には list のリファレンスが格納されている。

list のリファレンスなので、その全体は @{$data{'Class_A'}} で参照する。
@$data{'Class_A'} じゃダメ。

105 :98:2006/11/07(火) 20:02:45
ありがとうございます、無事に解決しそうです。
勘でコーディングするだけでなく、しっかりと何をしているか認識しないと駄目ですね。
Cのポインタはなんかはすぐに理解できたんですが、Perlはそれ以上に混乱しそうです。

>103
おっしゃる通りです。以後気をつけます。



106 :デフォルトの名無しさん:2006/11/07(火) 20:13:57
↓のように、配列に変数を代入できますか?

@array=($sec,$min,$hour,$day,$mon,$year);

107 :デフォルトの名無しさん:2006/11/07(火) 20:38:34
>>106
質問するより
print join(',', @array) . "¥n";
で試した方がはやくね? 釣り?

108 : ◆TWARamEjuA :2006/11/07(火) 20:40:15 ?BRZ(6667)
やってみたのか?

109 :デフォルトの名無しさん:2006/11/07(火) 20:54:03
>>107
釣り?

110 :デフォルトの名無しさん:2006/11/07(火) 21:11:17
>>107,108
実行できる環境じゃないんです;;

111 :106:2006/11/07(火) 21:11:55
すいません
>>106=110です

112 :デフォルトの名無しさん:2006/11/07(火) 21:13:37
print "aa";を実行するとaaと画面に表示されますか?
実行できる環境じゃないんです;;

113 :デフォルトの名無しさん:2006/11/07(火) 21:17:48
20年くらい前は紙の上だけでプログラム書くのがプログラマだったんだっけ。

114 :106:2006/11/07(火) 21:23:36
もういいです
C++でもJavaでもできるので、できるものとして書いていきます

115 :デフォルトの名無しさん:2006/11/07(火) 21:36:29
いってらっしゃい

116 :デフォルトの名無しさん:2006/11/07(火) 21:41:21
>>106
できない。

117 :デフォルトの名無しさん:2006/11/07(火) 21:49:59
実行できる環境じゃないのに何のために書いてんだw

118 : ◆TWARamEjuA :2006/11/07(火) 22:32:12 ?BRZ(6667)
(´-`).。oO(そんなことを宣っているやつがC++だろうがJavaだろうが、はたまたObjective-C++2.0でもまともなことは出来ない伊予柑♪)

119 :93:2006/11/07(火) 23:19:58
$tee = new IO::Tee(\*STDOUT, ">>log.txt");
print $tee "ほげふが";
で解決しました。
レスありがとうございました。

120 :デフォルトの名無しさん:2006/11/07(火) 23:55:34
<FORM ACTION="hoge.cgi" method="POST">
<INPUT TYPE=HIDDEN NAME=huga VALUE="huge">
<INPUT TYPE=SUBMIT NAME=ok VALUE="送信">
<INPUT TYPE=SUBMIT VALUE="取り消し">
</FORM>

これを送信したいんですが下のようにすると取り消しが送られてしまいます。
どうすればいいですか?

$string = "上のHTML";
$url = 'http://hoge/hoge.cgi';
$string =~ /NAME=huga\sVALUE="(.*?)"/;
%formdata = ('huga' => $1);
$ua = LWP::UserAgent->new;
$req = POST($url, [%formdata]);
$res = $ua->request($req);


121 :デフォルトの名無しさん:2006/11/08(水) 00:11:16
>>120
>>1

122 :デフォルトの名無しさん:2006/11/08(水) 00:17:34
$string = <<EOF;
<FORM ACTION="hoge.cgi" method="POST">
<INPUT TYPE=HIDDEN NAME=huga VALUE="huge">
<INPUT TYPE=SUBMIT NAME=ok VALUE="送信">
<INPUT TYPE=SUBMIT VALUE="取り消し">
</FORM>
EOF
$string =~ /NAME=huga¥sVALUE="(.*?)"/;
%formdata = ('huga' => $1);
print join(',', %formdata) . "¥n";

>>120は上記を参考にして出直してください。
上記の結果が予想と一致するのであれば、スレ違いかな。
予想と違うのであれば、どっかがおかしい。

123 :デフォルトの名無しさん:2006/11/08(水) 00:36:44
ふと思ったんだけど、
HTMLを標準出力やファイルに出力するスクリプト自体はWebProg板じゃなくてもOKよね?

124 :120:2006/11/08(水) 00:39:04
すみません説明不足だったのかもしれません。
簡易HTTPブラウザを作っていて、
以下のHTMLを受け取った時に解析して送信するといった処理をしたいのです。
やはりスレ違いでしょうか?

<FORM ACTION="hoge.cgi" method="POST">
<INPUT TYPE=HIDDEN NAME=huga VALUE="huge">
<INPUT TYPE=SUBMIT NAME=ok VALUE="送信">
<INPUT TYPE=SUBMIT VALUE="取り消し">
</FORM>

use LWP::UserAgent;
use HTTP::Request::Common qw(POST);
$string = "上のHTML";
$url = 'http://hoge/hoge.cgi';
$string =~ /NAME=huga\sVALUE="(.*?)"/;
%formdata = ('huga' => $1);
$ua = LWP::UserAgent->new;
$req = POST($url, [%formdata]);
res = $ua->request($req);

125 :デフォルトの名無しさん:2006/11/08(水) 01:03:51
>>124
CGI/HTTPの問題であればスレ違い。
文字列のパーシングとかならOK。
で、文字列のパーシングに関しては良さそうに思う。
>>122 のコードで確認しる。
>>124は、どこ(CGI/HTTP/文字列処理/etc.)が怪しいのか切り分けできてるのか?

126 :120:2006/11/08(水) 01:25:48
>>125
ありがとうございます。>>122の意味を掴めていませんでした。
送信、取り消しの違い(ok)をどうやって区別するかを尋ねましたが、スレ違いでした。

127 :デフォルトの名無しさん:2006/11/08(水) 01:40:06
>>126
submitが複数あるフォームでどのsubmitが押されたかを知りたいってこと?
もしそうなら完全に板違いだね。
webprog板の初心者perlスレが良いと思う。

128 :デフォルトの名無しさん:2006/11/08(水) 01:41:38
>>127
とっくにそのスレに移動してんだろ。
死ねよ俺www

ごめんなさい…orz

129 :デフォルトの名無しさん:2006/11/08(水) 08:29:46
>>128
罰として次回のスレ立てを命ずるw

130 :デフォルトの名無しさん:2006/11/08(水) 15:24:02
質問です

ARR_1[1] =1;
@ARR_2 = @ARR_1;
++$ARR_2[1];
print ($ARR_1[1]);
だと当然 1が出力されます

ARR_1[1][1] =1;
@ARR_2 = @ARR_1;
++$ARR_2[1][1];
print ($ARR_1[1][1]);
だと何故か1ではなく、$ARR_2[1][1]の値である2が表示されてしまいます
どこか間違っていますでしょうか?

131 :デフォルトの名無しさん:2006/11/08(水) 15:38:38
$ARR_1[1]と$ARR_2[1]には何が入ってるか調べる

132 :130:2006/11/08(水) 15:52:23
>>>131
よく分かっておりませんが

上の場合は 両方とも、1というスカラー値が入っております

下の場合は、両方とも配列へのリファレンスが入っています
(なぜか$ARR_1と$ARR_2には同じ物へのリファレンスが入ってしまってます)

133 :デフォルトの名無しさん:2006/11/08(水) 15:52:54
すみません
Net::FTPのquotコマンドの引数の書き方がわからないのですが
quot (CMD [,ARGS]) この場合
$ftp->quot("/usr/bin/du", "-k -s ../")
これであってますか?




134 :デフォルトの名無しさん:2006/11/08(水) 15:57:43
>>132
リファレンスをコピーしてもそれらが指す実体は変わらない。
ディープコピーしたければ以下のモジュールを。
http://search.cpan.org/~rdf/Clone-0.22/ (要コンパイル)
http://search.cpan.org/~evo/Clone-PP-1.02/ (PurePerl)

135 :デフォルトの名無しさん:2006/11/08(水) 16:08:31
>>132
>(なぜか$ARR_1と$ARR_2には同じ物へのリファレンスが入ってしまってます)
リファレンスが入った配列を代入したんだから、そうなっていて正常
>++$ARR_2[1][1];
ここでは実体を変えてる

昔の友達の電話番号にかけたら違う人が出た、みたいな


136 :130:2006/11/08(水) 16:22:12
親切な説明、ありがとうござました
私の認識が間違っておりました

ここに書いたのは省略したコードで
実際に詰まってしまった実コードはもっと複雑なスパゲティになっております
全部見直さなきゃ。

137 :デフォルトの名無しさん:2006/11/09(木) 00:01:25
WEB検索でよく使われる構文
(A B) (C D)
をSQL文
(x='%A%' or x='%B%') and (x='%C%' or x='%D%')
に変換するスクリプトを簡単に書く方法はないでしょうか?

Text::Balancedを使って()の対応はチェックしていますので、
()の対応は取れているという前提でやっているのですが
なかなか上手くいきません。

138 :デフォルトの名無しさん:2006/11/09(木) 10:32:50
ファイルハンドルの渡し方で質問なんですが
このようにするしかないのでしょうか?
test(*OUT);
sub test {
local *FD = shift;
flock(FD, 2);
}

139 :デフォルトの名無しさん:2006/11/09(木) 10:55:14
昨日ファイルから読み込んだデータ('機能@')&キー('@')で
index ($data,$key,2)を実行したら3が返ってきたので、
"能"の第二バイト\が原因と考えそれを他の文字に置き換えたら
正しく 4 が返ってきました。

で、今日こんな場合の上手い対処方法はないか質問しようと
もう一度、index ($data,$key,2)を何も手を加えずに実行したら
4が返ってきました。

indexの動作に何か環境条件が影響するんでしょうか?

140 :139:2006/11/09(木) 10:57:50
あ、一個書き忘れ。'機'の第二バイトは @ です

141 :デフォルトの名無しさん:2006/11/09(木) 12:25:32
>>138
渡す方は、
open(FD, "hoge") or die;
test(*FD{IO});

または

my $fh;
open($fh, "hoge") or die;
test($fh);

受け取る方はどちらでも
sub test {
my $fh = shift;
}

ただし、perl 5.8 以降だった気がする

142 :138:2006/11/09(木) 13:46:55
>>141
ありがとうこざいます。
ということは>>138のは間違ってますか?動作はしますが

143 :デフォルトの名無しさん:2006/11/09(木) 15:09:36
>>142
間違っているわけではないけど、use strict できないし、古めかしい。
perl 5.6 以前のバージョンでは(記憶に間違いがなければ)、>>138のような
書き方をせざるを得なかったんじゃないかな。

144 :138:2006/11/09(木) 15:43:13
なるほどどうもです。ありがとうこざいました。

145 :デフォルトの名無しさん:2006/11/09(木) 15:46:20
$ascii = '[\x00-\x7F]';
$twoBytes = '[\x81-\xFC][\x40-\xFC]';
$string =~ /^(?:$ascii|$twoBytes)*?(?:\Q$key\E)/;

これでマッチした位置をしる方法ないですか?

length $` は、0が返ってきました。

perl v5.6.1


146 :デフォルトの名無しさん:2006/11/09(木) 15:56:30
パターンが^ではじまってるんだからマッチしたとすれば文字列先頭からなんじゃないの?
($*をいじってない限り)


147 :145:2006/11/09(木) 16:17:31
事故解決しますた

length ($string) - length ($key) - length ($')

148 :デフォルトの名無しさん:2006/11/09(木) 16:56:34
素直な方法は

$string =~ /^(?:$ascii|$twoBytes)*?(?:\Q$key\E)/;



$string =~ /^(?:$ascii|$twoBytes)*?(\Q$key\E)/;

にかえて $-[1] じゃないか。$keyの部分がキャプチャされる
のがどうしても嫌なら


$string =~ /^(?:$ascii|$twoBytes)*?()(?:\Q$key\E)/;

でもいいがちと見難いかも。

$'はパターンマッチ使う場所がそこだけしかないような小さい
プログラムならいいが、一般的にはあまりお勧めしない。


149 :デフォルトの名無しさん:2006/11/09(木) 17:16:56
>>145
解決隅にレスるのもなんだが pos 使えば?
my $str = 'hogefugehagehoge' ;
print +( pos $str ) . "\n" while $str =~ /(hage)/g ;


150 :145:2006/11/09(木) 17:59:53
>>148
あっ、そっちの方が全然スマートですね。頂きます。

ところで、$' が芳しくない理由はどんなことに起因しますか?
参考サイトがあったら教えて下さい。勉強します

151 :デフォルトの名無しさん:2006/11/09(木) 18:49:47
>>150
> ところで、$' が芳しくない理由はどんなことに起因しますか?

添付マニュアルに書いてある。


152 :デフォルトの名無しさん:2006/11/09(木) 19:37:06
>>150
せっかく解答してくれてるのに>>149氏を無視すんなよ…

153 :150:2006/11/09(木) 20:12:50
>>152
いいんでね?流れ的にも pos の出番じゃなさそーだしw


っと規制解除の prin 経由でカキコテスト

154 :デフォルトの名無しさん:2006/11/09(木) 20:14:22
かけたのはいいけどまちごーた orz...
153 は 149 です。150 さん御免。

155 :デフォルトの名無しさん:2006/11/09(木) 20:15:04
>>152
無視が許容されているから答える人がたくさん現われるのである。

156 :145=150:2006/11/09(木) 20:47:33
>149,153

ごめん。
pos何て使ったことないから勉強のため、それも試したんだけど、

my $str = 'hogefugehagehoge';
print +( pos $str ) . "\n" while $str =~ /(hage)/g;
print $-[1];
--------------------------------
12
8

こんな答えがでたんで、どうレスつけていいか迷って。。。。
塚、プログラムの方が忙しくて、忘れてしまったです スマソ

157 :デフォルトの名無しさん:2006/11/09(木) 21:05:54
pos SCALAR
SCALAR に対して前回に m/ /g サーチが行われた場所を返す。この関数は、最後に
マッチした場所の次の文字のオフセットを返す・・。

programing Perl / 2nd Edition 改訂版 P.228 より。

158 :デフォルトの名無しさん:2006/11/09(木) 22:59:34
>>143
open $fh, $filename が使えないんなら、use FileHandleとかすればいいんじゃね?



159 :デフォルトの名無しさん:2006/11/10(金) 17:00:16
はじめまして
v5.8.8 builtを使用しています

system関数を使用して2〜3個のプログラムを連続で実行させようとしているのですが
「system("Perl hoge.pl < in.txt")」 が実行できません。
誰かご教授お願いします。

「system("Perl hoge.pl in.txt")」のほうはうまくいきました

試した例
my @cmd = ('perl', 'hoge.pl', '< in.txt');
my $ret = system @cmd;

my $cmd = 'perl hoge.pl < in.txt';
my $ret = system $cmd;

160 :デフォルトの名無しさん:2006/11/10(金) 17:20:15
>>159
質問するならOSなどの環境とどう動かないか(エラーが出るとか、一見動いたように見えるが
結果がこうなるはずなのにこうなったとか)を説明しろよ。


161 :159:2006/11/10(金) 17:28:08
>>160
すいません。

OS: XP

my $cmd = 'perl hoge.pl < in.txt';
my $ret = system $cmd;
print $ret;

を入れたところ、「65280」という値が返ってきて、失敗しました。

my @cmd = ('perl', 'hoge.pl', '< in.txt');
my $ret = system @cmd;
print $ret;

の場合はhoge.plは実行されますが、< in.txtが引数(@argv)と勘違いされてるのか標準入力がうまくいきませんでした。(入力画面で止まる)

162 :デフォルトの名無しさん:2006/11/10(金) 17:36:41
>>161
my $cmd = 'cmd perl hoge.pl < in.txt';
でどうかな?(試していないが)

163 :159:2006/11/10(金) 18:28:36
>>162
うまくいきませんでした。

my $cmd = 'cmd perl hoge.pl < in.txt';
my $ret = system ($cmd);
if ($ret != 0) {
print "error [$ret]\n";
}
で、試した所
error [65280]
となりました。

ちなみに
$ perl hoge.pl < in.txt とそのまま実行はできていますので、in.txtがない、名前を間違えてる等の間違いはないです。

164 :デフォルトの名無しさん:2006/11/10(金) 19:04:14
>>163
幾つか試してみたけれど、そのExit codeはhoge.plの中にエラーがある場合に帰ってきてるな。
hoge.plをもっと単純な内容に変えてやってみたらどうなる?

うちの環境(ActivePerl build 819 on Windows XP)では、
hoge.plを空のスクリプトや、標準入力の内容をそのまま表示するだけの内容にして
my $cmd = 'perl hoge.pl < in.txt';
my $ret = system $cmd;
でちゃんと動いてる

165 :デフォルトの名無しさん:2006/11/10(金) 19:50:22
>>164
色々試してくれてありがと。

hoge.plでは

print "好きな数字は?:";
$s=<STDIN>;
print "好きな数字は$s\n";

のみにしてみた。

in.txtは「1」だけ入れたけど、失敗

ちょっと。ActivePerl build 819に変えてやってみます。817だったので

166 :デフォルトの名無しさん:2006/11/10(金) 20:32:06
>>165
バージョンアップして駄目だったら、環境疑ったほうがよさそうだね。

んでかなり特殊な状況だけれど、その現象が起きる状態見っけた。
PERL5SHELL環境変数に値がセットされてないか調べてみれ。
それとPATHが通ってる場所に変なcmd.exeが無いかどうかも。
ttp://perldoc.jp/docs/perl/5.6.1/perlrun.pod#item_PERL5SHELL__specific_to_the_Win32_port_

167 :159:2006/11/10(金) 20:46:44
バージョンアップしてもダメでした…。

>PERL5SHELL環境変数に値がセットされてないか調べてみれ
>それとPATHが通ってる場所に変なcmd.exeが無いかどうかも

Path=C:\Program Files\MeCab\bin;C:\Perl\bin;C:\cygwin\bin;
PERL5SHELLはどうやってみる&変更するんでしょうか?
教えてもらえないでしょうかお願いします。

168 :164=166:2006/11/10(金) 21:48:16
>>167
# Perlの質問ではなくなってきてるけれど(;´Д`A

> Path=(snip);C:\cygwin\bin;
マテ、さっきプロンプトに$を使ってたがCygwin上のシェルからActivePerlを呼んでるのか。

> PERL5SHELLはどうやってみる&変更するんでしょうか?
見るには(コマンドプロンプトでもbashでも)setコマンド。
結果にPERL5SHELLが含まれてないか確認。
変更方法までは面倒見切れんので グ グ れ。

> PATHが通ってる場所に変なcmd.exeが無いかどうか
はCygwin上から使っててwhichを入れてあるなら
$ which cmd.exe
/cygdrive/c/WINDOWS/system32/cmd.exe
になっているかで確認できる。

これらが白ならいよいよ漏れには解らん。

169 :159:2006/11/10(金) 22:00:28
164=166=168さん
色々とありがとうございます

>マテ、さっきプロンプトに$を使ってたがCygwin上のシェルからActivePerlを呼んでるのか。

いえ、Windowsのコマンドプロンプトで使っています。
cygwinのパスを通してるだけです

>見るには(コマンドプロンプトでもbashでも)setコマンド。
>結果にPERL5SHELLが含まれてないか確認。
見てみますと、なかったので追加したんですが、うまく実行できませんでした

ながながとありがとうございます、今度友達のパソを借りて(違う環境で)試してみたいと思います

170 :デフォルトの名無しさん:2006/11/10(金) 22:09:23
cmd 経由でコマンドを実行するには、cmd /c 〜
後はCygwinのPerlが動いてたりとか。

171 :デフォルトの名無しさん:2006/11/11(土) 10:53:49
Windows2000 + ActivePerlでテキスト処理などをやっているのですが、
今度から業務移管で別の担当者が行うことになりました。

で、引き継ぎをしたら「CUIだと非常に使いにくい」とか
「GUIのコマンドラッパーみたいなもの作れないの?」と言われてます。
何か簡単に実現できるよい手はないでしょうか?

自分はckw+Nyacusで満足してたのですが・・。

172 :デフォルトの名無しさん:2006/11/11(土) 10:54:15

$ftp = Net::FTP->new
の$ftpをサブルーチンに渡すにはどうすればいいでしょうか?
&net($ftp);
sub net {
my $ftp = shift;
$ftp->ls;
}
のようにしたのですができないようです。


173 :デフォルトの名無しさん:2006/11/11(土) 12:56:16
Perl初心者なんですが、
変数に代入された値が数値か文字列かを
判別するにはどうすればいいんでしょうか?

174 :デフォルトの名無しさん:2006/11/11(土) 13:14:46
多分 /\D/辺りを期待してるんだと思うけど
内部的には数値文字の区別ないよ

$string = '123xx';
$num = $string + 0;
print $string. " $num";
----------------
123xx 123

175 :デフォルトの名無しさん:2006/11/11(土) 13:27:03
>>172
普通にできると思うけど。
そもそもサブルーチンなしなら出来ているという確認はしたの?
サブルーチンなしでも出来ない、別の問題というオチじゃ

176 :岐山面:2006/11/11(土) 13:33:19
>>173
残念だがPerlで文字列と数字では変数型の区別がないです。できるのは、ある文字列は有効な数字の表現かどうかだけです。たとえば、ある文字列に対するいろんな判別方法は(→Perl Cookbook)

warn "has nondigits" if /\D/;
warn "not a natural number" unless /^\d+$/; # rejects -3
warn "not an integer" unless /^-?\d+$/; # rejects +3
warn "not an integer" unless /^[+-]?\d+$/;
warn "not a decimal number" unless /^-?\d+\.?\d*$/; # rejects .2
warn "not a decimal number" unless /^-?(?:\d+(?:\.\d*)?|\.\d+)$/;
warn "not a C float"
unless /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/;



177 :デフォルトの名無しさん:2006/11/11(土) 13:36:09
>>173
>>174の言うとおり、内部では区別なし。
次の質問は「数値として適切な文字列を判定する方法は?」
と「値を数値と解釈したい(or そのまま文字列として解釈したい)」
が予想されるが。。。

前者の簡単な判断は $val =~ /¥D/ なら数値以外が含まれていることになる。
が、小数点や符号や浮動小数点を考慮するともう少し複雑になる。

後者は、「$val + 0」で数値として扱われる。
算術演算子で扱わなければ文字列として扱われるが、「$val . ""」で文字列として扱われる。

178 :デフォルトの名無しさん:2006/11/11(土) 13:55:33
はらたいらに全部。本名だったんだ。
ttp://www.nikkei.co.jp/news/past/honbun.cfm?i=AT1G10035%2010112006&g=K1&d=20061110

179 :デフォルトの名無しさん:2006/11/11(土) 14:15:44
Math::BigRatとかつこたらええやん

180 :デフォルトの名無しさん:2006/11/11(土) 14:17:48
Scalar::Utilのlooks_like_number使っとけ。perlの判定API呼ぶからいちばん確実

181 :デフォルトの名無しさん:2006/11/11(土) 14:27:04
>>174
>>176
>>177
レスありがとうございます。$val + 0で期待通りの動作に出来ました。

182 :デフォルトの名無しさん:2006/11/11(土) 16:46:58
ここはモジュールのインストールについての質問をしてもOKですか?

183 :岐山面:2006/11/11(土) 17:01:14
モジュールのインストールなら、ActiveStateのPPMを利用すれば簡単だろう

184 :182:2006/11/11(土) 17:16:49
Solaris10 x86を使っていて、できれば後学のためActiveperlじゃないのでやりたいと考えていました。
DBD::mysqlについてです。


185 :岐山面:2006/11/11(土) 17:27:39
非PPMのインストール経験がないから分かりません-_-

186 :デフォルトの名無しさん:2006/11/11(土) 17:47:07
>>184
基本は
$ perl Makefile.PL
$ make
$ make test
$ make install (ここは root 権限で)
なので、一度やってみ。

187 :182:2006/11/11(土) 18:19:05
>>186
ありがとうございます。
書いて下さった手順は一通りやっていて、make test で一つだけエラーが出ています。
t/40bindparam........FAILED test 23
Failed 1/28 tests, 96.43% okay

この状態でとりあえずインストールまでやって、MovableType3.3を動かそうとしていますが、
mt.cgiで下のようなエラーを吐いています。

Got an error: install_driver(mysql) failed: Can't load '/usr/local/lib/perl5/site_perl/5.8.7/i86pc-solaris/auto/DBD/mysql/mysql.so' \
for module DBD::mysql: ld.so.1: perl: fatal: /usr/sfw/lib/libgcc_s.so.1/libmysqlclient.so.15: Not a directory at /usr/local/lib/perl5/5.8.7/i86pc-solaris/DynaLoader.pm line 230.
at (eval 9) line 3
Compilation failed in require at (eval 9) line 3.
Perhaps a required shared library or dll isn't installed where expected
at lib/MT/ObjectDriver/DBI/mysql.pm line 96

"/usr/sfw/lib/libgcc_s.so.1/libmysqlclient.so.15"というパスは存在していない(libgcc_s.so.1はディレクトリじゃない)
ので、ここがネックなのかな、と思っていますが、どこの設定の結果ここを見に行っているのか把握できないので、
どうかご教授お願いします。


188 :デフォルトの名無しさん:2006/11/11(土) 18:57:39
>>187
オラわかんね。
ちなみに、Solarisに二つperlが入ってるってことはないよね?
/usr/bin/perl と /usr/local/bin/perl があって、DBD のインストール対象と mt.cgi が
使ってるものが違うとか。ハズしてたらめんご。

189 :デフォルトの名無しさん:2006/11/11(土) 19:15:10
>>187
こんなの見つけたよう。
http://dev.mysql.com/doc/refman/4.1/ja/perl-support-problems.html

190 :182:2006/11/11(土) 19:48:11
レスありがとうございます。

>>188
難しいですよね(´・ω・`)
デフォルトで入っていたものは退避させていて、新しい方を見に行くように設定しています。

>>189
わざわざありがとうございます。
しかし、書いてあるような"-static -config"ってオプションはないみたいなんですよ。
バージョン5系を使っているので、無くなっちゃったんですかね。。。

191 :182:2006/11/11(土) 19:56:39
libmysqlclient.soは既に/usr/libに入ってて、
LD_LIBRARY_PATHにもLDFLAGSにも/usr/libを通しているんですけどね。。。
困りました(^_^;)

192 :デフォルトの名無しさん:2006/11/11(土) 21:23:54
>>191
http://perldoc.jp/docs/modules/DBD-mysql-2.1026/DBD/mysql/INSTALL.pod

内の「既知の問題」の 3. がそれっぽい気がします。
mysqlclient.so では動作せず、スタティックリンクが必要なシステムがあるということのようです。
僕もようわからんので、追加情報 & 経過報告よろしく。

193 :デフォルトの名無しさん:2006/11/11(土) 22:07:08
>>191
問題の切り分けとして。
シンプルなテストプログラムですら動かない?
use DBI;
$dbh = DBI->connect('DBI:mysql:dbxxx:hostxxx', 'userxxx', 'passxxx');
くらいでもいいと思うけど。

194 :182:2006/11/11(土) 22:08:44
>>192
ありがとうございます。
libmysqlclient.so周りがあやしい、っていうのは前出のと同じ感じなんですね。
オプションの指定の仕方がハッキリとは書いてない感じなので、いろいろ試してみます。

・libmysqlclient.aを/usr/libにコピー→変わりなし
# 明示的に指定しないとダメなんですね(^_^;)

・mysql_config --libsの結果をコピーして、mysqlclient部分をlibmysqlclient.a
のフルパスに書き換え、貼り付け→オプションエラー


195 :デフォルトの名無しさん:2006/11/11(土) 22:34:17
>>171
Perl/Tk使うとか?
あるいはWin32::GUI::Loftとか。


196 :182:2006/11/11(土) 23:35:48
>>193
一行目にperlパス追加したCGIにして実行しましたが、下のようになりました。
Name "main::dbh" used only once: possible typo at CGIファイルのパス line 3.

194の最後に書いた方法、ダブルクオートで囲むのを忘れていましたorz
しかし、それでやるとmake testでほぼ全滅になり、余計ダメみたいでした(;つД`)

197 :デフォルトの名無しさん:2006/11/12(日) 00:10:31
>>196
>一行目にperlパス追加した

もしかして perl に -w オプション付けてる? だったら -w 外すか、
my $dbh = ..
にしてみて。動いてるような気がする、のはらたいらに3000点

198 :182:2006/11/12(日) 00:35:36
>>197
…付けてました!
外したらエラーは出なくなりました。

199 :デフォルトの名無しさん:2006/11/12(日) 00:52:17
>>198
ということは、最低限DBに接続できていると言うことになるんじゃ?
試しにパスワードとかデタラメにしてエラーが出るように変わるか確認すればいいよね。
ということは、DBDのインストール成功(make testの影響はわからないが)。

じゃ、mt.cgi は何でよ、ってのはわからんけど。

200 :182:2006/11/12(日) 01:14:38
>>199
ユーザ、パスワードイジったらコネクションできなかったので何らかの形にはなってる、ってことですね。
MTのモジュールチェック用CGIでもインストールされている、という表示は出ています。

ますます原因がわからなくなってきましたね(´・ω・`)

201 :デフォルトの名無しさん:2006/11/12(日) 01:15:55
素朴な疑問だけど、chompは何て読むの?

202 :デフォルトの名無しさん:2006/11/12(日) 01:20:11
ちょーマジックポイント

203 :デフォルトの名無しさん:2006/11/12(日) 01:39:38
perlってうにxのシェルのsh -xみたいなデバッグコマンドある?

204 :デフォルトの名無しさん:2006/11/12(日) 02:23:33
>>203
Devel::Trace

205 :デフォルトの名無しさん:2006/11/12(日) 07:43:34
Perlってなんでこんなに楽しいの?

206 :デフォルトの名無しさん:2006/11/12(日) 08:29:10
if (($str eq 'ほげ') || ($str eq 'ふが') || ($str eq 'もが')) {
print "hoge\n";
}

これを簡略化して

if ($str eq ('ほげ' || 'ふが' || 'もが')) {
print "hoge\n";
}

としたのですが、うまくいきませんでした。
簡単に書ける方法があったら教えてください。

207 :デフォルトの名無しさん:2006/11/12(日) 08:45:03
if ($str =~ /^(ほげ|ふが|もが)$/) print "hoge\n";

ただし ほげ ふが もが にマルチバイト文字や記号が入る時は
\Q と \E で囲わないと、ダメな場合がある。 >>82-84 辺りを参照。

208 :デフォルトの名無しさん:2006/11/12(日) 08:51:31
これはどうか
print "hoge\n" if grep {$str eq $_} ('ほげ', 'ふが', 'もが')

209 :206:2006/11/12(日) 10:10:14
>>207
なるほどお
正規表現を使うことは全く頭にありませんでした。
ひとつ知恵が付きました。

>>208
grep関数、知らなかったので調べてみました。
これ便利ですね。 

>>207-208
おかげで解決しました。
レスありがとうございました。


210 :デフォルトの名無しさん:2006/11/12(日) 11:17:00
サブルーチンで渡しちゃうという手もあるかな。
まあ、そこまでするくらいなら普通に比較した方が楽だとは思うけど
比較文字列に何らかの修正を加える場合なら一考の余地ありかと思う。

大文字小文字を区別しないとか、半角カナ・全角カタカナ・ひらがなを区別しないとか。

211 :デフォルトの名無しさん:2006/11/12(日) 11:37:24
>>206
解決隅にレスるのもなんだが誰も指摘しないので一応書いとく。
my $str = 'bar' ;
if ( $str eq 'fuga' || 'hoge' || 'bar' ){ print 'hoge' . "\n" ; }

212 :デフォルトの名無しさん:2006/11/12(日) 11:39:12
211 は忘れてくれ。

213 :デフォルトの名無しさん:2006/11/12(日) 13:03:46
>>205
君がperlを愛しているからさ

214 :デフォルトの名無しさん:2006/11/12(日) 13:34:15
http://search.cpan.org/~cfranks/Perl6-Junction-1.10/Junction.pm

一応こういうものもある。
Perl6では言語機能として提供されるようだね。

215 :デフォルトの名無しさん:2006/11/12(日) 18:21:48
ファイルのバイナリダンプから先頭32バイトを削除したいのですが、
手動でバイナリエディタから削除したものとPerlスクリプトでのものが同一になりません
すみませんがアドバイスを頂けないでしょうか

open (IN,"hoge");
open (OUT, ">hogehoge");
binmode IN;
binmode OUT;
@bin = <IN>;
$binout = "";
foreach $bin(@bin){
$binout .= unpack("H*", $bin);
}
$bin2 = substr($binout,32);
print OUT pack("H*",$bin2);
close (IN);
close (OUT);


こんな感じでスクリプトを書いてみたのですが…
ちなみに substr の所をコメントアウトして unpack したものをそのまま pack したところ
同一のファイルが出力されることは確認してます

216 :182:2006/11/12(日) 18:26:45
再起動して気付いたのですが、mt.cgiを、コマンドライン上では、
環境変数LD_LIBRARY_PATHに/usr/local/mysql/lib/mysql/(mysqlのインストール先ディレクトリの、ライブラリがある場所)がないと
>>193さんのテストスクリプトも動かなくなります。
逆に、追加してあるとコマンドライン上でmt.cgiもエラーを吐かなくなります。
ブラウザ上では相変わらずなので、見に行くライブラリの指定が足りない状態でインストールされてる、ってことなんでしょうかね。。。




217 :デフォルトの名無しさん:2006/11/12(日) 18:26:54
と、追記。この場合は単純に削除ですが
置換等の作業もするので16進ダンプを使用したいのです
最初の確認で躓き…orz

218 :182:2006/11/12(日) 18:36:26
すいません、>>216文章変でした。一行目の「mt.cgiを、」は余計です。。。
コマンドライン上だと下のような実行結果になる、ということです。

LD_LIBRARY_PATHに/usr/local/mysql/lib/mysql/がない
test.cgi => ×
mt.cgi => ×

LD_LIBRARY_PATHに/usr/local/mysql/lib/mysql/がある
test.cgi => ○
mt.cgi => ○
↓出力内容
Status: 302 Moved
Pragma: no-cache
Location: http://設置WebサイトURL/MTのディレクトリ/mt-upgrade.cgi?__mode=install

219 :デフォルトの名無しさん:2006/11/12(日) 18:56:49
>>218
なるほど、LD_LIBRARY_PATH の問題だったか。
じゃあ、httpd にも LD_LIBRARY_PATH を設定すれば解決するんじゃないかな。
Solarisではどのように httpd 起動してるんだっけな。
/etc/init.d/httpd あたりだっけ? そこで追記するか、そこから apachectl を
呼び出しているなら apachectl へ追記するか。で、httpd を再起動。
スレ違いになっちゃったけどね。

220 :215:2006/11/12(日) 20:20:29
うわー、ごめんなさい、元ファイルの抽出方法が違ったんで微妙に異なってたようです
同一の方法で抽出からやり直したところ、ちゃんと想定通りの結果になりました。
スレ汚し申し訳ない…

221 :182:2006/11/12(日) 22:33:06
>>219
ありがとうございます、ようやく解決できました。
やはりApacheにLD_LIBRARY_PATHを持たせる、というのでOKでした。

ApacheのconfファイルにデフォルトでLD_LIBRARY_PATHをset envするオプションがついていて、
そこに"/usr/sfw/lib/libgcc_s.so.1"が記述されていたので、libmysqlclientをそこに見に行って、
>>187のエラーになっていたようです。

ホントにスレ違いでしたが、ありがとうございました!



222 :デフォルトの名無しさん:2006/11/12(日) 23:57:14
ファイルを読み出すとき、改行区切りとかではなく、
ファイル全てを一つの文字列としてスカラー変数に入れたいのですが、
どう書くのが適切かつコンパクトですか。

223 :デフォルトの名無しさん:2006/11/12(日) 23:58:44
>>222
use File::Slurp;

my $text = read_file('filename');



224 :デフォルトの名無しさん:2006/11/13(月) 00:05:10
>>223
ありがとうございます。それ調べてみます。
ちなみに、モジュールを使わないケースではどうなりますか?

225 :デフォルトの名無しさん:2006/11/13(月) 00:12:09
>>215みたいのでもいいんじゃない?

226 :デフォルトの名無しさん:2006/11/13(月) 00:12:12
[1]
{
local( $/, *FH ) ;
open( FH, $file ) or die "sudden flaming death\n"
$text = <FH>
}

[2]
local( *FH ) ;
open( FH, $file ) or die "sudden flaming death\n"
my $text = do { local( $/ ) ; <FH> } ;

[3]
{
local( $/ ) ;
open( my $fh, $file ) or die "sudden flaming death\n"
$text = <$fh>
}

[4]
open( my $fh, $file ) or die "sudden flaming death\n"
my $text = do { local( $/ ) ; <$fh> } ;

[5]
my $text = do { local( @ARGV, $/ ) = $file ; <> } ;


227 :222:2006/11/13(月) 00:28:11
ありがとうございます。
と、取り敢えず安全性?なんたるものか調べます。


228 :さくら:2006/11/13(月) 00:51:29
リナックスでperlのプログラムを実行しています。
「画面上に(kterm)に「last
            proxy  」と二つのメニュー(それぞれプログラム
名)を表示させ、lastをクリックして選べばlastコマンドの出力から、
自分(0123456)がログインした回数を数える(他のユーザーは数えない)
サブルーチンが実行される。
 またproxyを選べば、proxyのログから、ある今までにもっともサイト
にアクセスした時間帯を表示するサブルーチンが実行される。」
というプログラムを組みたいのです。proxyはどんな解析がいいか、
いろいろ考え中でしたが一例として述べました。。。どなたか、アドバイス等
お願いします!!!!

229 :デフォルトの名無しさん:2006/11/13(月) 01:14:14
>>228
日本語でおq

230 :デフォルトの名無しさん:2006/11/13(月) 01:29:33
Perlは肌に合わないとわかった
これは完全に文系向けのものだな
厳密でない
基本的に1次元のデータが基本
列操作、多次元操作がまともにできないってどんなくそ言語だよ・・・
fortran90から移行したが
それととくらべると
とんでもないだめ言語だな
perlは

231 :デフォルトの名無しさん:2006/11/13(月) 01:32:20
>>230
その通りだな!! 時間の無駄だから、さっさとPerlのことは忘れた方がいい。
がんばってくれ。



232 :デフォルトの名無しさん:2006/11/13(月) 01:36:55
>>228
アドバイスとしては、ちゃんと読み書きの勉強して、色々な本を読もうね、ってとこかな。

233 :デフォルトの名無しさん:2006/11/13(月) 04:40:51
3つの変数のうちのどれが一番小さいかを調べたいです。
下記が今使っているコードですが、これをもっとスマートに書く方法があれば教えてください。

$number1 = 8;
$number2 = 3;
$number3 = 4;

if (($number1 < $number2) && ($number1 < $number3)) {
print "\$number1が一番小さいです。\n";
} elsif (($number2 < $number1) && ($number2 < $number3)) {
print "\$number2が一番小さいです。\n";
} elsif (($number3 < $number1) && ($number3 < $number2)) {
print "\$number3が一番小さいです。\n";
}


234 :233:2006/11/13(月) 04:49:04
すみません。
訂正します。

if (($number1 <= $number2) && ($number1 <= $number3)) {
print "\$number1が一番小さいです。\n";
} elsif (($number2 <= $number1) && ($number2 <= $number3)) {
print "\$number2が一番小さいです。\n";
} elsif (($number3 <= $number1) && ($number3 <= $number2)) {
print "\$number3が一番小さいです。\n";
}


235 :デフォルトの名無しさん:2006/11/13(月) 07:10:09
そうゆうのは取り敢えず配列に入れてループで比較するといいと思います。
贅沢な方法ではsortする手があります。

236 :デフォルトの名無しさん:2006/11/13(月) 09:38:54
バブルソート最強伝説

237 :デフォルトの名無しさん:2006/11/13(月) 11:34:01
$#value
はどういう意味ですか?

238 :デフォルトの名無しさん:2006/11/13(月) 11:37:07
>>237
配列変数 @value の最後の添え字
@value = ('a', 'b', 'c', 'd')
なら最後の要素 'd' は $value[4] なので $#value は 4 になる

239 :デフォルトの名無しさん:2006/11/13(月) 11:37:53
アチャー>< 3 の間違いです… これは恥ずかしいw

240 :237:2006/11/13(月) 11:39:46
事故解決しました。
>$#変数名 は、@変数名 の配列の最後の添え字(個数から1をひいたもの)を表わします。

241 :デフォルトの名無しさん:2006/11/13(月) 11:40:33
>>238-239
レスありがとうございました。
添え字をあらわすんですね。

242 :デフォルトの名無しさん:2006/11/13(月) 11:47:18
$#valueは要素数を返す方が直感的

243 :デフォルトの名無しさん:2006/11/13(月) 11:55:17
スカラコンテキストなら @value って書けば要素数になるんだからよくね?

$#value はあくまでも最後の添え字として扱うべきで、
$#value + 1 を要素数として使うべきではないって偉い人が本に書いてた。

244 :デフォルトの名無しさん:2006/11/13(月) 11:55:23
……

245 :デフォルトの名無しさん:2006/11/13(月) 11:56:25
ま、添字の初期値を変更する変質者もいるかもしれんし。

246 :デフォルトの名無しさん:2006/11/13(月) 11:57:43
>>234
>>235のゆうように比較対象を配列にいれて、
勝ち抜き合戦を一回ループすればおk
最小値を求めるのも同じ。
ソートはまた別の話だから混乱しないように。
パールっつよりプログラミングの基本テクニック
だから、どこにでも参考資料はあると思うよ

247 :デフォルトの名無しさん:2006/11/13(月) 12:10:14
Scalar::Utilのmax,minが単に最大値、最小値求めるだけじゃなくて
ブロック引数を与えたらブロックの値を最大or最小にする要素を
返してくれれば便利なのになといつも思う。

min { $x[$_] } 0..$#x

みたいに使うイメージで。


248 :デフォルトの名無しさん:2006/11/13(月) 12:11:37
ごめん、ぼけてた。ScalarじゃなくてList::Util


249 :デフォルトの名無しさん:2006/11/13(月) 12:42:07
min @x[0..$#x];
それぐらいならこれでいいじゃん

250 :デフォルトの名無しさん:2006/11/13(月) 12:50:45
>>249
添え字が欲しいんじゃなかったっけ? それだと値のほうになってしまうよ。

reduce { $x[$a] < $x[$b]? $a: $b } 0..$#x

でもいいんだけど$aだの$bだの何度も書くの面倒だし。


251 :デフォルトの名無しさん:2006/11/13(月) 12:57:49
あーなるほど。

252 :デフォルトの名無しさん:2006/11/13(月) 13:34:48
@x[0..$#x]は配列スライスを使うまでもなく@xでいいのでここは笑うところだったのかもしれず


253 :デフォルトの名無しさん:2006/11/13(月) 14:30:21
perlにはINT_MAXとかDBL_MAXみたいな
処理可能な数値の最大最小を表す定数なり
特殊変数はないん?

254 :デフォルトの名無しさん:2006/11/13(月) 14:40:38
>>253
use POSIX


255 :デフォルトの名無しさん:2006/11/13(月) 15:47:36
   /*
   |
   |
   |
  ∧|∧
 ( / ⌒ヽ     | ̄ ̄ ̄ ̄ ̄ ̄ ̄
  | |   |     |
  ∪ / ノ  .   |
  ノ ノ ノ      */
 main       (
           )
           {
           }


256 :253:2006/11/13(月) 16:12:04
>>254 アリガント

257 :デフォルトの名無しさん:2006/11/13(月) 20:12:16
みんなきちんとパールの話題したいんですか?って疑問におもう。。。

258 :デフォルトの名無しさん:2006/11/13(月) 21:50:47
Linux上で日本語のファイルをperlで処理したいですが普通にできますか?

259 :デフォルトの名無しさん:2006/11/13(月) 22:19:48
独習終えたら何を読むといいですかね?

260 :デフォルトの名無しさん:2006/11/13(月) 22:51:09
>>258
普通にできる

261 :デフォルトの名無しさん:2006/11/13(月) 22:51:33
でらべっぴん はオススメ

262 :デフォルトの名無しさん:2006/11/14(火) 02:23:45
>>260
ありがとうございます。
hashのkeyに半角の空白を含む日本語を入れてvalueに数値を入れると

Argument "ホゲホゲ 5" is not numeric in array element at ./a.pl, <> line 28

の用にエラーが出ます。
何がいけないのでしょうか?

263 :デフォルトの名無しさん:2006/11/14(火) 02:39:27
>>259
> 独習終えたら何を読むといいですかね?

主要モジュールや最近バリバリ書かれているとんがったシステムのソースコード。

264 :デフォルトの名無しさん:2006/11/14(火) 02:42:13
>>262
> hashのkeyに半角の空白を含む日本語を入れてvalueに数値を入れると

ホントか? ホントにそう書いてあるか?

265 :デフォルトの名無しさん:2006/11/14(火) 02:54:07
>>264
hashに 「ホゲホゲ 5」 をいれて
keyに 「10」 を入れた時に以下のエラーが出ます。
日本語の取り扱いが間違ってるのでしょうか?

Argument "M-^CzM-^CQM-^CzM-^CQ 5" isn't numeric in array element at ./a.pl line 32, <> line 1.


266 :デフォルトの名無しさん:2006/11/14(火) 03:07:06
とりあえずエラーが出た行あたりのプログラムさらしてもらったほうがいいと思うけどな。

267 :265:2006/11/14(火) 03:16:46
以下がソースです。

#!/usr/bin/perl -w

# hash----------------------------
%cn2p;

while(<>){
chomp;
# print "$_\n";
@words = split;
# print "n1 $words[0]\n";
# print "n2 $words[1]\n";
# print "n3 $words[2]\n";

$tmp = $words[1] . " " . $words[2];

$cn2p[$tmp] += $p;
}


268 :265:2006/11/14(火) 03:18:44
>>267
間違い。
簡略化したのでエラーが出るのは最後の行です。

10 ホゲホゲ 5

と言うのをファイルから読ませています。

#!/usr/bin/perl -w

# hash----------------------------
%cn2p;

while(<>){
chomp;
# print "$_\n";
@words = split;
# print "n1 $words[0]\n";
# print "n2 $words[1]\n";
# print "n3 $words[2]\n";

$tmp = $words[1] . " " . $words[2];

$cn2p[$tmp] += $words[0];
}

269 :デフォルトの名無しさん:2006/11/14(火) 03:21:21
だからさ、

Argument "M-^CzM-^CQM-^CzM-^CQ 5" isn't numeric in array element at ./a.pl line 32, <> line 1.

って、配列の添字に数値じゃないのが入れられてるっていうエラーなんだが。


270 :デフォルトの名無しさん:2006/11/14(火) 03:21:56
>>268
答えを言うのはもったいないので、とりあえず use strict してみようよ。

271 :265:2006/11/14(火) 03:28:11
>>269
hashには数値以外も入れられるんじゃないのでしたっけ?

272 :デフォルトの名無しさん:2006/11/14(火) 03:29:44
>>271
あなたのコードには、hashは存在しません。

273 :265:2006/11/14(火) 03:32:54
>>272
わかりました!

ありがとうございます。

274 :デフォルトの名無しさん:2006/11/14(火) 03:46:09
なにこの面白い流れw
答え言っちゃダメでしょw

275 :デフォルトの名無しさん:2006/11/14(火) 04:51:23
>>274
全員が君みたいな性格って訳じゃないみたいだ

276 :デフォルトの名無しさん:2006/11/14(火) 08:50:22
argvのvってなんですか?

277 :デフォルトの名無しさん:2006/11/14(火) 08:56:43
>>276
ベクターだっけ?


278 :デフォルトの名無しさん:2006/11/14(火) 09:03:57
ふむ、Argument Vectorだな。

279 :デフォルトの名無しさん:2006/11/14(火) 10:15:56
なるほど。
ありがとう

280 :デフォルトの名無しさん:2006/11/14(火) 11:25:40
perl使いの性格が良くわかるやりとりでした

281 :デフォルトの名無しさん:2006/11/14(火) 11:27:32
print <<END_OF_DATA; の中に
use constant LOG_DIR => './logs';
などの LOG_DIR や 関数呼び出しを書くことは可能ですか?


282 :デフォルトの名無しさん:2006/11/14(火) 11:31:07

foreach my $value (@log) {
if ($flag) {
undef $value;
}
}
ってやると @log から $valueの要素が削除されるのって仕様なの?


283 :デフォルトの名無しさん:2006/11/14(火) 11:51:34
>>282
削除されたんじゃなくて値がundefになっただけだと思うが、それは仕様。

If any element of LIST is an lvalue, you can modify it by modifying VAR
inside the loop. Conversely, if any element of LIST is NOT an lvalue,
any attempt to modify that element will fail. In other words, the
"foreach" loop index variable is an implicit alias for each item in the
list that you're looping over.


284 :デフォルトの名無しさん:2006/11/14(火) 11:52:13
↑ごめん引用元書き忘れた。perlsyn(1)です。

285 :282:2006/11/14(火) 13:47:38
でも $value = "";
ってやっても消えないよね
どうなってんの

286 :デフォルトの名無しさん:2006/11/14(火) 13:53:54
>>285
空文字列の代入

287 :282:2006/11/14(火) 14:11:10
え@logの要素にも空文字列が入るの?

288 :デフォルトの名無しさん:2006/11/14(火) 14:16:54
関数の引数@_みたいにただのエイリアスなんだね。

289 :282:2006/11/14(火) 14:54:41
まじなのかよこえー

290 :デフォルトの名無しさん:2006/11/14(火) 15:02:03
>>289
こわいのは自分の無知だろ

291 :デフォルトの名無しさん:2006/11/14(火) 15:02:17
 ▓       ▓.
      ▓█     ▓█
    ▓▓██   ▓▓██
   ▓▓▓▓▓▓▓▓▓▓▓███
 ▓▓▓██▓▓▓▓▓██▓▓███
 ▓▓█▓▓▓▓▓▓▓▓▓█▓███
 ▓▓▓▓█▓▓▓▓▓█▓▓▓███
 ▓▓▓▓▓█████▓▓▓▓███
  ▓▓▓▓▓███▓▓▓▓███
    ▓▓▓▓▓▓▓▓▓███
  ▓▓▓▓▓▓▓▓▓▓▓▓███
 ▓▓▓▓▓▓▓▓▓▓▓▓▓▓███
 ▓▓▓▓▓▓▓▓▓▓▓▓▓▓███
 これを見ると今年の大学受験に落ちます。
これを今から1時間以内に3回他スレにコピペすれば100%、受かります。
貼らないと
落  ち  ま  す


292 :デフォルトの名無しさん:2006/11/14(火) 18:30:08
>>281
できない。できたらかえって困る。here document なんだから。
ただ、$hoge のように「$」から始まっていれば変数置換は評価される。
しかし、$hoge がオブジェクトだったとしても
$hoge->method() としても method() は呼び出されない。

293 :デフォルトの名無しさん:2006/11/14(火) 18:32:01
>>276
>argvのv
釣りにマジレスで Volume。

294 :デフォルトの名無しさん:2006/11/14(火) 18:52:32
>>281 ↓実験してみ。

sub sum { $_[0] + $_[1] }
use constant THREE => 3;

print <<_EOF_;
${[sum(THREE,4)]}[0]
_EOF_

295 :デフォルトの名無しさん:2006/11/14(火) 19:47:07
>>294
独創的だな。

普通は @{[ expr ]} か ${\( expr )} だと思うが。

296 :デフォルトの名無しさん:2006/11/14(火) 20:15:06
print __FILE__ . ":" . __LINE__ .":";
を書くのが面倒なのですが、Cのプリプロセッサのようなことは
できないのでしょうか?

297 :デフォルトの名無しさん:2006/11/14(火) 20:44:32
windowsXP+Activeperl(v5.8.8)でImage::Magickをインストールしようとして
cpanのshellでinstall Image::Magickと入力するとnmakeが実行されるのですが
windows.hが開けないと言われて終了してしまいます
vc++のインクルードディレクトリにはちゃんとwindows.hのあるディレクトリが指定してあり
vc++のプロジェクトでは普通にwindows.hをincludeすることができます
どうすればインストールできるのでしょうか

298 :デフォルトの名無しさん:2006/11/14(火) 21:14:32
Perlで例外処理をする方法としてError.pmを使うというのまでは
分かったのですが、Error.pmのエレガントな使い方について
教えてもらえませんか?

299 :デフォルトの名無しさん:2006/11/14(火) 21:38:14
>>297
駄目な理由は、 lib/config_heavy.pl 参照。
自力でコンパイルする時は、perl自体もソースからコンパイルして生成するか
lib/config_heavy.pl と lib/config.pm を適切に修正する必要があるよ。

ActivePerlならppmを使う方法が楽。
自分は Image Magickのwin32パッケージに入ってる奴を入れた。
方法は Image MagickのREADME.TXTに書かれてる。

300 :デフォルトの名無しさん:2006/11/14(火) 21:39:38
>>296
プリプロセッサ相当のことならばFilterモジュールがそれだが…
"Thare's more than one way to do it."

sub __HERE__() {
my (undef, $filename, $line) = caller();
return "$filename:$line:";
}
print __HERE__;

301 :297:2006/11/14(火) 22:16:49
>>299
ありがとうございます
ppm使ってやってみようと思います

302 :デフォルトの名無しさん:2006/11/14(火) 22:59:58
>>300
caller()で十分でした。ありがとうございます。

303 :デフォルトの名無しさん:2006/11/15(水) 01:38:33
open(IN, "< test.txt");
flock(IN, 2);
@testdata = <IN>;
close(IN);
foreach (@testdata){
$_ =~ s/[\x0D\x0A\r\n]//g;
$_ .= "writed\x0A";
}
open(OUT, "> test.txt");
flock(OUT, 2);
print OUT @testdata;
close(OUT);
exit;

windows上で
こんな感じで「内容が複数行あるテキストファイル」を読み込んで少しだけ改変して
元のテキストファイルに上書きするスクリプトを書いていたのですが、
print OUT @testdata;でファイルへ保存するときに\x0Aが\x0D\x0Aに変換されてしまいます。

改行コードを指定して(この場合は変換せずに\x0Aのままで)保存したいのですが、
テキストファイル保存時の改行コードを指定するにはどうすればよいのでしょうか。
flock後にbinmodeを指定すれば期待通りの動作はしましたが、binmodeを指定せずにできる方法はありませんか。

304 :デフォルトの名無しさん:2006/11/15(水) 02:08:15
open, IN, '<:raw', test.txt or die "$!\n";

305 :デフォルトの名無しさん:2006/11/15(水) 03:51:03
間違えた。
open OUT, '>:raw', 'test.txt' or die "$!\n";
flockも数字リテラルよりもFcntl.pmを使うのがお薦め。

306 :デフォルトの名無しさん:2006/11/15(水) 05:05:31
私はPerlはCGIとしてWebベースで動くものしか作ったことが無い者ですが教えてください。

Windows+ActivePerl5.8の環境で、Windows標準の時計(時刻)をPerlで変更することってできますか?


307 :デフォルトの名無しさん:2006/11/15(水) 07:29:58
できる

308 :デフォルトの名無しさん:2006/11/15(水) 08:39:58
>>306
それは、Perlじゃなくて、その、なんていうの、そうゆうのは時計のほうを調べるんだよ。

309 :デフォルトの名無しさん:2006/11/15(水) 10:15:47
use constant THREE => 3;

で &test(THREE);ってかくとエラーなんですけどなんでですか?
それと自作関数に&付ける人といない人がいますけど違いってあるの?

310 :デフォルトの名無しさん:2006/11/15(水) 10:29:31
>>309
エラーメッセージはインタプリタが人間に分かるように適切に出す大事な情報なんだよ。
おまえの説明はソースとエラーメッセージを省略してるからエスパーしか状況を把握できんぞ。
助けを求めるときには、おまえではなく他人に分かるように状況を説明しろ。

311 :デフォルトの名無しさん:2006/11/15(水) 10:43:26
>>309
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq7.html#what_s_the_difference_between_calling_a_function_as__foo_and_foo__
http://www.kt.rim.or.jp/~kbk/perl5.005/perlsub.html

312 :デフォルトの名無しさん:2006/11/15(水) 11:33:26
>>309
どこでどのようなエラーが出るのか、省略せずに全部書け。

サブルーチン呼出しで & を付ける必要があるのはそれがサブルーチン名だと
判別できない場合、つまり後ろの () がない状態で使う場合だ。


313 :309:2006/11/15(水) 12:42:45
ありがとうこざいます
サブルーチンのほうはわかりました。

>>209のソース間違えてました。
use constant (PL => 'test.pl');

require PL;

Can't locate PL.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .) at te
st.pl line 3.
とでます。PL.pm になってるんですが置き換えできないのでしょうか?

314 :デフォルトの名無しさん:2006/11/15(水) 12:54:41
>>313
サブルーチンの引数とrequireではかなり話が違う。

reqruire PL;

だとrequireに対してベアワードが引数だったときに'.pm'をつけてファイルを探す機能の
方が先に効いてしまうので

reqruire (PL);

などとすればよい。



315 :309:2006/11/15(水) 13:01:37
できました。ありがとうこざいます。

316 :デフォルトの名無しさん:2006/11/15(水) 19:12:32
        ,, ―- 、_
      /        '' - ,,
    /             '' - ,,
   /                 ヽ
  i           / /ヽ    !
  ,i          ./ / ''―、   !
  i     ,、 n て'' ノノ    ヾ   !
  i    ノノノ ノ ノ ''´      !  /
 U   j   ' ´    ノ (    ヽ |
 >-,,  /  ,,=━━・!' ,ノ━== ! ノ
 !・  ヽ |  ’ニンniii、 :::::i/ィ7iii=  i )
 \(てi iヽ   ^' ~     -'  /}
  `i_   、 \        i_    l_j
   `┐ i    /(,,, ,n 〉   /\\   もうスクリプトっていうレベルじゃねぇぞ!
  ̄ ̄へ    ! '   T''    l |  \
   |  ! i    ン=ェェi) i ソ )
   |  i´\! ,, -ェ`、_ン ノノ 〈
   |  |  \\,, `―''´//  |
   |  つ   !、_'''''''''''''  /   7

317 :デフォルトの名無しさん:2006/11/15(水) 22:32:46
>>312 の解説をより正確にすると以下のようになります。参考までに。

サブルーチン呼出しよりも定義が先に perl に読まれる場合は () と & を省略可能。
サブルーチン呼出しよりも定義が後に perl に読まれる場合は () か & のいずれかが必要。
いずれの場合でも () または &、もしくはその両方を記述する事ができます。
いずれの場合でも & を付けるとプロトタイプ宣言を無視します。

318 :デフォルトの名無しさん:2006/11/15(水) 22:36:57
& って付けるメリットあるの? リファレンス取るときぐらいしか付けないなぁ。

319 :デフォルトの名無しさん:2006/11/15(水) 22:59:57
$string = <<HOGE
value1<TD>1<TD>value2<TD>24</TR>
<TD>ほげ<TD>73<TD>/\565
HOGE
;

$string =~ /value1<TD>(.*?)<TD>value2<TD>(.*?)<\/TR>(?:.|[^.])*?ほげ<TD>(.*?)<TD>/;

print(
"value1:$1\n".
"value2:$2\n".
"ほげ:$3\n"
);

これを実行すると

value1:
value2:
ほげ:

と何も表示されないのですが、$stringの中の\565のどれか一つ以上を消す、
パターンの中のほげの前に<TD>をつける、ほげを半角英数に置き換えるのいずれかをすると

value1:1
value2:24
ほげ:73

とうまくいきます。なぜですか?

320 :デフォルトの名無しさん:2006/11/15(水) 23:06:24
>>318
&をつけることによってプロトタイプを無視できる。

321 :デフォルトの名無しさん:2006/11/15(水) 23:08:39
プロトタイプ無視して何がうれしいのかという疑問が...


322 :317:2006/11/15(水) 23:51:42
>>318
最大のメリットは定義済か未定義かに加えて、言語組込の予約語との名前衝突を気にしなくてよくなる点ですが、>>317 では意図的に省いています。
でもこれはメリットかどうか微妙というかなんというか…、「やりたければそうすることもできるよ」という「Perl 流」(というよりも UNIX 流) の一例とは言えるでしょう。
常に付けておけば、マイナーな予約語との衝突によるややこしいエラーと格闘せずに済むという点ではメリットかもしれません。

323 :デフォルトの名無しさん:2006/11/16(木) 00:00:06
>>319
$string =~ m{value1<TD>(.*?)<TD>value2<TD>(.*?)</TR>[\r\n]*<TD>ほげ<TD>(.*?)<TD>};
素直に改行をマッチさせるんじゃダメなん?

>>322
予約語との衝突を防ぐのと、プロトタイプチェックされるのとでは、断然後者のほうが有益なような…
それに、衝突のチェックは、例えば構文色分けできるエディタで予約語を色分けすれば防げるよね。
まあ、個人の主観の問題なので、TMTOWTDIってことで……。

324 :319:2006/11/16(木) 00:18:00
>>323
なぜ\565を削除するしないで結果が変わるのか知りたいです。

325 :デフォルトの名無しさん:2006/11/16(木) 00:23:49
>>324
なんだか面白い現象だね >>319
ぼくもよくわからんけど、さしあたり /\\\d\d\d?/ のような文字列が八進表現の文字コードによる文字指定として展開される点については知っていますか?


326 :デフォルトの名無しさん:2006/11/16(木) 00:49:19
>>318
あと、歴史的な理由もなかったかな。
perl4 とか 3の頃では、自作サブルーチンの呼び出しに&は必須だったような記憶が。

327 :デフォルトの名無しさん:2006/11/16(木) 00:51:49
>>324
>>325 の書いてる通り \565 は1つの文字として扱われてるんだけど、
Perl では文字列中に ASCII の範囲で表せない文字(255番以降の文字)が入ってると
UTF-8 の文字列として扱われる。(正確には UTF-8 をPerl独自に拡張した「utf8」)

この時、同じ文字列中にある「ほげ」も UTF-8 に変換されるけど、
その結果、正規表現中の(ファイルのエンコーディングでの)「ほげ」という文字の並びと
変換された「ほげ」が一致しなくなるので、マッチしなくなってしまう。
(しかも、\565 なんてわけがわからない文字と一緒だから、誤変換されてるっぽい)

これを防ぐには、スクリプトファイル自体を UTF-8 エンコーディングで保存して、
頭に use utf8; を付ければよい。文字列もパターンも全てUTF-8で統一されてハッピー。

328 :デフォルトの名無しさん:2006/11/16(木) 01:45:12
>>324
\565 がiso-8859-2(latin2 , 1文字=1バイト)で表現できない文字だから。
なので、$stringはutf8化されて格納される。

正規表現もiso-8859-2扱いだが、正規検索エンジンがutf8化を考慮しないので、
(utf8の仕様上)ASCII範囲外の文字がマッチしなくなる。

329 :319:2006/11/16(木) 07:26:41
>>325,327-328
なるほど。
そういうわけだったんですか。

では\565を消さずともほげの前に<TD>を追加するとマッチするのはなぜなんでしょうか?
<TD>に特別な意味はないのであるなしにかかわらず$stringはutf8として扱われ、結果マッチしないと思うのですが。

330 :309:2006/11/16(木) 10:31:24

use strict;
use constant (STR => 't', FLAG_X => 1);

if (FLAG_X && test()) {
print "OK";
}

sub test {
return 1;
}
Bareword "FLAG_X" not allowed while "strict subs" in use at t.pl line 4.
Execution of t.pl aborted due to compilation errors.

これはなぜなのでしょうか?
複数の定数を定義するとこうなるのですが

331 :デフォルトの名無しさん:2006/11/16(木) 11:12:38
while (<DATA>) {
$file{$num} = [(split)[2..4]];


この場合、splitは何を表しているのでしょうか?

332 :デフォルトの名無しさん:2006/11/16(木) 11:38:23
>>330

use constant {STR => 't', FLAG_X => 1};

333 :デフォルトの名無しさん:2006/11/16(木) 11:39:47
>>330
それ複数の定数の定義になってないし。perldoc constantよく読め。

× use constant (STR => 't', FLAG_X => 1);
○ use constant {STR => 't', FLAG_X => 1};

ちなみに上も便宜上×と書いたがそれはそれで正しい書き方で、
('t', 'FLAG_X', 1)というリストを値とする定数STRを定義したことになる。


334 :デフォルトの名無しさん:2006/11/16(木) 11:42:26
>>331
$_ = "aa bb cc dd ee";
$a = [(split)[2..4]];
print join(",", @{$a}) . "¥n";
-----
cc,dd,ee


335 :デフォルトの名無しさん:2006/11/16(木) 11:44:03
>>331
すべての引数を省略して組み込み関数splitを呼んでるだけ。
引数省略したときどういう意味になるかはマニュアル読め。


336 :330:2006/11/16(木) 15:36:41
ありがとうこざいました。

337 :デフォルトの名無しさん:2006/11/16(木) 16:11:09
Perlのオブジェクト指向使いづらっ

338 :デフォルトの名無しさん:2006/11/16(木) 16:20:23
OOPは後から取って付けたものだからねえ。
言語はケースバイケースで使い分けられるのがよろし。

339 :デフォルトの名無しさん:2006/11/16(木) 16:20:48
どの辺が使いにくいと思ったかも書けよ。


340 :デフォルトの名無しさん:2006/11/16(木) 17:18:36
そんな自明のことは書かなくていい

341 :デフォルトの名無しさん:2006/11/16(木) 17:27:23
そこまでいうとOOP使いづらいのも自明じゃないか...


342 :デフォルトの名無しさん:2006/11/16(木) 18:20:55
ぶっちゃけ慣れの問題だろ

343 :328:2006/11/16(木) 19:03:09
>>329
ごめん、嘘書いてた。
iso-8859-2じゃなくてiso-8859-1だよ。
それと、「正規検索エンジンはユニコード/非ユニコード間のマッチが不完全」がより正確。
詳細は、perlソースのrecomp.cやreexec.c付近。

改めて、(328までを理解した前提で)319がマッチしない部分の詳細。

m/(?:.|[^.])*?ほげ/ は「複雑なパターン」の繰り返し+固定文字列として処理される。
この場合、繰り返しの終了判定に「固定文字列の先頭バイトと次の1バイトが一致」
という条件が追加される。
この追加の判定はユニコード/非ユニコード間の比較を考慮していないので、
「固定文字列の先頭バイトがutf8表現でも同じバイト表現」である場合を除き
正しい位置で「複雑なパターンの繰り返し」が終了しなくなる。

具体的にsjisでは「ほ」は 82 d9 で、\x{82}という文字のutf8表現は C2 82
本来繰り返しを終了すべき位置での判定は 82 と C2 になり、繰り返し部分の
処理が継続されてしまう。
eucやuse utf8してない場合のutf8でも似たようなもの。

319の正規表現だと、他の部分はユニコード/非ユニコード間を正しく処理できる。
だから、「(複雑なパターン)*?固定文字列」部分の*?直後に来る文字(固定文字列
の先頭文字)がutf8化しても同じバイト表現になる(=ASCII文字セットに含まれる)
事が、正しくマッチが行われる為の条件になっている。

344 :デフォルトの名無しさん:2006/11/17(金) 11:06:23
$data{$moji} = [ $num1, $num2 ];

これはどのような動きをしているんでしょうか?
変数名は気にせずに。

345 :デフォルトの名無しさん:2006/11/17(金) 11:18:40
>>344
代入です

346 :デフォルトの名無しさん:2006/11/17(金) 11:19:33
>>345
とはいっても、mojiに代入できるのは1つでは?

347 :デフォルトの名無しさん:2006/11/17(金) 11:20:07
>>344
ハッシュdataのキー$mojiの値を、リスト($num1, $num2)へのリファレンスにしている。

348 :デフォルトの名無しさん:2006/11/17(金) 11:22:17
>>347

key value
moji → num1
moji → num2

ということでしょうか?
data{key}をプリントすれば
num1 と num2が表示されるということでしょうか?

349 :デフォルトの名無しさん:2006/11/17(金) 11:27:51
プリントしてみなよ
perl リファレンス でぐぐるといいかも

350 :デフォルトの名無しさん:2006/11/17(金) 11:36:22
my (%data);
my $num1 = 3;
my $num2 = 4;
my $moji =tetra;

$data{$moji} = [ $num1, $num2 ];

print("%d",$data{$moji});


perl 実行
%dARRAY(0x85a7c28

何かよくわからない結果になってしまったのですが・・・



351 :デフォルトの名無しさん:2006/11/17(金) 11:43:05
それがリファレンスです

352 :デフォルトの名無しさん:2006/11/17(金) 11:43:21
>>350
デバッグしろ

353 :デフォルトの名無しさん:2006/11/17(金) 11:44:04
デバッグってどうするんですか?

354 :デフォルトの名無しさん:2006/11/17(金) 11:47:43
「リファレンス」って言葉が何回も出てるし
「perl リファレンス でぐぐるといいかも」ともあるだろ


355 :デフォルトの名無しさん:2006/11/17(金) 11:48:43
少なくとも結果はでてます

356 :デフォルトの名無しさん:2006/11/17(金) 11:54:33
なんすかー
わからないなら知ったかしないでください

357 :デフォルトの名無しさん:2006/11/17(金) 12:05:05
>>353
どこが間違っているか調べて、それを修正して正しくする。


358 :デフォルトの名無しさん:2006/11/17(金) 12:35:21
ここで説明するより、解説してるサイトや本を見てもらったほうが早い
ひと通り見た上でわからない点があれば質問するといいよ

359 :デフォルトの名無しさん:2006/11/17(金) 12:41:39
のってない

360 :デフォルトの名無しさん:2006/11/17(金) 12:46:18
>>359
何が?


361 :デフォルトの名無しさん:2006/11/17(金) 12:48:17
http://pc8.2ch.net/test/read.cgi/tech/1163409543/16
マルチ?

362 :デフォルトの名無しさん:2006/11/17(金) 12:50:38
perl リファレンス 無名配列
ぐぐって1ページ目の全サイトを1日かけて読め

363 :デフォルトの名無しさん:2006/11/17(金) 12:55:48
1日もかけたらこのスレの意味がない

364 :デフォルトの名無しさん:2006/11/17(金) 13:06:27
print $data{$moji}->[0];
print $data{$moji}->[1];

これでわかっただろ。

365 :デフォルトの名無しさん:2006/11/17(金) 13:07:52
以下放置で。

366 :デフォルトの名無しさん:2006/11/17(金) 13:37:28
>>364
できねぇぞ
嘘つくなよ

367 :デフォルトの名無しさん:2006/11/17(金) 13:49:20
age

368 :デフォルトの名無しさん:2006/11/17(金) 14:54:02
ここは学校でもなんでもないのです。
一から手取り足取り教えてくれるわけないのです。
それくらい初歩的で、調べればいくらでも答えの出てくる質問なのです。
自分に調べる能力がないからって駄々こねて暴れても無駄です。

369 :デフォルトの名無しさん:2006/11/17(金) 15:25:55
このままできない様なら
Perl6バージョンアップボタンを押からな

370 :デフォルトの名無しさん:2006/11/17(金) 18:40:32
for (sort {$file{$a}[1] <=> $file{$b}[1]} @keys) {
for $box (@{$data{$_}}) {
}

すみません、これはどういうことを表しているのでしょうか?

371 :デフォルトの名無しさん:2006/11/17(金) 19:44:33
>>370
リスト@keysの要素をハッシュ%fileのキーにしたときの値のリストの2個目(1番目)の要素によってリスト@keysを昇順にソートし、
ソートされた各値をハッシュ%dataのキーにしたときの値の文字列を名前とするリストの各要素を変数$boxに入れて繰り返すことを
ソートされた@keysの要素でくりかえす

ってことかな。

372 :デフォルトの名無しさん:2006/11/17(金) 20:20:35
keys = ai bi ci di ei
とすると

file[ai][1] <=> [][2]

ん、これは aiとbiを比較してから 昇順にソートして
for $boxの行を実行するのか

それともai からeiを全てが 昇順になるようにその行でソートしてから
for $boxの行を実行するのでしょうか?

373 :デフォルトの名無しさん:2006/11/17(金) 22:13:58
>>372
日本語でおp

374 :デフォルトの名無しさん:2006/11/17(金) 22:19:27
>>371
この場合の比較って
どういう順に比較するのでしょうか?

123456789 があるとしたら

1-2 1-3 1-4 1-5 1-6 1-7 1-8 1-9
2-3 2-4 2-5 2-6 ...
..
8-9 とまで全て比較しているのでしょうか?

375 :デフォルトの名無しさん:2006/11/17(金) 22:37:25
>>374
マニュアル見れ

376 :159:2006/11/18(土) 02:16:29
rand関数を使っているのですが。
$r=int(rand(65536)+1);
で使用した場合
$rでは奇数しか値を取りません。
もしかしてrand関数は32768までしかランダムで撮りませんか?
仮に$r=int(rand(32769)+1);
にすると32769のみ値をとりませんでした。

これを解消して65536までのランダム関数にしたい場合は
$r=int(rand(32768)+1)+int(rand(32768)+1);
にするしかないんでしょうか?もっとうまい具合の方法があったら教えてください

377 :デフォルトの名無しさん:2006/11/18(土) 02:17:36
376の名前である159の意味はないです。
申し訳ありません

378 :デフォルトの名無しさん:2006/11/18(土) 04:25:11
>>376
つ perldoc -f rand

RANDBIT値の確認は、use Config "config_vars"; で print config_vars('randbits'); 付近。
この値が15なら 2^15通り,48なら2^48通りの値を(rand関数は)返す。

対策ならば、それよりは
int((unpack('L',pack('CCCC',rand(256),rand(256),rand(256),rand(256)))/4294967296*65536)+1);

int(rand(256))*256+int(rand(256))+1;
の方が多少マシだと思う。
質の良い乱数が必要ならば専用のモジュールをあたるべき。

379 :デフォルトの名無しさん:2006/11/18(土) 04:40:23
randが返した値サンプル10個

0.56646728515625
0.523223876953125
0.143218994140625
0.589141845703125
0.5029296875
0.998626708984375
0.325347900390625
0.82904052734375
0.5904541015625
0.816375732421875

これらに65536を掛けると全て偶数でかつ整数
どゆううこと?

380 :デフォルトの名無しさん:2006/11/18(土) 10:33:03
\8000などから\を削除したいのですが逆chonp関数みたいなものってありますか?

381 :デフォルトの名無しさん:2006/11/18(土) 10:43:44
>>380
無いが、substrでポレポレしれ。


382 :デフォルトの名無しさん:2006/11/18(土) 10:53:07
s/^.// とか

383 :デフォルトの名無しさん:2006/11/18(土) 10:58:04
>>381-382
ありがとうございます。
解決しました。

# substrってs///で代用出来る思うんですが、何かメリットあるんでしょうか?


384 :デフォルトの名無しさん:2006/11/18(土) 11:34:36
# chompってs///で代用出来る思うんですが、何かメリットあるんでしょうか?


385 :デフォルトの名無しさん:2006/11/18(土) 11:58:32
# なるほど

386 :デフォルトの名無しさん:2006/11/18(土) 13:21:50
#println関数みたいなのって無いの?

387 :デフォルトの名無しさん:2006/11/18(土) 15:33:45
自分で作ればいいじゃない

388 :デフォルトの名無しさん:2006/11/18(土) 16:13:27
>>386
つPerl6::Say

389 :デフォルトの名無しさん:2006/11/18(土) 17:44:52
>>387
> 自分で作ればいいじゃない

ワンライナーなときに欲しいよね。

390 :デフォルトの名無しさん:2006/11/18(土) 17:58:01
>>389
perl -le 'print "hage"'

391 :デフォルトの名無しさん:2006/11/18(土) 17:59:40
このスレは本当に勉強になります。
ところで、OOP勉強として、モジュールの中身を覗いているのですが、
意外と複雑な物が多いです。初心者が読めるくらいの単純なモジュールのお勧めはないですか?
(レファレンス、パッケージ、オブジェクトの概念はわかります)
「ああ、こういう風に実装してるのか」という実感がつかみたいのです。
perlの勉強で、一番始めにソースを読んでみたモジュールを教えてくださっても構いません。

392 :デフォルトの名無しさん:2006/11/18(土) 18:32:04
Class::Data::Inheritableマジお勧め。
短いのにいろいろ勉強になるテクニック満載

393 :デフォルトの名無しさん:2006/11/18(土) 22:43:34
Catalyst 嫁

394 :デフォルトの名無しさん:2006/11/18(土) 23:07:15
Plagger詠め

395 :デフォルトの名無しさん:2006/11/19(日) 00:23:13

お助けください。
変数名に変数を使いたいたく、いろいろ試してみたのですがどうもうまくいきません。
$abc="file"として、$iを0,1,2,3,4・・・と増やしたいのです。

$abc$i
${abc"$i"}
${"abc" . "$i"}

など試してみましたが、だめでした。
なにかよい方法ないでしょうか?


396 :デフォルトの名無しさん:2006/11/19(日) 00:26:31
ちょっと質問です。

日本語の文章を入力すると、
ばらされた単語になって出力されるなんていう
便利なモジュールはありませんか?

split の日本語バージョンに相当するものが欲しいのです。

$tmp = "I am a cat.";
@words = split( " ", $tmp);
foreach $word (@words) {
print $word,"\n";
}
とすると、以下の出力が得られます。
I
am
a
cat.



397 :デフォルトの名無しさん:2006/11/19(日) 00:27:13
欲しい関数を仮に jsplit() とすると、こんなイメージです。

$tmp = "我輩はネコである";
@words = jsplit($tmp);
foreach $word (@words) {
print $word,"\n";
}

出力結果:

我輩

ネコ

ある。

398 :デフォルトの名無しさん:2006/11/19(日) 00:54:05
>395
日本語で書いてくれ。

>396
日本語の分かち書きだな。Text::ChasenかText::MeCabあたりかな。

399 :デフォルトの名無しさん:2006/11/19(日) 01:01:15
>>395
${"$abc" . "$i"}


400 :デフォルトの名無しさん:2006/11/19(日) 01:01:22
>>395
惜しい。
${$abc . $i}

401 :396:2006/11/19(日) 01:49:21
Text::Chasen
http://chasen.aist-nara.ac.jp/chasen/distribution.html.ja
こちらは辞書込みでDLしてインストールですね。

Text::MeCab
http://mecab.sourceforge.jp/
こちらは CPAN のモジュールなんで、PPMで落せるかもとwktk。

その他、Kakasi とかいうモジュールもあるそうですが、
簡単そうなMeCab で頑張ってみます。

ありがとうございました。 >>398 さん


402 :395:2006/11/19(日) 02:55:59
>>399
>>400
ありがとうございます。
無事にできました。
use strict;
を使ってたらエラーが出ましたが、はずしたらうまく動きました。

403 :デフォルトの名無しさん:2006/11/19(日) 04:53:05
>>402
何に使うか知らんが、配列にしたらええやん。

404 :391:2006/11/19(日) 10:45:48
>>392-394
おお、ありがとうございます!! 張り切って読んでみます。


405 :デフォルトの名無しさん:2006/11/19(日) 11:21:31
正規表現で日本語(S-JIS)を使うと [ が入ってるとエラーが出るのですが
皆さんどうやって回避してますか?(たとえば「ー」があると言われる)

文字コードを変換してるのでしょうか?

406 :デフォルトの名無しさん:2006/11/19(日) 11:29:16
普通はutf8かeucに変換してから扱うと思うんだ

407 :デフォルトの名無しさん:2006/11/19(日) 11:31:45
入出力時に変換してスクリプトと内部処理はutf8に統一

408 :デフォルトの名無しさん:2006/11/19(日) 11:32:36
\Q\E とか use encoding とか

409 :デフォルトの名無しさん:2006/11/19(日) 12:32:03
皆さんどうやって変換してますか?
Jcode->convert()
Jcode->new()->euc で変換するのはおk?



410 :デフォルトの名無しさん:2006/11/19(日) 12:42:19
板違いだが、ケータイの絵文字なんかが入力される環境だと文字コード変換しにくいんだよな……。

411 :デフォルトの名無しさん:2006/11/19(日) 13:17:55
>>410
そのあたりを扱うフレームワークが作られていたと思ったが。

412 :デフォルトの名無しさん:2006/11/19(日) 13:41:44 ?BRZ(5115)
Encode::JP::Mobile

413 :デフォルトの名無しさん:2006/11/19(日) 14:15:52
ほー。
今度、仕事先に導入してみない?って聞いてくる。

414 :デフォルトの名無しさん:2006/11/19(日) 14:25:00
このレスでのコメントを読むと大変に勉強になります。
大学などでは、Javaなどの言語の講義はあると思いますが、
Perlは高等教育、情報科学教育では嫌われている言語ので、
授業などで学ぶ機会は少ないと思います。

perlに詳しい方は、どのような勉強法をされましたか?
皆さん独学ですか?

415 :デフォルトの名無しさん:2006/11/19(日) 15:25:31
習うより慣れよ。

ことプログラミングに関しては、他人に習うということは忘れた方が良い。

416 :デフォルトの名無しさん:2006/11/19(日) 15:29:28
Perl には詳しくない。独学。

いまだに sprintf() を使ってしまう。
printf( "%d\n" $hogehoge); と書く癖が抜けない。


417 :デフォルトの名無しさん:2006/11/19(日) 15:49:07
ソースコードを読もう。

418 :デフォルトの名無しさん:2006/11/19(日) 15:51:03
計算機言語の講義なんてナンセンス。
自分で習得しやがらない阿呆ための救済策だ。

419 :デフォルトの名無しさん:2006/11/19(日) 17:09:07
言語の習得は目的ではない。手段だ。

420 :デフォルトの名無しさん:2006/11/19(日) 17:09:20
情報系の学科を修了した人は、高卒に見えてしまう。

421 :デフォルトの名無しさん:2006/11/19(日) 17:23:19
どのルート辿ろうが
勉強し続けなきゃろくなことできないからな

422 :デフォルトの名無しさん:2006/11/19(日) 17:27:51
>>414
情報系の大学では、言語の講義なんておまけだよ。
もう書いている人がいるように、尻拭い的。


423 :デフォルトの名無しさん:2006/11/19(日) 17:49:04
for (sort {$file{$a}[1] <=> $file{$b}[1]} @keys) {
for $box (@{$data{$_}}) {
}

これって、{$a},{$b} には最初に何が入るのでしょうか?
@kes の要素の1番めと1番めですか?
その次が2番めと2番めですか?

424 :デフォルトの名無しさん:2006/11/19(日) 18:12:28
>>423
訊いてるヒマがあったら調べろよ。

425 :デフォルトの名無しさん:2006/11/19(日) 18:36:07
以下のような感じで$FOOというグローバル変数を
宣言しているつもりなのですが、エラーになってしまいます。
何がいけないのでしょうか?

[エラー内容]
Global symbol "$FOO" requires explicit package name at test.pl line 11.
Execution of test.pl aborted due to compilation errors.

[test.pl]
#!/usr/bin/perl

use strict;
use warnings;

require "config.pl";

&main();

sub main {
print($FOO);
}

[config.pl]
my $FOO = "aaaaa";
1;

426 :デフォルトの名無しさん:2006/11/19(日) 18:44:15
>>424
そっくりそのまま返す

427 :デフォルトの名無しさん:2006/11/19(日) 18:49:02
>>425
myはグローバル変数ではなくレキシカル変数の宣言だよ。
グローバル変数の宣言はourを使え。
詳細は
perldoc -f my
perldoc -f our


428 :デフォルトの名無しさん:2006/11/19(日) 18:51:59
>>425
どう見ても$FOOをファイルconfig.pl内にローカル化しています。

429 :デフォルトの名無しさん:2006/11/19(日) 18:58:10
for data (@datas){
これってどういう意味なのでしょうか?
for文ではありえない気がするのですが

430 :デフォルトの名無しさん:2006/11/19(日) 19:26:36
ありえないだろうな
普通 for $data (@datas) {} だし、
それ以前にdataの複数形ってなんだ


@datasの要素を1つずつ$dataに代入し、ブロックを実行します
foreach $data (@datas) {} と等価です

431 :デフォルトの名無しさん:2006/11/19(日) 19:35:19
data自体が複数だよ。単数形はdatum

432 :デフォルトの名無しさん:2006/11/19(日) 20:15:15
>>431
( ・∀・)つ〃∩ ヘェーヘェーヘェー

433 :デフォルトの名無しさん:2006/11/19(日) 20:26:16
>>414
特定言語の講義なんてなかったよ?
具体的な実装例としてオマケ的には使うけど。



434 :デフォルトの名無しさん:2006/11/19(日) 21:38:34
>>427
ourにしてみましたが同じエラーになります。

>>428
>どう見ても$FOOをファイルconfig.pl内にローカル化しています。
具体的にはどのようにすればいいでしょうか?

435 :デフォルトの名無しさん:2006/11/19(日) 22:00:51
>>434
427はレキシカル変数とグローバル変数は違うよって説明でしょ。
perldoc読んでないでしょ?

エラーをなくしたいのであれば
test.plのrequireをBEGINで囲って、
config.plのグローバル変数はourじゃなくてuse vars使って定義してみ。

436 :デフォルトの名無しさん:2006/11/20(月) 00:17:41
そもそもグローバル変数を使おうって考えがいけないのじゃないだろうか。


437 :デフォルトの名無しさん:2006/11/20(月) 00:20:47
つ〜か、AppConfigでも使うってのはだめか?

438 :デフォルトの名無しさん:2006/11/20(月) 01:49:59
質問させてください。

windowsのperlで、wavかmp3のサウンドを鳴らせる方法はあるでしょうか?
もしあれば、ご教授よろしくお願いします。

439 :デフォルトの名無しさん:2006/11/20(月) 01:51:10
>438
つWin32::Sound

440 :デフォルトの名無しさん:2006/11/20(月) 02:03:48
>>439
即レスども。

441 :デフォルトの名無しさん:2006/11/20(月) 03:03:23
>>433
ないよね。 言語使ったとしてもそれは素材的な
使用をしてるだけで、本則は基礎理論だし。
基礎が有れば言語が変わったって、数週で対応できるよ。

例えれば、乗る車が変わるのと大差ない。
基本操作知ってれば、あとは車幅感覚や視点高さに慣れるだけ。

442 :デフォルトの名無しさん:2006/11/20(月) 10:48:57
>441
良い例えだな。免許持ってないけど。

443 :デフォルトの名無しさん:2006/11/20(月) 11:20:56
>>434
Exporter使ってuseでimportできるようにするのが吉。





444 :デフォルトの名無しさん:2006/11/20(月) 19:37:41
質問があります。
if文の条件式はどう書けばいいでしょうか。

@array = (3, 5, 9, 10);
for (my $i =0; $i <= 20; $i++) {
if () {
# $iが@arrayに含まれている時の処理
} else {
# $iが@arrayに含まれていない時の処理
}
}


445 :デフォルトの名無しさん:2006/11/20(月) 19:49:14
grep($_==$i, @array)

446 :デフォルトの名無しさん:2006/11/20(月) 19:56:22
>>444
チェック用のハッシュを作る

for (@array){$Hash{$_} = 1};

for (my $i =0; $i <= 20; $i++) {
 if ($Hash{$i} == 1){
  ・・・


447 :444(嫌な事がありそう):2006/11/20(月) 21:25:06
>>445-446
できました。
ありがとうございました。

448 :デフォルトの名無しさん:2006/11/20(月) 21:40:51
SJIS全角文字をn文字以上を含んでいるかチェックさせたいのですが
書き方がわかりません。

/[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]\{2,\}/

これじゃだめですよね。
他にも色々試してみたのですがさっぱりわからないので
どなたかご教授ください。

449 :壁|x ・):2006/11/20(月) 21:51:08
駆け出しですが,こんなのできました.
#! /usr/pink/perl -w
use strict;
my @array = (3, 5, 9, 10);
{
 foreach (1..20) {
  if ($array[0] == $_) {
   print "Match: $_\n";
   }
 }
shift @array;
redo if @array;
}

450 :448:2006/11/20(月) 21:55:48
すみません、これで自己解決しました。
/[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]\{2,\}/
 ↓
/([\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]){5,}/

451 :デフォルトの名無しさん:2006/11/20(月) 22:25:16
>>449
普通のブロックにredo使ってるの久々に見たなぁ。redo自体あんま見ないけど。
ただ、破壊してるうえに可読性も悪くなった割には、2重forでぶん回すのと変わってないような。

452 : ◆TWARamEjuA :2006/11/20(月) 22:36:52 ?BRZ(6677)
数が少ないうちはいいけれども、多くなってきたり、重複してきたりするとややこしくなってきたり。
やっぱりハシュ使った方が効率的かなぁと。@2ch回路的経験

my %hash;
@hash{@Array} = (1) x @Array;
みたいな。。

453 :デフォルトの名無しさん:2006/11/20(月) 22:48:27
>@hash{@Array} = (1) x @Array;
これ何やってるの?

454 :デフォルトの名無しさん:2006/11/20(月) 22:58:33
二項演算子の "x" は繰り返し演算子です。 スカラコンテキスト
では、左被演算子を右被演算子に示す数だけ繰り返したもので構成
される文字列を返します。 リストコンテキストでは、左被演算子
が括弧で括られたリストであれば、リストを繰り返します。

print '-' x 80; # 1 列のダッシュを印字

print "\t" x ($tab/8), ' ' x ($tab%8); # タブに畳み込み

@ones = (1) x 80; # 80 個の 1 を含むリスト
@ones = (5) x @ones; # すべての要素を 5 にする

ttp://www.att.or.jp/perl/man/perlop.1.html より


455 :デフォルトの名無しさん:2006/11/20(月) 22:59:17
>>453
ハッシュのスライスに、必要個数だけ要素を持つリストを代入
ttp://search.cpan.org/~nwclark/perl-5.8.8/pod/perldata.pod#Slices___
ttp://search.cpan.org/~nwclark/perl-5.8.8/pod/perlop.pod#Multiplicative_Operators_

456 :デフォルトの名無しさん:2006/11/20(月) 23:12:42
>>454-455
ありがとん

457 :壁|x ・):2006/11/20(月) 23:44:36
>>451, 452
評価してくれてありがとう!光栄です.
また暇だったら,たまーーーにROMらせてもらいます 笑
(2ch鯖監視係。の中の人 乙華麗!)

458 : ◆TWARamEjuA :2006/11/20(月) 23:55:21 ?BRZ(6677)
(´-`).。oO(shebangの /usr/→pink←/perl が気になったりして♪)

459 :デフォルトの名無しさん:2006/11/21(火) 05:59:32
こうやると、配列の代入部分で処理コストが掛かって
Rubyで書いたスクリプトより遅くなるんですが、どうにかなりませんか?
@a = sort(@a);

sort(@a);
それとも、とすると、すでに何かの変数に代入されてますか?

460 :デフォルトの名無しさん:2006/11/21(火) 09:18:02
>>459
配列代入のコストとソートのコストをどうやって分離して計測したんだ?


461 :デフォルトの名無しさん:2006/11/21(火) 13:00:50
>>459
そういう質問する場合は
 ・環境
 ・比較したRubyとPerlのソース
 ・計測方法
 ・計測結果
ぐらい出せや。

462 :デフォルトの名無しさん:2006/11/21(火) 14:25:57
2chみたいにIDが日付で変わるようにしたいんですけど
それでIPと日付を暗号化したものが掲示板に表示されるようにしたいんだけど
cryptで暗号可したんですが
半角10文字までの文字だけが暗号可されるみたいで
IPの最初のほうがいっしょのやつはIDがいっしょになって困ってます。
教えてください

463 :デフォルトの名無しさん:2006/11/21(火) 14:28:36
日付2桁、IP8桁でやればいいんじゃないか?

464 :デフォルトの名無しさん:2006/11/21(火) 14:32:52
>>462
マルチ乙

465 :デフォルトの名無しさん:2006/11/21(火) 14:33:51
>>463
どうも
>>464
板違いだったからここに書いたんだ

466 :デフォルトの名無しさん:2006/11/21(火) 15:02:37
>>465
自分が立てたスレの>>10を百回嫁

467 :デフォルトの名無しさん:2006/11/21(火) 15:11:17
>>462
cryptよりmd5の方が良いと思う

468 :デフォルトの名無しさん:2006/11/21(火) 15:40:09
>>467
ありがd
やってみる

469 :デフォルトの名無しさん:2006/11/21(火) 15:57:10
>>460-461
すみません。具体的には以下のような感じです。処理結果は10回の結果の平均値です。
単純な計測方法なので誤差はあると思いますが…
配列の代入なしで実行した場合はPerlの方が圧倒的に速いのですが
代入処理を入れると一気に遅くなってしまいます…

[環境]
OS: WindowsXP SP2 CPU: Pentium4 2GHz RAM: 1GB
Perl ver: 5.8.3.809 Ruby ver: 1.8.5
[結果]
Perl: 0.078sec (代入なし) 1.391sec (代入あり)
Ruby: 0.219sec
[ソース]
----- Perl -----
$N = 100000;
$s = (times)[0];
srand(time());
@a;
for($i = 0; $i < $N; ++$i){ $a[$i] = rand($N); }
@a = sort(@a); #代入あり
#sort(@a); #代入なし
print((times)[0] - $s);
----- Ruby -----
N = 100000
s = Time.now
srand(Time.now.to_i)
a = []
N.times{ a << rand(N) }
a.sort!
print Time.now - s

470 :デフォルトの名無しさん:2006/11/21(火) 16:45:29
>>469
馬鹿者。
数値のソートは @a = sort @a じゃなくて @a = sort {$a <=> $b} @a だ。
perlに無駄な仕事させてんじゃねぇ。

無駄な仕事ってのは、@aの各要素に対する文字列値の生成の事な。
内部で100000回のsprintfとその倍のmalloc(OSレベル)が発生するので遅くもなるが、
そもそも文字列比較と数値比較では結果が異なる。

471 :461:2006/11/21(火) 16:50:59
>>469

> @a = sort @a

my @result;
@result = sort @a;
に変更してみ。

確か古いバージョンのsortはソート対象の配列と
結果受け取りの配列が同じだと極端にパフォーマンスが落ちるってのがあったと思う。

あと演算子を指定しないとデフォルトでは文字列比較になるから
数値比較する場合は
@result = sort {$a <=> $b} @a;
ってしないとソート結果がおかしくなるぞ。

コマンドプロンプト起動して
perldoc -f sort
でsort関数のマニュアルがでるからそれ見れ

472 :デフォルトの名無しさん:2006/11/21(火) 16:58:57
ソートだけの時間計ってみたら代入なしのときは0だったから
代入なしのソートって何もしてないんじゃね?


473 :461:2006/11/21(火) 17:12:20
http://perldoc.jp/docs/perl/5.8.4/perl584delta.pod
に「その場でのソート (@a = sort @a)が最適化されました。」
ってあって>>469は5.8.3だからここを>>471の形に直せば
Rubyと同じ処理速度になると思うんだけどなぁ。
結果を教えれ!>469

474 :デフォルトの名無しさん:2006/11/21(火) 17:25:42
Rubyのコードでは、配列に入っているのが整数だという不公平性もあるので
同じにはならんだろうな。


475 :デフォルトの名無しさん:2006/11/21(火) 17:29:27
>>470-471
レスどうも。言われた通りのコードで実行してみました。
処理速度が倍くらいにアップしましたが、まだ「0.687sec」なのでRubyより遅いです…
やはり配列のコピーの部分がネックになってる様なのですが…
my @r;
@r = sort{$a <=> $b} @a;

ちなみにRubyは配列を代入しても「!」を付けた破壊的メソッド(メソッドの内部で値入れ替え)でも
速度は殆ど変わりませんでした。代入がすべて参照になってるからみたいです。

476 :469:2006/11/21(火) 17:35:29
>>474
あ、言うのを忘れてましたが、新しいコードでは乱数生成の部分は、
int(rand($N));
で行いました。こうすると浮動小数の時より少し速くなりました。

新しいコードは以下です。
$N = 100000;

$s = (times)[0];

srand(time());

@a;
for($i = 0; $i < $N; ++$i){ $a[$i] = int(rand($N)); }
my @r;
@r = sort{$a <=> $b} @a;

print((times)[0] - $s);

477 :デフォルトの名無しさん:2006/11/21(火) 17:39:24
RDBMを使うようになってからというもの、sortなんてめったに使わなくなってしまった…。
まぁ代入でRubyより時間が掛かるのは、そりゃそうだろうな。それは仕方ない。
その代わり他の部分で早かったりもするし、スクリプト言語なんてそんなもんさ。

478 :デフォルトの名無しさん:2006/11/21(火) 17:40:40
ちなみにPerlもRubyもsrand()をする必要はないぞ。

479 :デフォルトの名無しさん:2006/11/21(火) 17:40:46
確定情報じゃない( ruby の方 )からロムってたんだが。
- ruby のソートはクイックソート(多分、間違ってたら指摘よろ)
- perl のソートは ( perldoc -f sort / perldoc sort に書いてある。確定)
 - 5.6 以前は quick sort
 - 5.8 以降は mergesort
アルゴリズムが違う可能性があるんだよ。
そこまで速度に固執する理由が判らんが、
use sort '_quicksort' ;
宣言して sort { $a <=> $b } @a あたりしてみたら如何?

480 :デフォルトの名無しさん:2006/11/21(火) 17:43:06
ところがPerlでは実装部分では整数が

481 :462:2006/11/21(火) 17:43:53
md5のやりかたがのってるサイトああればよかったら教えてください
検索したのですが
出てきませんでした

482 :デフォルトの名無しさん:2006/11/21(火) 17:45:15
>>481
Digest::MD5をインストール

483 :462:2006/11/21(火) 17:45:58
>>482
アドレスお願いします

484 :デフォルトの名無しさん:2006/11/21(火) 17:46:18
>>482
あ、標準モジュールか。
まあ、Digest::MD5を使えと。

485 :469:2006/11/21(火) 17:49:41
>>479
0.656sec と変わりませんでした。
やはり一番のネックは代入の部分みたいです。これは言語の特徴という事で仕方がないかもしれません。
代入処理を省略すると、0.084sec と一気に速度アップするみたいですので。

486 :デフォルトの名無しさん:2006/11/21(火) 17:56:48
>>485
それ、早い遅い以前にソート処理が処理がスキップされているぞ。
代入の速度を計りたいなら
my @tmp = @a;
でやれば代入自体は大して時間がかかってないのが分かるぞ。


487 :469:2006/11/21(火) 18:07:55
>>486
う〜ん、ではやっぱりソート処理の部分が問題なんですかねぇ…

ちなみにCとC++でもまったく同じものを実行してみましたが
何故かC++の方が処理が速かった…
なんか全部予想外の結果だったなぁ…
環境:VC++6.0
C: 0.046sec
C++: 0.015sec

488 :469:2006/11/21(火) 18:19:37
色々試してみたらこんな結果になりました。
PHPはコードの書き方が悪かったのかもしれませんが、遅かったです。
C: 0.046sec
C++: 0.015sec
Ruby: 0.219sec
Perl: 0.687sec
PHP: 0.761sec

489 :デフォルトの名無しさん:2006/11/21(火) 18:19:50
だからPerlは整数のあつかいが

490 :470:2006/11/21(火) 18:54:15
確認したら、単に @a = sort {$a <=> $b} @a だと文字列値作りやがる。
恥ずかし過ぎるので、ちょっと pp_sort.c 眺めてみた。

>>487-488
@a = sort { 0; $a <=> $b } @a; にすれば、もうちょっと早くなる。

比較部分に付けた 0; は、perlで記述した比較式を使わせるためのおまじない。
(オプティマイザに「複雑な評価式」だと勘違いさせる)

491 :デフォルトの名無しさん:2006/11/21(火) 19:08:57
別に ruby の方が早くても不思議でもなんでもない ( >>479 ) が、
なんで sort 文以外の rand やら int やら c 方式の for 文やらが、
評価されてるベンチマークで、「 sort が遅い」と結論付けてんのか
分からん。

492 :デフォルトの名無しさん:2006/11/21(火) 19:10:31
>>490
0.594sec
ちょっとスピードアップです。
my @r;
@r = sort{0; $a <=> $b} @a;

あと、use sort '_quicksort' 入れるとどうも遅くなりますね…
0.719sec

493 :ぴゅあ:2006/11/21(火) 19:17:37
>>462
ちょっと気になってみたので書いてみてますが…

2chのIDが日付で変わるとかは知らないですが
暗号化(crypt)としてますけど、符号化の処理としてcryptを利用しているという感じでしょうか

>半角10文字までの文字だけが暗号可されるみたいで
8文字ですよね(かつ下位7ビットとされているらしい)@DESの場合でしょう

生成される文字列が13文字であるというのは、11文字の中に種も含まれているということだろうか?と推測しますが
IPを8文字に収め、種に日付を関連付ければ(基準日から)11年分くらいをその11文字で一意な値として得られそうにも思えますけど、実際には13文字(実質11文字)では足りないような気もします
(実際のDES/MD5の実装までは追えてないので…というか追う必要のあるもの?と思うので追ってない)

# crypt()はパスワード暗号化関数である。
というようなところもあるので、必ず一意となることが保証されているものなのか?と、ちょっと疑問に思ったりもします

パスワードの"暗号化だけ"が目的ではないかと思っているので、必ずしも得られるものが一意であることは重要ではないですよね?
目的は
>IPの最初のほうがいっしょのやつはIDがいっしょになって困ってます。
ということでもあり、ちょっと気になったりです。。。
或いはMD5を使うことでその辺りが保証されてくるものなのか

どうなんでしょう
検証できてない推測だけですけどね

あと、cryptはパスワード暗号化関数で、DES/MD5はどちらを使用するかが選択されるものじゃないかなと思ったりもします

494 :462:2006/11/21(火) 19:39:54
>>493
どうもありがとうございます。


http://multix.jp/html/memo/030525.html
ここに2chのIDについてのっていたのですが

use Digest::MD5;
use Digest::MD5 qw(md5_hex);
sub get_2ch_id {
my $bbskey = shift;
my $rand = shift;
my $ip = $ENV{'REMOTE_HOST'};
my $day = ( localtime )[3];
my $md5 = Digest::MD5->new();
my $ipmd5 = substr( md5_hex( $ip ), -4 );
$md5 -> add( $ipmd5 );
$md5 -> add( $bbs );
$md5 -> add( $day );
$md5 -> add( $rand );
my $id = substr( $md5->b64digest, 0, 8 );
return $id;
}
# printf "ID:%s", &get_2ch_id( 'bbskey', 'rand' );
#
# bbskey は板の名前
# rand は /dev/rand から読み出した16バイトの乱数文字列
# ただし ( localtime )[3] の値がおなじ間は変化しない(再利用する)こと。
↑を使ってテストのつもりでIDを表示してみたら日付で変わるようになったみたいですけど
人のものなのではずしました。
上のようなものを作成するための説明がのってるサイトってありませんかね?
調べてもないんです・・・

495 :デフォルトの名無しさん:2006/11/21(火) 20:17:06
use Benchmark qw(:all);
use sort '_quicksort';

$N = 100000;
push @a, int(rand($N)) for (1..$N);

timethese(10, {
'case1' => sub { @b = sort @a; },
'case2' => sub { @b = sort { $a <=> $b } @a; },
'case3' => sub { @b = sort { 0; $a <=> $b } @a; },
'case4' => sub { sort @a; },
});

---
This is perl, v5.8.8 built for MSWin32-x86-multi-thread
Windows XP SP2 + AMD Athlon 64 2.39GHz

Benchmark: timing 10 iterations of case1, case2, case3, case4...
case1: 4 wallclock secs ( 3.84 usr + 0.02 sys = 3.86 CPU) @ 2.59/s (n=10)
case2: 2 wallclock secs ( 2.16 usr + 0.03 sys = 2.19 CPU) @ 4.57/s (n=10)
case3: 4 wallclock secs ( 4.37 usr + 0.00 sys = 4.37 CPU) @ 2.29/s (n=10)
case4: 0 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 CPU)
(warning: too few iterations for a reliable count)

0; をつけない方が速いみたい。case2 は10回やって平均約0.22msと、なかなかの好タイム。
代入しない case4 はヴォイドコンテキストなので、実行すらされないわけですね。

496 :495:2006/11/21(火) 20:30:41
require 'benchmark'

N = 100000
a = []
N.times { a << rand(N) }

puts Benchmark.measure{ 10.times { b = a.sort } }
puts Benchmark.measure{ a.sort! }

---
ruby 1.8.5 (2006-11-02) [i386-mswin32]

0.407000 0.000000 0.407000 ( 0.406000)
0.031000 0.000000 0.031000 ( 0.032000)

Ruby は門外漢だけど、こんな感じだろうか。sort!は繰り返しての平均がとれないので1回だけ。
代入付きだと約41ms。in-placeだと約31ms。平均じゃないけど参考までに。

497 :デフォルトの名無しさん:2006/11/21(火) 20:35:47
メモリ節約のため必要なときにrequireするようにしたいのですが

main.pl
$val{'mess'} = "hello world\n";
if (1) {
require ''sub.pl";
messprint();
}
---------------------
sub.pl

sub messprint {
print $val{'mess'};
}
1;
---------------------
このように書くとうまく動作しません
どのように記述すればうまくうごくようになるのでしょうか

498 :デフォルトの名無しさん:2006/11/21(火) 20:40:10
>>497
× require ''sub.pl";
○ require "sub.pl";

てかエラーメッセージぐらい書こうよ。

499 :デフォルトの名無しさん:2006/11/21(火) 20:43:52
すみません・・・

main.pl
+my $val{'mess'};
$val{'mess'} = "hello world\n";

sub.plのサブルーチン内でmain.plの変数の参照ができるようにするには
どのようにしたらいいのでしょうか?

500 :デフォルトの名無しさん:2006/11/21(火) 20:44:24
my %val;ですね

501 :デフォルトの名無しさん:2006/11/21(火) 20:45:28
our %val;
じゃないとダメだろう。

502 :デフォルトの名無しさん:2006/11/21(火) 20:53:07
あ、できました・・・
ありがとうございます
ローカルにするとだめなんですね

503 :デフォルトの名無しさん:2006/11/21(火) 20:57:58
>>502
> ローカルにするとだめなんですね
ちょwおまvflkmvkぁd
スコープ外で使えたら局所化している意味がないじゃんYO

504 :デフォルトの名無しさん:2006/11/21(火) 21:01:53
>>503
頭沸いてましたw
スッキリー

505 :デフォルトの名無しさん:2006/11/21(火) 21:02:38
>>497
値が欲しいだけなら引数で渡してあげよう。

# main.pl
my %val = ( 'mess' => "hello world\n" );
if (1) {
  require ''sub.pl";
  messprint($val{mess});
}

# sub.pl
sub messprint {
  my $message = shift;
  print $message;
}
1;

506 :469:2006/11/21(火) 21:17:22
>>495
今、ActivePerlの最新版で試してみたら
何の工夫もない>>469と同じコードで、軽く 0.203sec 出ました。
どうやら遅い原因の多くは、古いバージョンのせいだったみたいです…

507 :462:2006/11/21(火) 21:29:29
cryptで暗号可すると11文字になりますよね?
それを8文字にするほうほうってありますかね?

508 :462:2006/11/21(火) 21:59:32
>>507
自己解決しました。

509 : ◆TWARamEjuA :2006/11/21(火) 22:10:57 ?BRZ(6677)
ID生成については、
bbs.cgi再開発プロジェクト Part8
ttp://qb5.2ch.net/test/read.cgi/operate/1149664022/l50
の過去ログにあったような伊予柑♪

ようするに、IPアドレスは端折って入れちゃっているからもちろんのこと被ったりします♪65536通りだったかしら

510 :470:2006/11/21(火) 22:33:52
あー説明不足だった、申し訳ない。
>>490は(>>469氏が使っている)v5.8.3での話。
(v5.8.7までは同じ)

ソースを比較しながら読んでみたけど、
perl588delta.pod にある
> provided improvements to reduce the memory usage of C<sort>
> and to speed up some cases.
の中身が「数値比較が指定された時に文字列値を作るのを止めた」のと
「全要素が整数ならば、自動的に整数比較を用いる」でした。

5.8.8以降で {0; $a <=> $b} を指定すると、「複雑な比較式用の呼び出し」を
使うオーバーヘッド分が遅くなるだけです。
5.8.7までなら同時に全要素の文字列化が行われなくなるので、早くなる分と
遅くなる分を加えて、今回の例では早くなったと。

511 :デフォルトの名無しさん:2006/11/22(水) 02:23:15
ちょっと聞きたいが
駱駝: http://www.oreilly.co.jp/books/4873110963/
これ読むのに
どれくらい時間かかる?
仕事しながら合い間に
休みの日もよむとして
ある程度(中級以下)Perl書ける人間が読むとして

512 :デフォルトの名無しさん:2006/11/22(水) 08:21:50
>>511
人によるだろうけど、リファレンスマニュアルって「読む」ものか?
オレは「読んだ」ことがないから判らんw

513 :デフォルトの名無しさん:2006/11/22(水) 08:43:23
>>512
> 人によるだろうけど、リファレンスマニュアルって「読む」ものか?
> オレは「読んだ」ことがないから判らんw

あれは、純粋にPerlに興味がある人間は、読むなと言われても貪るように読む本だが。

514 :デフォルトの名無しさん:2006/11/22(水) 10:34:20
俺はラクダ本全部読みきったけどな。
2,3週使ったハズ。最後の関数リファレンスは軽く流し読みしたけど。

515 :1/2:2006/11/22(水) 11:50:32
質問があります。

{
$str1 =~ /()()()/;
test("ほげ", $1, $2, $3);
} {
$str2 =~ /()()()/;
test("ふが", $1, $2, $3);
}

sub test {
$name = shift;
($hash{$name}{value1}, $hash{$name}{value2}, $hash{$name}{value4}) = @_;

{
$hash{$name}{value2} =~ /()/;
$hash{$name}{value3} = $1 ? $1 : 0;
} {
$hash{$name}{value4} =~ /()/;
$hash{$name}{value5} = $1 ? $1 : 0;
}
}

こういう処理をしたいんですが、このままだと呼び出し元の
$1がサブルーチン内でも有効であって期待通りの動きをしません。
ですので下の用に書き直しましたが、もっと簡潔に書けませんか?

続く

516 :2/2:2006/11/22(水) 11:52:39
{
my @array;
{
$str1 =~ /()()()/;
@array = ($1, $2, $3);
}
test("ほげ", @array);
} {
my @array;
{
$str2 =~ /()()()/;
@array = ($1, $2, $3);
}
test("ふが", @array);
}

sub test {
# 同じ
}


517 :515:2006/11/22(水) 11:58:05
ごめんなさい、訂正です。

sub test {
$name = shift;
(${$hash{$name}}{value1}, ${$hash{$name}}{value2}, ${$hash{$name}}{value4}) = @_;

{
${$hash{$name}}{value2} =~ /()/;
${$hash{$name}}{value3} = $1 ? $1 : 0;
} {
${$hash{$name}}{value4} =~ /()/;
${$hash{$name}}{value5} = $1 ? $1 : 0;
}
}


518 :デフォルトの名無しさん:2006/11/22(水) 12:24:55
質問。

シグナルハンドラを設定するときのサンプルって、たいてい

local $SIG{INT} = ...

って書いてあるけど、なんでlocalがいるの?

$SIG{INT} = ...

だけじゃダメなん?

うわ、一行ごとの改行書き込みになってしまった。

519 :デフォルトの名無しさん:2006/11/22(水) 12:42:22
>>515
意味のないブロック使うなよ、質問はもっと具体的に書いてくれ。
お望みのものはこんな感じか?
==================
sub test{
my $name = shift ;
my %hash ;
$hash{$name} = {
value1 => $_[0],
value2 => $_[1],
value3 => $_[1] =~ /(c)/ ? $1 : 0 ,
value4 => $_[2],
value5 => $_[2] =~ /(o+)/ ? $1 : 0 ,
} ;
print $1 . "\n" ;
return %hash ;
}
my $str = 'hoge-fuga-foo' ;
use Data::Dumper ;
print Dumper { test( "ほげ", $str =~ /(\S+)-(\S+)-(\S+)/ ) } ;


520 :デフォルトの名無しさん:2006/11/22(水) 13:03:05
>>518
あとで値を元に戻す必要がなけりゃlocalなくてもいいよ。
プログラムの一部分でだけ有効にしたいときはブロックで
囲んでlocalにしとけばブロック抜けるときに勝手に戻るので
いちいち退避用の変数用意したり戻し忘れないように気を
つけたりといった手間がいらないから楽というだけのこと。


521 :デフォルトの名無しさん:2006/11/22(水) 13:03:21

&a({ 'mode' => '1', 'test' => 'あ' });
sub a {
my %f = shift;

print $f{'mode'};
}
うまく受け取れないのですがどうすればいいでしょうか?


522 :デフォルトの名無しさん:2006/11/22(水) 13:13:34
my $f = shift;
print $f->{'mode'};

523 :デフォルトの名無しさん:2006/11/22(水) 13:41:16
なるほどありがとうこざいました。

524 :デフォルトの名無しさん:2006/11/22(水) 14:20:36
リストにして渡してもできた。
どっちがいいんだろう?

&a( ( 'mode' => '1', 'test' => 'あ' ) );
sub a {
my %f = @_;

print $f{'mode'};
}

525 :デフォルトの名無しさん:2006/11/22(水) 14:22:34
なにこのスレの伸びっぷり

526 :デフォルトの名無しさん:2006/11/22(水) 14:50:59
>520
thx. ↓以下検証コード。

----------
local $SIG{INT} = sub { print "1\n"; }
sleep(10);

print "in\n";
{
local $SIG{INT} = sub { print "12\n"; }
sleep(10);
}

print "out\n";
sleep(10);
1;
__END__ ################################
C:\Docum...>test.pl
1
in
12
out
1

C:\Docum...>


527 :515:2006/11/22(水) 15:21:54
>>519
それはどうやって使うんですか?
下のようにしても上書きされてしまいます。
%hash = test("ほげ", $str =~ /(\S+)-(\S+)-(\S+)/);
%hash = test("ふが", $str =~ /(\S+)-(\S+)-(\S+)/);

$hash{名前}{要素}の用に使いたいです。
ブロックは$1のスコープを狭める為に使いました。


528 :515:2006/11/22(水) 16:01:38
ごめんなさい読み違えていました。

sub setInfo {
$name = shift;
$info{$name} = {
value1 => $_[0],
value2 => $_[1],
value3 => $_[1] =~ /(c)/ ? $1 : 0 ,
value4 => $_[2],
value5 => $_[2] =~ /(o+)/ ? $1 : 0 ,
} ;
}

my $str = 'hoge-fuga-foo';

setInfo("ほげ", $str =~ /(\S+)-(\S+)-(\S+)/);
setInfo("ふが", $str =~ /(\d+)-(\d+)-(\d+)/);

$1のスコープの問題も無く、簡略化できました。
とても参考になりました。
ありがとうございました。


529 :デフォルトの名無しさん:2006/11/22(水) 16:42:03
初めてPerlを使う者ですが、ActivePerl-5.6.1.638-MSWin32-x86を使ってインストールしました。
ppmを使って、
 install time-hires
 install io-zlib
 install win32-api
 install http-lite
 install Win32-Sound
 install getopt-long
これらを一行ずつ打ち込みたいのですが、うまくいかず
Error installing package time-hires : could not locate a PPD file for package time-hires
となってしまいます。
どうやれば正しくインストールできることができるのでしょうか?
ご教授お願いします・・・。

530 :デフォルトの名無しさん:2006/11/22(水) 17:05:54
>>527
お前さんがいいなら、まあいいが……
参考までに hash の merge は、
my %hash = ( %hashA, %hashB ) ;
なんかで実現出来る。527 の例だと
my %hash = test("ほげ", $str =~ /(\S+)-(\S+)-(\S+)/);
%hash = ( test("ふが", $str =~ /(\S+)-(\S+)-(\S+)/), %hash ) ;


531 :デフォルトの名無しさん:2006/11/22(水) 17:11:16
文字コードがわけわからん
どこが駄目なのかわからんから適当に弄ってたら
もう何やってんだかわからん
Help me!!

532 :デフォルトの名無しさん:2006/11/22(水) 17:31:37
エスパーが来るまでROMってろ

533 :デフォルトの名無しさん:2006/11/22(水) 17:34:38
>530
ハッシュのマージだけど、巨大なハッシュならeachでまわした方がメモリ食わないんじゃないか?

>531
何がどうわからんのか書かないことには答えようがない。

534 :530:2006/11/22(水) 17:49:02
>>533
each とコレ↓とどっちがメモリ食わないんだろ?
@hash{ keys %hashA} = values %hashA ;
まあ、そこまで巨大 hash を使うなら、hash の merge なんてせずにすむ様に
コードの最適化を優先するがw

535 :デフォルトの名無しさん:2006/11/22(水) 18:01:10
事故レス
cookbook に each が一番って書いてあった

536 :515:2006/11/22(水) 20:45:52
>>519で、testサブルーチンの中の正規表現がどちらも真だった時、
どちらにも同じ値が代入されてしまいます。解決策を教えてください。

value2 => $_[1],
value3 => $_[1] =~ /(\S+)/ ? $1 : 0,
value4 => $_[2],
value5 => $_[2] =~ /(.)/ ? $1 : 0,

結果
'value4' => 'foo',
'value5' => 'f',
'value1' => 'hoge',
'value3' => 'f',
'value2' => 'fuga'

期待する結果は
'value4' => 'foo',
'value5' => 'foo',
'value1' => 'hoge',
'value3' => 'f',
'value2' => 'fuga'

環境:WindowsXP SP2, Active Perl v5.8.8 built for MSWin32-x86-multi-thread

537 :デフォルトの名無しさん:2006/11/22(水) 20:56:25
>>536
出しゃいいだけだろが。
sub test{
 my $name = shift ;
 my %hash ;
 $hash{$name} = {
  value1 => $_[0],
  value2 => $_[1],
  value4 => $_[2],
 } ;
 $hash{$name}->{value3} = $_[1] =~ /(\S+)/ ? $1 : 0 ,
 $hash{$name}->{value5} = $_[2] =~ /(.)/ ? $1 : 0 ,
 return %hash ;
}



538 :519:2006/11/22(水) 21:17:50
537 が答えてくれてるが無理矢理にでも一文での代入がしたければ
my ( $tmp1, $tmp2 ) ;
$hash{$name} = {
value1 => $_[0],
value2 => $_[1],
value3 => $_[1] =〜 /(\S+)(?{ $tmp1 = $^N })/ ? $tmp1 : 0 ,
value4 => $_[2],
value5 => $_[2] =〜 /(.)(?{ $tmp2 = $^N })/ ? $tmp2 : 0 ,
} ;

実行せずに書きこむもんじゃねえな、
っつーか元の $str1, $str2 及び/()()()/ の中身を教えてくれよ。

539 :デフォルトの名無しさん:2006/11/22(水) 21:19:48
>>488
ちなみに余談だが、C++が爆速なのはインライン関数のせいからだと思われる。
テンプレートと相まって、例えC99のインライン関数をもってしてもC++にはかなわないはず。


540 :デフォルトの名無しさん:2006/11/22(水) 21:44:55
>>539 ソースはこんな感じでした。要はSTLを使ってるか否かの差なんですけど。環境:VC++6.0(C/C++共にReleaseビルド)
----- C -----
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 100000
int compare(const void *a, const void *b){ return *(int*)a - *(int*)b; }
int main(void){
int a[N];
clock_t s = clock();
srand((unsigned int)time(NULL));
for(int i = 0; i < N; ++i){ a[i] = rand() % N; }
qsort(a, N, sizeof(int), compare);
printf("%f\n", (float)(clock() - s) / CLOCKS_PER_SEC);
return 0;
}
----- C++ -----
#include <iostream>
#include <vector>
#include <algorithm>
#include <time.h>
#define N 100000
using namespace std;
int main(void){
clock_t s = clock();
srand((unsigned int)time(NULL));
vector<int> a;
for(int i = 0; i < N; ++i){ a.push_back(rand() % N); }
sort(a.begin(), a.end());
cout << (float)(clock() - s) / CLOCKS_PER_SEC << endl;
return 0;
}

541 :デフォルトの名無しさん:2006/11/23(木) 00:25:44
>>540
そうそう、STLのsortはそういうわけで早いわけ。アルゴリズムは(同じコンパイラならおそらくは)同じだとしてもね。

542 :デフォルトの名無しさん:2006/11/23(木) 00:31:10
ところでおまいら、最新版のActivePerlの PPM がGUIアプリになって
使い方が判らなくて困ってしまいましたよ。

まあ、必要な所 (GD, DBI::ODBC, ..) は最初から入ってたんで
ラッキーでしたけどね。

543 :デフォルトの名無しさん:2006/11/23(木) 00:44:31
PPM4だっけ?XML::LibXMLだったかな、そこらのインストールで問題があるからまだPPM3のbuild817使ってる。


544 :デフォルトの名無しさん:2006/11/23(木) 01:02:07 ?BRZ(5115)
>>542
CUIも使えるよ

545 :デフォルトの名無しさん:2006/11/23(木) 01:54:58
ppm-shell使えばおk

546 :デフォルトの名無しさん:2006/11/23(木) 03:02:57
>>544,545
詳しく。
CUI の方がやっぱ慣れてていいんです。

コマンドプロンプトから
>ppm-shell <改行>
とかするのかな?


547 :デフォルトの名無しさん:2006/11/23(木) 03:06:32
>>546
聞くより試したほうが早くね?

548 :デフォルトの名無しさん:2006/11/23(木) 03:14:59
いまは動作環境が手元にないのよ。


549 :デフォルトの名無しさん:2006/11/23(木) 04:31:37
フーン

550 :デフォルトの名無しさん:2006/11/23(木) 10:10:22
open(IN,"test.txt");
while(<IN>){
print;
}
close(IN);
これでプログラムと同一フォルダ内のtest.txtの内容を表示しようと思ったのですが、
openのところで失敗しているようで、うまく行きません。
どうやらtest.txtというファイルが存在しないとみなされているようです。
試しに、openで新しいファイルを作っても、プログラムと同じフォルダにはできず、
パソコンのどこにファイルが生成されているのか分かりません。
何がまずいのか全く見当が付きません。ご指導願います。

551 :デフォルトの名無しさん:2006/11/23(木) 10:12:51
カレントディレクトリって分かる?
ていうかどうやって実行したわけよ。

552 :デフォルトの名無しさん:2006/11/23(木) 10:34:06
コマンドプロンプトから
perl "プログラムのアドレス"
で実行しました。
すみません、カレントディレクトリについてはよく分かりません...

553 :デフォルトの名無しさん:2006/11/23(木) 10:35:50
>>550
> パソコンのどこにファイルが生成されているのか分かりません。

まずそれを調べろよ。


554 :デフォルトの名無しさん:2006/11/23(木) 10:49:02
ありがとうございます、chdirでフォルダを指定したら、とりあえず読み込めるようになりました。
区切り文字に\を使用していたのがいけなかったようです。
しかし、デフォルトではカレントディレクトリはどこに指定されているのでしょうか?
いままではプログラムとおなじフォルダだと思っていました。
ファイルの生成される場所は、自分のパソコン内の整理が悪いためによく分からない事になってしまっています。

555 :デフォルトの名無しさん:2006/11/23(木) 10:57:14
すみません
subの$_などはCのポインタと考えていいんですよね?
sub t {
my $a = $_[0];
$a = $_[0] = "あ";
}
つまりCでconst みたいにするにはいったん別の変数に移したほうがいいってことですよね?

556 :デフォルトの名無しさん:2006/11/23(木) 11:01:07
>>555
> subの$_などはCのポインタと考えていいんですよね?

ちがう。


557 :デフォルトの名無しさん:2006/11/23(木) 11:03:25
>>554
> しかし、デフォルトではカレントディレクトリはどこに指定されているのでしょうか?

ひょっとしてあなたが何かコマンドを打ち込んで Enter を押すたび、画面に次のような邪魔くさい文字列が表示されませんか?

C:\Documents and Settings\554>

> ファイルの生成される場所は、自分のパソコン内の整理が悪いためによく分からない事になってしまっています。

例えば「未整理のファイル群から特定のファイルを探す」ような非生産的な単純作業をやってくれるのが、コンピュータという道具です。


558 :デフォルトの名無しさん:2006/11/23(木) 11:16:22
>>555
@_ # 組込みの特殊変数。サブルーチンの引数のエイリアスのリストが自動で格納される。
$_[0] # @_ の 0 番目の要素。
@_[0] # @_ の 0 番目の要素のみを含む配列スライス。

そしてこれらは Perl の組込みの特殊変数 $_ とは関係ありません。


559 :デフォルトの名無しさん:2006/11/23(木) 11:19:31
>>557
表示されています。つまりこれがカレントディレクトリと言う事でしょうか。
ということで探してみるとそのフォルダにファイルが生成されていました。
つまりperlの問題じゃなかったと言う事ですね、すみません。

コンピュータに効率的にファイルを探させる事は、自分の力不足でちょっと難しかったです。

560 :デフォルトの名無しさん:2006/11/23(木) 12:41:21
>>559
> コンピュータに効率的にファイルを探させる事は、自分の力不足でちょっと難しかったです。

・スタートメニュー -> 検索 -> ファイルやフォルダ
・マイコンピュータからCドライブ開いてCtrl+Fでエクスプローラの右に検索

perlを覚える前に利用しているシステム(OS)の最低限の利用方法覚えることを推奨します。


561 :デフォルトの名無しさん:2006/11/23(木) 13:49:07
>>537-538
できました。
ありがとうございました。

中身は私的な物なのでごめんなさい。

562 :デフォルトの名無しさん:2006/11/23(木) 20:24:55
perlmagickを使ってbmp画像を生成して,
そこまでは24ビットなんだけども
Anotateで文字を埋め込んだ瞬間24ビットから32ビットに
勝手に変わってしまうという現象に悩まされてる.

それか,32ビットから24ビットに直すいいツールしりませんか?

convert -format BMP24+ a.bmp b.bmp

とやってもうまくいきませんでした.

563 :デフォルトの名無しさん:2006/11/23(木) 20:26:30
X Anotate
O Annotate

564 :233:2006/11/24(金) 17:01:38
ソートのアルゴリズムをいくつか勉強したのですが、
>>233のどの変数が一番小さいのかを調べる方法がまだ分かりません。
どなたか、お知恵を拝借させてください。

565 :デフォルトの名無しさん:2006/11/24(金) 17:23:28
use List::Util qw/min/;
$minimum = min ($number1, $number2, $number3);

566 :デフォルトの名無しさん:2006/11/24(金) 17:34:00
最小の値を出したいのか、最初の値を持った変数名を出したいのか

567 :デフォルトの名無しさん:2006/11/24(金) 17:39:25
> ソートのアルゴリズムをいくつか勉強したのですが

勉強してもスクリプトにいかせられないんだったら、わざわざ書かなくていいよ。

568 :デフォルトの名無しさん:2006/11/24(金) 18:52:17
>>566
>>233を読むと分かると思いますが後者です。
現在以下のような応急処理を行っているのですが、
要素が増えていけばif文がどんどん増えていくので、
何かいい方法はないのかなと。

$hoge = 3;
$huga = 92;
$foo = 2;
$bar = 39;

@hoge = (
$hoge,
$huga,
$foo,
$bar
);

$min = ソートサブルーチン(@hoge);

if ($min == $hoge) {
print "\$hogeが一番小さい\n";
} if ($min == $huga) {
print "\$hugaが一番小さい\n";
} if ($min == $foo) {
print "\$fooが一番小さい\n";
} if ($min == $bar) {
print "\$barが一番小さい\n";
}

569 :デフォルトの名無しさん:2006/11/24(金) 18:56:24
>>568
> 何かいい方法はないのかなと。

最小の値を抽出すればいいだけ。

570 :デフォルトの名無しさん:2006/11/24(金) 18:59:39
>>568
my $number = [
{name=>'number1',value=>8},
{name=>'number2',value=>3},
{name=>'number3',value=>4},
];
my $minimum = [sort { $a->{'value'} <=> $b->{'value'} } @$number]->[0]->{'name'};
print "$minimum が最小";

こんなのはどうかね?
最初に名前を付ける必要があるけど。

>>569
値じゃなくて名前が欲しいって書いてね?

571 :233:2006/11/24(金) 19:00:26
>>569
ごめんなさい。よくわかりません。

ソートサブルーチン(@hoge);
で配列の中の最小の値を返しています

572 :デフォルトの名無しさん:2006/11/24(金) 19:03:33
>>571
あのさあ、普通、不定個の変数のシリーズがある場合には、
配列に入れるんだけど。
で、「どの変数に?」に相当するのはインデックス番号を取得するプレイになる。

あなたはものすごく変なことをしてるんだけど、敢えてやってるの?



573 :デフォルトの名無しさん:2006/11/24(金) 19:10:51
>>572
それは何基準?
値じゃなくてラベルが欲しい場合は連想配列のほうがいいと思うんだけど・・・
まぁちょっと考えすぎかな、とは思うけど
質問内容見ればそんなに慣れてないってわかるでしょ
こういう大人が子供をダメにするんだよなあ

574 :デフォルトの名無しさん:2006/11/24(金) 19:16:07
あ、でも↑も考え方としては配列のインデックス番号か・・・

575 :デフォルトの名無しさん:2006/11/24(金) 19:16:20
>>572
具体的にはこういうことがしたいんですが、
要素がこれ以上増えると式が大変な事になるので>>568で対処しています。
ほかに何かいい方法がありますか?

my $applePrice = 100;
my $bookPrice = 500;
my $carPrice = 100000;

if (($applePrice <= $bookPrice) && ($applePrice <= $carPrice)) {
print "リンゴが一番安いです。\n";
} elsif (($bookPrice <= $applePrice) && ($bookPrice <= $carPrice)) {
print "本が一番安いです。\n";
} elsif (($carPrice <= $applePrice) && ($carPrice <= $bookPrice)) {
print "車が一番安いです。\n";
}




576 :デフォルトの名無しさん:2006/11/24(金) 19:18:17
さっきから頑張ってる>>566>>570>>573>>574が全部スルーされてるwww泣くなよ俺www

577 :233:2006/11/24(金) 19:20:42
>>576
ごめんなさい。
>>570を読んでいる途中です。

578 :デフォルトの名無しさん:2006/11/24(金) 19:25:46
>>577
おk

my $number = [
{name=>'リンゴ',price=>100},
{name=>'本',price=>500},
{name=>'車',price=>100000},
];
my $item = [sort { $a->{'price'} <=> $b->{'price'} } @$number]->[0];
print $item->{'name'} , 'が' , $item->{'price'} , '円で一番安いです';

579 :デフォルトの名無しさん:2006/11/24(金) 19:31:42
hogeとかfooとかbarとかいう奴に容赦する必要は無いと思う。

580 :233:2006/11/24(金) 19:37:49
>>578
読み終わりました。
こんなコードが良く思いつきますね。
たくさんレスを付けて頂いて、どうもありがとうございました。

>>579
背伸びしてごめんなさい。

581 :デフォルトの名無しさん:2006/11/24(金) 19:52:15
rubyとかpythonに乗り換えた方が幸せになれるんじゃないのかな

582 :デフォルトの名無しさん:2006/11/24(金) 19:54:01
>>581
どうして?

583 :デフォルトの名無しさん:2006/11/24(金) 20:05:31
配列の最大値・最小値を求める関数が最初からあるし、
ある要素が配列の何番目にあるかを求める関数もそろってる。

584 :デフォルトの名無しさん:2006/11/24(金) 20:07:35
へええ

585 :デフォルトの名無しさん:2006/11/24(金) 20:37:49
>>583
Perlみたいに

use List::Util;

とかやらなくても良いわけですね。

586 :デフォルトの名無しさん:2006/11/24(金) 21:48:27
perl std.pl > stdout.txt
こういう感じで標準エラー出力を変えることってできます?

587 :デフォルトの名無しさん:2006/11/24(金) 22:06:23
>>586 それはperlの使い方ではなくシステムだろ。スレ違いだ

588 :デフォルトの名無しさん:2006/11/25(土) 09:48:59
*STDERR = *STDOUT ;
突っ込めばとりあえず main の STDERR は STDOUT に全部流れるハズ。
そーじゃなくて、use warnings 時の warning を STDOUT に変更したい
ってんなら、
local $SIG{__WARN__} = sub { print STDOUT @_ } ;

が、586 の質問の仕方だと 587 の云う通り

======
前者の例
*STDERR = *STDOUT ;
print STDERR qq{hoge\n} ;

589 :デフォルトの名無しさん:2006/11/25(土) 11:23:20
フォルダ、ファイルのサイズ(使用容量)を返す関数ってありますか?


590 :デフォルトの名無しさん:2006/11/25(土) 12:39:08
>589
ファイルサイズなら stat か -s が使える。
フォルダはわからない。


ところで、配列の参照から配列長を知る方法を知りませんか?

$array_ref = \@hoge_array;
( $$#array_ref ?)

591 :デフォルトの名無しさん:2006/11/25(土) 13:41:15
@{$array_ref}

592 :デフォルトの名無しさん:2006/11/25(土) 14:35:20
$#array は配列長じゃなくて最後の添え字番号だと(ry

593 :デフォルトの名無しさん:2006/11/25(土) 21:52:20
$#$array_ref+1とか?

594 : ◆TWARamEjuA :2006/11/25(土) 22:03:07 ?BRZ(6677)
(´-`).。oO(だから>>591のをスカラーで評価すれば。。。scalar @{$array_ref})

595 :590:2006/11/25(土) 22:06:37
> 591-593

ご回答ありがとうございます。
ようやく見苦しいソースから開放されます。

596 :デフォルトの名無しさん:2006/11/27(月) 01:59:19
>>583
つまんないね、そういうの。

597 :デフォルトの名無しさん:2006/11/27(月) 02:10:46
色んなグラフを表示するサイトを作ることになったんですが、
GDの使い方がよくわかりません。

勉強するのに、詳しくて具体例の豊富な書籍かサイトがあったら
教えていただけないでしょうか?

できれば日本語だと助かりますが、英文サイトでも構いません。

598 :デフォルトの名無しさん:2006/11/27(月) 02:13:08
ちょっと古いネタだけど

 ttp://blog.livedoor.jp/dankogai/archives/50696852.html

> それとも、編集部は何かPerlに含むところでもあるのだろうか。
> 編集部の猛省を求める。

いったい何様のつもりなんだろう?


599 :デフォルトの名無しさん:2006/11/27(月) 02:26:01
>>598
編集部の人おつかれさまです^^

600 :デフォルトの名無しさん:2006/11/27(月) 02:32:21
>>598
> いったい何様のつもりなんだろう?

編集部は別に偉くないよ。

601 :デフォルトの名無しさん:2006/11/27(月) 02:35:42
>>598
100歩譲って君に考えを合わせたところで、
自分の場所で自分の意見を書くのは責められないだろ。

602 :デフォルトの名無しさん:2006/11/27(月) 02:39:27
別に個人が猛省を求めるって書くことは自由かと・・・

603 :デフォルトの名無しさん:2006/11/27(月) 02:42:42
ここで個人の陰口を書いてる方がどうかと思う。子供っぽい。
文句があるなら本人に直接言えばいいし、言えないなら見なかった事にしとけばいいのに。

604 :デフォルトの名無しさん:2006/11/27(月) 02:45:01
>>596
> つまんないね、そういうの。

そんな低レベルなところに面白さを求めるのはダラクですっ!!

志は高く! 下を見るな、上を見ろ!!

605 :デフォルトの名無しさん:2006/11/27(月) 02:50:53
ったく、日経は
インサイダーするし、
とばし記事や風説の流布で株価は操作するし、
インタビュー記事では印象操作するし、
あげくのはてに>>598のような2ちゃんを使って自分達を批判するものを貶める工作活動かよ。

モラルが欠け、自浄作用も期待できない以上、さっさと潰れちまえ糞マスゴミ社

606 :デフォルトの名無しさん:2006/11/27(月) 02:58:55
>>605
>>598はどうかと思うが、君は終わってる。

607 :デフォルトの名無しさん:2006/11/27(月) 04:52:37
>>606 日経の人、乙

608 :?????:2006/11/27(月) 05:07:22
?????????? ???????? ??????????????? ?????????? ???? ?????C ???????? Java ?? ?????? ?????


609 :デフォルトの名無しさん:2006/11/27(月) 10:55:48
Perlを名前くらいしか知らない友人に説明を求められて、
「バッチファイルの凄いヤツ」って言っちゃったんだけど、大丈夫かな?

(ちなみにPHPはテンプレートの凄いやつと言った記憶があるが)


610 :デフォルトの名無しさん:2006/11/27(月) 10:59:41
perlは終わってるだろう。
他の新しいスクリプト言語使ったら戻る気にならない。
古いスクリプトの修正くらいしか使わないよ。

611 :デフォルトの名無しさん:2006/11/27(月) 11:06:26
>>610
何使ってるんだ?
pyson?Ruby?

612 :デフォルトの名無しさん:2006/11/27(月) 11:09:37
その議論は他でやれ

613 :デフォルトの名無しさん:2006/11/27(月) 12:52:17
RubyもPerlも使うけど、直感で書きなぐりのスクリプト
書くのはPerlのほうがいいな。

Rubyで書くときはPerlで書くよりも時間をかけれるときか
あとでもう一回使うばあいか大規模な場合。

614 :デフォルトの名無しさん:2006/11/27(月) 17:33:43
Perlはそれ自体がすばらしいというよりCなどと併用しやすいのが嬉しいな。(XSはアレだが...)

リファレンス⇔Cのポインタの理解がすごく容易だし、文法もCをふまえて拡張してあるから、
理解しやすいだけでなくそれぞれの知識が実際のコーディングの妨げにならない。

615 :デフォルトの名無しさん:2006/11/27(月) 17:38:45
古い言語のメリットが、さらに古い言語と併用しやすいことって、こりゃまた後ろ向きだな


616 :デフォルトの名無しさん:2006/11/27(月) 17:48:04
perl以外でまともなスクリプト言語って何がある?

617 :デフォルトの名無しさん:2006/11/27(月) 18:48:43
奇形スクリプト言語Perlが隆盛にも困ったもんだが

618 :デフォルトの名無しさん:2006/11/27(月) 20:29:01
ソフトウェア業界では
古い=枯れていてバグが少ない(エイジングテスト通過済み)
なので、ほめ言葉ですよね^^

619 :デフォルトの名無しさん:2006/11/27(月) 21:54:14
言語なんてただの道具だ。
もし要件満たせなくなれば捨てるだけのこと。
執着など無用だ。

620 :デフォルトの名無しさん:2006/11/27(月) 22:06:55
日本語捨てられますか?
簡単に言語を捨てられるなら、その程度のレベルだったという事。

621 :デフォルトの名無しさん:2006/11/27(月) 22:16:30
周りに話す人がいなくなれば
捨てるしかないな

622 :デフォルトの名無しさん:2006/11/27(月) 22:19:52
しかしまあ、知ってる言語がPerlだけと言う人を見ると、ゾッとするね。

623 :デフォルトの名無しさん:2006/11/27(月) 22:37:34
perlの文法って、良し悪しはともかく面白いと思うので、
なくなったら寂しいな。


624 :デフォルトの名無しさん:2006/11/27(月) 22:58:14
おもしろ言語

625 :デフォルトの名無しさん:2006/11/27(月) 23:23:47
>>620
ああ、こういう言語憶えるのが目的みたいな人も
いるよね。 まぁ、それはそれでいんじゃない。

いい電動ノコ使いこなしてても、もっといい
チェーンソーが出れば俺は簡単に乗り換えるよ。
電動ノコ名人になりたんじゃなく木を切りたいのでね。
チュンチュン… ハッハッ…

626 :デフォルトの名無しさん:2006/11/27(月) 23:38:58
↑流行に踊らされる人間の図

627 :デフォルトの名無しさん:2006/11/27(月) 23:52:47
ここは「質問箱」だっての


↓↓何事もなかったかのように質問者登場↓↓

628 :デフォルトの名無しさん:2006/11/28(火) 00:10:13
質問です。

629 :デフォルトの名無しさん:2006/11/28(火) 00:10:17
質問です。Rubyは使いづらい言語なのにどうして信者は偉そうなんですか?
頭がおかしいからですか?

630 :デフォルトの名無しさん:2006/11/28(火) 00:22:29
偉そうな信者はどこでもいるもんだ

631 :デフォルトの名無しさん:2006/11/28(火) 10:39:31
Perlにも信者はいる
っつーかこの議論は他スレでやれっつの

632 :デフォルトの名無しさん:2006/11/28(火) 10:50:01
どこのスレでやってほしいのか言ってくれ

633 :デフォルトの名無しさん:2006/11/28(火) 11:23:33
>>632

ここなんかどうだ?
http://pc8.2ch.net/test/read.cgi/tech/1162273941/l30

634 :デフォルトの名無しさん:2006/11/28(火) 11:29:59
>>623
なくなったらまた作ればいいじゃない。


635 :デフォルトの名無しさん:2006/11/28(火) 13:17:13
>>630
いえ、その数がゼロではないことを疑問に思っているのではなく、
Rubyコミュニティがあまりにも「そんなのだらけ」なのは何故だろうというのが
訊きたかったことです。
(Rubyの話題のようでいて、Rubyスレで訊いても意味がないことなので、
彼らに噛み付かれることの多いPerlのスレで訊いてみました)

636 :デフォルトの名無しさん:2006/11/28(火) 13:44:23
>>635
邪魔

637 :デフォルトの名無しさん:2006/11/28(火) 13:54:44
Ruby 信者は Perl に噛みつくが Perl 信者は Ruby に噛みつかない。
このことから言えることは、 Perl は心の広いおおらかな人が使って
いる言語と言えよう。逆に言えば、Perl は心が広くおおらかでないと
使えない言語ということだ。こうあるべきだと理想ばかりを追求し、
それから外れたらすぐにキーっとなって怒るような人には耐えられ
ないということだ。

もしつき合うなら Perl を使っている人とつき合いたいものだ。


638 :デフォルトの名無しさん:2006/11/28(火) 14:16:27
perlを使ってる人は、負ける議論はやらないだけだ

639 :デフォルトの名無しさん:2006/11/28(火) 14:32:29
Ruby信者はあまりにも盲信がひどくて、
負ける議論ばかり始めるからな。

640 :デフォルトの名無しさん:2006/11/28(火) 17:18:28
Perlはへたうま言語って感じ。

641 :デフォルトの名無しさん:2006/11/28(火) 17:19:09
>>637
それPHP信者でもよくあるんだけどPerl使いはPHPやRubyも触っている事が多い
ので他の言語に噛みつかないと勝手に推測している。
おおらかというかじいちゃんみたいな印象がするかな。
2chで言語比較議論になった時のPerlerの交わしテクを見てるとウケる。

642 :デフォルトの名無しさん:2006/11/28(火) 17:25:38
Rubyコミュニティは、Perl4時代のPerlコミュニティを彷彿とさせる。

643 :デフォルトの名無しさん:2006/11/28(火) 18:58:41
質問です。
パケットキャプチャツール(tcpdump)からの出力を受け取って、
その出力結果をリアルタイムに、その場で加工することが行いたいです。

open(TCPDUMP, "tcpdump |");
while(1){
while(<TCPDUMP>){

#処理

}
}

現在は上記で処理しているのですが、どうしても処理が遅くなります。
なので、tcpdumpから入力があった際に処理を行う事にしたいのです。
初歩的質問で申し訳ないのですが、宜しく御願い致します。

644 :643:2006/11/28(火) 19:50:39
今の状態で納得いかない点ですが、入力、出力がリアルタイムに行われず、
バッファに溜まったかのような状態になります。
入力があったら即認識し、処理、出力をしたいです。

645 :デフォルトの名無しさん:2006/11/28(火) 19:59:42
>>644
っ[tcpdumpのマニュアル]

646 :643:2006/11/28(火) 20:07:45
パイプのバッファが原因なようなので、スレチになってしまう話題のようです。
すみません、有難う御座いました。

647 :デフォルトの名無しさん:2006/11/29(水) 17:06:36
>>641
うーん。PHP は最初は Perl で作った CGI だったのにな。
まあいいか。


648 :デフォルトの名無しさん:2006/11/30(木) 02:12:58
>>647
kwsk

というか、php,Perl で検索したら
WEBプログラミングは、PHP/Perl派と、Java派に二分されるとかいう
ブログを見つけてシマタヨ。
http://www.milkstand.net/fsgarage/archives/000803.html

Perl で簡単おきらくごくらくにスクリプト書いていた漏れは
Java 派にケーベツされる訳?! と思ってシマタヨ。

まあ、漏れの本業はWEBプログラミングじゃあなく、、
Perlスクリプトは本業を効率化する為の道具にすぎんので、
Java派にケーベツされようが何しようがいいんだが。

649 :デフォルトの名無しさん:2006/11/30(木) 07:27:19
誰かError.pmの独自例外クラスを作る方法を教えていただけませんか?
資料がなくて困っております。

650 :デフォルトの名無しさん:2006/11/30(木) 22:08:39
>>649
他人のコードを読めるなら、Sledgeで使ってるから(Sledge::Exception)読んでみたら?

651 :デフォルトの名無しさん:2006/11/30(木) 22:41:18
てか Error::Simple を use base してサブクラス作ればいいだけじゃん

652 :デフォルトの名無しさん:2006/11/30(木) 23:43:17
CPANで入れたモジュールを全部消すにはどうすれば良いでしょうか?
初期化でも構いません。

653 :デフォルトの名無しさん:2006/11/30(木) 23:51:43
o conf initで出来るみたいですね。事故解決しました。

654 :デフォルトの名無しさん:2006/12/01(金) 13:33:04
>>648
http://www.phpoo.net/index.php?p=history.html#history.php
PHPの歴史
PHP/FI

PHPはPHP/FIというソフトウェアを継承したものです。PHP/FI は1995年に
Rasmus Lerdorfによって作成されました。当初は オンラインに置いてある
彼のレジュメへのアクセスを解析するための Perlスクリプトの単純な組み
合わせでした。彼はこのスクリプト に 'Personal Home Page Tools' と
いう名前を付けました。 さらに多くの機能が要求されるようになると、
Rasmusはデータ ベースとの連携や、簡単な動的ウェブアプリケーションを
作成 できるようなものをC言語で書き直しました。


655 :デフォルトの名無しさん:2006/12/01(金) 15:22:09
>>648
>>まあ、漏れの本業はWEBプログラミングじゃあなく、、
>>Perlスクリプトは本業を効率化する為の道具にすぎんので、

同じく。
鯖缶なので保守用のスクリプトをメインで書いとるよ。
けど、世間ではブラウザで管理するのが流れなのでWeb用も書かないとダメになってきてる。


656 :デフォルトの名無しさん:2006/12/01(金) 18:04:29
職業に鯖缶とかスクリプト書いてる人ってどういうことをしているの?
俺のちんけな頭じゃHP、商品売買ぐらいしか思いつかないので
需要があると思わないのだが、この板を見ていると本業にしている
人がちらほら見受けられるので興味がある。

教えてちょ。

657 :デフォルトの名無しさん:2006/12/01(金) 19:18:46
需要あるところにビジネスの道あり

         〜武田信玄 風林火山より〜

658 :デフォルトの名無しさん:2006/12/01(金) 19:37:28
鯖缶ならアクセスログ解析、ユーザー管理
バックアップ、ドキュメント管理
とかとか色々考えつくけど。

659 :デフォルトの名無しさん:2006/12/02(土) 03:12:31
IDCで喉カラカラになりながら地べたに座って作業してる奴だろ

660 :デフォルトの名無しさん:2006/12/02(土) 14:53:41
ruby, sed, C++など他の言語を知っている人が
てっとり早くperlを学ぶために最初に読むといい
チュートリアルとか本はありますか?

661 :デフォルトの名無しさん:2006/12/02(土) 15:20:32
>>660
フリーで配付してる掲示板とかのソース。

662 :デフォルトの名無しさん:2006/12/02(土) 15:40:04
>660
perldoc

フリーで配布してるのもいいけど、KE○Tは駄目。
そんなの読む暇があったらCPAN漁ったほうが楽しいし役に立つよ。

663 :デフォルトの名無しさん:2006/12/02(土) 16:38:20
>>662を見て久しぶりに彼のサイト行ってみたが、今も盛況なんだねえ。
・・・でも置いてあるソースまで昔のままの出来なのな。
他の言語を知ってる人間は、恐らく言語のディテールにウェイトを置いて読むだろうから、
2種類のクオートがまったく意味不明な思想で使い分けられてる点とか、
そういうつまらない粗雑さに引っかかって、無用な足踏みをしちゃいそうな気がする。
確かに彼のソースは読むべきではない。

664 :デフォルトの名無しさん:2006/12/02(土) 16:40:06
>>660
UNIX/Linuxの知識があれば、最近出た"Minimal Perl"という本がお勧め。
題名通り、最低限の努力で、すでに知っている知識を活かしながら
perlを学習できる。

665 :デフォルトの名無しさん:2006/12/02(土) 16:51:48
>>660
> ruby, sed, C++など他の言語を知っている人が
> てっとり早くperlを学ぶために最初に読むといい
> チュートリアルとか本はありますか?

『PerlユーザーのためのRuby入門』……あ、逆か。


666 :660:2006/12/02(土) 20:32:38
いろいろありがとうございます。

>>Minimal Perl
洋書よむ気力はないです。

>>『PerlユーザーのためのRuby入門』……あ、逆か。
いい本だったら逆でも役にたつと思うんですが、amazonレビューの
評価が低いですね…

要所だけを押さえた覚え書きみたいのがあればよかったんですが、
とりあえずそこらのチュートリアルやソースをあさって読む
ことにします。

667 :デフォルトの名無しさん:2006/12/02(土) 21:16:56
>>660 殿

ミスティーネットはどうよ、
Cプログラマの漏れが見様見真似で Perl スクリプトを組み始めたときから愛用している
Perlサイトだ。
http://perl.misty.ne.jp/

関数リファレンスはなかなか秀逸だ
但し、モジュールの使いこなしやら ppm や CPAN モジュールは
ここからもう一歩踏み込まんといかんなあ。

668 :デフォルトの名無しさん:2006/12/02(土) 22:13:31
perldoc読むのが一番

669 : ◆TWARamEjuA :2006/12/02(土) 22:16:37
ぐだぐだ宣う前にperlstyleなり読んでみろよと叫びたい。
ようするにヘタレ君?

670 :デフォルトの名無しさん:2006/12/02(土) 23:50:57
ラクダ本から入ったなー。パラパラ読んだり、じっくり読んだり、調べ物したり。今でも役に立つ。

671 :デフォルトの名無しさん:2006/12/03(日) 01:16:04
古い人が陥りがちな思考の罠に、崖の高さが日々高くなっていることに
対する認識不足がある。

10年前、その崖の高さは3メートルだった。ジャンプすれば上によじ登ることが
できたのである。
しかし崖は日々高くなり続けた。早くから昇り始めた人は、ときどき崖が
すこし高くなっていることに気づくと、高くなった分30センチひょいと
登るというのを数多く重ね、崖の上やその上部に留まりつづけている。

だがふもとから見てみよう。崖の高さは今や20メートルに達している。

初心者がふもとから叫んでいる。
「どうやって登ったんですか〜!」

これに
「跳び上がったら上に手が届いたよ〜!」

と叫び返してはいけないのである。


672 :デフォルトの名無しさん:2006/12/03(日) 01:38:08
>>671

>>660の「知ってる」の解釈が
名前を知っているだけなのか、きっちり使いこなしているレベルの知っているのかで
扱いがかなり違うんだよね。

ぶっちゃけ後者なら、2ちゃんで聞くまでもなく自分でtarボールの付属ドキュメントを読んで
すぐにperldocを使って文法やコーディングスタイルよんだりCPANを覚えて
いろいろモジュールをDLして使い方覚えたり、ソースを呼んでコーディングテクニックを身につけたりしてるはず。


673 :デフォルトの名無しさん:2006/12/03(日) 02:17:45
>670
ラクダ本から入るのはちょっときつくないかな。ま、本格的にやろうと思ったらあれは必須の本だけど。
RubyだとかC++使いこなしてるレベルならいきなりいっても大丈夫か。
あとはPerlクックブックとPerl Best Practicesは必読だな。それだけ読めばあとはもうそれこそCPANのを
片っ端から読んで行くのが一番早いか。

674 :デフォルトの名無しさん:2006/12/03(日) 02:27:45
他の言語の経験があるならなおのこと、リャマをなぞってチュートるだけでも通り一遍はこなせるようになるでしょう。
もちろん長く深く使い倒したいならラクダが揃ってた方が圧倒的に便利なのは確か。他の物はそれからでもいいよん。

675 :デフォルトの名無しさん:2006/12/03(日) 02:31:21
>>671
俺自身はラクダ本の第2版を買って勉強しはじめたんだが、
今の初心者にいきなり「第3版上下とも買え」っていうのはちょっと酷な気がする

676 :デフォルトの名無しさん:2006/12/03(日) 03:57:42
ラクダ本第三版上下でPerlに入門したオレがきましたよっと。言うほどキツくなくて、結構すんなり読めました。
文体が独特で最初はとまどったけど、慣れると逆に明解でわかりやすいって思ったなぁ。
網羅的だから、一通り読むと、他の人のソースとかCPANモジュールとかが大体読めるようになってて驚いた。
あと、細かい所まで書いてあるから、細かい疑問の答えも大体載ってて、ありがたい。

でも、やっぱりプログラミング自体初めてっていう人にはキツいと思う。

677 :デフォルトの名無しさん:2006/12/03(日) 04:44:45
>でも、やっぱりプログラミング自体初めてっていう人にはキツいと思う。

質問者の>>660
>ruby, sed, C++など他の言語を知っている人が
>てっとり早くperlを学ぶために最初に読むといい
なので、大丈夫でしょ。>>672の前者のタイプだとダメかも知れんけど。
個人的にはperldocでいいじゃんと思うんだけど
>>666で英語読もうともしないヘタレと判明してるので、そうなるとラクダかな。


678 :デフォルトの名無しさん:2006/12/03(日) 08:24:04
>>671
壁は高くなってるかも知れんけど、道具はいっぱい増えてるから。

10年前には、2ちゃんねるなんか無かったし。

そもそも、実際の崖と違って落ちたって死にやしないんだから、
いろいろやってみればいいと思う。その上で、きちんと知りたきゃ
ラクダ本なり、マニュアルなりをあさればいいし。

どうしてもわからい所があれば Google なり2チャンを頼ればいい
と思うぞ。

679 :デフォルトの名無しさん:2006/12/03(日) 10:17:26
Readonlyモジュールって一般的ですか? つかってたら嫌がられる?
お願いします。

680 :デフォルトの名無しさん:2006/12/03(日) 12:09:41
>>678
>そもそも、実際の崖と違って落ちたって死にやしないんだから、
>いろいろやってみればいいと思う。

崖の比喩は、「落ちたら危ない」という意味ではなく、
「そこにたどり着くまでに困難である」という意味だと思うよ。

道具がいっぱい増えているには同意
Win32環境で、Unix環境とほぼ同じPerl開発・運用ができるようになるとは
10年前には思いもしなかったYO.

今の会社で運用している鯖はWindows2003Serverなんだが、
ActivePerl入れて、CGI使わせて貰っています。


681 :デフォルトの名無しさん:2006/12/03(日) 12:58:11
>679
使ってもいいんじゃない? PBPにも載ってるくらいだし、確か5.10.xだとコアに入るらしいし。

682 :デフォルトの名無しさん:2006/12/03(日) 13:50:41
>>680
> 崖の比喩は、「落ちたら危ない」という意味ではなく、
> 「そこにたどり着くまでに困難である」という意味だと思うよ。

道具やドキュメントやコミュニティが多くなったこと自体をも指すね。

> >そもそも、実際の崖と違って落ちたって死にやしないんだから、
> >いろいろやってみればいいと思う。

「いろいろ」の種類が多くなり過ぎたことでもある。




683 :デフォルトの名無しさん:2006/12/03(日) 14:47:17
崖が深い == 頂が高い # できる事が多くなってうれしい。

しかし頂に到るまでの崖のどの高さにおいても、誰もが遊ぶことができる。
少なくとも Perl ではそれが公式に認められているらしいぞ。

684 :デフォルトの名無しさん:2006/12/03(日) 14:56:14
> 少なくとも Perl ではそれが公式に認められているらしいぞ

よくわからんが、公式に認められるとうれしいのか?

685 :679:2006/12/03(日) 15:09:27
>>681 ありがとうございました。

686 :683:2006/12/03(日) 15:38:28
>>684
君のようなスーパーハカーには関係ない。
ぼくのような未熟者にとっては「ぼくは Perl について知らないことばかりだけれど、知っている範囲で遊んでもいいのだ」と思える点でうれしいかもしれない。

687 :デフォルトの名無しさん:2006/12/03(日) 16:43:50
>>686
そうだな、
C/C++ は、入門してから遊ぶことが出来までの道程が長いから、
そこで挫ける者も多かろう。

Perl はその道程が短いぶんいいよな。

688 :デフォルトの名無しさん:2006/12/04(月) 07:57:51
PBP!PBP!

689 :デフォルトの名無しさん:2006/12/04(月) 09:51:25
今、サーバー7台使っていろいろ試してます

690 :デフォルトの名無しさん:2006/12/04(月) 11:00:24
>>689
誰だよお前w

691 :デフォルトの名無しさん:2006/12/04(月) 16:02:48
Perl で正規表現にマッチしたとき、文字列のどの場所にマッチしたか知る方法はありますか。
if ($str =~ /foo/) {
# $strのどの場所にマッチしたか(index)知りたい
}

692 :デフォルトの名無しさん:2006/12/04(月) 17:17:08
>>691
if ( $str =~ /foo/ ){
print $-[0] . "\n" ;
}
後は @+ と pos 関数

693 :デフォルトの名無しさん:2006/12/05(火) 14:11:23
>>692
thanks

694 :デフォルトの名無しさん:2006/12/05(火) 16:18:06
require 5.8.1;
use strict;
use utf8;

open(OUT, '>:encoding(UTF-16LE)', 't:\tmp\16LE.txt') or die;
print OUT "\n";
close(OUT);

↑の処理で"16LE.txt"の内容が16進数で「0D,00,0A,00」になることを期待したのですが
実際には「0D,0A,00」でした。期待した結果を得るはどうしたらいいですか?


XPPro sp2
ActivePerl 5.8.8.817

よろしくお願いします。




695 :デフォルトの名無しさん:2006/12/05(火) 16:32:31
>>694
require 5.8.1;
use strict;
use utf8;

open(OUT, '>:encoding(UTF-16LE):crlf', '16LE.txt') or die;
print OUT "\n";
close(OUT);

手元のlinuxの5.8.8ではこれでいけた。



696 :デフォルトの名無しさん:2006/12/05(火) 17:20:44
>>695
ありがとうございます。早速コピペして実行したのですが、結果は変わりませんでしだ。
試しにFreeBSDの5.8.8でコピペして実行したら期待した結果が得られました。

WinのPerlをインストールし直してやってみます。


697 :デフォルトの名無しさん:2006/12/05(火) 17:34:24
>>696
あー、インストールしなおしても同じだよ、それ。
Cのライブラリ内で行われている改行の変換が原因だから。
(C/OSがテキストモードとバイナリモードを区別しない環境ではPerlIO内で処理される)

">:raw:encoding(utf-16le)" で開いて、最初から print "\r\n" するのが楽だと思う。

698 :デフォルトの名無しさん:2006/12/05(火) 18:12:09
>>697
言われた通りに書き直したら出来ました ! !
ありがとうです。助かりました。

699 :デフォルトの名無しさん:2006/12/05(火) 21:00:30
>>694,697
バグじゃないかという気がするので
バグレポしたほうがいいんじゃないか。


700 :デフォルトの名無しさん:2006/12/05(火) 21:06:08
>>699
思いっきり「仕様」だろーが。

701 :デフォルトの名無しさん:2006/12/05(火) 21:19:16
1.perl.exeがテキストモードでfopen
2.\nがperl.exeでUTF-16LEの0x0A,0x00に変換される
3.perl.exeが書き込む際にfputsか何かで0x0Aが0x0D,0x0Aに変換される
って認識でおk?

702 :デフォルトの名無しさん:2006/12/06(水) 16:22:48
バグだろう。

703 :デフォルトの名無しさん:2006/12/06(水) 16:46:56
ここによるとwindows環境でデフォルトで入っている:crlfレイヤの位置が悪いので、
いったん:rawで剥がしてからあとで付け加えるといいらしい。

ttp://blogs.msdn.com/brettsh/archive/2006/06/07/620986.aspx

俺はwindows環境のperl持ってないので試してないが。


704 :デフォルトの名無しさん:2006/12/06(水) 16:57:34
バグだね。

705 :デフォルトの名無しさん:2006/12/06(水) 17:25:47
バグばぐ言ってる奴
perldoc -f binmode
に明記されてる現象の何をもってバグと云うんだ?
(しかも BUGS 等に書いてある訳じゃない。注意書きとして書いてある)
仕様だよ。


706 :デフォルトの名無しさん:2006/12/06(水) 17:55:16
このスレはperldocも使えなかったり、英語だからと読もうともしない似非perlerがいっぱいだな。。。

707 :デフォルトの名無しさん:2006/12/06(水) 18:05:10
>>705
英語力無いオレには読みとれん。 Programing Perl 3rd Edition の binmode に
その旨、明記されてない。問題点間違えてない?

まあ、安易にバグだって云うのもなんだかなとは思うが。

708 :デフォルトの名無しさん:2006/12/06(水) 18:13:01
バグじゃないというならバッドノウハウだなw

709 :デフォルトの名無しさん:2006/12/06(水) 20:47:05
>>707
駱駝の 3rd は 5.6 ベースの内容で、5.8.x とはかなり違いがある。
5.8.x 使ってるなら perldoc なり >>2-3 に挙がってる訳なりで
確認した方がいいよ。

710 :デフォルトの名無しさん:2006/12/06(水) 21:16:31
5.8.8のperldoc -f binmode読んだがこの問題については
明示的には何も書かれてないように読めた。

705の言っている部分がどこだか示してもらえるとありがたい。


711 :デフォルトの名無しさん:2006/12/06(水) 21:30:49
ここじゃねーの?

The operating system, device drivers, C libraries, and Perl
run-time system all work together to let the programmer treat a
single character ("\n") as the line terminator, irrespective of
the external representation. On many operating systems, the
native text file representation matches the internal represen-
tation, but on some platforms the external representation of
"\n" is made up of more than one character.

712 :デフォルトの名無しさん:2006/12/06(水) 21:39:26
>>710
思いっきり書いてあるだろ。
それとも翻訳させるための釣りか?

The operating system, device drivers, C libraries, and Perl run-time system all work together to let
the programmer treat a single character ("\n") as the line terminator, irrespective of the external
representation. On many operating systems, the native text file representation matches the internal
representation, but on some platforms the external representation of "\n" is made up of more than
one character.

Mac OS, all variants of Unix, and Stream_LF files on VMS use a single character to end each line in
the external representation of text (even though that single character is CARRIAGE RETURN on Mac OS
and LINE FEED on Unix and most VMS files). In other systems like OS/2, DOS and the various flavors
of MS-Windows your program sees a "\n" as a simple "\cJ", but what’s stored in text files are the
two characters "\cM\cJ". That means that, if you don’t use binmode() on these systems, "\cM\cJ"
sequences on disk will be converted to "\n" on input, and any "\n" in your program will be converted
back to "\cM\cJ" on output. This is what you want for text files, but it can be disastrous for
binary files.

713 :デフォルトの名無しさん:2006/12/06(水) 22:13:19
そこは普通に改行文字の変換について書いてあるだけで、
encoding(...)と:crlfの順序で結果が違ってくるから:rawで
順序調整しないとおかしくなるってあたりの話じゃないだろ。


714 :デフォルトの名無しさん:2006/12/06(水) 22:31:32
英語読めないくせにperldocとか見栄はりさんが多いことがよくわかった。
つーか脊髄反射で物事を処理していると上達しないよ。

715 :デフォルトの名無しさん:2006/12/06(水) 23:14:09
>>713
当然だ
今は改行文字の変換についての仕様がperldocに載ってるかどうかの話だろ
:rawの順序云々は>>703が言及してるが、それがperldocに書いてあったとは一言も言っていない

716 :デフォルトの名無しさん:2006/12/06(水) 23:22:33
それをいうなら普通の改行文字の変換がバグだなんて誰も言ってないよ。
windows環境のperlでencodingをUTF16-LEにしたときに\nが0D,0A,00になって
変だっていう>>693が話の始まりなんだから。

とりあえずお前とは話がすれ違ってることはわかった。

717 :697:2006/12/06(水) 23:26:27
>>703
その手があったのか、気が付かなかった。
:encodingを先に指定してから:crlfを指定すれば良かったのか。
中途半端な事を書いてスマンかった >694氏

>>699
バグレポは出さなくても大丈夫だと思いたい。
既に
#36659: UTF-16 endianess switch after line break
http://rt.perl.org/rt3/Public/Bug/Display.html?id=36659

があるから。

718 :デフォルトの名無しさん:2006/12/07(木) 06:50:16
perlってバグが仕様なんだw
やっぱり俺はrubyで行こう。

719 :デフォルトの名無しさん:2006/12/07(木) 07:15:49
そうしておけ。
PHPとRubyはいまだにバッファオーバーフローのセキュリティホールで
バージョンアップを楽しめるぞ。

720 :デフォルトの名無しさん:2006/12/07(木) 10:10:44
もうencoding使うなよ…常識的に考えて…

721 :デフォルトの名無しさん:2006/12/07(木) 10:43:25
>>720
それはencodingプラグマのことで。最近話題のPerlIOレイヤのencodingとは
全く無関係ではないが別の話かと。


722 :デフォルトの名無しさん:2006/12/07(木) 10:55:17
単純変数のバイト数の上限を指定するような処理はないでしょうか?

$buf に外部メールサーバから情報をとってきて格納するプログラムを作成して
いるのですが、容量が大きくなりすぎると処理が重くなるので変数の
容量に上限をもうけたいと思っています。

723 :デフォルトの名無しさん:2006/12/07(木) 11:21:31
変数$aと$bのうち、値の大きい方を小さい方で割った結果を$cに代入するプログラムを作りなさい。
ただし、$aか$bのどちらかが0のときは$cに0を代入します。

という課題が出ているのですが、ただし以降がわかりません。
どのように入力すればよいのでしょうか?

724 :デフォルトの名無しさん:2006/12/07(木) 11:30:34
課題は自分でやれwww
っつーかまんまだろうが・・・

725 :デフォルトの名無しさん:2006/12/07(木) 11:33:30
>>723
$c = ($a == 0 or $b == 0) ? 0 : ($a > $b) ? $a / $b : $b / $a;

726 :デフォルトの名無しさん:2006/12/07(木) 11:41:08
>>722
tie使えば指定した長さ以上入れようとするとエラーになるスカラーとか作れるけど、
普通は格納するときにlengthをチェックするようにすりゃいいだけじゃねーの?


727 :デフォルトの名無しさん:2006/12/07(木) 12:24:22
>>721
似たようなもんだろ…常識的に考えて…

728 :デフォルトの名無しさん:2006/12/07(木) 13:23:38
>>725
ワロタ

729 :デフォルトの名無しさん:2006/12/07(木) 15:00:23
>>725
( ´,_ゝ`)プッ

730 :デフォルトの名無しさん:2006/12/07(木) 15:03:27
>>723
変数名に$aや$bは使うな、って先生に言ってやれ

731 :デフォルトの名無しさん:2006/12/07(木) 18:15:15
$number1 = $a;
$number2 = $b;
$answer = $c;

if (($number1 == 0) or ($number2 == 0)) {
$answer = 0;
} elsif ($number1 >= $number2) {
$answer = $number1 / $number2;
} elsif ($number2 > $number1) {
$answer = $number2 / $number1;
}

$c = $answer;


732 :デフォルトの名無しさん:2006/12/07(木) 18:38:04
いっそ
$c = 0+eval { pop(@{[sort $a,$b]}) / shift(@{[sort $a,$b]}) };

$c = 0+eval { length('a'x$a|'b'x$b) / length('a'x$a&'b'x$b) };
で。

733 :デフォルトの名無しさん:2006/12/07(木) 18:54:26
>>725って間違ってるんですか?

734 :デフォルトの名無しさん:2006/12/07(木) 18:57:13
>>733
間違ってないがわかり辛いから>>731の書き方のがいい

735 :733:2006/12/07(木) 19:01:47
>>734
すごくわかりやすいと思うんですが・・・
俺もこう書くねーフンフンと思ってたら笑われてて焦りました
if文で複数行で書くかどうかは好みですかね?

736 :デフォルトの名無しさん:2006/12/07(木) 19:06:44
>>735
そう書くなら関数でくるむのが正解
このパターンぐらいなら分かるけど ?が連続するのはちょっとな

737 :デフォルトの名無しさん:2006/12/07(木) 19:34:33
質問者が理解できないから、じゃない?<1行


738 :デフォルトの名無しさん:2006/12/07(木) 19:45:10
>>735
思いっきり普通だろ。「宿題の提出にはいじわる」ってんで笑っただけだ。
>>736
>関数でくるむのが正解
臨機応変に使うのが正解じゃねw

739 :デフォルトの名無しさん:2006/12/07(木) 19:47:43
>>736
?:三項演算子の読みやすさって整形次第で結構化けると思うんだ。どうよ?
$c = ($a == 0 or $b == 0) ? 0
                          : $a > $b ? $a / $b
                                    : $b / $a;

$c = $a == 0 ? 0:
     $b == 0 ? 0:
     $a > $b ? $a / $b
             : $b / $a;
# 等幅フォントのエディタにコピペしてみとくれ

740 :デフォルトの名無しさん:2006/12/07(木) 19:52:10
FYI で書くが PBP では三項演算子の連続はこういうインデントを推奨してた。
$c = ($a == 0 or $b == 0) ? 0
  : ($a > $b) ? $a / $b
: $b / $a
  ;
なにが条件で代入するものがなにか判りやすいからだと。

ちなみに「elsif を使うんじゃねえ」とも書いてあったw
これには同意しかねるが。

741 :740:2006/12/07(木) 19:53:55
かぶってしかもインデントくずれた
739氏のを採用してください orz...


742 :デフォルトの名無しさん:2006/12/07(木) 20:00:54
>>740
$c = ($a == 0 or $b == 0) ? 0
  : ($a > $b)      ? $a / $b
  :            $b / $a
  ;
ね。等幅エディタで。@Perl Best Practice

743 :デフォルトの名無しさん:2006/12/07(木) 20:02:11
初心者です
簡単な質問でスミマセン

ある配列に
AAA
BBB
CCC
CCC
DDD

と格納されているとします。
ダブってるCCCをひとつ消して
AAA
BBB
CCC
DDD

とするにはどうすればいいのでしょうか

744 :デフォルトの名無しさん:2006/12/07(木) 20:07:06
>>743
@hoge = qw( AAA BBB CCC CCC DDD ) ;
%seen ;
@uniq = grep { ! $seen{$_} ++ } @hoge ;


745 :デフォルトの名無しさん:2006/12/07(木) 20:11:12
答えをすぐに出しすぎだろ・・・
テンプレ>>3あたり全部読めば載ってるはず

746 :デフォルトの名無しさん:2006/12/07(木) 20:14:31
>>745
それいったらここんとこの質問全てが…
>>742
補足 THX

747 :デフォルトの名無しさん:2006/12/07(木) 20:18:20
つねに教育的指導を心がけないと、次第に質問者が堕落してゆく現象が
知られています。

748 :デフォルトの名無しさん:2006/12/07(木) 20:26:46
自治厨乙


749 :デフォルトの名無しさん:2006/12/07(木) 20:47:37
>>744って、天才??

750 :デフォルトの名無しさん:2006/12/07(木) 20:48:02
今日は3つぐらい続けて初心者的質問が出たから、一応ね。
答える側の住人も注意すべきかなと。
自治しなきゃ誰かが解決してくれるわけでもなし。

751 :デフォルトの名無しさん:2006/12/07(木) 21:07:23
>>750
質問者は同一人物だろ?
そのうち飽きるさ

752 :デフォルトの名無しさん:2006/12/07(木) 21:11:15
>>749
uniq するときの有名な手法の一つだよ。応用も効くので覚えておいて損はない。

下の例は拡張子を判断して各拡張子の一番若いものを grep する。
@list = qw( 00.jpg 10.png 05.png 01.jpg ) ;
%seen ;
@grepped = grep { $suf = (/\.(.*?)$/)[0] ; ! $seen{$suf} ++ } sort @list ;
print @grepped , "\n" ;
# まあ名前の長さが違えばもう一工夫必要になるけどね。


753 :デフォルトの名無しさん:2006/12/07(木) 21:36:13
>>747のような輪郭がぼやけてるけど確かに感じている物を端的に述べてるレスが
2ch見てるとたま〜にあってそれを読むとすごく気持ちいい。


754 :デフォルトの名無しさん:2006/12/07(木) 21:46:54
自画自賛乙

755 :デフォルトの名無しさん:2006/12/07(木) 22:34:39
>>750のような輪郭がぼやけてるけど確かに感じている物を端的に述べてるレスが
2ch見てるとたま〜にあってそれを読むとすごく気持ちいい。

756 :デフォルトの名無しさん:2006/12/07(木) 22:38:17
自画自賛乙

757 :デフォルトの名無しさん:2006/12/07(木) 22:38:48
質問者を資料のある方向に導くことを心がけましょう

758 :デフォルトの名無しさん:2006/12/07(木) 23:42:09
いやです。

759 :デフォルトの名無しさん:2006/12/08(金) 00:03:57
>>739,>>740
やっぱりあまり綺麗だとは思わないけどなぁ
ダミアン・コンウェイは尊敬しているが

760 :デフォルトの名無しさん:2006/12/08(金) 00:14:43
質問です
splitを使って2次元関数を作りたいのに、うまくいきません
たとえば、

@tnk = split(/,/,"a,b,c,d");
@unk[3] = split(/,/,"a,b,c,d");

tnk[0]に"a"、[1]に"b"が入っていくように、
これでunkの[3][0]に"a"、[2][1]に"b"・・・と入れたいのに、うまくいきません
どうすれば2次元配列が作れますか?

761 :760:2006/12/08(金) 00:15:54
下から2行目
[2][1]ではなく、[3][1]です

762 :デフォルトの名無しさん:2006/12/08(金) 00:32:12
>>760
$unk[3] = [ split(/,/, "a,b,c,d") ];

以下、詳しい説明が必要なら。

配列変数はあくまで「スカラ値」の集まりなので、
split が返す「スカラ値のリスト」を1つの要素として代入する事はできません。
Perl での2次元配列は、配列変数のリファレンスを利用します。
リファレンスはスカラ値の一種なので、配列の要素として利用できるからです。

配列変数のリファレンスを作成するには [ LIST ] という構文が便利です。
LIST が入った匿名の(名前を持たない)配列変数へのリファレンスが作成できます。上の例なら
@unnamed_array = split(/,/, "a,b,c,d");
$unk[3] = \@unnamed_array;
とほぼ同じ意味です。

ちなみに、配列の中の1要素を添え字で参照する場合、取り出される値はスカラ値なので
@unk[3] ではなく $unk[3] のように、スカラ値を表す「$」を使う必要があります。

763 :デフォルトの名無しさん:2006/12/08(金) 00:37:57
当方XPなんですが、ActivePerl 5.8.8.819をインストールしようとすると
インストールパッケージを開けませんでしたとでてインストールできませんでした
ActivePerl 5.6.1.638のほうはうまくいったんですが、最新版の方は
何か特別な制約があるのでしょうか

764 :デフォルトの名無しさん:2006/12/08(金) 00:40:24
↑すいません、インストーラの問題でした。
スレ汚し申し訳ないです。。。

765 :デフォルトの名無しさん:2006/12/08(金) 00:50:05
>>759
TMTOWTDI だから使わなきゃいいだけじゃねw
俺にとっては三項演算子は必須になってる


766 :デフォルトの名無しさん:2006/12/08(金) 00:50:26
質問です
sexを使って3次元の子供を作りたいのに、うまくいきません
たとえば、

$tnk->setSpirit("どどどどうていちゃうわ");
$mnk->setJob("風俗嬢");
sex($tnk, $mnk);

$manの$man{'osiri'}に$tinkが入っていくように、
$mnkに$tnk・・・と入れたいのに、うまくいきません
どうすれば3次元の子供が作れますか?

マジレスお願いします。

767 :デフォルトの名無しさん:2006/12/08(金) 02:05:30
>>766は想像以上に下劣ね

768 :デフォルトの名無しさん:2006/12/08(金) 02:34:30
>>766
標準出力がティッシュのままなので、selectで正しく指定し直し。
sex関数も基本的には、先入れ先出し(FIFO)処理に書き換えて下さい。

769 :デフォルトの名無しさん:2006/12/08(金) 03:32:17
ツマラン

770 :760:2006/12/08(金) 09:19:04
>>762
想定どおり動きました!
単なる知識不足だったようで、現に詳しい説明の部分が理解できません
そのあたりを勉強しなおしてきます
ありがとうございました

771 :デフォルトの名無しさん:2006/12/08(金) 16:07:27
URLの転送先を取得するにはどうしたらいいんでしょうか

#例
#
$url= http://www.youtube.com/v/2m0P-Q0joxU
#↓(リダイレクト先に変換)
$url= http://www.youtube.com/p.swf?video_id=2m0P-Q0joxU&eurl=&iurl=http%3A//sjc-static6.sjc.youtube.com/vi/2m0P-Q0joxU/2.jpg&t=OEgsToPDskKKNZHbTD7d-oE2My88f86P

772 :デフォルトの名無しさん:2006/12/08(金) 16:34:19
>>771
http://d.hatena.ne.jp/shag/20060920
のコードを読んでみれば分かるんじゃね?

773 :デフォルトの名無しさん:2006/12/09(土) 01:24:37
以下のプログラムはなぜ"NG"となるのでしょうか?
どうか教えてくださいm(_ _)m

Perl v5.8.8 built for i686-linux

#!/usr/local/bin/perl
$a='A¥[B¥]C';
if ( $a =~ /A¥[B¥]C/ ){
  print "OK¥n";
}else{
  print "NG¥n";
}

あと、任意の文字列を=~で比較しなくてはいけないとき、
"["のような都合が悪い文字列が入ってきた場合にそなえるのは
「quotemetaで処理」が適切なのでしょうか
quotemetaし忘れて=~で落ちるバグを修正しようとしたのですが、
上記のプログラムがなぜかNGになるので修正しきれないのです(; ;)

774 :デフォルトの名無しさん:2006/12/09(土) 02:14:57
$a = 'A¥[B¥]C';
if ($a =~ /A¥\[B¥\]C/ ){
print "OK¥n";
}
else {
print "NG¥n";
}

775 :デフォルトの名無しさん:2006/12/09(土) 04:52:25
>>773
(全角記号がもともとは半角であると仮定して)
正規表現では \[ は '[' という文字にマッチするので、 '\[' という二文字にはマッチしません。
'\[' にマッチするのは \\\[ です。

つまり 'A\[B\]C' にマッチする正規表現は /A\\\[B\\\]C/ です。

776 :773:2006/12/09(土) 07:59:13
>>774 >>775
言われて気づきましたorz (バグであせっていたのかも)
なんでもかんでもquotemetaすりゃいいってもんじゃないんですね・・・

どうもありがとうございましたm(_ _)m

777 :デフォルトの名無しさん:2006/12/09(土) 08:09:37
>>773
> 「quotemetaで処理」
えと、正規表現側の話だよね?まさかと思うけど変数側(ここで云う $a)じゃないよな?
この前提だと御前さんの提示したスクリプトに quotemeta の入る余地はないんだけど。
(quotemeta 使用例)
$str = 'a\[b\]c' ;
$quo = quotemeta $str ;
print $quo . "\n" ;
if ( $str =〜 /$quo/ ){ print "quote\n" ; }
if ( $str =〜 /$str/ ){ print "not quote\n" ; }
変数側の話しだとすると「すごおおおおく間抜けな事をやってる」とだけコメント
しとく。
(間抜けな例)
$quoquo = quotemeta $quo ;
if ( $quo =〜 /$quoquo/ ){ print "quotequote\n" ; }
それと 「quotemeta しわすれ」てのが理解できん。何せ提示された例の正規表現
は、直接文字列で作成されてて変数なんて見に行ってないから。

778 :773:2006/12/09(土) 13:44:02
>>777
一応マヌケじゃないほうの例です
簡単のために>>773のように書きました

機能追加を重ねていったスパゲッティなのでこのへんで

779 :デフォルトの名無しさん:2006/12/09(土) 21:30:22
>>771
↓のスレッドにレス付けておきました。

Perlコーディング初心者質問スレ Part 53
http://pc8.2ch.net/test/read.cgi/php/1164519503/


780 :デフォルトの名無しさん:2006/12/11(月) 22:10:46
age

781 :デフォルトの名無しさん:2006/12/12(火) 21:41:11
eucで書いたperlプログラムをwindowsで実行すると文字化けしてしまいます。
windowsのシェルはsjisしか表示できないらしいので、
nkf.exeを使って、perl a.pl | nkf -sとしたんですが、
リアルタイムで実行結果が表示されず、実行しているときの状況が分りません。
a.plに$|=1;と記述してもだめです。
どうすればいいでしょうか?

782 :デフォルトの名無しさん:2006/12/12(火) 22:29:49
かいけちゅしました。perl -Mencoding=euc-jp,STDOUT,shift-jis a.plと打てばできまちた

783 :デフォルトの名無しさん:2006/12/12(火) 22:51:42
急に過疎ったなあ

784 :デフォルトの名無しさん:2006/12/12(火) 23:13:35
>>275
File::Path


785 :デフォルトの名無しさん:2006/12/12(火) 23:15:38
ごめん、誤爆

786 :781:2006/12/13(水) 00:27:54
すいません。また問題が出てきました。
>perl -Mencoding=euc-jp,STDOUT,shift-jis a.pl
と実行すると、表示はsjisで出力されるのですが、
LWP使ってる部分↓
$ua=LWP::UserAgent->new();
$res=$ua->request($request);
$res->contentの中身が
500 Wide character in syswrite
になってしまいます。

何かいい方法教えてください。

787 :デフォルトの名無しさん:2006/12/13(水) 00:59:36
そういう用途なら-Mencoding使うより、

nkf -E -s -u

としてnkf側で解決したほうがいいんじゃないか。

ただしこの場合でもa.plのSTDOUTを$|=1にする必要はあるかも。

788 :デフォルトの名無しさん:2006/12/13(水) 01:08:27
>>787
やっとできました!!
まじでありがとうございました。

789 :デフォルトの名無しさん:2006/12/13(水) 16:31:33
配列の連結って可能ですか?
たとえば
a[]=("あ","い");#a[0]="あ";a[1]="い";

a[0]="あい";
にしたいのですが・・・
初心者ですみません;;

790 :デフォルトの名無しさん:2006/12/13(水) 16:49:54
文字列連結して入れなおすしかないかな

791 ::789:2006/12/13(水) 17:36:19
>>790
そうですか^^;
ありがとうございました

792 :デフォルトの名無しさん:2006/12/13(水) 20:11:07
Perl じゃなくて PHP に見えるのだけど、見間違いだろうか

793 :デフォルトの名無しさん:2006/12/13(水) 20:21:09
>>789
join すればおk

@a = ("あ", "い", "う");
$a[0] = join "", @a; # => "あいう"

794 :デフォルトの名無しさん:2006/12/13(水) 20:55:11
>>792
たぶん見間違い。俺には Perl でも PHP でもないものに見える。

795 :デフォルトの名無しさん:2006/12/13(水) 21:57:40
pherl知らないの?

796 :デフォルトの名無しさん:2006/12/13(水) 22:06:41
10からカウントダウンして0まで表示させるプログラムを作りたいのですが
このうち5のときは数字の5の変わりに「!」を表示させたいです。
どうすればよいのでしょうか?
多分forを使うと思うのですが、いまいちわかりません。


797 :デフォルトの名無しさん:2006/12/13(水) 22:21:35
テンプレサイトでif文を勉強してからfor文を勉強しましょう。
入門書の購入を進めます。


798 :797:2006/12/13(水) 22:29:33
自己解決しました


799 :デフォルトの名無しさん:2006/12/13(水) 23:10:12
ダメ元で質問させて下さい。
文字列の中で##から始まっている英数文字列があった場合
<font>タグで囲って文字を赤くしようとしていますが、この状態だと
ユーザーが任意にタグを挿入出来てしまうため置換処理を入れました。
ただ、そうしてしまうと<font>タグもむき出しになってしまい赤く表示することができません。
非常に分かりにくくてすみませんが、何かいい方法はないでしょうか?
---
$tmp = '<A> ##B <C>';

 $tmp =~ s/</</g;
 $tmp =~ s/>/>/g;

 $Str = '##[A-Za-z0-9*.?<>\+\#-.,;]+';
 $tmp =~ s/($Str)/<font color=FF0000>$1<\/font>/g;

print "$cmt";
---
↓現実
<A> <font color=FF0000>##B</font> <C>

↓理想(##赤は赤い)
<A> ##B <C>

800 :デフォルトの名無しさん:2006/12/13(水) 23:13:01
$cmt =~ s/</&lt;/g;
$cmt =~ s/>/&gt;/g;

3,4行目はこうです、失礼しました…

801 :デフォルトの名無しさん:2006/12/13(水) 23:23:48
$tmp と $cmt を統一して >>799,800 だけだと上手くいってるようだが。
他にも処理してるとかループさせてるとかじゃないのか?

802 :デフォルトの名無しさん:2006/12/13(水) 23:33:35
$cmt→&tmpの間違いです。度々申し訳ないですorz

803 : ◆TWARamEjuA :2006/12/13(水) 23:39:42 ?BRZ(6677)
もちつけぺったんぺったん♪

804 :デフォルトの名無しさん:2006/12/14(木) 00:00:07
>>799,>>800,>>802
貼り付けるソースで再現性があるか確認してから貼り付けろよ。
掲示板のリソースが無駄だよ。

805 :デフォルトの名無しさん:2006/12/14(木) 01:03:27
赤ではなく青でした。 何度も申し訳ないですorz

806 :デフォルトの名無しさん:2006/12/14(木) 21:52:51
配列変数で、
@a=(あ,い,う・・・こ)
@b=(100,200,300,・・・1000)と定義づけて
それをfor文であらわすとき
for($i=1 ; $i<=10 ; $i++){
print "$i $a[10] $b[10]\n";
}
でよいのでしょうか?

表示させたいのは
1 あ100
2 い200
3 う300
4 え400
5 お500
6 か600
7 き700
8 く800
9 け900
10 こ1000
です。

807 :デフォルトの名無しさん:2006/12/14(木) 22:02:32
>>806
試してから質問しましょう。
良いか悪いかが分かります。

808 :806:2006/12/14(木) 22:10:37
@mon=("あ","い","う","え","お","か","き","く","け","こ");
@mom=(100,200,300,400,500,600,700,800,900,1000);
for($i=1 ; $i<=10 ; $i++){
print "$i $mon[0] $mom[0]\n";
}

でやってみたのですが、
1 あ 100
2 あ 100
3 あ 100
4 あ 100
5 あ 100
6 あ 100
7 あ 100
8 あ 100
9 あ 100
10 あ 100
となってしまいます。
右側二列も数字をずらすためには、どうすればよいのでしょうか?

809 :デフォルトの名無しさん:2006/12/14(木) 22:16:35
$mon[$i - 1]

810 :806:2006/12/14(木) 22:19:49
>>809
出来ました!
でも、この-は何なのでしょうか?

811 :デフォルトの名無しさん:2006/12/14(木) 22:25:47
インデックス番号は0から始まる
知らないで配列扱うとは・・・

812 :デフォルトの名無しさん:2006/12/14(木) 22:51:01
そんな君には $[ = 1; がオススメ


813 :デフォルトの名無しさん:2006/12/14(木) 23:06:09
>812
そんな余計なこと教えるなよ

814 :デフォルトの名無しさん:2006/12/14(木) 23:30:23
>>808
こんなんでわかるか?

print "$mon[0]\n";
print "$mon[1]\n";
print "$mon[2]\n";
print "$mon[9]\n";


815 :デフォルトの名無しさん:2006/12/15(金) 09:39:41
Devel::Sizeでアレイやハッシュが使用するメモリのサイズとか確認できますが
Devel::Sizeモジュールをインストールせず、同様のことは可能でしょうか?
自由にモジュールインストールできない環境なので、何か方法あれば教えてください

816 :デフォルトの名無しさん:2006/12/15(金) 09:54:12
>>815
内部APIを使わないなら無理。B::*使えば出来るかも知れんが、無謀だな。

そもそも何故メモリサイズを知ることが必要?

817 :デフォルトの名無しさん:2006/12/15(金) 10:19:16
>>816
簡単に言うと仕事で頼まれたからw
私もあまり意味はないと思うんですが、動作が遅いプログラムがあってその調査の一環
プログラム内部で、階層構造のリファレンスハッシュで画面出力用にデータを編集しているところが
かなりメモリを食ってるみたいで、具体的にどれくらいか調べたいと思いました
psで確認するとプログラムの使用メモリが多いけど、遅い原因はDBアクセス等の効率が悪いだけだと思ってます

Devel::Sizeを使用しないと非常に難しいと言うことはわかりました
ありがとうございます

818 :デフォルトの名無しさん:2006/12/15(金) 10:22:55
>>817
プログラム速度の測定なら、メモリ消費量を調べるよりDevel::DprofやDevel::Profile(標準じゃないがPurePerlだから使うのは簡単)で調べた方がいいと思うが。

819 :デフォルトの名無しさん:2006/12/15(金) 10:40:46
>>817
スクリプトが原因でスラッシングしているなら遅くはなるだろうけど
スラッシングしていないなら、メモリ使用量と動作が遅いはあんまり関係ないでしょ。
#少ないには越したことないけど;p

psはtelnetかsshでログインして確認したのですか?
サーバ上でシェルが使えるならコンパイラ使えればroot権限なくても
モジュールをコンパイルして使えますよ。
Devel::DprofやDevel::ProfileでプロファイルをとるかBenchmark, Time::HiResを使って
ボトルネックを探すほうがいいと重いますよ。

820 :デフォルトの名無しさん:2006/12/15(金) 21:27:34
>>815
かかる手間を考えると趣味専用になるが、移植性を無視すれば可能。
・リファレンスを文字列評価すればスカラーヘッダ構造体のアドレスがわかる
・unpackのPは特定アドレスからメモリの中身を読み出す事ができる
からね。
これ(PurePerlによる変数dumper)を書く事でPerlの変数に対する理解はすすむので、
話のネタとしては面白いかもしれない。

821 :デフォルトの名無しさん:2006/12/16(土) 08:57:16
>>820
こりゃおもしろいなあ。何か他に使い途ないかな?

822 :デフォルトの名無しさん:2006/12/16(土) 09:46:46
C言語でいう__func__や__LINE__などのマクロはありませんでしょうか
デバッグログに使用したいと思っております。

823 :デフォルトの名無しさん:2006/12/16(土) 10:36:21
すみません、質問宜しいでしょうか
宛先が自分のIP以外のUDPパケットを受信したいのですが、どうすれば良いのでしょうか
もしモジュールを使用する場合は標準モジュールの範囲内でお願いします

824 :デフォルトの名無しさん:2006/12/16(土) 10:53:20
ソケットをrowモードでひらけばいいじゃん

825 :デフォルトの名無しさん:2006/12/16(土) 10:54:14
>>820
アドレス欲しいなら数値評価のほうがよくね?


826 :822:2006/12/16(土) 15:25:28
ググりました。以下のものはありましたね・・・

__LINE__
__FILE__
__PACKAGE__
__END__
__DATA__


__FUNC__は無い認識でよろしいでしょうかorz

827 :デフォルトの名無しさん:2006/12/16(土) 16:13:58
>>826
なければ書いたらいいじゃない。


828 :デフォルトの名無しさん:2006/12/16(土) 22:20:08
perlに触れて2日目です。。かない痛いミスしてるかもしれませんが、何方か教えてください。

Flashからcgiへ変数$nameを渡す実験をしているのですが、$nameを日本語にすると
すべて文字化けしてしまいます。手元にある入門書を参照したところ、jcode.plを使えばよいとあったので、

require 'cgi-lib.pl';
require 'jcode.pl';
&ReadParse(*name);
&jcode::convert(*name,'sjis');
print "$name";

としたのですが、まだ文字化けします。sjisにしてもeucにしても同じ結果です。
どうすればよいでしょうか。jcode.plが存在するディレクトリは確認しました。

829 :デフォルトの名無しさん:2006/12/16(土) 22:37:14
>>828

>>1 を読んで、WebProg板へどうぞ。
ちなみに cgi-lib.pl も jcode.pl も、もう古いです。入門書を変えましょう。

830 :820:2006/12/16(土) 22:39:08
>>825
何となく、数値評価だとdoubleとかintが面倒な気がして文字列から。
現行の5.8.8あたりならまだしも5.6とかになると、ちょっと迷わない?
(一応 5.6.0でも pack('I',$ref) だとdouble評価を経由しないけど)

831 :デフォルトの名無しさん:2006/12/17(日) 04:18:03
変数$iがオーバーフローしたかどうかってどうやって判断するんですか?

832 :デフォルトの名無しさん:2006/12/17(日) 17:21:31
perl -e "$i= 2; while ($i > 0) {$i **= 2; print $i, qq{\n};last if $i eq '1.#INF'}"

833 :デフォルトの名無しさん:2006/12/18(月) 00:49:22
>>826
caller()

834 :デフォルトの名無しさん:2006/12/18(月) 02:42:35
perl -e '$_="000aaa111aaa222";/(\d{3})/;print "$1\n"'
これで表示を
222
とするにはどうすればいいでしょうか?


835 :デフォルトの名無しさん:2006/12/18(月) 02:59:58
>>834
ちゃんと基準を日本語で言ってくれないと意味違うの答えが複数ある。
文字列の一番最後なのか三番目なのか。$1に入れないといけないのか取り出せればいいのか。

とりあえずそのデータに対して動けばいいなら/(\d{3})$/とでもしとけ

836 :デフォルトの名無しさん:2006/12/18(月) 03:25:33
>>835
最後のものにマッチさせて、それを取り出したいってことです。


837 :デフォルトの名無しさん:2006/12/18(月) 03:27:13
perl -e '$_="000aaa111aaa222";@nums=/(\d{3})/g;print pop @nums'
こういう動作を一度にやりたいです。

838 :デフォルトの名無しさん:2006/12/18(月) 03:50:58
perl -e '$_="000aaa111aaa222";/.*(\d{3})/;print "$1\n"'

839 :デフォルトの名無しさん:2006/12/18(月) 08:19:06
>>837
perl -le 'print + ( split /aaa/, "000aaa111aaa222")[0] '
perl -le 'print + ( "000aaa111aaa222" =~ /(\d{3})/ )'
perl -le 'print + ( unpack "A3", "000aaa111aaa222" ) '
perl -le 'print + ( substr "000aaa111aaa222" , 0, 3 )'

840 :デフォルトの名無しさん:2006/12/18(月) 09:37:48
>>839
つ perldoc -f pop

841 :デフォルトの名無しさん:2006/12/18(月) 11:14:25
リストファイルからの検索方法に付いて

例えば変換対象の内容をリストファイルと照らし合わせ
リストファイルの内容と一致した場合にファイルへ出力るすには
どうしたら良いでしょうか?

例えばリストファイルが
aaa
bbb
ccc
として、変換対象のファイルが
aaa test1
abc test2
bbb test3
だった場合は

aaa test1とbbb test3の抽出をしたいです。

openや関数を使ってみたけどうまくいかないので誰か教えてください。

842 :デフォルトの名無しさん:2006/12/18(月) 11:34:56
リストを存在確認用の連想配列に入れて
対象を1行ずつsplitして
0番目が連想配列に存在したら吐き出す

843 :デフォルトの名無しさん:2006/12/18(月) 12:02:34
素で shift と間違えたorz...
>>837 訂正だ。
perl -le 'print + ( split /aaa/, "000aaa111aaa222")[-1] '
perl -le 'print + ( "000aaa111aaa222" =~ /.*(\d{3})$/ )'
perl -le 'print + ( unpack "A3" x 5, "000aaa111aaa222" )[-1] '
perl -le 'print + ( unpack "@*X3A3", "000aaa111aaa222" ) '
perl -le 'print + ( substr "000aaa111aaa222" , -3 )'


844 :デフォルトの名無しさん:2006/12/18(月) 12:19:13
>>843 みたいに + を誤爆回避の為に ( ) に付けるとき、 + と ( ) の間を空けられると、
func + (123) で func の返り値と123を加算してるのか、それとも func を 123 で呼び出してるのか
一瞬迷うのは僕だけですか><

845 :デフォルトの名無しさん:2006/12/18(月) 13:51:07
参考書を買って、参考書通りのに書いたのですが19行目でエラーが・・・
HTMLファイルからフォームで送られたデータを表示させるCGIです

require './cgi-lib.pl';
&ReadParse;

print <<'EOD1';
Content-type:text/html

<html>〜省略〜<table border=1>
EOD1

print "<tr><td>会社/自宅</td><td>$in{'addr'}</td></tr>\n";
〜FORMからのデータ表示繰り返し〜
print "<tr><td>メール配信</td><td>$in{'mailreq'}</td></tr>\n";

print <<'EOD2'; ←19行目。ここでエラーが出てる
</table><form action="register.cgi"><input type=submit value="登 録"></form></center></body></html>
EOD2

二回目の「print <<」を止めてprint文にすると上手くいくのですが、「print <<」が二回使えないという記述がないですし
参考書が間違ってるということにもなります。 すいませんが何が駄目なのか教えて頂けないでしょうか


846 :デフォルトの名無しさん:2006/12/18(月) 13:53:41
>>845
とりあえずエラー文を見せるんだ

847 :デフォルトの名無しさん:2006/12/18(月) 14:01:57
>>846
「絶対できる!自宅PCでCGIの実行環境を構築」というHPを参考に自分のPCでCGIを試せる様にしてます
でコマンドプロンプトで実行してみると下記のエラー文がでます。翻訳サイトで見ても意味が分りませんでした

D:\cgi>perl entry.cgi
Can't find string terminator "EOD2" anywhere before EOF at entry.cgi line 19.

848 :デフォルトの名無しさん:2006/12/18(月) 14:04:31
ヒアドキュメントの識別子の後ろには改行必須

849 :デフォルトの名無しさん:2006/12/18(月) 14:10:27
すいません。文を短くするために書き込みの際に改行を少しいじりました
実際は全部に改行を入れています。問題の部分を正確にせずすいませんでした

print <<'EOD2';
</table>
<form action="register.cgi">
<input type=submit value="登 録">
</form>
</center>
</body>
</html>
EOD2

850 :デフォルトの名無しさん:2006/12/18(月) 14:17:35
>>848
あ、わかりました。識別子のことをよく理解してなかったみたいです
EOD2の後に改行を入れろ ということですね
ありがとうございます

851 :デフォルトの名無しさん:2006/12/18(月) 16:51:46
正規表現で使った変数$1を削除することは出来ますか?
undef $1;としてみたんですが動きません……

852 :デフォルトの名無しさん:2006/12/18(月) 16:57:08
削除する理由は?

853 :デフォルトの名無しさん:2006/12/18(月) 17:00:25
できるかできないかを答えてくださると嬉しいです。
できれば質問に質問を返すのは控えてください。

854 :デフォルトの名無しさん:2006/12/18(月) 17:04:09
なにこれ

855 :デフォルトの名無しさん:2006/12/18(月) 17:06:05
>>853
おまえには出来ない。
終了。

856 :デフォルトの名無しさん:2006/12/18(月) 17:11:46
たまにいるんだよな、こういうの・・・
どんな脳みそしてんだかさっぱりわかんねw

857 :デフォルトの名無しさん:2006/12/18(月) 17:16:41
>>855
人の属性について訊いているのではなく、Perlのできる・できないを訊いているのです。

もしかして、回答する知識がないのにしゃしゃり出ているのですか?

858 :デフォルトの名無しさん:2006/12/18(月) 17:19:32
>>856
同意ですね。
質問に質問を返す意味がさっぱりわかりません。
そして、その当然の「おかしさ」を指摘されてヒスを起こすのも更にわかりませんよね。
(回答者は理不尽に振る舞ってもいい、その理不尽を質問者は指摘せず享受せよ、
とでも勘違いしているのかもしれませんね。
でも回答者ですらないのですから、その発想は二重にナンセンスというべきでしょう)

859 :デフォルトの名無しさん:2006/12/18(月) 17:24:27
>>853>>857>>858
頭悪すぎるみたいだから説明してやる
>>856はおまえに言ってんだよ
質問する=教えを請う
質問者が理不尽なのに答える義理は無い
しね                                                    でおk?

860 :デフォルトの名無しさん:2006/12/18(月) 17:31:07
>>859
> >>856はおまえに言ってんだよ
でしょうねえ。
(それがわかっているから、色々と言葉を乗っけて
「それに該当するのはあっちだよ」と教えてあげているわけです)。

> 質問者が理不尽なのに
まったく理不尽ではないですね。どう理不尽だと思い込んでいるのでしょうか?
質問に質問を返してきた人間に「質問に質問を返されては困る」旨を伝えたことですか?
でも、質問に質問を返してきた人間は「回答者」ではないですから、
「質問者として回答者にどういう態度をとるべきか」というテーマで仮にあなたが
粘着したいのだとしても、>>852>>853の関係にはまったく当てはまっていません。
なぜならこの2つのレスは、質問者と回答者の関係ではないからです。

861 :デフォルトの名無しさん:2006/12/18(月) 17:38:11
イタイ人が出てきちゃった。スルーで。

862 :デフォルトの名無しさん:2006/12/18(月) 17:40:25
そうですね、イタイ人はスルーするのが良いと思います。
今回はちょっと時間があったので、どこがイタイのか丁寧に教えてあげましたが、
こんなことをする義理は無いですからねえ。

863 :デフォルトの名無しさん:2006/12/18(月) 17:42:12
ここには質問者も回答者もいません。みんな平等です。
さようなら。

864 :デフォルトの名無しさん:2006/12/18(月) 17:42:46
なにしに来たのかわからんなぁ。

最初に答えた人も、$1を削除する以外の方法を提案するためだろうし
機能についてききたいだけならperldocで十分だし。


865 :デフォルトの名無しさん:2006/12/18(月) 17:43:40
>>859さん、ここではみんな平等だそうですよ。
質問者の態度ばかり注文つけるのはおかしいようです。次から気をつけて下さい。

866 :デフォルトの名無しさん:2006/12/18(月) 17:49:44
>>864
一連の「回答者でもないのに質問者に尊大な態度を取る人」がそんな感じですね。
回答するだけなら「できる・できない」で十分なのに、
その何倍もの文章を何のために書きに来たのかが「わからんなぁ」です。

答を知らない人=回答者になりようもない人、が、あたかも回答者候補であるかのように
装って「ただ尊大な態度を取りにきた」なら納得ですが。

867 :デフォルトの名無しさん:2006/12/18(月) 17:53:08
正解はperlvar読め。

$<digits>
Contains the subpattern from the corresponding set of capturing
parentheses from the last pattern match, not counting patterns
matched in nested blocks that have been exited already.
(Mnemonic: like \digits.) These variables are all read-only
and dynamically scoped to the current BLOCK.

読み取り専用なので値は(パターンマッチの副作用以外では)勝手に変えられない。
当然undefで未定義値を設定することもできない。

無理にやろうとすると

Can't modify constant item in scalar assignment at ほげほげ

というエラーになるはずなので、エラーメッセージをperldiagで調べてもよい。


868 :デフォルトの名無しさん:2006/12/18(月) 17:54:46
>>867
どうもありがとうございます。
こんなに丁寧に教えて下さって恐縮です。
これを足場に、他にも頑張って色々調べてみますね。

869 :デフォルトの名無しさん:2006/12/18(月) 17:57:16
いるんだよなぁ。はっきりレス番指して言われないと自分だと認めない人が。

870 :デフォルトの名無しさん:2006/12/18(月) 17:58:16
>>865
全くおかしくない
礼儀のないってない奴に答える義務はない
ここに居る人間は回答者ではなく、回答者になる可能性のある人たち
あるいは質問者になる可能性のある人たち
>できれば質問に質問を返すのは控えてください。
などという一文は回答してくれるかもしれない人に対して横柄に過ぎる
平等ではない
建前であっても立場をわきまえろ

>>867
答えるべきじゃないだろ・・・常識的に考えて・・・

871 :デフォルトの名無しさん:2006/12/18(月) 18:07:02
>>869
レス番の有無はあまり関係ないと思いますよ。
「誰にともなく言っているかのような」気持ちの悪い書き方を選んでいるレスには、
今回のように「ああ、あの人はそうですよね」という書き方で「本当にそれが当てはまる人」
のことに触れる――つまり「気持ち悪さが当人に跳ね返る」因果応報を狙うわけですが
(レス番を書かない人は往々にして、こちらが「対象をきっちりわかってあげる」と
「なんだ、自覚あるんだw」とか「被害妄想乙」という風に、スレをベトベトさせる方向に
頑張り出すので、スレのためにも「お前に言ってるんだよ」と言わせるよう「焙り出す」必要が
あるわけです)
もしレス番を指定してストレートに何かを言ってきたとしても、同じ内容を
「いいえ、それは○○のほうですね」というフォーマットで返すだけのことなわけですから、
認めるとか認めないとか、そういうのにはまるで関わってこないのではないでしょうか。

872 :デフォルトの名無しさん:2006/12/18(月) 18:09:52
一応の回答は得られて満足しているならそれでもいいのだが、
できないということを知っただけではやりたかったことを
実現する助けにはならない。852の言うことに耳を貸して
こういうことがやりたいんだけどというのを説明していれば
より的確な助言が得られたかもしれないんだけどね。


873 :デフォルトの名無しさん:2006/12/18(月) 18:10:36
いるよね、自分がキモイって気づかないキモイ人・・・

874 :デフォルトの名無しさん:2006/12/18(月) 18:10:49
>>870
> 回答者になる可能性のある人たち
すべてが終わってから「可能性があったのだ」と言い張るのは実に便利だから
そのやり方に飛びつく気持ちはわかりますが、
「質問に質問を返す人」や、「質問に質問を返すのはいかがか」という意思表示を
自分が侮辱されたように思ってしまう「自分を質問に質問を返す人の同類に位置づけていて」
且つ「正論を言われるとムカついちゃう、ちょっと変な人」に、その可能性があるとは
思えませんね。そもそもちっとも横柄ではありませんし。

875 :デフォルトの名無しさん:2006/12/18(月) 18:12:00
>>873
そういう人って困りますよね。

876 :デフォルトの名無しさん:2006/12/18(月) 18:19:32
粘着しちゃったよ。だからスルーしろと

877 :デフォルトの名無しさん:2006/12/18(月) 18:24:28
ここでレスしないと負けた気になるのが悔しいが
常識のある一社会人としてはこれ以上荒しにつきあうわけにもいかない
続きはVIPで。

878 :VIPPER:2006/12/18(月) 18:31:14
>>質問者
質問に質問で返されてブチ切れる理由が分かりません。
>>864,872のレスにもあるように、それは解決への良い手段だと思いますよ。


879 :デフォルトの名無しさん:2006/12/18(月) 18:38:41
自分の質問への回答だけが書かれるわけじゃないんだから、
自分の質問への回答だけが欲しいんなら他のはスルーしろよ。

880 :デフォルトの名無しさん:2006/12/18(月) 18:40:12
もうこの件は飽きた。新しい質問マダー?


881 :デフォルトの名無しさん:2006/12/18(月) 19:00:05
もまえらどうでもいいことでヒートアップしすぎもちつけ!
スレの主旨と違う議論は他でやるなりスルーしろ。

882 :デフォルトの名無しさん:2006/12/18(月) 19:30:07
>>878
誰もブチ切れちゃいないと思うぞ

883 :デフォルトの名無しさん:2006/12/18(月) 20:12:37
質問文に対し質問文で答えるとテスト0点なの知ってたか?マヌケ

ってのを延々と慇懃無礼に続けてたわけね。
単純に興味があったから何でそんなことするのと聞いただけだろうに。

884 :デフォルトの名無しさん:2006/12/18(月) 20:17:53
興味じゃなくてアドバイスの1歩目じゃね?

885 :デフォルトの名無しさん:2006/12/18(月) 20:52:53
バカ相手すんのはいい加減疲れるね
質問の意味がわかれば、モアベターなアドバイスも出来るだろう?
まあ質問する側として礼儀もわきまえないような他力本願のカスに教えることなんぞない

886 :デフォルトの名無しさん:2006/12/18(月) 21:08:47
換気換気

>>834を見て思ったのだけれど、
マッチ対象がもっと複雑なパターンだった場合は良い方法ある?

例えば
HOGE1a2bFUGA3c4d5!PIYO
こんな文字列があったときに、一番最後の
(?:[[:digit:]][[:alpha:]])+
な部分(上の文字列では3c4d)を取り出したいと言う場合とか。
.*で食わせるだけだと3cが引っかからなくなるし、後の部分を
[^[:digit:]]*$
のようにそれ以外の文字に限定することもできない気がする。

/gでマッチしてから最後を取り出すしかないかな

887 :デフォルトの名無しさん:2006/12/18(月) 21:39:02
>>886
こんなのはいかが?
/((?:[0-9][a-zA-Z])+)(?!.*[0-9][a-zA-Z])/

888 :デフォルトの名無しさん:2006/12/18(月) 22:15:03
>>887
おお、なるほど
否定先読みでそれ以降にそのパターンを含んでいなければ、とするのね。
これなら確かに大抵のパターンは/($regex)(?!.*$regex)/でできますね。
実際に書くときに使うかどうかは別問題だけれど勉強になりました。d

889 :822:2006/12/19(火) 01:25:09
#規制くらってました・・・

>>833
おお!こんなものがあったのですか!ありがとうございます

>>827
>なければ書いたらいいじゃない。
呼び元のサブルーチン名or現在のサブルーチン名を
取得する方法ってあるのでしょうか
もしありましたら教えてくださいm(_ _)m

890 :デフォルトの名無しさん:2006/12/19(火) 01:42:12
>>889
> 呼び元のサブルーチン名or現在のサブルーチン名を
> 取得する方法ってあるのでしょうか
(゚д゚)

だからcallerだって
sub __func__() { return +(caller(1))[3] }

891 :822:2006/12/19(火) 02:26:24
callerに引数を与えると、与えないとき以上の情報が得られるのですね
教えてくださいましてありがとうございました

自分乙 o...rz

892 :デフォルトの名無しさん:2006/12/19(火) 02:55:51
perlで条件判断でnorやnandを使う時は
norの時は!( $boolean1 || $boolean2 )、
nandの時は!( $boolean1 && $boolean2 )と書かないといけないのでしょうか。

893 :デフォルトの名無しさん:2006/12/19(火) 03:07:35
mainパッケージにあるグローバル変数を
修飾なしで他のファイルで使う方法はありませんか?

#コード
ファイル1 ourtest.pl

#start
use strict;
use b1;
package a;
our $x;
$x = 10;
#package b;
#print $x, "\n"; # パッケージaの$x
#同一ファイル内なら表示可能
b1::printit();
#end

ファイル2 b1.pm #実行時エラー
#start
package b1;
use strict;

sub printit {
print $x, "\n"; # パッケージaの$x
# print $main::x , "\n";なら表示可能

}
1;
#end


894 :デフォルトの名無しさん:2006/12/19(火) 03:10:50
すいません、間違えました。
メインパッケージの変数を他ファイルで使いたいのです
#コード
ファイル1 ourtest.pl

#start
use strict;
use b1;
our $x;
$x = 10;
#package b;
#print $x, "\n"; # パッケージmainの$x
#同一ファイル内なら表示可能
b1::printit();
#end

ファイル2 b1.pm #実行時エラー
#start
package b1;
use strict;

sub printit {
print $x, "\n"; #mainパッケージの$xを表示したい
# print $main::x , "\n";なら表示可能

}
1;
#end



895 :デフォルトの名無しさん:2006/12/19(火) 03:27:17
>>892
ド・モルガンの法則って知ってる?

!( $boolean1 || $boolean2 )は( !$boolean1 && !$boolean2 )と等価
!( $boolean1 && $boolean2 )は( !$boolean1 || !$boolean2 )と等価

まあ、「NOR演算子」や「NAND演算子」は用意されてない。
if文に関しての話ならばunlessを使うこともできる。
unless ( $boolean1 || $boolean2 )
unless ( $boolean1 && $boolean2 )

>>893-894
望む効果範囲はどこまでなの?
真のグローバル変数(=mainに細工をすると全てのパッケージから見える)にするのか
特定のモジュール(のour変数。以下同)とmainの変数を共有したいのか
特定のモジュールの特定の変数のみを共有したいのか

それだけ聞いた限りでは凄く変なことをしようとしているように見えるので、
もう一歩引いて何を目的としてそういうことをしようとしてるのか
説明したほうが良い答えが返ってくるかもしれないよ

896 :893:2006/12/19(火) 03:38:55
>真のグローバル変数(=mainに細工をすると全てのパッケージから見える)にするのか
まさにこれです。
mainパッケージの変数を各種モジュールから自由に読み書きしたいのです。
>それだけ聞いた限りでは凄く変なことをしようとしているように見えるので、
>もう一歩引いて何を目的としてそういうことをしようとしてるのか
>説明したほうが良い答えが返ってくるかもしれないよ
元々一つの巨大なファイルのプログラムを分割したいと考えています。
module内からmainパッケージの変数にアクセスするときはmain::として書きたいのですが
元々のファイルが膨大な量なので、全てを変更する事は避けたいです。

897 :893:2006/12/19(火) 03:43:44
シンボルテーブルをモジュールごとにインポートすれば
mainパッケージの変数を表示できるようになったのですが
簡単な方法が知りたいです。

#ファイル1
use strict;
use b1;

our $x = 10;
b1::printit();

#ファイル2
package b1;
use strict;

*x = *::x;
our $x;
sub printit {
print $x, "\n";
}
1;

898 :デフォルトの名無しさん:2006/12/19(火) 06:45:37
>>896
。oO(それモジュールにする意味あるのかな…) まあそれは置いておいて

とりあえず、Perlには元来グローバル変数は存在しない。
一箇所に仕掛けをしただけでグローバル変数を作るのは、
Perlはdirty hackが色々できる言語だから不可能とまでは言わないが、
かなり邪道な方法になると思う。
擬似グローバル変数を持つ専用のモジュールを作って、
必要な全てのモジュールからimportするってところでどうよ。
## GlobalVariables.pm
package GlobalVariables;
use base Exporter;
our @EXPORT = qw($x);
1;

## main.pl
use GlobalVariables;
use b1;
$x = 10;
b1::printit();

## b1.pm
package b1;
use GlobalVariables;
sub printit { print $x, "\n"; }
1;

こんなモジュールもあった。
http://search.cpan.org/~polettix/vars-global-v0.0.1/lib/vars/global.pm

899 :デフォルトの名無しさん:2006/12/19(火) 10:49:59
デバイスファイルなど、読み書きするためのオープン方法がよくわからないです。

900 :デフォルトの名無しさん:2006/12/19(火) 11:14:40
で?っていう

901 :デフォルトの名無しさん:2006/12/19(火) 11:15:09
E*trade証券のポートフォリオにperlで証券番号を登録するスクリプトを作りました。
しかし、該当ページの tmp_web_sec_code に 証券コードを代入し、一件づつしか
登録できない。(どうやっていいのか良くわからない)

このページは、画面を見る限りでは、
10件づつ登録できるはずなんだけど、
どうしたらよいのかな?

全銘柄の約4000件登録するのに2時間30分かかりました。
並列処理にして、半分以下の時間に短縮できたけど、効率化できそうなので。。。

perlで使用しているモジュール
use Crypt::SSLeay;
use LWP::UserAgent;
use WWW::Mechanize;

以下の部分を効率化できる?
$class->submit_form(
form_name=> 'FORM',
fields=>{
'tmp_web_sec_code' => $stock_number,
},
button=> 'ACT_insertPfList',
);

902 :デフォルトの名無しさん:2006/12/19(火) 11:31:55
>>901
>>1

903 :デフォルトの名無しさん:2006/12/19(火) 11:42:27
>>901
それはその何とか証券側のインタフェース仕様がわからないという話なので、こっち側の
プログラムを何で書いたかにはよらない話だからスレ違い。


904 :899:2006/12/19(火) 11:42:35
>>900
open( FH, "+</dev/ttyS0" ); を使え、 とか
そういう回答を期待してんだよボケ。市ね。

905 :デフォルトの名無しさん:2006/12/19(火) 11:58:41
またか・・・
学生は冬休みか。

906 :デフォルトの名無しさん:2006/12/19(火) 12:43:00
>>895
どうも。
演算子はないんすね。
そっちの法則の方も学校でやったような気はするんですが身についてなかったです。
ありがとうございました。

907 :デフォルトの名無しさん:2006/12/19(火) 14:36:18
今の時期に休みなのは、あったとしてもせいぜい北海道の小中学生くらいじゃないかしら?

908 :デフォルトの名無しさん:2006/12/19(火) 17:24:27
MIME::Parserを使って、メールの本文と添付ファイルを取得するプログラムをPERLで作っているのですが、
ソフトバンクの3D携帯からのメールが来た時、

$MTBody = unmime( $$mail->parts(0)->bodyhandle->as_string )

の所で、

Can't call method "as_string" on an undefined value at 〜

なエラーが出ます。解決方法を教えてください。宜しくお願いします。

909 :デフォルトの名無しさん:2006/12/19(火) 17:27:16
サポセンかっ!!

910 :デフォルトの名無しさん:2006/12/19(火) 19:56:06
as_stringは$$mail->parts(0)->bodyhandleに対するメソッドなので、
$$mail->parts(0)->bodyhandleの返す値がundefだということだな。

なぜそうなってるかを $$mail や元のメールをよく見て調べ、適切に
修正すれば解決するだろう。

911 :デフォルトの名無しさん:2006/12/19(火) 20:07:11
ぶっちゃけ板違い。
ここで聞くより、WebProgなりケータイ関連の板で聞くべきだろう。

で、まあ、ついでに聞いておく。
送信したメールに、本文は書かれてるかい?

912 :デフォルトの名無しさん:2006/12/20(水) 14:36:19
リストファイルからの検索方法に付いて

例えば変換対象の内容を予め用意したリストファイルと照らし合わせ
リストファイルの内容と一致した場合にファイルへ出力るすには
どうしたら良いでしょうか?

例えばリストファイルが
aaa
bbb
ccc
として、変換対象のファイルが
aaa test1
abc test2
bbb test3
だった場合は

aaa test1とbbb test3の抽出をしたいです。

openや関数を使ってみたけどうまくいかないので誰か教えてください。


913 :デフォルトの名無しさん:2006/12/20(水) 14:59:26
どういうことしたいのかよくわからんがこんなんでどう?
動くか試してないけど。

open my $listfh, '<', $listfile or die $!;
my @list;
while (<$listfh>) {
  chomp;
  push @list, qr/$_/;
}
close $listfh or die $!;
open my $convfh, '<', $convertfile or die $!;
while (defined(my $l = <$convfh>)) {
  chomp $l;
  print "$l\n" if grep {$l =~ $_} @list;
}
close $convfh;


914 :デフォルトの名無しさん:2006/12/20(水) 15:09:06
>>841,842

回答されてるじゃん。
回答の意味がわからないなら、「わかりません」「できません」とか言ってからにしろよ

915 :デフォルトの名無しさん:2006/12/20(水) 15:12:59
>>912
月曜に全く同じ文章で書き込んだだろ?
回答したんだけどやってみた?

916 :デフォルトの名無しさん:2006/12/20(水) 15:13:47
くっそーかぶった結婚しよう

917 :デフォルトの名無しさん:2006/12/20(水) 15:19:03
それにしても、ものすごく回答しにくいけど、どうして回答しにくいのかを指摘するのも
やはり難しい、そーゆー質問文だよな・・・。

たぶん、リストファイル、リストファイル、ファイルと、同じ言い方で3つの「ファイル」が
文中に登場することと、
「変換」という言葉を使っていながら、その後のディテールには「変換したい」という意志が
見えるところはなく、その象徴のように「抽出」に表現が変わってること、この2点かなぁ。

1) 同じようなものが複数登場するときは、自分から「仮称」をつけて明確に呼び分けておく。
2) ある場所である単語にある概念を託したら、その概念のことは以後必ずその単語で呼ぶ。
  それが曖昧な表現ならなおさら、ちょっとでも違う言い方をしたら本人以外は混乱するので。

これを守るだけで、回答者的にすいぶん答えやすくなると思うんだけどね。

918 :デフォルトの名無しさん:2006/12/20(水) 15:26:11
でも、この場合は入力例と出力例が書いてあるから、何をしたいかはなんとなくわかるけどね。
それよりも
「openや関数を使ってみたけどうまくいかない」
って文章で、質問者がどれくらい出来てるのかがわかんないよ。
単純にファイルを読み込んでリストを作るくらいは出来てるの?とか。

919 :デフォルトの名無しさん:2006/12/20(水) 15:58:42
$a = "1.jpg";
$b = "2.jpg";
$c = "3.jpg";

PerlMagickでこの3枚を使ってアニメーションGIFを作り方が知りたいです
$1〜$3は同じ大きさなのでリサイズ不要です

920 :デフォルトの名無しさん:2006/12/20(水) 16:00:10
PerlMagickの使い方なんてぐぐればすぐ出てくるだろうに・・・

921 :デフォルトの名無しさん:2006/12/20(水) 16:14:48
ぐぐって色々やって出来なかったから聞いてます

922 :デフォルトの名無しさん:2006/12/20(水) 16:18:14
どうやったか書けばそう思ってくれる人もいるんだけどね

923 :デフォルトの名無しさん:2006/12/20(水) 16:23:49
つttp://www.oreilly.co.jp/books/4873110203/toc.html

924 :デフォルトの名無しさん:2006/12/20(水) 16:33:46
>>922
$image = Image::Magick->new;
$image->[0]->Read($a);
$image->[1]->Read($b);
$image->[2]->Read($c);
$image->Write("output.gif");
とかです。間違ってるようだけど

>>923
本は買う金がありません

925 :デフォルトの名無しさん:2006/12/20(水) 16:37:14
変数の付け方からして・・・課題か?

926 :デフォルトの名無しさん:2006/12/20(水) 16:39:11
ぐぐったら出てくるだろ・・・

927 :デフォルトの名無しさん:2006/12/20(水) 16:44:21
いいから答えて下さい
そのためのスレでしょう?

928 :デフォルトの名無しさん:2006/12/20(水) 16:45:09
放置決定か

929 :919:2006/12/20(水) 16:46:40
$image = Image::Magick->new;
$image->Read($a);
$image->Read($b);
$image->Read($c);
$image->Write("output.gif");
でいけました。後秒間隔を設定したいです

ちなみに>>927は自分じゃありません

930 :デフォルトの名無しさん:2006/12/20(水) 16:49:03
>>927
そんな言われ方したら普通は答える気が失せるんじゃないだろうか。

ここはID出ない板だから元の質問者が書いているかどうかは不明だが。


931 :デフォルトの名無しさん:2006/12/20(水) 16:50:20
>>929
perldoc Image::Magick でマニュアルページ見れば分かるのでは?


932 :デフォルトの名無しさん:2006/12/20(水) 16:52:05
あーもうめんどくさい。
ttp://imagemagick.net/script/perl-magick.php
ここでsecondで検索したら見つかるから。

933 :919:2006/12/20(水) 17:03:23
>>932
ありがとうございます。

$image = Image::Magick->new;
$image->Read($a,$b,$c);
$image->Set(delay=>100);
$image->Write("output.gif");
で解決しました。

>>930
自分じゃありません。


お騒がせしてすいません
早めの埋めだと思っておいてください

934 :デフォルトの名無しさん:2006/12/20(水) 17:51:38
お前が言うな

935 :デフォルトの名無しさん:2006/12/20(水) 18:00:07
IDでる板ならいいのに。

936 :デフォルトの名無しさん:2006/12/20(水) 18:03:37
そうですね

937 :デフォルトの名無しさん:2006/12/20(水) 18:34:52
教えてほしいんだけど。
open my $fh, '>', 'hoge.dat';
こういう風にファイルを開いたときに、$fhからファイル名をしることってできる?
この例ならhoge.datが帰ってきてほしい。

938 :デフォルトの名無しさん:2006/12/20(水) 18:56:04
こんばんは

引数に配列・ハッシュ・リファレンスのいずれかを受け取るサブルーチンを用意するのですが、
与えられた引数が配列とハッシュのどちらかであるか判別する方法はありませんか?
リファレンスを受け取る場合は !$#_ && ref($_[0]) で判別できるのですが、
@_%2 では引数が偶数個だった場合配列とハッシュを区別できません。
exists(${¥%{{@_}}}{keyname}) では引数の偶数番目にkeynameが含まれる配列をハッシュと誤ってしまいます。

939 :デフォルトの名無しさん:2006/12/20(水) 18:58:08
>>937
直接に知る方法はない。statすればデバイスとinode番号がわかるから
必死でfindすればわかる可能性はあるが、既にunlinkされててみつからな
かったり、リンクがあって複数候補がでて特定できなかったりするかも
しれない。



940 :デフォルトの名無しさん:2006/12/20(水) 19:07:45
>>938
こんなじゃだめなの?

$LIST = [1,2,3];
$HASH = {1 => 2, 3 => 4};

if ($LIST =~ /^ARRA/)
{print "LISTn"}
elsif ($LIST =~ /^HASH/)
{print "HASHn"}


941 :デフォルトの名無しさん:2006/12/20(水) 19:15:35
それリファレンスじゃん

942 :デフォルトの名無しさん:2006/12/20(水) 19:27:21
>>938
特にプロトタイプを指定していない関数の場合、引数はリストコンテキストで評価されます。
配列もハッシュもリストコンテキストではただのリストに変換されます。

('A', 123, 'B', 456, 'C', 789)

↑これが元は配列だったのかハッシュだったのかなんて、判断のしようがないでしょう?

943 :デフォルトの名無しさん:2006/12/20(水) 19:44:34
リファレンスで渡してやればいいべ

944 :デフォルトの名無しさん:2006/12/20(水) 19:45:11
>>941
ああ、配列のリファレンスかハッシュのリファレンスかの判断かと思ったよ。
全部リファレンスに置き換えてサブルーチンに渡すか、
設計そのものを見直した方がいいんじゃない。

945 :デフォルトの名無しさん:2006/12/20(水) 20:03:23
確実に意図通り渡すにはリファレンスを用いる外にないということですね。
ありがとうございました

946 :デフォルトの名無しさん:2006/12/20(水) 20:05:08
>>942
('A'
の部分が顔に見えた

947 :デフォルトの名無しさん:2006/12/20(水) 20:16:55
>946
言われて見直してみたら吹きかけたじゃねーか

948 :デフォルトの名無しさん:2006/12/20(水) 20:18:32
('A');

949 :デフォルトの名無しさん:2006/12/20(水) 20:29:23
continueはforeach文でも使えますか?

950 : ◆TWARamEjuA :2006/12/20(水) 21:18:10 ?BRZ(6677)
つ wantarray
・・・ってだめじゃん(呆)

♪This function should have been named wantlist() instead.
だったらさっさと作れば。。。

951 :デフォルトの名無しさん:2006/12/20(水) 21:31:31
>>940
なぜ正規表現。ref 使ってくれ…。

952 :デフォルトの名無しさん:2006/12/20(水) 21:53:05
>>949
Perl には continue なんてありませんが、next なら使えます。

953 :デフォルトの名無しさん:2006/12/20(水) 22:17:02
>952
待て。ちょっと待て。

954 :デフォルトの名無しさん:2006/12/20(水) 22:25:09
>>952
がんばって生きろ。

955 :デフォルトの名無しさん:2006/12/20(水) 22:25:47
>>949
まずやってみれ。

956 :デフォルトの名無しさん:2006/12/20(水) 22:33:36
あー ループブロックの後ろに付ける continue ブロックってあったねそういえば orzz
あんまり使わないし見ないので忘れてた(´・ω・)

957 :937:2006/12/20(水) 23:41:42
>939
ありがとう。じゃああきらめて別の書き方しよう。

958 :デフォルトの名無しさん:2006/12/21(木) 00:59:11
>>937
開いたファイル名を何がしかの形で保存しておくだけで実現すると思うんだけれど。
取り出せないファイル名でファイルを open するというのは、少なくともぼくはやったことがないので。

それでもちゃんと CPAN には、
FileHandle::Deluxe
による文字列化機能があります。


959 :937:2006/12/21(木) 01:11:38
>958
うわ、ありがとう。
インターフェース的に、ファイルハンドルだけ渡したほうが
すっきりするような状態になってたからすごく助かる。

960 :デフォルトの名無しさん:2006/12/21(木) 19:21:23
$x、$y、$zを大きい順に並び替える場合
どうすればよいのでしょうか?

961 :デフォルトの名無しさん:2006/12/21(木) 19:33:51
配列に突っ込んでソート

962 :960:2006/12/21(木) 19:40:20
ソートの方法がわからないのですが・・・

963 :デフォルトの名無しさん:2006/12/21(木) 19:41:51
ココってperl初心者スレだっけ?

964 :デフォルトの名無しさん:2006/12/21(木) 19:45:26
検索ぐらいしてください。いくらでも例つきで出てきます。
ttp://www.google.com/search?num=50&hl=ja&q=Perl+sort&lr=lang_ja

ちなみに、sortにリストで渡して、結果をリストで受ければ配列要らず。

965 :960:2006/12/21(木) 19:47:13
できればソートを使わずに、配列で表示させたいです。

966 :デフォルトの名無しさん:2006/12/21(木) 19:47:38
使えよwwww

967 :960:2006/12/21(木) 19:49:04
やはり使わないと不可能でしょうか?


968 :966:2006/12/21(木) 19:52:05
すまん言い方が悪かった。なんかウケてしまったw
ソートってのは並び替える関数だから覚えると便利だよ
リストと配列の違いも調べるといいよ
sort使わずに、っていう条件なら住人の食いつきもいいかも。

969 :960:2006/12/21(木) 19:53:42
>>968
sort使わずにの条件でお願いします。


970 :デフォルトの名無しさん:2006/12/21(木) 19:57:39
なんで?理由は?

971 :デフォルトの名無しさん:2006/12/21(木) 19:59:54
比較演算子とかifとか知らないのかな

972 :デフォルトの名無しさん:2006/12/21(木) 20:03:55
どう考えてもこれで十分だろ。
($x, $y, $z) = sort { $b <=> $a } ($x, $y, $z);

973 :デフォルトの名無しさん:2006/12/21(木) 20:12:01
sortを使わないとなると、if文やリスト、配列を使うのでしょうか?

974 :デフォルトの名無しさん:2006/12/21(木) 20:25:37
>>973
変数3個なら並び方は順列で6通りだから if〜elsif 文でなんとかなるだろ

975 :デフォルトの名無しさん:2006/12/21(木) 20:26:12
$i = @nums = ( $x, $y, $z );
foreach (0 .. $i) {
  foreach (0 .. @nums) {
    @nums[ $_, $_ + 1 ] = @nums[ $_ + 1, $_ ] if $nums[$_] < $nums[ $_ + 1 ];
  }
  unshift @sorted, pop @nums;
}

sort() を使わないと、こんな愉快なコードを保守する破目になりますが、かまいませんか?

976 :デフォルトの名無しさん:2006/12/21(木) 20:35:39
それは変数三つに対して大仰だろう
if ($x < $y) { ($x, $y) = ($y, $x) }
if ($y < $z) { ($y, $z) = ($z, $y) }
if ($x < $z) { ($x, $z) = ($z, $x) }

977 :デフォルトの名無しさん:2006/12/21(木) 20:39:14
って順番間違えたorz 正しくはこうだ
if ($x < $y) { ($x, $y) = ($y, $x) }
if ($x < $z) { ($x, $z) = ($z, $x) }
if ($y < $z) { ($y, $z) = ($z, $y) }

978 :デフォルトの名無しさん:2006/12/21(木) 20:55:22
そろそろ >>960 の釣り宣言が入る頃だな

979 :デフォルトの名無しさん:2006/12/21(木) 20:57:04
>>976-977
スネーク、三大美徳の基本を思い出して!

980 :960:2006/12/21(木) 21:05:54
@a=($a=10,$b=5,$c=30);

if($a<$b){
($a,$b)=($b,$a)
} elsif($a<$c){
($a,$c)=($c,$a)
} elsif($b<$c){
($b,$c)=($c,$b)
}

print $a $b $c

xyzをabcに変えました。
これでできません・・・どうしたらよいのでしょうか?

981 :960:2006/12/21(木) 21:27:49
教えてくれるほどの技術の人が居ないようなので
別のところで質問することにします。
さようなら

982 :960:2006/12/21(木) 21:29:31
>>981
偽者はやめてください

983 :デフォルトの名無しさん:2006/12/21(木) 21:31:29
>>980
自分で$x,$,$zで質問して、なぜ$a,$b,$cに代えるの?
無知なフリして無駄に時間を使わせないで下さい
しかもつまらないし

皆さんも、親切なだけではなく、ガマン強いですね
もう相手にするのはやめては?

984 :デフォルトの名無しさん:2006/12/21(木) 21:36:33
>>980
上のほうで if (条件) { ブロック } を3つ並べる例を出してもらってるのに
if〜elsif〜elsif〜に動作変えちゃったのはなぜ?

つーか、sort で…というのを踏まえて $a $b を使う方向に変えたのかなあ。

985 :960:2006/12/21(木) 21:44:48
($x=10,$y=100,$z=30);

if ($x < $y) {
($x, $y) = ($y, $x)
} if ($x < $z) {
($x, $z) = ($z, $x)
} if ($y < $z){
($y, $z) = ($z, $y)
}

print "$x,$y,$z";

でやったらできました。
しかしifの中がいまいちわかりません。。

986 :デフォルトの名無しさん:2006/12/21(木) 21:59:17
>>979
そうだ、プログラマは無精であるべきだったな。
対象が増えることを予期するべきだった。私とした事が。
罰として久しぶりに次スレ建ててくる。

987 :デフォルトの名無しさん:2006/12/21(木) 21:59:40
どうしてsortを使わないのかいまいち分かりません。。

本当は分かるけど。課題なんだろ。

988 :デフォルトの名無しさん:2006/12/21(木) 22:29:51
>>986はスレ立てを蹴られたのか、テンプレの準備がなかなか進まないのか。

989 :デフォルトの名無しさん:2006/12/21(木) 22:31:27
ごめん、蹴られて別回線使おうとしてたところだけど駄目だった。

990 :988:2006/12/21(木) 22:33:59
俺も蹴られたらどうしよう?と思いながら逝ってくる。

991 :デフォルトの名無しさん:2006/12/21(木) 22:38:00
無事に立ちました。次スレ。
Perlについての質問箱 29箱目
http://pc8.2ch.net/test/read.cgi/tech/1166708139/

992 :デフォルトの名無しさん:2006/12/21(木) 22:41:52
うめ

993 :デフォルトの名無しさん:2006/12/21(木) 22:42:02
うめ

994 :デフォルトの名無しさん:2006/12/21(木) 22:42:17
うめ

995 :デフォルトの名無しさん:2006/12/21(木) 22:42:54
うめ

996 :デフォルトの名無しさん:2006/12/21(木) 22:43:29
うめ

997 :デフォルトの名無しさん:2006/12/21(木) 22:43:35
うめ

998 :デフォルトの名無しさん:2006/12/21(木) 22:43:37
$s = q{$self->kakikomi(qq{\$s = q{$s};\n$s\n__END__\n埋め})};
$self->kakikomi(qq{\$s = q{$s};\n$s\n__END__\n埋め});
__END__
埋め

999 :デフォルトの名無しさん:2006/12/21(木) 22:43:50
うはww

1000 :デフォルトの名無しさん:2006/12/21(木) 22:44:10
1000なら彼女できる

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

278 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)