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

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

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

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

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

リンク集は>>2-3
過去スレは>>4
2デフォルトの名無しさん:2006/04/26(水) 12:33:36 BE:375455074-
[プログラミング自体の経験が無い奴はまずココを読め]
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/04/26(水) 12:34:13 BE:201136853-
4デフォルトの名無しさん:2006/04/26(水) 12:37:41 BE:241363692-
5デフォルトの名無しさん:2006/04/26(水) 12:38:55 BE:402273465-
6デフォルトの名無しさん:2006/04/26(水) 12:40:45
こんな時間に乙!
7デフォルトの名無しさん:2006/04/26(水) 12:58:10
乙〜
8デフォルトの名無しさん:2006/04/26(水) 13:02:20
Perlで2つのプロセスを動かして同時に同じファイルを参照したり書き込むとき
がたまにある場合、非同期書き込みか排他制御?みたいなのしないといけないと思うけど
どうやってするの?
9デフォルトの名無しさん:2006/04/26(水) 13:04:59
次からはググってから質問してね
http://www.google.co.jp/search?hl=ja&q=Perl+%E6%8E%92%E4%BB%96&lr=
10デフォルトの名無しさん:2006/04/26(水) 14:06:03
ある変数 $kekka に、20バイト分のバイナリデータを代入した場合、
それらの値を1バイトずつ表示したいのですが、どうすれば良いのでしょうか?
unpack("C16", $kekka)とすると、16バイト分しか表示できませんでした。
11デフォルトの名無しさん:2006/04/26(水) 14:06:22
久々にエロ小説埋めきたな
12デフォルトの名無しさん:2006/04/26(水) 14:07:20
@list = unpack('C*', $kekka);
13デフォルトの名無しさん:2006/04/26(水) 14:15:47
>>12 Thx!!
14デフォルトの名無しさん:2006/04/26(水) 14:43:29
>>8
flock とか fcntl の F_SETLKW とか。
ロックファイルとかセマフォとか。
15デフォルトの名無しさん:2006/04/26(水) 16:15:07
あげ
16デフォルトの名無しさん:2006/04/26(水) 20:13:17
>>1


>>15
マターリ=サゲシンコ
17デフォルトの名無しさん:2006/04/26(水) 21:34:40
>>970
環境変数?の変更ですか?
ご教授ください。
18デフォルトの名無しさん:2006/04/27(木) 01:38:33
Encode::JP::H2Zを使って半角->全角変換しようとしたけどうまくいきませんでした。
全角→半角変換(z2h)はうまくいきます。どこが悪いのでしょうか。

use encoding "shiftjis";
use Encode;
use Encode::JP::H2Z;
$str = "アイウエオ";
$str = encode("euc-jp", $str);
Encode::JP::H2Z::h2z(\$str);
$str = decode("euc-jp", $str);
print $str;
19デフォルトの名無しさん:2006/04/27(木) 03:40:29
スクリプト自体の文字コードが分らないからなんとも言えないけど
shiftjisなら

use strict;
use warnings;
use Encode qw/from_to/;
use Encode::JP::H2Z;
my $str = "アイウエオ";
from_to($str,'shiftjis',"euc-jp");
Encode::JP::H2Z::h2z(\$str);
from_to($str,"euc-jp",'shiftjis');
print $str;

euc-jpだったらfrom_toいらない
20デフォルトの名無しさん:2006/04/27(木) 12:32:01 BE:1086137699-
>>17
環境変数とは違うものなんだけど…作業ディレクトリ=カレントディレクトリといえば分かる?
もし分からないなら、自分で調べれ。Perl以前の基本中の基本だから。
# 時々知らない香具師が現れる…

$FindBin::Binのほう、起動されたスクリプトが配置されているディレクトリの絶対パスが入っている。
そもそもそのスクリプトは、スクリプトのあるディレクトリにあるファイルを操作する、
つまり作業ディレクトリがスクリプトのある場所になっていることを前提に作ってあるわけだ。
だから、その前提に合うように作業ディレクトリを変えてやれば望んだとおりに動作する、と。
21デフォルトの名無しさん:2006/04/27(木) 14:19:38
windowsへのコンパイルってどれ使えばいいの?
perl2exe以外で
22デフォルトの名無しさん:2006/04/27(木) 15:57:31
PARとか
23デフォルトの名無しさん:2006/04/27(木) 16:05:05

stat || die とやると、なぜか stat の結果が得られない。
なぜ??????


---------
Sarge:~$ perl -e '@val=stat("/bin/bash")||die;print "size:$val[7]\n"'
size:
↑なにも出力されない。
Sarge:~$ perl -e '@val=stat("/bin/bash");print "size:$val[7]\n"'
size:625228
↑die をはずすとちゃんと出力される。
Sarge:~$ ls -la /bin/bash
-rwxr-xr-x 1 root root 625228 Dec 20 2004 /bin/bash
Sarge:~$ perl -v
This is perl, v5.8.4 built for i386-linux-thread-multi
24デフォルトの名無しさん:2006/04/27(木) 16:09:15
>>23
……覚醒剤でもやってるのか?
25デフォルトの名無しさん:2006/04/27(木) 16:14:35
>>23
ヒント: 優先順位
26デフォルトの名無しさん:2006/04/27(木) 16:31:32
サンスコ!わかった。
()でくくらないと、演算子の優先順位の問題があるのね。
27デフォルトの名無しさん:2006/04/27(木) 16:33:57
え?でも変だな、、、。
stat の結果が、優先順位の問題で返ってこないとすると、
その場合、die が実行されてないか?
逆に、dieが実行されず、stat しか実行されなければ、statの結果が返るはず。

あー、もうわかんねぇ。
だれかわかりやすく教えて!。
28デフォルトの名無しさん:2006/04/27(木) 16:38:55
>>27
ヒント: コンテクスト
29デフォルトの名無しさん:2006/04/27(木) 16:41:12
>>27
ヒント:or
30デフォルトの名無しさん:2006/04/27(木) 18:56:26
>>27
hint: stat の引数がない
31デフォルトの名無しさん:2006/04/27(木) 19:01:38
>>27の人気に脱糞
32デフォルトの名無しさん:2006/04/27(木) 19:19:35
>>27
||はスカラーコンテキストで評価される
だから@valにはstatの戻り値としてリストは格納されていない
試しにprint $val[0];とやってみ1って出るから
つまりstatが成功したことを示すスカラーが返却されている
つぅか||なんて使うな
orにしとけ
33デフォルトの名無しさん:2006/04/27(木) 20:10:56
>>27
read <perldoc> or die;
34デフォルトの名無しさん:2006/04/27(木) 20:49:39
Type of arg 1 to read must be HANDLE (not <HANDLE>) at >>33 line 2, near "<perldoc> or"
Not enough arguments for read at >>33 line 2, near "<perldoc> or"
>>33 had compilation errors.

perldoc -f read
35デフォルトの名無しさん:2006/04/27(木) 21:07:04
>>21
PerlAppオススメ。有料だけど起動時間は最速だと思う。
3618:2006/04/27(木) 21:20:48
>>19
あり。
Encode::JP::H2Z使う時はencodingプラグマは使えないという仕様なんですかね〜
37デフォルトの名無しさん:2006/04/27(木) 23:13:01
>>20
お前の勘違いじゃね?
環境変数だろ
38デフォルトの名無しさん:2006/04/27(木) 23:21:20
また知らない香具師が現れたな・・・
39デフォルトの名無しさん:2006/04/27(木) 23:23:43
ごめんなさい。わかりません。
カレントディレクトリの意味はわかるけど
>>20のいうようなカレントディレクトリの変更方法がわからんw
4020:2006/04/27(木) 23:32:11 BE:750910278-
>>37
そうか、スマソ
「環境変数」で意味が解る香具師がいるなら漏れの勘違いなんだろうな。
漏れには話のつながりが解らんから質問に対する答え頼んだ。
41デフォルトの名無しさん:2006/04/27(木) 23:32:57
pathのこと?
42デフォルトの名無しさん:2006/04/27(木) 23:33:43
>>40
おいコラ、諦めんな!
43デフォルトの名無しさん:2006/04/27(木) 23:36:41
>>40
ごめん、、、ヒントをくれ・・・カレントディレクトリの意味しかわからんよ。
44デフォルトの名無しさん:2006/04/27(木) 23:43:01
俺も白根
教えて栗
45デフォルトの名無しさん:2006/04/27(木) 23:44:02 BE:335228055-
>>43
| use FindBin;
| chdir $FindBin::Bin;
のchdirについて訊いているのかと思って解説しただけ…

ってもしかして>>37氏ageてるって事は質問者さんだったか・・・
そうだったら重ねてスマソ。普通の回答者だと思って回答頼んじまった
46デフォルトの名無しさん:2006/04/27(木) 23:45:50
>>45
970 名前:デフォルトの名無しさん[sage] 投稿日:2006/04/26(水) 01:01:29 ?
>>969
原因は分からんが関連付けから起動したときに、
作業ディレクトリが別のところに行くようになっちゃってるようで。
根本的な原因はこのスレの範疇外だと思う。スクリプトの頭で、
use FindBin;
chdir $FindBin::Bin;
とでもやっておきなされ。これで作業ディレクトリがスクリプトのある場所に行く。

>作業ディレクトリが別のところへ行くようになっちゃってるようで
これの設定変更ってできる?
4720:2006/04/27(木) 23:57:54 BE:107273524-
>>46
そっちのことだったのかorz それについては知らん。
というかその問題はPerlと関係ないと伝えたつもりだったから、
Perlに関連する部分か前提になっている作業ディレクトリという単語に対しての
レスだろうと思ってあんな勘違いしたレスになった。いや申し訳ない。
48デフォルトの名無しさん:2006/04/28(金) 00:42:52
もう、win から再インストールしなされ
49デフォルトの名無しさん:2006/04/28(金) 01:33:07
こういうときに何で馬鹿がわくのか・・・

答え絶対いわないよな
50デフォルトの名無しさん:2006/04/28(金) 01:33:30
cperl-modeで
/[\r\n]/;
この一行がエラーになるんだけど、文法的になんか不味いですか?
emacsのバージョンは
"GNU Emacs 21.4.1 (i386-mingw-nt5.0.2195) of 2005-08-28 on CUBE" です
51デフォルトの名無しさん:2006/04/28(金) 01:50:50
またエラー内容隠蔽者か。

シねばいいのに。
52デフォルトの名無しさん:2006/04/28(金) 02:03:08
>>51
エラーつってもcperl-modeのエラーだから、
cperl-mode使えるやつなら試してみれるかなと思って。

End of `/ ... /' string/RE not found: (scan-error Unbalanced parentheses 1 13)

これがミニバッファにしつこく表示される。
53デフォルトの名無しさん:2006/04/28(金) 02:14:40
Emacs 21.3 で試したけど問題無いみたい。
どっかでエンバグしたのかね。
Emacs 系のスレで聞いてみた方が良い気も。
54デフォルトの名無しさん:2006/04/28(金) 02:22:18
>>53
>Emacs 21.3 で試したけど問題無いみたい。
試していただきどうもです。
時間があるときにEmacsのアップデートするのが良さそうですね。
55デフォルトの名無しさん:2006/04/28(金) 02:30:01
>>46
思ったんだけどショートカットから起動してたりと化しない?
56デフォルトの名無しさん:2006/04/28(金) 08:32:47
すいません、ActivePerlなんですが、
5.8.4から5.8.8にバージョンアップしても、
5.8.4の時に入れたモジュールとかは引き継いでくれますよね?
57デフォルトの名無しさん:2006/04/28(金) 13:47:12
>>56
だろうけど
動かないモジュールがでるかもね
58デフォルトの名無しさん:2006/04/28(金) 16:27:53
>>57
ありがとうございます。
バージョン違いで動かないものが出てくることはある、ということですよね。
それはしょうがないですね。
59デフォルトの名無しさん:2006/04/28(金) 20:36:40
ふと思ったのですが、ハッシュのキーに使えるものにはどんな制限あるのでしょうか?
文字列が問題無いのはわかりますが、
2バイト文字、
packされたバイナリデータ、
リファレンス、オブジェクト、
ファイルハンドル、
等はハッシュのキーとして使えるのでしょうか?
使うときに注意することとかあるでしょうか?

別にファイルハンドルをハッシュのキーとして使うメリットも思いつかないんですが、
どこまで使えるんだろう? と思ったので。

use constant で定義した定数は使えませんよね?
60デフォルトの名無しさん:2006/04/28(金) 20:57:51
>>59
え? スカラにさえなるなら何でも使えると思うけど?
61デフォルトの名無しさん:2006/04/28(金) 21:05:35
>>59
ハッシュのキーには文字列しか使えないはず。
ttp://search.cpan.org/~nwclark/perl-5.8.8/pod/perldata.pod
> Hashes are unordered collections of scalar values indexed
> by their associated string key.

で、Perlの文字列データはバイナリセーフなので
・2バイト文字
・packされたバイナリデータ
これらは全て文字列(PV)として一括りに扱うことが出来る。
リファレンス(やそれにblessしたオブジェクト)に関しては、
文字列表現に変換されて記録されるため保障されない。
それを扱うためには標準モジュールであるTie::RefHashを使う。
ttp://search.cpan.org/~nwclark/perl-5.8.8/lib/Tie/RefHash.pm

ファイルハンドルについては…どうだっけ。文字列として扱って良いんだっけ?
62デフォルトの名無しさん:2006/04/28(金) 21:37:36
$val{$x}{$y} のようにキーが2つあるハッシュを値でソートして $x,$y,$val{$x}{$y} を出力するには
どうしたらよいのでしょうか?
sort の中で sort したら何とかなるかと思ったのですが、キーが2つあると$a,$bがこんがらかってしまいました。

それに、どんなに工夫しても
sort何か比較する式} keys %val
としてしまったら、$x しかソートされないし、ネストしたsortという方向自体が間違っているような気がしています。
ヒントだけで良いので教えていただけないでしょうか?
63デフォルトの名無しさん:2006/04/28(金) 21:57:24
>>62
一回でやろうとするからこんがらがる。$xと$yを別々に決定するんだ
foreach my $x (sort keys %val) {
foreach my $y (sort keys %{$val{$x}}) {
print $x, $y, $val{$x}{$y};
}
}
6462:2006/04/28(金) 22:12:17
>>63
それではハッシュのキーでのソートになってしまいます。
ハッシュを値でソートしてと言う意味は
$val{ a }{ A } = 1;
$val{ a }{ B } = 4;
$val{ b }{ A } = 3;
$val{ b }{ B } = 2;
の場合
a,A,1
b,B,2
b,A,3
a,B,4
のように出力させたいのです。
65 ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄:2006/04/28(金) 22:34:42
___ ミ
┌ ┌ | ζ
┌ ┌ |
┌ ┌ |
┌ ┌ |
┌ ┌ |
┌ ┌ |
┌ ┌ |
66デフォルトの名無しさん:2006/04/28(金) 22:37:06
sub main {
my %val = (a => {A => 1,
           B => 4,
           C => 6},
        b => {A => 3,
           B => 2},
        c => {D => 5,
           E => 7});
foreach my $kh ( sort {$val{$a->[0]}->{$a->[1]} cmp $val{$b->[0]}->{$b->[1]}} map { my $fk = $_; map { [$fk, $_] } keys(%{$val{$_}}); } keys(%val)) {
    printf("%s:%s:%d\n", $kh->[0], $kh->[1], $val{$kh->[0]}->{$kh->[1]});
}

}
67デフォルトの名無しさん:2006/04/28(金) 23:01:17
ぁ cmpじゃなくって<=>だった;
6862:2006/04/28(金) 23:21:32
>>66
やばい。ヒントだけもらって自分で解くつもりが答えを見てもよくわかんない...orz
でも、時間をかけて順々に追っかけていくと何とかわかったような気がしてきました

解読結果を書くので間違っていたら指摘してください( 用語とか間違ってるかも )

$fkは$x成分を一時的に入れている。
外側のmapでキーの要素$x,$yの組み合わせに対して
無名配列[$x,$y]を要素としたリストをつくっている。
@xy_list = map{...} keys(%val)

できた@xy_listに対して、以下のsort
(自分の場合やりたいのはcmpでなくて、<=> なので少し変えてます)
sort {
$val{ $aのx成分 }{ $aのy成分 }
<=>
$val{ $bのx成分 }{ $bのy成分 }
}@xy_list

この、値順に並んだ[$x,$y]に対してこれを$khとしてforeachで回している。
一度[$x,$y]の組み合わせのリストをmapで作るのがポイント。

自分一人では絶対に思いつかない方法でした。
ありがとうございました。
69酩酊 ◆TWARamEjuA :2006/04/28(金) 23:21:58 BE:1742944-#
そもそもの構造が、あはぁんな悪寒。
ひとまず、
[key1, key2, value]
にしてsortするのが判りやすくなるかな?
70デフォルトの名無しさん:2006/04/28(金) 23:26:58
>>68
あってると思う。

でもこんなことやるより最初にハッシュキーの組み合わせのリストだけ作ってsortしたほうが読みやすいし、
>>69の人が言ってるようにそもそもデータ構造を変えたほうが正解かもしれない
7162:2006/04/28(金) 23:34:45
>69 のヒントに従って書くと、

for my $x ( keys %val ){
for my $y ( keys %{ $val{ $x }} ){
push @xy_val_list,[$x,$y,$val{ $x }{ $y }];
}
}
@xy_list = sort { $a->[2] <=> $b->[2] } @xy_val_list;
for my $xy_val ( @xy_list ){
print join ",",@$xy_val,"\n";
}
って感じですね。
これも$xと$yをセットにしたもの( [$x,$y,$val] )を要素とした配列をソートすると言う方針は同じですね。
mapにあんまり慣れていないので、こっちのほうがわかりやすいような気がします。
72デフォルトの名無しさん:2006/04/29(土) 00:26:44
憧れのDANさんが最近の記事で書いていたんですが

open($fh, '<', "$file") || croak("failed to open: $file: $!");

は || じゃなくてorにしろありました
どうしてでしょうか?
上記のコードは別に||でもうまくいってるみたいなんだけど
73デフォルトの名無しさん:2006/04/29(土) 01:38:18
>>66
を1行で書けばこんな感じ。

print map { "$_->[0],$_->[1],$_->[2]\n" }
  sort { $a->[2] <=> $b->[2] }
  map {
    my $x = $_;
    map { [$x, $_, $val{$x}{$_}] } keys %{$val{$x}}
  } keys %val;

おれはこの手の書き方をよく使うけど、複雑になりそうなら
>>71 のような素直な書き方の方がいいかもね。
74デフォルトの名無しさん:2006/04/29(土) 03:23:18
>>72
> 憧れのDANさんが最近の記事で書いていたんですが

その憧れのDANさんに訊けばいいだろ。
75デフォルトの名無しさん:2006/04/29(土) 04:40:21
>>72
優先順位
open $fh, '<', "$file" or croak "failed to open: $file: $!";

と書ける。どちらが可読性が高いかという話だ
76デフォルトの名無しさん:2006/04/29(土) 06:09:20
正規表現で最後の前にマッチした値を知るにはどうしたらいいですか?

m/pattern/; # ()がたくさん
print $+; # 最後にマッチした値
77デフォルトの名無しさん:2006/04/29(土) 07:23:08
>>76
@x = m/pattern/;
print ((grep {defined $_} @x)[-2]);
7876:2006/04/29(土) 08:14:40
>>77
おー、なるほど。
いわれてみれば、あーそうだとわかるのに、思いつかんかった。
ありがとうございます。
79デフォルトの名無しさん:2006/04/29(土) 08:47:58
patternの中身が可変長でもない限り目で数えて$nでいんじゃね?
それか嫌ならマッチを2行にして
最後のマッチにだけ(?>pattern)を使う
→次のマッチから()を使ってそれの$+とか?

>>77みたいなperlらしすぎるコードも嫌いじゃないけどさ

80デフォルトの名無しさん:2006/04/29(土) 13:42:12
>>75
ありがとうございました!
81デフォルトの名無しさん:2006/04/29(土) 14:38:28
txtファイルを読み込んで、改行コードを外してから連結していく処理を作ろうとして、

#$lineに一行読み込み後の処理
$line =~ s/\n//;
$line =~ s/\r//;
$all_line .= $line;

とすると、たまに先頭に付加されてしまう事があるんだけど、何故?

先頭に付加というのは、
$all_lineが abcdef の状態に、XYZの行を足したら、
XYZdef になってしまうという事です。
82デフォルトの名無しさん:2006/04/29(土) 14:45:52
>>81
そのtxtファイルの改行コードが壊れてCR CR LFになってる悪寒。
先頭に出るのはコンソール上でカーソルを行頭に戻す制御コードCRが
一個以上消え残ってしまっているからだと思われる。
- $line =~ s/\r//;
+ $line =~ s/\r//g;
でどう?
83デフォルトの名無しさん:2006/04/29(土) 14:50:12
>>81
さすがにperlの.=がバグっているとは考えにくいので思い違いの
可能性が高いな。

$all_line .= $line;

の前後で$all_lineの値を表示してみると問題はそこではないことが
わかりそうな気がする。
84デフォルトの名無しさん:2006/04/29(土) 14:59:10
異プラットホームのテキスト扱ってて行末以外にも改行コードがあるってこと?
chompじゃダメなの?
85デフォルトの名無しさん:2006/04/29(土) 15:10:15
>>83
その場合、確認すべき事を理解して無いと >>82 の現象を見逃してしまうけどね。
$all_line = "abcdef\rXYZ"; になっている場合。
86デフォルトの名無しさん:2006/04/29(土) 15:14:52
>>81
原因は82で間違いなさそう。
CRCRLFが出力されるのはWindows上でPerlを動かしてるときに
print FH "abcdef\r\n";
といったことをしたんだと思う。
元々\nを(環境に合わせて)CRLFにする機能があるから自分でCRを出力する必要は無いんだよね。
87デフォルトの名無しさん:2006/04/29(土) 15:35:53
えーと、まとめてレスさせていただきますが、状況としては、

・読み込んでいるtxtは、Windows上で、某有名txtエディターで作ったtxt
  -> 改行コードは、問題ないと思います。

・$all_lineに連結する直前の、$all_line、$lineのprint表示はしてみましたが、
 それぞれ、正常に表示されていました。

 連結後に、$all_lineがおかしくなります。

・テストはWindowsで行っていますが、運用時にはLinuxで作成したファイルも混在するため、
 chompは使わずに、上記の置換処理で代用しています。

 というか、サンプルでは直接書きましたが、上記の置換処理は、
自作chomp関数の中の処理となっています。



で、レスを読んでいて、\rが残っているのだろう、と思えてきましたが、
上記のような状態なので、改行コードが壊れるとも思えず、
どこで混入したのかが、謎ですね・・・・・
88デフォルトの名無しさん:2006/04/29(土) 15:38:08
あ、あと、>>82さんの方法ですが、会社でないと試せないので、
月曜日にやってみます。

でも、試しに今、自宅で上記の再現コードを書いても発生しないから、
どこかで自分が改行コードを壊して、やらかしている予感・・・・
89デフォルトの名無しさん:2006/04/29(土) 16:23:21
ファイルのバイナリをみればいいじゃない
90デフォルトの名無しさん:2006/04/29(土) 16:45:30
プログラムは、あなたの「思えない」を考慮しない。
91デフォルトの名無しさん:2006/04/29(土) 19:02:58
92デフォルトの名無しさん:2006/04/29(土) 20:20:16
@in = (
  "\r\n",
  "\n\r",
  "\r",
  "\n",

  "\x0d\x0a",
  "\x0a\x0d",
  "\x0d",
  "\x0a",
);

for ( @in ) {
  print map { ord( $_ ) . ' ' } split( '' );
  print "-> ";

  chomp;
  print map { ord( $_ ) . ' ' } split( '' );
  print "\n";
}

これを windows, unix, スクリプトの改行コード CRLF, LF の環境で試してみると・・・
93デフォルトの名無しさん:2006/04/30(日) 13:37:39
青ラクダ本って日本語訳されたperldocが本になってるだけと思ってたんですが、
本にしか書かれていない章もあるようです。
perldocに無くて、本にだけ書いてあることってどれくらいあるんでしょう?
94デフォルトの名無しさん:2006/04/30(日) 13:53:59
当たり前のことだが perldelta や CPAN から入れたモジュールに関しては,逆に perldoc を読むしかない.
必要なことはすべて perldoc に書かれているので, 英語が読めればラクダ本は不要.
95デフォルトの名無しさん:2006/04/30(日) 14:28:31
>>94
http://www.oreilly.co.jp/books/4873110971/toc.html

24.1 初心者にありがちな誤り ← perltrap
24.2 効率の問題 ← ?
24.3 プログラミングの書法 ← perlstyle
24.4 Perlらしいコード ← ?
24.5 プログラムの生成 ← ?

上の ? の項は perldoc だとどれに該るんでしょうか?
http://search.cpan.org/~nwclark/perl-5.8.8/pod/perltoc.pod
96デフォルトの名無しさん:2006/05/01(月) 04:24:18
sql文を一行読み込み、
select id, name from user_info where id = '5'
を改行コードなどでフォーマットさせるモジュールか関数を知っていたら教えてください。select以外も対応するもの。
select
 id,
 name
from
 user_info
where
 id = '5'
こんな感じにしたいです。
9796:2006/05/01(月) 16:37:39
抜けが有りそうだけど、結局手作業で簡単なものを作りました。
98デフォルトの名無しさん:2006/05/01(月) 17:59:03
threads使いたくてベースの5.6に、5.8を追加して共存させたいんですが
既に共存成功している人で、ppmでのインストールとかどうなってますか?
やっぱりppm利用時に絶対パスでppmの場所を指定しないと、
目的のPerlバージョンのあるところにインストールされないものですか?
9998:2006/05/01(月) 17:59:43
環境書き忘れましたが、WindowsXPでPerlはActivePerlです。
100デフォルトの名無しさん:2006/05/01(月) 22:58:14
HASHへのリファレンスを一つ引数に取る関数で、
以下の二つのうち下だけがエラーになります。

sub hoge {
 $huga = shift;
 return keys %$huga;
}

-- コレは通る
%z = (a => 1, b => 2);
&hoge(\%z);

-- コレはエラー
&hoge(\(a => 1, b => 2));

下の方で書きたいんですが、どうにかなりませんか?
101デフォルトの名無しさん:2006/05/01(月) 23:10:10
&hoge({a => 1, b => 2});
102デフォルトの名無しさん:2006/05/02(火) 00:49:13
下の書き方に拘るならこうだが・・・

sub hoge {
 my $huga = shift;
 my %huga = @$huga;
 return keys %huga;
}

指摘の意味が分かればいいんだけど・・・
103デフォルトの名無しさん:2006/05/02(火) 00:55:45
きんもーっ☆
104デフォルトの名無しさん:2006/05/02(火) 02:51:34
>>102
sub { print ref($_[0]), '/' . @_ } -> (\(a => 1, b => 2)); # SCALAR/4
http://www.kt.rim.or.jp/~kbk/perl5.005/perlref.html#Making_References
105デフォルトの名無しさん:2006/05/02(火) 09:31:09
next unless $t->[0] eq 'T' or $t->[0] eq 'S' and $t->[1] eq 'a';
なんとかnext if 〜に書き直せない?
106デフォルトの名無しさん:2006/05/02(火) 09:35:14
>>105
小学校の算数の教科書を復習するとわかるよ。
107デフォルトの名無しさん:2006/05/02(火) 11:03:03
>>105
next if !( $t->[0] eq 'T' or $t->[0] eq 'S' and $t->[1] eq 'a' );
next if $t->[0] ne 'T' and !($t->[0] eq 'S' and $t->[1] eq 'a');
next if $t->[0] ne 'T' and ($t->[0] ne 'S' or $t->[1] ne 'a);

でも元のunless使ったのが一番読みやすいと思う。

108デフォルトの名無しさん:2006/05/02(火) 12:32:31
>>106
ド・モリマンの法則ですか?わかりません!><
109デフォルトの名無しさん:2006/05/02(火) 13:09:09
クックブックvol1,526ページに

@array = map { \my $aton } 0 .. 3;
#4つの無名スカラー値のリファレンスを代入

ってあるんですが、\myが意味わかりません
なんでmyの前にデリファレンス演算子の\があるの?
my \$atonなんじゃないかと思ったけどこれはエラーになった
110デフォルトの名無しさん:2006/05/02(火) 13:34:40
>>109
逆スラッシュ演算子はデリファレンスでなく作る方。
my で map ブロック内のスコープを持つレキシカル変数 $aton を宣言し、
そのリファレンスを返している。演算子の優先順位が分かるよう括弧を
付けるなら map { \(my $aton) } 0..3;
111109:2006/05/02(火) 14:52:05
>>110
ありがとうございます

\がmy $aton全体にかかってるんですね
逆スラッシュ演算子については完全に勘違いでした
あほでした失礼します
112デフォルトの名無しさん:2006/05/02(火) 14:57:44
>>108
ド・モリマンの法則ってのがあるんだ
へぇ〜
やっぱこのスレ勉強になるわ
113デフォルトの名無しさん:2006/05/02(火) 15:33:23
>>112
あるあ、ねーよwww
114デフォルトの名無しさん:2006/05/02(火) 15:39:44
>>105
next if (! ($t->[0] eq 'T' or $t->[0] eq 'S' and $t->[1] eq 'a'));

115デフォルトの名無しさん:2006/05/02(火) 17:06:45
>>105
next if $t->[0] ne 'T' and "$t->[0]$t->[1]" ne 'Sa';
または
next if "$t->[0]$t->[1]" !~ /^T|^Sa/;
116デフォルトの名無しさん:2006/05/02(火) 18:21:22
よく使う自作関数を別ファイルにしてrequireで呼び出すようにしたんですが
普通こういうときは外部ファイルの拡張子をpmにするんでしょうか?それともpl?
外部ファイルではpackageを使っておらず、@INCに置くことはありません。
117デフォルトの名無しさん:2006/05/02(火) 18:48:03
.pl かな
118デフォルトの名無しさん:2006/05/03(水) 01:08:46
while (1) {

$flag = 1, last if (適当);

}

上記のコードを実行するとifでtrueになったときに
whileを抜けて、そのときに$flagがセットされますが、
どうしてそのようになるのか理解できません

last if ()の時点でループを抜けてしまい
$flag=1は評価されないような気がするのですが、
一体何が起こっているのでしょうか?
119デフォルトの名無しさん:2006/05/03(水) 01:36:27
>>118
> last if ()の時点でループを抜けてしまい

そうだな。

> $flag=1は評価されないような気がするのですが、

なぜ?


120デフォルトの名無しさん:2006/05/03(水) 01:37:10
>>118
コンマは演算子であって文の区切りでは無いよ。

> 一体何が起こっているのでしょうか?

if ((適当)) { $flag = 1, last }
121デフォルトの名無しさん:2006/05/03(水) 02:05:41
>>117
ありがとうございます。plにします。
122デフォルトの名無しさん:2006/05/03(水) 02:33:29
>>118
hint: if と , の優先順位
123デフォルトの名無しさん:2006/05/03(水) 10:50:14
ファイルをロックしてオープンするサブルーチンを作ろうと思い

sub lock_open{
    my $file=shift(@_);
    #ここにlockの処理
    open(OUT, ">>$file");
    return OUT;
}

としたのですが、
Bareword "OUT" not allowed while "strict subs" ...
と怒られてしまいます。openの前に my OUT としても
No such class OUT ...
と怒られるのですが、perl的にはどのようにするのが正しいのでしょうか。
124デフォルトの名無しさん:2006/05/03(水) 11:09:24
flockならopenしてから
125123:2006/05/03(水) 11:25:13
NFSですのでロックはmkdirにしようと思っています。
といいますか問題はロックまわりではなくファイルハンドルの扱いなんです。
わかりにくい書き方をしてしまってごめんなさい。

これまではファイルハンドルをグローバルで書いてしまっていて再利用しづらかったので、
これを機にstrictでまじめに書くようにしようと思ったのですが、上記のような状態で…。
126デフォルトの名無しさん:2006/05/03(水) 12:13:42
>>123
open my $fh, ">> $file";
return $fh;

でいいんじゃね?
つか、ひょっとして

OUT = lock_open( 'filename');

とかやってない? だとしたら間違い。
127デフォルトの名無しさん:2006/05/03(水) 12:14:26
>>125
君の知りたいことはここに載っていることかな?

http://perldoc.jp/docs/perl/5.6.1/perlfaq5.pod
の、
(どうすればファイルハンドルをサブルーチンに局所化できますか?
128デフォルトの名無しさん:2006/05/03(水) 14:43:24
129デフォルトの名無しさん:2006/05/03(水) 14:56:04
日本でもPerl盛り上がっているように見えるけど、
日本語ドキュメントに対する細かいケアが行なわれていないのが興味深いね。
130デフォルトの名無しさん:2006/05/03(水) 16:32:36
>>128
>>>127
>perldoc.jp にある HTML 化された POD ってアンカー消してあって不便だよね。
ものによるみたいだよ?
今読んでたperlfuncはアンカーあったし。
131デフォルトの名無しさん:2006/05/03(水) 16:57:52
>>129
原文読めば済むからでしょ
132123=125:2006/05/03(水) 17:36:00
>>126
やってます。
あー違うんですかー。
>>127
よく理解できていませんが、これみたいです。
ちょっとがんばってみます。

ありがとうございました。
133デフォルトの名無しさん:2006/05/03(水) 17:36:27
>>131
俺読めない。いいな読める人は。
134123=125:2006/05/03(水) 17:43:06
>>126 様のように my をつければ局所化はされていると理解しました。
OUT = lock_open('filename') という記述が誤っているとのことでしたが、
正しい書き方がわかりません。
イチイチで申し訳ないのですが、教えていただけないでしょうか。
135123=125:2006/05/03(水) 17:52:07
あ、分かりました。
同じようにmain(?)側で変数に代入して、それをファイルハンドルとして扱うだけですね。
ファイルハンドルと変数をごっちゃにしてしまっていました。(情けないです)

ありがとうございました。
136デフォルトの名無しさん:2006/05/05(金) 12:39:10
gzipを解凍したのですが、モジュールありますか?
137デフォルトの名無しさん:2006/05/05(金) 13:06:06
138デフォルトの名無しさん:2006/05/05(金) 13:07:50
Compress::Zlib
139デフォルトの名無しさん:2006/05/05(金) 19:52:46
user1:password
user2:password
user3:password
のようなユーザーのリストから
open (D,"user.dat");
@userdata=<D>;
close (D);
$dataline=0;
foreach (@userdata){
($loadid[$dataline],$loadpass[$dataline])=split(/:/,$_);
$dataline++;
}
のように読み込んで、入力されたデータと一致するようにしているのですが、
入力されたデータがuser1とpasswordだった場合、
if ($loadid[$count] eq $id)
でIDは照合できるのですが
if ($loadpass[$datalocation] eq $pass)
($datalocationは$countと同じ値)でやってみると、同じ文字列を入れても同じだと認識しません。
printしてみても同じ文字列なのですが…htmlでprintして見るとどうも後ろに空白のような物があるのですが、
chompやchopをしてみてもうまくいきません。どなたかどのようにしたらいいのか教えてください。
140デフォルトの名無しさん:2006/05/05(金) 20:24:01
一致しないときは
print unpack "H*", $string;
とかやっとけばどう異なるかよくわかる。
141デフォルトの名無しさん:2006/05/05(金) 21:37:20
>>140
ファイルからロードしたデータ:70617373776f72640d0a
入力したデータ70617373776f7264
と出ました。0d0aを検索してみたら改行コードだということがわかりました。
chompしてみると70617373776f72640dと出ます。なので一致しません。
Perl 改行 削除で検索してみましたらこのページが出てきたので
ttp://www.nishishi.com/perltips/string2.html
書いてあるようにファイルを読み込むときに
$dataline=0;
foreach (@userdata){
$_=~ s/\r//;
$_=~ s/\n//;
($loadid[$dataline],$loadpass[$dataline])=split(/:/,$_);
$dataline++;
}
のように追加してみましたらうまくいきました。ありがとうございました。
142デフォルトの名無しさん:2006/05/05(金) 21:59:56
可能ならセパレーターを変える方法もあるます。

use strict;

$/ = "¥x0d¥x0a";    # 入力セパレーター(行末)をCRLFにする
my (@loadid, @loadpass);

open D, "user.dat" or die;
while (<D>) {
    chomp;          # この対象もCRLF
    ($loadid[$. - 1], $loadpass[$. - 1]) = split /:/;
}
close D;
143デフォルトの名無しさん:2006/05/05(金) 23:07:19
すいません。ActivePerl5.8.4を使い続けていて、
5.8.8に乗り換えようと思っているのですが、
とあるスクリプトが動かなくて苦労しています。

--------------------------------------------
use encoding "cp932";

#5.8.4だと、cp932でopenできる
#use open ":encoding(cp932)";

#5.8.7以降だと、shift-jisと書かないとダメ
use open ":encoding(shift-jis)";

use strict;
my $str = "";
$str = "テスト";
print "$str\n";
print length($str), "\n";
--------------------------------------------

5.8.4までだと、
use open ":encoding(cp932)";
と書けたのですが、5.8.7と5.8.8だと、
use open ":encoding(shift-jis)";
と書かないと、
Wide character in print at testcode.pl line 6.
と出て、文字化けしてしまいます。

cp932というコードセットは、うまく使えない仕様になってしまったのでしょうか。
そのくせ、
use encoding "cp932";
は通るのだから、よく分からない。。。use open時のバグかな?
144デフォルトの名無しさん:2006/05/06(土) 00:54:40
perlスクリプトでHDDの空き容量を調べる方法を
探しております。

HDD(1)中の拡張子*.mpgのファイルを別のHDD(2)に
コピーする際に、HDD(2)の空き容量を確認したいの
ですが、そのような関数またはモジュールがperlには
ありますか? mpgファイルの容量は:
$size = (-s "test.mpg");
で調べられることは分かったのですが、コピーする先
のHDD(2)に十分な空き容量があるかを調べたいのです。
145デフォルトの名無しさん:2006/05/06(土) 01:21:09
>>144
WindowsならWin32::DriveInfoってモジュールを使ったことがある
146デフォルトの名無しさん:2006/05/06(土) 01:23:06
>>143

 馬 鹿 は encoding.pm を 使 う な (゚Д゚)

 
147デフォルトの名無しさん:2006/05/06(土) 02:06:33
use encoding 'cp932', Filter=>1;
でどうだ。

encodingは確かに使いづらいけど本当にカジュアルに使えるようになったらかなり便利だと思う・・・
148デフォルトの名無しさん:2006/05/06(土) 03:57:12
>>143

use encoding 'shift-jis';
use open 'encoding(shift-jis)';

でも同様のエラーになるから、cp932の問題じゃないんじゃないか?

つか、そのスクリプトなら use encoding だけでよくて use open いらないんじゃね?
149デフォルトの名無しさん:2006/05/06(土) 10:45:08
>>147
今でも十分お手軽でしょ。副作用が大きいから分かんない奴は使うなって
作った人間が言ってるのに、なんで固執するのか理解に苦しむ。
150デフォルトの名無しさん:2006/05/06(土) 14:25:03
>>145
素早いご回答をありがとうございます。
求めている機能を含むモジュールがあるので
すね。
Unix系でも動くperlスクリプトにしたいので、
別のモジュールも探してみます。
151デフォルトの名無しさん:2006/05/06(土) 16:29:53
Perlで現時刻から10000分後の時間を得るにはどうすればいいですか?
time() + 10000 * 60
とやるしかありませんか?
152デフォルトの名無しさん:2006/05/06(土) 17:01:56
むしろそれで何が不満なのか聞きたい
153デフォルトの名無しさん:2006/05/06(土) 19:59:38
>>152
N分後ならtime()+60*n
N時間後ならtime()+60*60*n
N日後ならtime()+60*60*24*n

うるう秒みたいな特殊なケースを除けばこれは絶対に正しい?
154デフォルトの名無しさん:2006/05/06(土) 20:25:23
>>153
正しくないケースを伸べよ。
155デフォルトの名無しさん:2006/05/06(土) 20:30:25
>>153
「60*n」等の式が正しいとすれば(正しいだろう)
現在のエポック秒に求める秒数を足してるのだから明らかに正しい。
なんせ年月日時分の概念が無いんだから。
156デフォルトの名無しさん:2006/05/06(土) 20:45:06
掛け算で閏秒はどうやって解決しているのか、ぜひ聞かせていただきたい物だ
157デフォルトの名無しさん:2006/05/06(土) 20:59:20
>>156
ちゃんと>>155読んだ?
158デフォルトの名無しさん:2006/05/06(土) 21:38:31
>>157
阿呆は放置。
159デフォルトの名無しさん:2006/05/06(土) 21:45:48
>>154
ビーーン
160デフォルトの名無しさん:2006/05/06(土) 21:53:29
>>156
本来の要求仕様がわからんから正確にはなんとも言えんが、
「n秒後」という要求では、逆にうるう秒は考えちゃいけないだろ。

「x月y日まであと何秒?」という場合なら考えなきゃいけないが。
161デフォルトの名無しさん:2006/05/06(土) 22:05:07
どっちにしても、うるう病は地球の自転の観測結果から調整するもので、うるう年みたいな
規則性がないからどうしようもないけどね。
162デフォルトの名無しさん:2006/05/06(土) 22:10:13
次のPerlの仕様がどうたらこうたらってきいたのですが
仕様がそんなにかわるんですかね?

簡単に仕様変更を書いたサイトとかってないですかね?
163デフォルトの名無しさん:2006/05/06(土) 22:12:43
つか、エポック秒なんだから、そもそも考える必要性がないだろ?
164デフォルトの名無しさん:2006/05/06(土) 22:14:09
ていうか何がしたいねん
165デフォルトの名無しさん:2006/05/06(土) 22:20:46
キチガイ君は放って置けよwww
166デフォルトの名無しさん:2006/05/06(土) 22:41:47
エポック社といえば
167デフォルトの名無しさん:2006/05/06(土) 22:45:26
ビッグエッグ野球盤
168デフォルトの名無しさん:2006/05/06(土) 22:47:15
バーコードバトラー
169デフォルトの名無しさん:2006/05/06(土) 23:44:57
>>162
http://dev.perl.org/perl6/
Pugs含め現状どうなってるかは知らない
170デフォルトの名無しさん:2006/05/07(日) 00:13:35
おまいら責め杉だ
171デフォルトの名無しさん:2006/05/07(日) 00:17:03
use CGI::Util qw( expire_calc );

my $time = expire_calc('+7y'); # 3年後のエポック秒
日付に関しちゃ年によってずれるだろう。


172デフォルトの名無しさん:2006/05/07(日) 01:03:57
>>171
なにがずれるん?
173デフォルトの名無しさん:2006/05/07(日) 01:07:29
>>171
>use CGI::Util qw( expire_calc );

いや、それ、31日ある月の計算すらしてないよ。
my(%mult) = ('s'=>1,
'm'=>60,
'h'=>60*60,
'd'=>60*60*24,
'M'=>60*60*24*30,
'y'=>60*60*24*365);
を掛けてるだけだから。
174デフォルトの名無しさん:2006/05/07(日) 01:09:54
.exeっていうファイルもつくれるのか?この言語は
175173:2006/05/07(日) 01:11:30
>>172
閏年の計算してないんで、おそらく、2/29の有無によって、1年後の日付が1日ずれるって言いたいと思われ。
176デフォルトの名無しさん:2006/05/07(日) 01:18:10
今からn秒後が閏年であろうがなかろうがn秒後であることには変わりがない。
177デフォルトの名無しさん:2006/05/07(日) 01:22:16
>>174
反則技を使えばできないこともない。でも基本的にそういう言語ではない。
178デフォルトの名無しさん:2006/05/07(日) 01:25:21
>>175
要するに任意の日付までの秒数を求めようとしている人がいるわけね…
179デフォルトの名無しさん:2006/05/07(日) 01:32:38
日付は歴史と密接な関係があるからなぁ。
180デフォルトの名無しさん:2006/05/07(日) 01:36:32
こうまとめたらいいかな?

N秒後は + N (間違いなし)
N分後は + N*60 (閏秒でズレる)
N時後は + N*60*60 (閏秒でズレる)
N日後は + N*60*60*24 (閏秒でズレる)
N月後は + N*60*60*24*30 (31日の月、閏年、閏秒でズレる)
N年後は + N*60*60*24*30*365 (31日の月、閏年、閏秒でズレる)
181デフォルトの名無しさん:2006/05/07(日) 01:37:57
スルー
182デフォルトの名無しさん:2006/05/07(日) 01:56:54
>>177
ええええええ
俺がやりたいのは、市販のプログラム に乗っかって パケット解析しつつ
そのパケットをアルゴリズムで分析して(かなり原始的なアイデアはいくつかあるから実験したい)
 命令出す ってのなんだけど この言語でいけるかな?
トップ企業では普通にやってるらしいが
その関係者がにちゃんでぼろっと言ってたのだと、そいつはむかしperlつかって組んだらしい

ネトゲでマクロやってて正規表現の基本とかはわかってる
ただ、ネックだったのはパケットとアルゴリズムでした。

らくだ本と、アルゴリズムの基礎を学校の図書館で借りてきた。パケットはあとまわし。
とりあえず自動ログインツールをつくることを目標にしてるけど、

exeで動かさないなら、いちいちperl login.plとか打って起動させなきゃならんの?
login.pl の末端に autorun.plを起動させる文かいたりして、
条件 しだいで buy.plとかを動かす、とかそんなふうに組んでくの?

リアルタイムでどんな処理してるかビジュアルで把握したかったら、
別のプログラムが必要なんかな?VBちょっとやったことあるけど、あれは窓をすぐにつくれるじゃん?
183デフォルトの名無しさん:2006/05/07(日) 02:08:54
華麗にスルー
184デフォルトの名無しさん:2006/05/07(日) 02:28:09
>>182
>exeで動かさないなら、いちいちperl login.plとか打って起動させなきゃならんの?
>login.pl の末端に autorun.plを起動させる文かいたりして、
>条件 しだいで buy.plとかを動かす、とかそんなふうに組んでくの?

そうだよ
185デフォルトの名無しさん:2006/05/07(日) 02:31:02
閏秒や閏年に対応したけりゃ DateTime 使うか zic が leapsecond に対応した環境で
localtime() 使えばいいだけじゃないの?

>>180
「閏秒でずれる」という表現がおかしいでそ。
例えば「3分後」は 3 * 60 = 180秒後であって、間に閏秒を挟んでいても
それは変わらん。
186デフォルトの名無しさん:2006/05/07(日) 04:59:06
x/x/x x:x:x から n 秒後を y/y/y y:y:y
として、間に閏秒があった場合、
(y/y/y y:y:y)−(x/x/x x:x:x) ≠ n になっちゃうか。
187デフォルトの名無しさん:2006/05/07(日) 08:23:49
たとえば「1分後」といったときに、60秒後のことを言っているのか、
次の分の同じ秒のことを言っているのかをはっきりさせないまま
話しているのでなんだかよくわからなくなってるような。

前者の意味なら常に秒数だけ気にしていればいいが後者だと閏秒が
でてくる。

DateTimeだと1分後と60秒後は区別していて、1分後は閏秒こみだから
こんな例がマニュアルにある。

# 1971-12-31 23:59:30 - our starting datetime

$dt->clone->add( minutes => 1 );
# 1972-01-01 00:00:30 - one minute later

$dt->clone->add( seconds => 60 );
# 1972-01-01 00:00:29 - 60 seconds later

$dt->clone->add( seconds => 61 );
# 1972-01-01 00:00:30 - 61 seconds later
188デフォルトの名無しさん:2006/05/07(日) 11:13:22
過去の閏秒は分かっているからいいけど、未来だとどうしてもズレちゃうよね。
189153:2006/05/07(日) 12:08:48
とりあえずうるう秒以外に例外はないってことが分かっただけで十分です
ありがとうございました
190デフォルトの名無しさん:2006/05/07(日) 12:38:12
しかしまじめに閏秒の設定して使ってる人っているのかね?
今まで見たことないんだが。
191デフォルトの名無しさん:2006/05/07(日) 14:09:29
>>190
天文関係とか、年単位で正確な秒数が必要な科学技術計算では必須だよ。
192デフォルトの名無しさん:2006/05/07(日) 19:01:29
で、実際にそんな人見たことあるわけ?
193デフォルトの名無しさん:2006/05/07(日) 20:48:34
改行区切りの文字列("abc\ndef\nghi)を1行ずつ処理する方法ありますか?
地道にindexとsubstrやれば出来そうですが。
194デフォルトの名無しさん:2006/05/07(日) 20:55:08
@lines = split(/\n/, $string);

楽チンチン
195193:2006/05/07(日) 21:06:03
>>194
ありがとう。
splitは改行使えないと思いこんでた・・・orz
196デフォルトの名無しさん:2006/05/07(日) 21:34:12
よく天文学的な数字って言うけどPerlで桁足りるんだろうか。
use bignum 入れて速度保とうとすると面倒だしさ。

>>190
閏病を調整する人が使えば当然必要だーね。
197デフォルトの名無しさん:2006/05/07(日) 23:13:33
>>196
crackmeのkeygen作るのに、Math::BigInt使って、Perlで16進数16桁の平方を求めるとかはやったことあるけどね。
198デフォルトの名無しさん:2006/05/08(月) 07:21:37
s///ee
という表現があるようなんですが
これは何でしょうか?
eは置き換え後文字列部分を式評価するという意味
ですが、なんで二つ並んでいるの?
199デフォルトの名無しさん:2006/05/08(月) 08:04:03
(それを書いた人にとっては)見た目が良いから。
200デフォルトの名無しさん:2006/05/08(月) 08:24:43
>>198
式評価した結果を更に式評価したいから。
201198:2006/05/08(月) 09:14:16
>>200
ありがとう。でもよくわからない
202デフォルトの名無しさん:2006/05/08(月) 10:19:37
>>201
$_ = "aXb";
s/X/"1+1"/ => a"1+1"b
s/X/"1+1"/e => a1+1b
s/X/"1+1"/ee => a2b

まともなコーディングで二重評価する必要性のある例がなかなか思い浮かばないけど…何か良い例あるかね
とりあえずFAQ
ttp://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq4.html#how_can_i_expand_variables_in_text_strings
203デフォルトの名無しさん:2006/05/08(月) 11:00:38
>>146 ヽ(`Д´)ノ

>>147
ありがとうございます。結局こちらでは、

use encoding "cp932";
use open ":encoding(cp932)";
use open ":std";

と、最後に use open ":std"; を追加することで対応できました。
確かにencoding、馬鹿ではよく理解できない。。。

>>148
確かにcp932の問題ではなかったですね。失礼しました。
use openを付けたのは、実際の処理の際には、
テキストファイルを読み込む場合が多いので、
その状況も検証したかった、というのが理由です。

>>149
jperl時代のお手軽さに慣れてしまってたので。。。
204201:2006/05/08(月) 16:11:27
>>202
ありがとう。
とりあえずわかったけど
おっしゃる通り使い道が浮かばない
205デフォルトの名無しさん:2006/05/08(月) 16:36:55
>>202
> まともなコーディングで二重評価する必要性のある例がなかなか思い浮かばないけど…何か良い例あるかね

う〜む、具体的に思い出せないが、かつて「あれってこのためにあったのか!!」と
驚愕した記憶がある。
206デフォルトの名無しさん:2006/05/08(月) 17:39:21
中に書く式で自分でevalすりゃいい話のような気がするのだが、
それでは本質的にできないようなことなのだろうか?
207デフォルトの名無しさん:2006/05/08(月) 17:57:02
思い出せないんじゃしょうがない
208デフォルトの名無しさん:2006/05/08(月) 19:31:36
>>202
> まともなコーディングで二重評価する必要性のある例がなかなか思い浮かばないけど…何か良い例あるかね

どっかのカスCGIで、HTMLテンプレート展開ルーチンに
そんなのが使われてたのを見た記憶が。
209デフォルトの名無しさん:2006/05/08(月) 21:15:57
s/<\?php(.*?)\?>/$1/ee;
210ヽ(´ー`)ノ ◆.ogCuANUcE :2006/05/09(火) 02:05:12
まぁ普通にURLデコードとか。

s/%([[:xdigit:]]{2})/pack('H2', $1)/ge;
211デフォルトの名無しさん:2006/05/09(火) 02:46:04
>>210
一重じゃん。
212デフォルトの名無しさん:2006/05/09(火) 03:05:35
ワロス
213デフォルトの名無しさん:2006/05/09(火) 07:53:18
>ヽ(´ー`)ノ ◆.ogCuANUcE
>ヽ(´ー`)ノ ◆.ogCuANUcE
>ヽ(´ー`)ノ ◆.ogCuANUcE
214デフォルトの名無しさん:2006/05/09(火) 12:37:33
ee = Enterprise Edition

企業気分になれるんだよ。
215デフォルトの名無しさん:2006/05/09(火) 13:32:27
s/u//gee;
216デフォルトの名無しさん:2006/05/09(火) 14:49:57
ちょっとは、お役に立てるかな?
http://www.yukinko-net.jp/computer/download/downloadlist.htm
217デフォルトの名無しさん:2006/05/09(火) 19:47:30
Perlってなんでこんなに楽しいの?
218デフォルトの名無しさん:2006/05/09(火) 19:57:06
>>217
ラリってる奴が作ってるから。
219デフォルトの名無しさん:2006/05/09(火) 20:09:59
>>217
脳内麻薬物質が出てくるからです。
220デフォルトの名無しさん:2006/05/09(火) 20:11:15
ぶっちゃけ>>214に納得
221デフォルトの名無しさん:2006/05/09(火) 20:17:28
>>214は深いね。
222デフォルトの名無しさん:2006/05/09(火) 20:59:17
220,221=214
223デフォルトの名無しさん:2006/05/09(火) 21:24:58 BE:180428235-#
俺も思った
224ヽ(´ー`)ノ ◆.ogCuANUcE :2006/05/10(水) 00:44:44
>>211-213
すまん、全然読んでなかった…orz
225デフォルトの名無しさん:2006/05/10(水) 00:52:21
perlfaq7 に一つ、二重評価の例があるけど、あまり良い例じゃないな…。
226デフォルトの名無しさん:2006/05/10(水) 05:43:21
>>202
/e の多重評価って確か、意図した仕様じゃなくて、開発側も当初は気づかなかったけど結果として可能になっちゃってた、というモノだったと思ふ。

「面白いからそのまま feature にしようぜ」、というノリが Perl 流か。w
227デフォルトの名無しさん:2006/05/10(水) 07:29:35
winでホームディレクトリへ移動するにはどうすれば?
use Cwd;
chdir('~');
print Cwd::getcwd();

しても変化なし

228デフォルトの名無しさん:2006/05/10(水) 07:38:56
とあるディレクトリで
@list = glob('*');
print @list;
とすると
a.plb.plc.pl
となる

また、
$list = (glob('*'))[0];
print $list;
とすると
a.pl

これを
$list = glob('*');
print $list;
とすると
a.pl
となる
どうしてc.plにならないの?

たとえば
$str = qw(a b c);
print $str;
とするとcになるのに
229デフォルトの名無しさん:2006/05/10(水) 07:48:24
>>227
chdir($ENV{'USERPROFILE'});
230デフォルトの名無しさん:2006/05/10(水) 08:53:51
>>228
readlineと同じでスカラコンテキストではイテレータになるから
ドキュメントではファイル名グロブ<>の方かな
231デフォルトの名無しさん:2006/05/10(水) 09:29:04
>>229
さんくす!
でもこのUSERPROFILEっていう環境変数は誰が
セットしているの?
マイコンピュータ→環境変数とたどって一覧みたけど
USERPROFILEなんてなかったよ
win2000proですけど。
232デフォルトの名無しさん:2006/05/10(水) 09:37:17
EffectivePerlに載ってたんだけど

print "hello, " && print "goodbye.";

goodbye1
になるのはなぜ?

print "hello, " and print "goodbye.";
ならきちんと
hello, goodbye
となる

andと&&の優先順位の違いが原因だろうとは
思うんだけど具体的に何が起こっているのかわからない
233デフォルトの名無しさん:2006/05/10(水) 09:47:06
>>227
chdir の引数を省略するとホームディレクトリに移動する。参考まで。
HOME が未設定の環境でどうなるかは知らん。
234デフォルトの名無しさん:2006/05/10(水) 10:21:06
>>231
explorer.exe
235デフォルトの名無しさん:2006/05/10(水) 10:23:32
>>232
優先順位の問題。

print は引数にリストを取るので、連続したリストに見える後続の全てを引数として飲み込む。ひとつの文中で、print のようなリスト演算子モドキの後に何か別の処理を書く時にはこの動作に注意しなくてはいけない。
引数をそれぞれ () で括るのが最も万能の対策。() を使わずに何か後続させようとする場合は、より優先順位の低い not、and、or、xor のいずれか、あるいは制御構造修飾子を使うべし。

最初の && を用いた文は次のようにパースされる。

print( "hello, " && print( "goodbye.") );

perl はまず && の左辺 "hello, " を評価する。リテラル "hello, " は Perl の有効な真値であるため、次に右辺の print() が評価される。
print は出力に成功すると真値 '1' を返すのでこれも真と評価される。よって && の両辺が真となり、最後に評価された値である '1' が、最初の print の引数として渡され、それが出力される。

てな感じ。
236デフォルトの名無しさん:2006/05/10(水) 10:24:53
>>232

>print "hello, " && print "goodbye.";
print ("hello, " && (print "goodbye."));

>print "hello, " and print "goodbye.";
(print "hello, ") && (print "goodbye.");
237214:2006/05/10(水) 12:44:50
>>222-223
えっ、いや、それぶっちゃけちがう人だよ。
俺的にはぶっちゃけ>>215がSUGEEEEEEE!!!

s/a//ge;
238デフォルトの名無しさん:2006/05/10(水) 15:03:45
>>233
C:\>perl -MCwd -echdir(); -eprint(Cwd::getcwd());
C:/Documents and Settings/Administrator

おーう、知らなかったぜ
239デフォルトの名無しさん:2006/05/10(水) 16:03:16
>>233
なんだ単にchdirの引数省略すりゃよかったのか
どうもありがとうもー
240デフォルトの名無しさん:2006/05/10(水) 16:13:07
eachで頭が壊れそうです

my %hash = (a=>1, b=>2, c=>3);

foreach (each %hash)
{

print $_ , "\n";

}

この結果が
c
3
になるんだけど意味わからんのです
perldoc -f each
で読んでみると
eachはスカラーコンテキストで呼ばれると次のキーのみを返すとあります
foreach ()の()の中はスカラーコンテキストですよね?
なのにどうしてprint $_ , "\n";
の結果が
c
3
なんかになるのだろう

それと、どうしてハッシュ全体が$_にセットされないの?
foreach (each %hash)としたら
まず一回目のループでeach %hashされて一つ目がとりだされて
つぎのループでまたeach %hashされて二つ目がとりだされて
っていうふうにならないのはなぜ?
ループ一回しか回らんのですが
どういうからくりか教えてくださ・・・い
241デフォルトの名無しさん:2006/05/10(水) 16:18:36 BE:541282695-#
そのまんまじゃねえか
foreachに使う配列がeachで取り出した(c,3)になってる
ここでも参考にしてコード書き直せ

http://perl.misty.ne.jp/function01/each.html
242デフォルトの名無しさん:2006/05/10(水) 16:19:33
>>235
超わかりやすかった
さんくふぉーゆー
243240:2006/05/10(水) 16:20:51
>>241
あ、なるほど
うわぁああん
244デフォルトの名無しさん:2006/05/10(水) 16:57:59
perldoc -f each でサンプルプログラムまで出てくるというのに…
245デフォルトの名無しさん:2006/05/10(水) 17:19:50
そもそもforeach (...)のカッコ内がスカラーコンテキストだと思っている時点で間違い
246デフォルトの名無しさん:2006/05/10(水) 18:01:55
以前こんな風に書いてあるのを見たことがある。

$i = 0;
for $n (1..100) {
 $a[$i] = $n;
 $i++;
}

Perl の心を伝えるのは難しいものよのう。
247デフォルトの名無しさん:2006/05/10(水) 19:13:29
>>245
pritn for 1
これが構文的にはOKだしね
248デフォルトの名無しさん:2006/05/10(水) 19:23:34 BE:180427853-#
プリトン
249デフォルトの名無しさん:2006/05/10(水) 20:25:03
>>247
Unquoted string "pritn" may clash with future reserved word at - line 1.
Useless use of a constant in void context at - line 1.
- syntax OK


ほんとだ。syntax は OK らしい。
250デフォルトの名無しさん:2006/05/10(水) 20:49:17
>>245
そっかforeach(...)のカッコ内はリストコンテキストだったんだね
251デフォルトの名無しさん:2006/05/10(水) 23:16:03
コンテキスト以前に、foreachは()内を一回しか評価しないということ。
配列を返す関数get_array()でforeachは(get_array() ){...}
とか書いてもget_array()一回分の配列しか取らない。

eachで取り出した配列であるキーと値が一回分出てきている。
全ての値が見たいなら
print $_ , "\n" foreach (%hash);
とかでオケ
252デフォルトの名無しさん:2006/05/10(水) 23:20:26
てか
print join( "\n", %hash, "\n");

デバッグ目的なら
use Data::Dumper;
print Dumper( \%hash );
253デフォルトの名無しさん:2006/05/11(木) 00:31:15
>>252Data::Dumper超便利だねありがとー

>>251そっか単にハッシュをforeachでまわせばよかったのか
ありがとー

254デフォルトの名無しさん:2006/05/11(木) 01:21:05
「each は while のオプション」くらいの認識でだいたいヨシ。
255デフォルトの名無しさん:2006/05/11(木) 02:39:39
Perlのスレッドっていくらなんでも重過ぎない?
スレッドごとにインタプリタの環境を複製するから仕方ないのかな?
perl -e 'use threads;push(@TL,threads->new(sub{}))for(0..99);sleep 10;$_->join for(@TL)'
256デフォルトの名無しさん:2006/05/11(木) 05:51:01
>>255
うん、激重な上にメモリもかなり消費。
257デフォルトの名無しさん:2006/05/11(木) 09:51:08
文字コードをEUCかSJISかを変数で切り替えるようにしたいんだけどうまく表示できません
どうすればうまくいくんでしょうか?

$mozi_code="euc-jp";
#$mozi_code="sjis";


$str="文字コードテスト";

print "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=$mozi_code\">";
print "<HTML>";
&jcode'convert (*str,$mozi_code);

print "文字列=$str";
print "</HTML>";
258デフォルトの名無しさん:2006/05/11(木) 10:22:04
HTMLの勉強しる

print "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=$mozi_code\">";
print "<HTML>";
ってなによ。
259デフォルトの名無しさん:2006/05/11(木) 10:30:22
>>258
途中省略しただけ
これでもちゃんと表示できないんだけど

$mozi_code="euc-jp";
#$mozi_code="sjis";
$str="文字コードテスト";

print "<HTML>\n";
print "<HEAD>\n";
print "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=$mozi_code\">";
print "<TITLE>$title</TITLE>\n";
print "<BODY>";

&jcode'convert (*str,$mozi_code);

print "文字列=$str";

print "</BODY></HTML>";
260デフォルトの名無しさん:2006/05/11(木) 11:09:25
以下のサブルーチンが何やってるか意味不明です

sub is_tainted {
return ! eval {
join('', @_), kill 0;
1;
};
}

if(is_tainted($value))

などとして$valueが汚染されているかをチェックするらしい


join('', @_), kill 0;
が特に理解できない

kill 0でプロセスの状態がチェックできるのはわかったけど
いったいどのプロセスをチェックしてるんだ?
本当ならkill 0, xxxというふうにプロセスID指定しなきゃならんのでは?
261デフォルトの名無しさん:2006/05/11(木) 11:22:22
>>258
print "文字列=$str";

とりあえずこの「文字列=」の部分も変換すれ
262デフォルトの名無しさん:2006/05/11(木) 11:37:33
>>260
kill 0は汚染チェックされる物なら何でもよくて、特にkill 0でなければならないというわけではない。
たぶん実行しても他に影響なさそうなものということで選んだと思われる。

そしてなぜだかわからないがperlsec(1)の例にあるように、

$arg, `true`; # Insecure (although it isn't really)

汚染されたデータと危険な操作を,で並べたときも汚染チェックでNGになるので、is_taintedの
パラメタが汚染されていたときは実行時エラーの発生によりevalの戻り値がundefになる。
263デフォルトの名無しさん:2006/05/11(木) 12:35:56
&jcode'convert (*str,euc);だとうまくいくのに
&jcode'convert (*str,euc-jp);だとエラーがでるのはどうしてですか?
264デフォルトの名無しさん:2006/05/11(木) 13:14:15
なぜperl4
265デフォルトの名無しさん:2006/05/11(木) 13:25:49
>>263
jcode.plのconvertは文字コードの指定はeuc,jis,sjisのどれかしか受付けない。
euc-jpは結果的に空文字列になるがそのどれでもない。
266デフォルトの名無しさん:2006/05/11(木) 13:36:25 BE:757795897-#
素直にJcode.pm使った方が…
267デフォルトの名無しさん:2006/05/11(木) 13:39:23
>>265
ちょっ、euc-jp の結果は 0
268デフォルトの名無しさん:2006/05/11(木) 13:54:41
>>267
ありゃ、確認するために

print euc-jp;

としたら空文字列だったんだが、よくかんがえるとこれは
eucというファイルハンドルに-jpをprintしていたのか...
すまん。
269260:2006/05/11(木) 14:26:07
>>262
ごめん。理解できなかった

270デフォルトの名無しさん:2006/05/11(木) 14:58:43 BE:144342926-#
jcode.plの57-58行目読めよ
271デフォルトの名無しさん:2006/05/11(木) 14:59:39
EUCコードに改行って含まれるんでしょうか?
272デフォルトの名無しさん:2006/05/11(木) 15:07:16
&jcode'convertでEUCに変換するときソースコードの表示する文字列部分を一つずつ

&jcode'convert (*str1,euc);
&jcode'convert (*str2,euc);
&jcode'convert (*str3,euc);
というようにしなければならないのですか?

ページ全部一括でEUCに変換できないんですか?
273デフォルトの名無しさん:2006/05/11(木) 15:09:32 BE:144342926-#
含まれるんじゃないかな?
http://euc.jp/i18n/charcode.ja.html
274デフォルトの名無しさん:2006/05/11(木) 15:27:13
なんか凄い奴がいるな……。
正しい行き先教えてやれよ。
275デフォルトの名無しさん:2006/05/11(木) 15:34:14
>>273
つまりフォームから送信されたデータをファイルに書き込んで保存する場合は
EUCに変換して保存するのはやめたほうがいいということですね?
276デフォルトの名無しさん:2006/05/11(木) 15:36:24 BE:433026566-#
( ゚д゚)ポカーン
277デフォルトの名無しさん:2006/05/11(木) 16:17:37
>>275
>>1読んで。
278デフォルトの名無しさん:2006/05/11(木) 16:18:32
>>269
kill がシグナル送信に成功したプロセス数を返すことを思い出したら、
kill 0; の戻り値を確認するといいよ。

>>262 は、この(一見)無意味なkill 0; の役割だね。
279デフォルトの名無しさん:2006/05/11(木) 17:15:29
>>272
&jcode'convert (*all_str,euc);

>>275
どこをどう読むと(ry
280269:2006/05/11(木) 17:28:26
>>278
ありがとう。
でもごめん
もっとわからなくなった
281デフォルトの名無しさん:2006/05/11(木) 17:36:25
>>279
データの保存方法ですが

1:フォームから送信されたデータをEUCに変換して保存してEUCとして読み込んで表示する
2:フォームから送信されたデータをSJISで保存して読み込むときEUCに変換するして表示する

のどっちがいいか知りたかっただけです
それでどっちがいいんでしょうか?
282デフォルトの名無しさん:2006/05/11(木) 17:42:11
>>281
自分のすきな方でいいんじゃないかな。

保存より表示の回数が多いなら、保存時に変換しておくと変換回数を減らせる。
まぁ、効果は小さいものだろうけど。
個人的には、表示を EUC で行うなら EUC で保存しておくのが好みだけど。
283デフォルトの名無しさん:2006/05/11(木) 17:53:54
板違いはしょうがないとしても指摘されたら改めろ。
それを助長するように回答付ける方もカスだが。
284デフォルトの名無しさん:2006/05/11(木) 18:03:22
>>283
指摘されたのが自分だと気づいてないんじゃないだろうか。
285デフォルトの名無しさん:2006/05/11(木) 19:27:25
>>283
まぁもちつけ。
それから、もっとまともな指摘をしろよ。
286デフォルトの名無しさん:2006/05/11(木) 19:33:56
perlで以下のようなpasswdファイル文字列の"Hoge"の部分だけ小文字にしたいと考えています。
hoge:kwaKjt6IJ/rBs:1100:100:Hoge,,,:/home/hoge:/usr/bin/csh

区切りが:と,の2つあるので下のようにしました。

m/(.*):(.*):(.*):(.*):(.*):(.*):(.*)/;
@MA = split(',',$5);
$MA[0] = lc($MA[0]);
$MA2 = join(',',@MA);
print "$1:$2:$3:$4:$MA2:$6:$7\n";

ところがこれをおこなうと、小文字に変わりますが",,,"が消えてしまいます。
hoge:kwaKjt6IJ/rBs:1100:100:hoge:/home/hoge:/usr/bin/csh

,,,のところはnullだけでなく文字が入る場合もあります。
どうすれば
hoge:kwaKjt6IJ/rBs:1100:100:hoge,,,:/home/hoge:/usr/bin/csh
のようなかたちになりますか?
287デフォルトの名無しさん:2006/05/11(木) 19:40:11
>>286
splitのマニュアルを、良く読め。
3つ目のパラメータだ。
288デフォルトの名無しさん:2006/05/11(木) 19:43:45 BE:108257033-#
@MA = split(',',$5,-1);

とか
289デフォルトの名無しさん:2006/05/11(木) 19:55:43
(.*): より ([^:]*): の方が良くないか?
290デフォルトの名無しさん:2006/05/11(木) 20:01:09
>>286
s/(.*?:.*?:.*?:.*?:)(.*?):/$1.lc($2)/e;
291デフォルトの名無しさん:2006/05/11(木) 20:06:45
みなさんありがとうございます。
@MA = split(',',$5,-1); でうまくいきました。
292デフォルトの名無しさん:2006/05/11(木) 20:09:12
s/^((?:[^:]*:){4})([^,]*)/$1.lc($2)/e;
293デフォルトの名無しさん:2006/05/11(木) 20:57:22
>>285
まともな指摘がなされてると思うが

294デフォルトの名無しさん:2006/05/11(木) 21:09:19
>>259
取り繕ってもダメ。大文字でタグを書く人間がHTMLを勉強しているはずがない。
295デフォルトの名無しさん:2006/05/11(木) 21:50:26
>>294
論理的じゃない理論だが、納得。
296デフォルトの名無しさん:2006/05/11(木) 23:33:03
>>294
昔は、本文と区別しやすくするためにHTMLは大文字で書くのが良いとされていたのになぁ
297デフォルトの名無しさん:2006/05/12(金) 00:28:53
終戦直後はそうだったよなぁ
298デフォルトの名無しさん:2006/05/12(金) 01:05:18
>>296
>>259がその手の人とは思えませんが?
299デフォルトの名無しさん:2006/05/12(金) 01:24:25
一行ごとに print文使うのは突っ込むところじゃないのか?
300デフォルトの名無しさん:2006/05/12(金) 03:34:05
みんなマメだね。w
301デフォルトの名無しさん:2006/05/12(金) 03:39:50
Perlを愛するみんな!! ありあまっているそのパワーを、フリーソフトウェアを作ることに向けようよ!!

そうすれば、世の中少しは良くなるよ!!
302デフォルトの名無しさん:2006/05/12(金) 04:13:18
>>301
Perlを愛してるなんて気持ちはないと断言できる!
303デフォルトの名無しさん:2006/05/13(土) 03:17:41
WindowsXP proでwin32::DDEをインストールし
ppm install http://www.bribes.org/perl/ppm/Win32-DDE.ppd
Excelの一番左上のセル(C1R1)の内容を延々と表示するプログラムを書きました。

#!/Perl/bin/perl
$client = new Win32::DDE::Client ('excel', "Sheet1");
print sprintf('%06d ', ++$i), $client->Request ('R1C1') while 1;

32768回目(2^16 / 2)のリクエストから挙動がおかしくなり
49152回目(2^16 / 4 * 3)からは4回に1回しか値が取得できなくなり
65536回目で
「Undefined subroutine &main:: called at C:/Perl/site/lib/Win32/DDE/Callback.pm line 46.」
とエラーを吐きます。このエラーをググると
http://www.google.com/search?num=50&hl=ja&ie=UTF-8&oe=UTF-8&q=%22Callback.pm+line+46%22&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=
2件ヒットしますが解決に至りませんでした。
何かいいアイディアはありませんでしょうか。
304デフォルトの名無しさん:2006/05/13(土) 08:30:11
>>303
以前 Win32::DDE 使ったことあるけど、おれもエラーが出た。
そのときソース(Win32::DDE のperl部分)もみたけどよく分からなかった。

Win::32::DDE::Callback には

TO DO
Test, debug, document; this hasn't been touched since the original version, and
doesn't seem to be used by Win32::DDE::Client, so no rush :)

と書かれてるけど、Win32::DDE::Client によって使われてるし。

2^15 や 2^16 回でエラーが発生してるということは、モジュール自体あたりのバグかも
しれないね。
Win32::DDE ではなく、Win32::API を使うという方法はどうかな。
305デフォルトの名無しさん:2006/05/13(土) 10:30:58
PDFを読めるようなモジュールってないでしょうか。
今はpdftotextを呼び出して使っているんですが、
その部分を自分で作ってしまえればすっきりするかなぁと思っています。
306デフォルトの名無しさん:2006/05/13(土) 10:39:48
http://search.cpan.org/search?query=PDF&mode=all
いろいろあるようだけど、どれがおすすめとかは知らない
307305:2006/05/13(土) 11:07:44
>>306
ありがとうございます。

実はすでにモジュールのサーチはしてたんですが、
作るためのモジュールと読み出すためのモジュールの区別も付かなかったんです。
英語力なさ過ぎです。
せめてサンプルプログラムでもあれば想像で何とかできるんですが…。
308デフォルトの名無しさん:2006/05/13(土) 11:26:39
特定のコマンドラインオプションが指定されていた場合は
指定されたファイルに出力
されていなかった場合は標準出力
というように処理を分けたいのですが、何かいい方法はないでしょうか
今はいちいち if で処理を分けているのですが
けっこう量が多いので面倒なのです

$ some_script.pl -o foo.txt
foo.txt に結果を書き込む
$ some_script.pl
結果を標準出力する
309デフォルトの名無しさん:2006/05/13(土) 11:33:11
>>304
ありがとうございます。
XSの方のソースをちょっと眺めてみます。
9年前に作成されたモジュールでVer0.02だから多くを求めるのは無理なのかもしれませんねーー)
310デフォルトの名無しさん:2006/05/13(土) 12:02:11
>>308
リダイレクトじゃだめなのかい
some_script.pl > foo.txt
311デフォルトの名無しさん:2006/05/13(土) 12:15:12
>>308
select
open STDOUT,...
open $fh,'>&STDOUT' や $fh = *STDOUT
312デフォルトの名無しさん:2006/05/13(土) 12:48:33
>>308
つーか その出力用のメソッド作れば?
313デフォルトの名無しさん:2006/05/13(土) 12:53:56
それはなんか美しくないなぁ
314デフォルトの名無しさん:2006/05/13(土) 13:30:14
open FILE, ...
select FILE;

de ii jan.
むしろ >>310 でいいじゃん。
315308:2006/05/13(土) 14:21:17
>>310
すみません、書き忘れていました
途中経過を標準出力したかったので
リダイレクトは使いたくなかったのです
>>311 でうまいこと実現できたのでこれを使わせていただきます
どうもありがとうございます
316デフォルトの名無しさん:2006/05/13(土) 15:42:56
途中経過はSTDERRに出せばええやん…
317デフォルトの名無しさん:2006/05/13(土) 16:08:21
それはなんか美しくないなぁ
318デフォルトの名無しさん:2006/05/13(土) 19:55:37
use strict; しちゃうと、どうやってもtrue/false は使えなくなるの?
319デフォルトの名無しさん:2006/05/13(土) 21:03:32
Perlにはtrue/falseのリテラルないよ
320デフォルトの名無しさん:2006/05/13(土) 21:10:10
0と1でいいじゃん
321デフォルトの名無しさん:2006/05/13(土) 22:07:14
use constant false => 0;
use constant false => 1;

じゃ駄目なん?
322デフォルトの名無しさん:2006/05/13(土) 22:07:50
うわ、コピペミス
use constant true => 1;
ね。


323デフォルトの名無しさん:2006/05/13(土) 23:05:15
win2kのコマンドプロンプトでactiveperlを使っています
テキストの表示で、一部だけ色を付けるにはどうすればいいですか?
config.sys書き換えて、とかは無しの方向で
324デフォルトの名無しさん:2006/05/13(土) 23:13:39
>>323
Term::ANSIColor
Win32::Console::ANSI
325デフォルトの名無しさん:2006/05/13(土) 23:49:56
>>323
自前でエスケープコード送ったりする方法も使えるかも。一応。
モジュール使う方が断然いいけど。
326デフォルトの名無しさん:2006/05/14(日) 00:20:42
エスケープコードは、cmd.exeが無視するので使えません
ansi.sysを組み込んでcommand.comから起動すると使えるようですが、
それはあまりに一般的でないので避けたい
327デフォルトの名無しさん:2006/05/14(日) 03:49:46
無視するので使えません
って自分で言ってんじゃん。
328デフォルトの名無しさん:2006/05/14(日) 05:26:52
cmd.exe では使えないけど、command.com では使えるってことじゃまいか。
ま、モジュール使うということでよさそうだけど。
329デフォルトの名無しさん:2006/05/14(日) 11:22:33
いやいや、cmd.exeで動いてる他のexeファイルで
カラー表示してるのは普通にあるから、ESC[31m とかに頼らなければ
方法はある筈なんだけど、perlでどうやるんだろうと

Term::ANSIColor は試してみたけど、エスケープコードを代わりに
出してくれるだけだったので効かなかった
330デフォルトの名無しさん:2006/05/14(日) 11:33:07
Win32::Console::ANSI がそれを解決するのか

Windows NT/2000/XP does not support ANSI escape sequences in
Win32 Console applications.
This module emulate an ANSI console for the script which uses it.

でもインストールの敷居が高い
331デフォルトの名無しさん:2006/05/14(日) 11:54:32
nmakeはなんとか落としてきたけど、
Cコンパイラは何を使えばいいんだろう
332デフォルトの名無しさん:2006/05/14(日) 11:57:47
>>329
ここで聞く質問じゃないな。
333デフォルトの名無しさん:2006/05/14(日) 12:21:29
PerlはLinuxでは大体/usr/lib/perl5/にインストールされますが
下記のディレクトリ構成はどういう基準で分けられているのでしょうか?


root@localhost [/usr/lib/perl5]# ls
5.8.3/ 5.8.4/ 5.8.5/ 5.8.6/ 5.8.7/ 5.8.8/ site_perl/ vendor_perl/
334デフォルトの名無しさん:2006/05/14(日) 13:26:52
>>333
みての通り、Perlのバージョンによってわけられてる。
perl5/VERSION/がバージョン別のコアライブラリ
perl5/site_perl/VERSIONがバージョン別の追加ライブラリ
vendor_perlとsite_perlの違いはよく分からん。
335デフォルトの名無しさん:2006/05/14(日) 13:40:43
>>334
ありがとうございます。
/usr/lib/perl5/直下にコアライブラリがあって
site_perlとvender_perlは追加ライブラリって事なんですね。
いろんなバージョンが共存できるから、バージョン毎にディレクトリがあるのでしょうか?

FedoraCoreではrpmで入れるとvender_perlに入って、cpanから入れるとsite_perlに
入るらしいですけど、なんで2つに分かれてるんでしょうね。。。
336デフォルトの名無しさん:2006/05/14(日) 13:47:28
>>332
perlでできるって
337デフォルトの名無しさん:2006/05/14(日) 15:03:54
>>336
できるかできないかじゃないだろ? 正真正銘のアホだな。
それがありならCGIの質問だってOKってことか?
338デフォルトの名無しさん:2006/05/14(日) 15:10:33
>>330-331
ppm install Win32-Colsole-ANSI
でよくね?
339デフォルトの名無しさん:2006/05/14(日) 15:14:38
>>337
Perlがかかわってるならなんでもいいよwww
340デフォルトの名無しさん:2006/05/14(日) 15:15:59
>>335
まさかきみサーバ運用する気って訳じゃないよね?
341デフォルトの名無しさん:2006/05/14(日) 15:20:26
>>340
ご安心ください。。。
外部に公開する気は今の所全くありません。
単にperlの勉強を始めようと思って、環境を作ろうとしているだけですので。
342デフォルトの名無しさん:2006/05/14(日) 16:28:57
>>341
あ、いや、偉そうにごめん。
343デフォルトの名無しさん:2006/05/14(日) 17:29:57
>>338
Error installing package 'Win32-Colsole-ANSI': Could not locate a PPD file for package Win32-Colsole-ANSI
となります
何か下準備が要る?
344デフォルトの名無しさん:2006/05/14(日) 17:38:44
タイプミスですた
345デフォルトの名無しさん:2006/05/14(日) 17:43:04
ということで、カラー表示できました
以下サンプルプログラム

use Term::ANSIColor qw(:constants);
use Win32::Console::ANSI;
$Term::ANSIColor::AUTORESET = 1;
print BOLD RED "RED\n";
print BOLD GREEN "GREEN\n";
print BOLD BLUE "BLUE\n";
346デフォルトの名無しさん:2006/05/14(日) 18:23:43
#!/usr/local/bin/perl
print "あなたのお名前を教えて下さい。入力(ローマ字)=>";
$yourname = <STDIN>;
print "こんにちは、$yournameさん\n";

は実行できるんですが

#!/usr/local/bin/perl
$greeting = "こんばんは";
$name = "三島";
&prt_message2($greeting,$name);

sub prt_message2{
print "$_[0]、$_[1]さん","\n";
}

はコマンドプロンプトがでてきません
違いはフォルダが違うだけなんですが
どう対処したらいいでしょうか??
347346:2006/05/14(日) 18:28:57
ダブルクリックで起動させようとしました
348346:2006/05/14(日) 18:53:27
いつもperl command line interpreterで開いてます

何度もすみません
よろしくおねがいします
349デフォルトの名無しさん:2006/05/14(日) 20:11:58 BE:96228342-#
多分、物凄い速さでウィンドウが
350346:2006/05/14(日) 20:22:07
そうです
それをとめる方法はどうしたらいいでしょうか??
調べたらプロパティをいじくると書いてあったんですが
みても書いてありませんでした
CMDですよね??
351デフォルトの名無しさん:2006/05/14(日) 21:13:08
【すいません演算子】

記述
<> =~ m(_ _)m;

効果
変なプログラムでごめんなさいと思ったところに挿入すると
一時的に停止して確認できるようになります。

副作用
CGIでつかうと何が起こるかわからないので決して使わないでください。
352346:2006/05/14(日) 21:35:00
ちがうすれいきます
353デフォルトの名無しさん:2006/05/14(日) 21:36:08
>>351
ワラタ。あんた最高。
354デフォルトの名無しさん:2006/05/14(日) 21:58:56
cpanからモジュールをインストールするときはinstallでOKですが
削除するときのコマンドってありますか?
355デフォルトの名無しさん:2006/05/14(日) 22:15:39
rm
356デフォルトの名無しさん:2006/05/14(日) 22:26:20
>>355
それはcpanからではなくて、直接削除しちゃえばいいっていうことですか?
357ヽ(´ー`)ノ ◆.ogCuANUcE :2006/05/14(日) 22:41:23
1. CPANPLUS
2. packlist の中身を rm で削除
358デフォルトの名無しさん:2006/05/14(日) 22:48:24
コマンドプロンプトで普通
C:\perl>にしたら
hello.plをデスクトップにおいて
コマンドプロンプトでperl hello.plを実行すると実行できるんですが
あるデータをデスクトップにおいて同じ事をするとデータが見つからないって言われるんですけど…どうしたらいいでしょう?
359デフォルトの名無しさん:2006/05/14(日) 23:10:04
日本語でおk
360違うスレからきました:2006/05/14(日) 23:17:51
すみません
うまくかけませんでした
Can't open perl script "hello02.pl": No such file or directory
とでたんですがどうしたらいいでしょうか??
デスクトップに置いてあるんですが
361デフォルトの名無しさん:2006/05/14(日) 23:24:03
>>358
C:\perl\ の下にもhello.plがある
に一票!

普通は実行したいスクリプトのあるところまで移動してから実行する
(c:\perlにはパスが通っていること)
362デフォルトの名無しさん:2006/05/14(日) 23:25:37
>>360
そう名乗るのが流行ってるの?何なの?
Perlコーディング初心者質問スレ Part 48
http://pc8.2ch.net/test/read.cgi/php/1146042050/456
363358:2006/05/14(日) 23:26:49
>>361さん
C:\perlってPROGRAMFILESの中にありますよね?みたらないんですが…
364358:2006/05/14(日) 23:28:59
検索かけたらありました…なぜだ……orz
一つ疑問なんですがhello.plをダブルクリックするとコマンドプロンプトがすぐ消えるんですが消えなくできませんか?
365デフォルトの名無しさん:2006/05/14(日) 23:35:09
最後にsleep(5);でも入れとけ
366デフォルトの名無しさん:2006/05/14(日) 23:35:59
>>363-364
Windowsの基本を勉強した方がいい気がします。
C:\perl\ は C:\perl\ です。
C:\Program Files\ は C:\Program Files\ です。
ぜんぜん別物です。

基本はコマンドプロンプトを開いてそこから実行すべきです。
どうしても直接実行してそのまま開いておきたい場合は、
BATファイルに記述してプロパティで継続オプションを有効にしてください。
367デフォルトの名無しさん:2006/05/14(日) 23:38:37
ありがとうございます
調べたらoggdropXPdでもできるらしいですね
知識ない俺には無理だ…
368デフォルトの名無しさん:2006/05/15(月) 00:04:45 BE:769824588-#
もうね…
369デフォルトの名無しさん:2006/05/15(月) 10:46:36
>oggdropXPd
( ゚д゚) …。
370デフォルトの名無しさん:2006/05/15(月) 13:43:59
あまりにプログラミング以前過ぎてワロタ
371デフォルトの名無しさん:2006/05/15(月) 18:03:20
質問です。
<TABLE border="1" >
<TBODY>
<TR>
<TD>お名前(必須)</TD>
<TD><input type="text" size="30" name="name" id="name"></TD>
</TR>
<TR>
<TD>■メールアドレス(必須)</TD>
<TD><input type="text" size="30" name="mail"><BR>
<input type="text" size="30" name="mail2">(確認用)</TD>
</TR>
</TBODY>
</TABLE>
これの、nameを指定する時、$in{'name'}で参照に行ってくれません。
どう書けばいいの?
372デフォルトの名無しさん:2006/05/15(月) 18:18:34
>>371
ソースも何も無しでは、全く我々には分かりません。
WebProg板でどぞ
373デフォルトの名無しさん:2006/05/15(月) 19:06:16
>>371
つまり君の書いたプログラムを想像しろと、こう言いたいわけですね。
あるいは君の書いたプログラムが保存されているコンピュータを
クラックしてソースを見ろと、こうおっしゃる。
374デフォルトの名無しさん:2006/05/15(月) 20:19:36
>>371
PHPみたいに、変数に自動で設定はされませんよ。
375デフォルトの名無しさん:2006/05/15(月) 20:40:28
>>373
それくらいやってやれよ
376デフォルトの名無しさん:2006/05/15(月) 20:47:06
>>375
やったけどスパゲッティだったんで萎えた
377デフォルトの名無しさん:2006/05/15(月) 21:29:36
>>375
エスパーの俺にまかせろ!

%in = map{s/\+/ /g;s/%([\da-fA-F]{2})/chr hex$1/eg;$_}map{split/=/,$_,2}split/&/,$ENV{QUERY_STRING};
378デフォルトの名無しさん:2006/05/15(月) 21:40:56
>>371
で <FORM> が無いってどういうことだ?!
379デフォルトの名無しさん:2006/05/15(月) 22:22:24
みんなやさしいな
380デフォルトの名無しさん:2006/05/16(火) 01:43:02
インストールに関する質問もこちらでよろしいでしょうか?

RedHat Enterprise AS3なレンタルサーバにperl-5.8.8をインストールしようとしているのですが
make testの段階でSys::syslogのモジュールのテストが失敗します。

ちなみに/usr/local/src下でソースのコンパイルを行っているのですが
/usr/local/src/perl-5.8.8/ext/Sys/Syslog下でmake testを行うと

# Error: Can't load '/usr/local/src/perl-5.8.8/ext/Sys/Syslog/blib/arch/auto/Sys/Syslog/Syslog.so' for module Sys::Syslog: \
/usr/local/src/perl-5.8.8/ext/Sys/Syslog/blib/arch/auto/Sys/Syslog/Syslog.so: undefined symbol: PL_sv_undef at /usr/lib/perl5/5.8.0/i386-linux-thread-multi/DynaLoader.pm line 229.
# at (eval 1) line 2
# Compilation failed in require at (eval 1) line 2.
t/00-load......NOK 1# Looks like you failed 1 tests of 1.
t/00-load......dubious
Test returned status 1 (wstat 256, 0x100)
DIED. FAILED test 1
Failed 1/1 tests, 0.00% okay
とか
# doesn't match '/^This is not a valid Sys::Syslog macro/'
t/constants....NOK 1# Failed test (t/constants.t at line 20)
# '&Sys::Syslog::constant not defined at (eval 3) line 1
こんなのがたくさん出ます。

なにが原因なのでしょうか?
381デフォルトの名無しさん:2006/05/16(火) 11:16:21
以前ここでwindowsで.plファイルをダブルクリックで実行
するとコマンドプロンプトが開くがすぐに閉じてしまうという
質問に対して.batファイルを使った便利な解決策を伝授し
てもらいました

perl %1
pause

このようなバッチファイルを.plファイルと関連付けることで
ダブルクリックで.plファイルを起動してもコマンドプロンプト
は閉じなくなるということでした
ところがこのバッチファイルの名前を
perl.bat
とすると変なことになります。

例えば
print 1;
というf:\perl\a.plファイルをperl.batに関連付けて実行すると
延々とperl "f:\perl\a.pl"
が表示され続け、また1というprintもされません
これはどういうことが起こっているのでしょうか?

382デフォルトの名無しさん:2006/05/16(火) 11:24:17
perl %1
にしてるからperl.batがperl.batを延々呼び続けてるんじゃないの。
perl.batをやめるか、バッチファイル内のperl.exeをフルパスで書けばいいんでない。

C:\perl\bin\perl %1
pause
383デフォルトの名無しさん:2006/05/16(火) 11:26:30
>>380
RedHat または Linux 関係のスレで聞くべし。
384デフォルトの名無しさん:2006/05/16(火) 11:26:39 BE:216513836-#
つーかもはやPerlの質問じゃないだろ…
Windows板でやれ
385381:2006/05/16(火) 11:46:27
>>384
ごめんなさい

>>382
そっか.batの拡張子は無視されちゃんだ
ありがとうございます
386デフォルトの名無しさん:2006/05/16(火) 11:49:52
Benchmarkについて質問です

use Benchmark;

$count = 100000000000;

timethese( $count, { test1 => 'test1', test2 => 'test2' }

sub test1 { ...}

sub test2 { ...}

これをやろうとすると$countが桁数多すぎるみたいで
Range iterator outside integer range at (eval 4) line1.
とエラーになってしまいます。
確か通常のperlが扱うintegerよりもずっと大きい桁数を
扱えるようにする標準モジュールがあったような気がする
のですが…

どのような解決策があるでしょうか?
387デフォルトの名無しさん:2006/05/16(火) 12:03:08 BE:192455982-#
bignumじゃね?
388デフォルトの名無しさん:2006/05/16(火) 12:10:35
>>387
use bignum;
いれたけど同じエラーになります
389デフォルトの名無しさん:2006/05/16(火) 12:20:25
Benchmark.pmの方にも
use bignum;
を入れると違うエラーになりました
runloop unable to compile '': Constant(undef): $^H{integer} is not defined at (e
val 10) line 1, at end of line
Constant(undef): $^H{float} is not defined at (eval 10) line 1, at end of line

code: sub { for (1 .. 10000000000000) { local $_; package main; ;} }
at F:\perl\test.pl line 7

こりゃお手上げじゃー
390デフォルトの名無しさん:2006/05/16(火) 12:38:05
>>389
bignumのマニュアルに以下のようにあるのでだめだね。

Please note the following does not work as expected (prints nothing),
since overloading of '..' is not yet possible in Perl (as of v5.8.0):

perl -Mbignum -le 'for (1..2) { print ref($_); }'

そこだけなら範囲演算子使わないように書き換えればなんとかなるんじゃね?

for($_ = 1; $_ <= 100000000000; $_++) { ... }

みたいに。隠れていた別の問題がでるだけかもしれんが。
391デフォルトの名無しさん:2006/05/16(火) 12:42:18 BE:216514229-#
392デフォルトの名無しさん:2006/05/16(火) 13:23:58
[
use constantの「定数」は、
実は定数を返すsubなので、
sigil ($@%&*)が定数から消えてしまう
]

use constant A => 'xx';

sub A { 'xx' }
と同義だというのはわかったのですが、

sigil ($@%&*)が定数から消えてしまう

というのが理解できません

コードで具体例を教えてもらえませんか?
393デフォルトの名無しさん:2006/05/16(火) 13:41:03
>>392
単に頭に sigilが付けられないから
スカラなのか配列なのか、何なのかよく分からなくなるという意味では
394デフォルトの名無しさん:2006/05/16(火) 14:27:04
>>393
あっそういう意味でしたか
どうもさんくすべりまっちゅ
395389:2006/05/16(火) 14:38:01
>>390
Benchmark.pmの635行あたりにあった

$subcode = "sub { for (1 .. $n) { local \$_; package $pack; &\$c; } }";



$subcode = "sub { for(my \$int = 1; \$int <= \$n;\$int++) { local \$_; package $pack; $c;} }";

にしたらとりあえず動いてるっぽい
でも
timetheseに10000000000000も指定しちゃうと
ベンチ終わんない..
396デフォルトの名無しさん:2006/05/16(火) 17:35:17
>>386
sub test1 { ...}



sub test1 { for ( 0...9999 ) { ... } }

という風にするとかは。
397デフォルトの名無しさん:2006/05/16(火) 18:04:11
>>395
そもそも何で10兆回も反復させる必要が?
一秒当たりの実行回数を測れれば充分じゃない?

http://search.cpan.org/~nwclark/perl-5.8.8/lib/Benchmark.pm
> The COUNT can be zero or negative: this means the minimum
> number of CPU seconds to run. A zero signifies the default of
> 3 seconds. For example to run at least for 10 seconds:
>
>  timethis(-10, $code)
398デフォルトの名無しさん:2006/05/16(火) 18:10:38
test1を10000回繰り返す関数を作るとか。
関数呼び出しのオーバヘッドが気になるかな?
399デフォルトの名無しさん:2006/05/16(火) 19:00:15
>>397
ソレダ
400デフォルトの名無しさん:2006/05/16(火) 19:15:47
ベンチマーク用に遅いマシンを確保しておくという方法。
401デフォルトの名無しさん:2006/05/16(火) 19:24:43
$#LIST、これが要素数を変えなさいのって言語の設計的なミス?
for (my $i; $i<$#LIST; $i++) {
$LIST[$i] = ...
こう書ける方が自然だと思うんだけど
402デフォルトの名無しさん:2006/05/16(火) 19:32:34
foreach my $i (0 .. $#LIST) {
 $LIST[$i] = ...
}
こっちを想定したんじゃないかな
403デフォルトの名無しさん:2006/05/16(火) 19:35:14
>>401
配列はスカラコンテキストで要素数を返す。
for (my $i; $i<@LIST; $i++) {
$LIST[$i] = ...
404デフォルトの名無しさん:2006/05/16(火) 20:43:07
my @LIST = ( A..Z );
print $LIST[$#LIST]; # Z
$#LIST = 5;
print $LIST[$#LIST]; # F
push @list, '-';
print $#LIST; # 6

言語仕様のミスだなんてとんでもない。
405デフォルトの名無しさん:2006/05/16(火) 21:22:50
>>404
>$#LIST = 5;
これだけど、0を代入しても先頭の要素が残るのってあんまり直感的じゃないような・・・
406389:2006/05/16(火) 21:31:25
>>396
なるほど!!!全然思いつかなかった

>>397
全然知らなかった。次からはそれ使います

>>398
実用Perlって本に変数をサブルーチンに渡すときに
普通にsub1(@list)って渡すと配列のコピーのオーバヘッドが
出ちゃうからそれを回避する策としてリファレンス渡しと
型グロブ渡しの二つがあって、型グロブ渡しの方が1.5倍速い
って書いてあったのでBenchmark使って
timethese(1000,ほにゃらら)って実験してみたら
warning: too few iterations for a reliable count
てなってループ少なすぎて速度差出ませんってなったから
もっと増やしてやろうとしたのでした
407404:2006/05/16(火) 22:08:30
>>405
それは仕方ない

配列のクリアは
@list = ();
undef @list;
好きな方を選べ

どうせ↓で配列クリアできたとしても↑と比べて感覚的に理解しづらいだろ。
$#LIST = 0;

$#は最後の添え字、それで十分
408デフォルトの名無しさん:2006/05/16(火) 22:31:16
@list = qw(10 20 30);
sb(*list);
print "@list";

sub sb{
*copy = shift;
foreach (@copy) { $_++}
}

これだと出力は
11 21 31
になります

shiftを$_[0]と変えても
11 21 31
のままです

ところが
shiftを@_に変えると
10 20 30
となってしまいます

なんで---
409デフォルトの名無しさん:2006/05/16(火) 23:23:06
>>408
(*copy) = @_;
410408:2006/05/17(水) 04:21:05
>>409
11 21 31
になりましたありがとうございます

でもどうしてカッコで括るだけでうまくいったの?
どういう原理なの?
411デフォルトの名無しさん:2006/05/17(水) 07:28:40
sub a {
my @a = @_;
print "@$a";
}

my @a = (a, b, c);
a(\@a);

サブルーチンに配列のリファレンスを渡して
サブルーチン内でそれをデリファレンスして表示したいのですが

これの結果に何も表示されません
a b cと表示されることを期待しているのですが
どこがまずいのでしょうか?
412デフォルトの名無しさん:2006/05/17(水) 07:36:08
sub a {
my $a = shift;
print "@$a";
}

リファレンスはスカラだから、配列じゃないよ
413デフォルトの名無しさん:2006/05/17(水) 07:38:24
>>411
use strict; してる?
414411:2006/05/17(水) 07:45:55
ばかでした失礼しました
ありがとうでした
415デフォルトの名無しさん:2006/05/17(水) 07:48:51
Perl一本で仕事ありますか?
416408:2006/05/17(水) 07:53:23
>>408
なんだけどいくら考えてもわかりません
例えば*copyが型グロブじゃなくてスカラーだったら
@_ = qw(a);
$copy = @_;
としちゃうと$copyにはaじゃなくて1が入ってしまうから
($copy) = @_;
としなきゃいけないってのはわかるんだけど
@_ = *list;
*copy = @_;
がうまくいかないのに
(*copy) = @_;
がうまくいくのはなんでなんだろう
たすけてください
417デフォルトの名無しさん:2006/05/17(水) 08:48:00
>>416
デバッガでシングルステップ実行してみるといいよ。
418デフォルトの名無しさん:2006/05/17(水) 09:01:45
>>416
*copyがスカラーだから。$copyと理由は一緒。

419デフォルトの名無しさん:2006/05/17(水) 09:26:21
てか、型グロブってきんもー☆だから極力避けたくね?
420デフォルトの名無しさん:2006/05/17(水) 09:48:11
>>419
避ける。
こんな変態行為覚えちゃったら、Perlから離れられなくなっちゃうと
思ってる。
421デフォルトの名無しさん:2006/05/17(水) 12:37:48 BE:541283459-#
今時型グロブて…
422デフォルトの名無しさん:2006/05/17(水) 12:54:58
BEログインして書き込んでいる人が煽ってばっかりのクソレスばっかりでうざいんですけど
423デフォルトの名無しさん:2006/05/17(水) 12:59:18 BE:384912948-#
そうですか。
424デフォルトの名無しさん:2006/05/17(水) 13:07:12
>>421
いいじゃないか型グロブ
「もっとエレガントな方法があるじゃないか」と言いたいだろうけど、
そのエレガントな方法を生み出すためには型グロブが必要なんだぜ?
425デフォルトの名無しさん:2006/05/17(水) 13:12:29
バッドノウハウの極地だな。
426デフォルトの名無しさん:2006/05/17(水) 13:14:10
個人的には嫌いで使ってないけど、ありだと思う型グロブ。
だってPerlだし。
427デフォルトの名無しさん:2006/05/17(水) 16:46:38
PerlのtieはC#のプロパティとほぼ同義と考えてよいでしょうか?
428デフォルトの名無しさん:2006/05/17(水) 17:51:45
libwww-perl(LWP)モジュールのインストールについて質問です。

多分インストールしなくても最初から入ってると思うんですけど、
HTTPアクセス関連の動作がおかしい(※)ようなので
関連モジュールをもう一度インストールしようとやってみましたがうまくいきません。

perl Makefile.PL
make
make test

までは普通に進み、「All tests successful.」と出るのですが

make install

とすると、lwp-requestのところで

Can't find string terminator "@" anywhere before EOF at -e line 1.

というエラーが出て終わってしまいます。
ppmもcpanシェルも、それぞれ別のエラーで失敗するので諦めました。

環境は以下の通りです。どうしようもなくて困っています。どうか助けて下さい。
OS…WinMe
Perl…ActivePer5.8.8.817
LWP…libwww-perl-5.805
Cコンパイラ…Borland C++ Compiler

(※動作がおかしいというのは以下のリンク先の質問のような症状です。
基本となるURLみたいなものがブラウザにちゃんと渡されていないようです。)
http://oshiete1.goo.ne.jp/kotaeru.php3?q=2143752

よろしくお願いします。
429デフォルトの名無しさん:2006/05/17(水) 17:55:54
お前らRubyスレ荒らすなよ

ったくクソどもが!
430デフォルトの名無しさん:2006/05/17(水) 18:04:11
Rubyスレ荒れてんの?
面白そうだから俺も荒らしに行こ。
431デフォルトの名無しさん:2006/05/17(水) 18:42:01
>>429
見てきたが、あれでPerlスレの住人を疑うって凄い被害妄想だな。
Perl6ならともかくPerl5はRubyとほぼ棲み分けされてるだろう。

そんなんだから荒らしを退治できないんじゃない?

>>430
py厨乙
432デフォルトの名無しさん:2006/05/17(水) 19:12:25
型グロブでprint関数のデフォルト出力先を変えられる?
433デフォルトの名無しさん:2006/05/17(水) 19:39:47
>>432
>>308-
434デフォルトの名無しさん:2006/05/17(水) 19:57:34
>>433
open my $fh,">foo.txt";
*STDOUT=$fh;
print "aaa";

これでいけました。どうもありがとう。
435デフォルトの名無しさん:2006/05/17(水) 20:25:18
>>434
それをやるなら、普通は
open my $fh,">foo.txt";
select $fh;
print "aaa";
だが。
436デフォルトの名無しさん:2006/05/17(水) 20:53:04
>>435
ほうほう、selectってそういう関数だったのか。
勉強になりました
437デフォルトの名無しさん:2006/05/17(水) 22:19:06
局所化した関数を再帰処理させるってできますか?
sub foo(){
  my $var = sub(){
          $var->();
         }
}
みたいな感じですが。
438303:2006/05/17(水) 22:56:17
Win32::DDEを諦めWin32::APIを利用してUser32.dll経由でDDEを利用しようとしたのですが
根本的な知識に乏しく簡単なサンプルプログラムも作れませんでした。
途中で挫折したExcelの一番左上のセルの情報を取得するプログラムです。

use Win32::API;
$sendData = "R1C1"; # 送るデータ
$ini = new Win32::API("User32", "DdeInitialize", ["N", "N", "N", "N"], "I") || die $!; # イニシャライズ
$ret1 = $ini->Call(\$insID, 0, 0, 0) || die $!;
$con = new Win32::API("User32", "DdeConnect", ["N", "N", "N", "N"], "N") || die $!; # 接続
$ret2 = $con->Call($insID, 'excel', 'sheet1', undef) || die $!;
$snd = new Win32::API("User32", "DdeClientTransaction", ["N", "N", "N", "N", "N", "N", "N", "N"], "N") || die $!; # データ送信
$ret3 = $snd->Call($sendData, length $sendData, $con, undef, 0, 'XTYP_REQUEST', 10000, undef) || die $!;
print $ret3;

どなたか正常に動作するプログラムをご教授いただけませんでしょうかm(_ _)m
439デフォルトの名無しさん:2006/05/17(水) 22:59:05
sub foo(){
  my $var = sub(){
          $var->();
         }
}
このとおり走らせてみてから聞けよ
440デフォルトの名無しさん:2006/05/17(水) 23:21:46
$varは、無名サブルーチンからグローバルに見えるはずなので動きそうだけどね
441デフォルトの名無しさん:2006/05/17(水) 23:29:32
無名関数を定義するまえに変数$varを存在させとけばいい
つまりこうだ
my $var;
$var = sub() {… $var->(); …};
442437:2006/05/18(木) 00:04:07
やりたいことをちゃんと書いてる間に解決策が・・・
ありがとうございました!

やりたかったこと(解決バージョン)
$aaa = '1234aaaa5678bbb9876ccc';
@list = &func($aaa);
print join(',', @list), "\n";

sub func(){
 my $str = shift;
 my $list;
 $list = sub {
  my $var = shift;
  $var =~ /(\d+)(.*)/;

  my $first = $1;
  my $rest = $2;
  print $rest, "\n";
  if($first =~ /\d+/){
   return ($first, $list->($rest));
  }else{
   return ();
  }
 };
 return $list->($str);
}
443デフォルトの名無しさん:2006/05/18(木) 00:18:37
>>442
解決乙

>$var =~ /(¥d+)(.*)/;
>
>my $first = $1;
>my $rest = $2;
どうでも良いけど↑の部分

my($first, $rest) = ($var =~ /(¥d+)(.*)/);
こんな書き方が俺は好き。1行で書けるから
444437:2006/05/18(木) 00:26:18
>443
おおう。勉強になりますた。
445428:2006/05/18(木) 00:26:29
ここには分かる方おられませんでしょうか?
スレ違いなら他をあたります。
446デフォルトの名無しさん:2006/05/18(木) 00:28:10
>>428
>libwww-perl(LWP)モジュールのインストールについて質問です。
プロキシーやウィルス・ソフトが動いていると、
接続できないことがあるが...
447428:2006/05/18(木) 00:40:12
>>446
ありがとうございます。それは知りませんでした。

早速Norton AntiVirusとZoneAlarm(ファイアウォール)を止めてやってみましたが
やっぱり「http://127.0.0.1/〜」となってしまいます…。

通常の場合、
http://oshiete1.goo.ne.jp/kotaeru.php3?q=2143752
↑ここの回答者の方がおっしゃっているみたいな処理をしなくても
相対指定の画像やスタイルシートとかって、ブラウザが自動的に読み込んでくれますか?
448デフォルトの名無しさん:2006/05/18(木) 02:48:22
>>442
わざわざそんなめんどくさいことしなくても。
$aaa = '1234aaaa5678bbb9876ccc';
print join ',', $aaa =~ /(\d+)(?{ print $', "\n" })/g;
449デフォルトの名無しさん:2006/05/18(木) 03:02:42
>>447
> 早速Norton AntiVirusとZoneAlarm(ファイアウォール)を止めてやってみましたが
> やっぱり「http://127.0.0.1/〜」となってしまいます…。

意味不明

> 通常の場合、

「通常の場合」の意味が不明

> http://oshiete1.goo.ne.jp/kotaeru.php3?q=2143752
> ↑ここの回答者の方がおっしゃっているみたいな処理をしなくても
> 相対指定の画像やスタイルシートとかって、ブラウザが自動的に読み込んでくれますか?

ブラウザや、その設定による。
450デフォルトの名無しさん:2006/05/18(木) 06:38:38
スルーしろや。
451デフォルトの名無しさん:2006/05/18(木) 07:27:18
>>447
以下のコードが動かないなら、ActivePerl を再インストールすべし。
アンインストール後、ActivePerl のフォルダも全部消してから。

use LWP::Simple;
print get( 'http://www.yahoo.co.jp/' );

また、socket での通信もできないとのことなので、ネットワークあたりの問題の
可能性も高い。
Windows のネットワークのプロパティを見てみるべし。
452デフォルトの名無しさん:2006/05/18(木) 08:31:21
キチガイ相手にするなや。増えるぞ。
453デフォルトの名無しさん:2006/05/18(木) 08:53:00
なんつーか、

use LWP::Simple;
print get( '/' );

とかやって「うまく動かん!」と言っているような予感。
454デフォルトの名無しさん:2006/05/18(木) 09:49:14
ファイル名の取得についてです。
c:\windows\*\ABC*.txt
wildcardを利用してファイル名(フルパス)を
配列か何かで取得するのに
何かよい関数とか知りませんか?
455デフォルトの名無しさん:2006/05/18(木) 09:52:57
globとか?
456デフォルトの名無しさん:2006/05/18(木) 10:39:53
>455
ありがとうございます。
できました。
@files = glob('c:\windows\*\*.txt');
457デフォルトの名無しさん:2006/05/18(木) 14:23:45
>>438
OLE を使いなよ。ここにサンプルあるから。
http://www.att.or.jp/perl/faq/perlwin32faq/perlwin32faq12j.html#extract_cells

DDE のモジュールがかなり前から更新されてないのは、DDEは古くて
OLEよりも機能が劣っており、みんなOLEを使っているからだよ。
458428:2006/05/18(木) 20:22:27
皆さんありがとうございます。
おっしゃるようにActivePerlを再インストールしました。
でも同じです…。

>>451のコードは動くのですが、ブラウザ上でちゃんと表示されないんです。
中心の「ショッピング」「共同購入」とかのリンクにカーソルを持っていくと、本当は

http://www.yahoo.co.jp/r/sh
http://www.yahoo.co.jp/r/gb

とかになっているはずのところが

http://127.0.0.1/r/sh
http://127.0.0.1/r/gb

となっていたりします。
だから、本来ブラウザが自動的に取得しにいくはずのものが取得できていません。
例えば右上の「個人ツール」の上の広告が表示されてなかったりします。
もっとスタイルシートとかをバリバリに使っているサイトだと、ページ全体がぐちゃぐちゃになります。

相対指定の基準とするURLをブラウザにちゃんと渡せていないせいかと思うんですが…。
これって他の方も同じなんですか?
459デフォルトの名無しさん:2006/05/18(木) 20:46:23
>>458
> 皆さんありがとうございます。
> おっしゃるようにActivePerlを再インストールしました。
> でも同じです…。
>
> >>451のコードは動くのですが、ブラウザ上でちゃんと表示されないんです。

意味不明。

> 相対指定の基準とするURLをブラウザにちゃんと渡せていないせいかと思うんですが…。
> これって他の方も同じなんですか?

意味不明。
460デフォルトの名無しさん:2006/05/18(木) 21:15:30
>>459
死ね。キチガイに構う同類。
461428:2006/05/18(木) 21:17:31
意味不明ですか? じゃあ言い方を変えます。

お時間のある方にお願いしますが、次のコードで@niftyのトップページを取得してみたら
どうなるか教えていただけませんでしょうか?

print "Content-Type: text/html\n";
print "\n";
use LWP::Simple;
print get( 'http://www.nifty.com/' );

私のところだと、ブラウザ上での表示がぐちゃぐちゃになります。

(トップページのHTMLファイル自体は正常に取得できているのですが、
相対指定でリンクされている画像やスタイルシートやJavaScriptのファイルが取得できないため、
表示がぐちゃぐちゃになってしまうんだと思います)
462デフォルトの名無しさん:2006/05/18(木) 21:17:39
ACTIVEPERLをダウンロードしようとしたら、
このインターネットサイトを開くことができませんでした
というエラーが出てきたできません。どうすればいいんでしょう。
463デフォルトの名無しさん:2006/05/18(木) 21:18:19
>>461
消えろゴミクズ
464デフォルトの名無しさん:2006/05/18(木) 21:19:22
>>458
それはそういうものだよ。
HTML を勉強すると吉。

>>460
まあそう荒れるなや。
465デフォルトの名無しさん:2006/05/18(木) 21:21:24
>>458
m9プギャー
466デフォルトの名無しさん:2006/05/18(木) 21:22:47 BE:433026094-#
<base href="http://www.nifty.com/">
467デフォルトの名無しさん:2006/05/18(木) 21:24:51
>>462
セキュリティソフト切る。
それでも無理なら、他のPCでdownloadすべし。
468デフォルトの名無しさん:2006/05/18(木) 21:26:32
パールで出力したデータを隠したいんですが、どうやったらいいでしょうね??
<!-- --!>の間に隠すのや、<div style="desplay:none">で消すのって、見ようと思えば見えるんですよね??
パールにお詳しい皆さんに、力を貸していただきたく思います。
469デフォルトの名無しさん:2006/05/18(木) 21:28:13
>>468
日本語でおk
470428:2006/05/18(木) 21:31:01
>>464
「そういうもの」とは…?
皆さんは、正常に表示させたい場合は>>466のタグを挿入して返してるんですか?
それだと元のページをそっくりそのまま取得できたことにならないと思うんですけど…。

HTTPヘッダにそういう情報があるのかと思ったんですが違うんでしょうか。
471デフォルトの名無しさん:2006/05/18(木) 21:38:04
>>467
ノートンきりました。そしたらなんだか、パソコンがかってに再起動するように鳴ったんですが(泣)。
他のパソコンはありません。携帯なら歩けどできない。
472デフォルトの名無しさん:2006/05/18(木) 21:38:55
おかしい質問だけじゃなく、それに対する返答も含めて巧妙な荒らしに見えるのだが。。。
473デフォルトの名無しさん:2006/05/18(木) 21:43:42
>>470
HTTPヘッダにそんな情報はねえし
ヘッダ保存してないだろ
474428:2006/05/18(木) 21:44:36
>>473
そんなこと聞いてるんじゃないんですが(苦笑)
475428 ◆AOxf8.Tmck :2006/05/18(木) 21:47:12
>>474は偽物です。何が目的なんですか?
一時的にトリップつけさせていただきます。

>>473
じゃあ相対指定のリンクを含むページを取得する方法って
どうやるのか教えてください。
476428 ◆4p1DirMNWQ :2006/05/18(木) 21:51:57
>>475は偽物です。何が目的なんですか?
一時的にトリップつけさせていただきます。
477デフォルトの名無しさん:2006/05/18(木) 21:58:46 BE:96228724-#
少しは自分で考えろ
478428 ◆4p1DirMNWQ :2006/05/18(木) 21:58:57
で、結局私の質問に答えられる方はおられないのでしょうか。
それともやはり質問がスレ違いなのですか? それならば他へいきますが…。
479428 ◆4p1DirMNWQ :2006/05/18(木) 21:59:48
>>477
申し訳ありません。ですが自分で考えてわからないからこうして質問しているのです。
480デフォルトの名無しさん:2006/05/18(木) 22:00:01
>>461

>(トップページのHTMLファイル自体は正常に取得できているのですが、
>相対指定でリンクされている画像やスタイルシートやJavaScriptのファイルが取得できないため、
>表示がぐちゃぐちゃになってしまうんだと思います)

そう思うんなら全部ダウンロードすればいいじゃん。
そうすりゃ表示されるよ。

481デフォルトの名無しさん:2006/05/18(木) 22:01:35
>>476
はてなで聞いたらおしえてあげるよー
482デフォルトの名無しさん:2006/05/18(木) 22:01:41
471です。パソコンに詳しい友人によると、ブラスターだとかいうのに感染したらしく、修理しなければ直らないそうです。
質問はパソコンが帰ってきてからにします。どうもありがとうございました。
483428 ◆AOxf8.Tmck :2006/05/18(木) 22:02:45
>>480
127.0.0.1に指定しているフォルダに、ディレクトリ構造ごとそっくりそのまま
持ってくるということですか?

私がやりたいのはオフラインで閲覧できるようにページを丸ごと取得することではなく、
普通にどこかのページをブラウザに返すということです。
484デフォルトの名無しさん:2006/05/18(木) 22:04:30
>>483
すれ違いだ。消えろ。行き場所は自分で探せ。
485デフォルトの名無しさん:2006/05/18(木) 22:13:05
ん〜、なんだぁ?
前の自称Ruby厨が荒らしてるのか。
486デフォルトの名無しさん:2006/05/18(木) 22:14:31
>>479
考えるな。調査せよ。行き来するデータをインスペクトせよ。
処理の各段階でのデータをインスペクトせよ。
487428 ◆AOxf8.Tmck :2006/05/18(木) 22:17:09
>>486
それは偽物です。
428 ◆AOxf8.Tmck←これが私(>>428)です。

アドバイス頂いた方ありがとうございました。
これ以上ここでは聞けないと判断しましたのでもう移動させていただきました。
488デフォルトの名無しさん:2006/05/18(木) 22:21:45
>>483
> 私がやりたいのはオフラインで閲覧できるようにページを丸ごと取得することではなく、
> 普通にどこかのページをブラウザに返すということです。

やっと一番最初に書いておかないと質問の体をなさない事項を書いたよ(嘲笑

依然として意味不明だけどな。
489デフォルトの名無しさん:2006/05/18(木) 22:25:29
構うなよおまえら・・・
490デフォルトの名無しさん:2006/05/18(木) 22:26:58
>>489
自演だろ。
491デフォルトの名無しさん:2006/05/18(木) 22:28:36
Cryptをもっと安全にするにはどうすればいい?
492デフォルトの名無しさん:2006/05/18(木) 22:29:01
話に入れなくて悔しい約1名が必死に荒らしているスレはここですか?
493デフォルトの名無しさん:2006/05/18(木) 22:29:43
>>489
質問に答えられないからってそういうこと言わないでくださいよ。
494デフォルトの名無しさん:2006/05/18(木) 22:30:46
>>492>>428
自演乙。
495デフォルトの名無しさん:2006/05/18(木) 22:31:00
>>491
> Cryptをもっと安全にするにはどうすればいい?

意味不明
496491:2006/05/18(木) 22:36:52
>>495
質問に答えられない厨房君は帰ってね(^^;
貴方のほうが意味不明です。答えられないなら答えるな。
497デフォルトの名無しさん:2006/05/18(木) 22:38:19 BE:541282695-#
変な奴が…2名くらい?
498デフォルトの名無しさん:2006/05/18(木) 22:45:15
>>497
いるな。ここは何でも質問箱だってのにぐだぐだ言う奴が。
499デフォルトの名無しさん:2006/05/18(木) 22:55:27
>>437
普通にやるなら既に解決しているけれど、面白そうだから先に変数を宣言しないようにやってみた。

sub Y {
my $f = shift;
my $m = sub {
my $proc = shift;
$f->(sub { $proc->($proc)->(@_) });
};
$m->($m);
}
my $var = Y sub { my $f = shift; sub { $f->() } };
$fact->();

Y Combinatorってやつ。
500デフォルトの名無しさん:2006/05/18(木) 23:13:12
質問です。
Windows 2000 ActivePerl 5.6を使っています。
ファイルが存在しているかどうかを確かめたくて、
ファイルテスト演算子を使おうとしたのですが、うまくいきません。
ttp://www.site-cooler.com/kwl/perl/7.htm#7-5
こちらのサイトに、
ファイルテスト演算子はWindowsではうまくいかないこともあると書かれていたのですが、
Windowsでは使えないものなのでしょうか。
この方法以外にテストできるやり方があったら教えてください。
501デフォルトの名無しさん:2006/05/18(木) 23:17:40
>>500
「うまくいかない」とは?
502デフォルトの名無しさん:2006/05/18(木) 23:18:25
>>501
いい加減この手の質問になってない質問に答えるのやめようよ。
さっきのみたいのがまた増えるよ?
503デフォルトの名無しさん:2006/05/18(木) 23:22:06
PAR-0.92
Activeperl 5.8.7

GUI::Loftを利用して簡単な画面を作成してみたのですが、
ppコマンドで--guiを指定したときに、
タイトルにcacheと付くdos画面が開いてしまいます。

なにかこれについて知りませんか?
504デフォルトの名無しさん:2006/05/18(木) 23:22:59
同じような欠落質問が連続してきてるのってどういう現象?
荒しの一種か? コレクションしてあった欠陥質問の大放出か?
505500:2006/05/18(木) 23:24:12
>501

$file = <STDIN> ;
if (-e $file){
print "存在します" ;
}else{
print "存在しません" ;
}

で、存在するファイルをフルパスで入力しても
存在しません
ってでてくる。
506酩酊 ◆TWARamEjuA :2006/05/18(木) 23:25:54 BE:2941439-#
>>505
$file = <STDIN> ;
chomp $file; # ファイル名に改行が含まれるかもしれないのでちょん切る♪
507デフォルトの名無しさん:2006/05/18(木) 23:26:16
>>504
1.変な質問が出る
2.変な質問に答える奴が出る
3.変な質問をしてもいいんだと誤解した奴等が寄ってくる
4.変な質問に答える奴はまだいる
5.3.に戻る
508デフォルトの名無しさん:2006/05/18(木) 23:27:05
>>506
キチガイ乙。
509酩酊 ◆TWARamEjuA :2006/05/18(木) 23:28:04 BE:2723055-#
>>508
ぎくっ、、、(汗)
510デフォルトの名無しさん:2006/05/18(木) 23:30:04
>>509
何が楽しくて荒らすの? やめようよもう…
511500:2006/05/18(木) 23:37:00
>506
なんてこった。できました。
どうもありがとうございました。

次回からは質問方法を気をつけます。
ありがとうございました。
512デフォルトの名無しさん:2006/05/18(木) 23:48:33
>>511
まあ、木に病むな。
わからんことがあったらどんどん質問しなされ。
暇人の俺らが答えるから。
513デフォルトの名無しさん:2006/05/18(木) 23:50:11
>>512
荒らしさん勝手に自分の行為正当化しないでください。
514デフォルトの名無しさん:2006/05/18(木) 23:57:08
Ruby スレを荒らしたら今度は Perl かね。
515デフォルトの名無しさん:2006/05/19(金) 00:48:03
>>448
gにそんな使い方があったとは・・・
516デフォルトの名無しさん:2006/05/19(金) 00:51:27
>>468
ベッドの下に入れる。
それでも無理なら貸し金庫を借りる。

>>471
hint: ネットカフェ

>>503
PAR と ActivePerl を最新版にしてみたらどうかな。
PAR は、配布されてるパッケージによっては動かないことがあるので(相性問題がある)
ppm の配布サイトを変えて試してみるといいかも。
517503:2006/05/19(金) 01:05:48
レスTHX。

ActivePerlは、最新にしたら駄目だったのでバージョンを下げました。

以前、PAR-0.91は試しました。nmakeでコンパイルしています。
ん、あれは、コピーだけしていたのかな。

Windows2000とXPで試して同じだったので、同じ現象にあっている人いないかな〜。

環境上の問題あるのかな。
ppmの配布サイト。探してみます。中身違うのかな。
518デフォルトの名無しさん:2006/05/19(金) 02:19:36
perl のプログラムで、あるファイルを他のファイルにコピーする処理を行うサブルーチン
が定義されているとします。複数のperlのプログラムを実行するプロセスがあり、
その各々がそのサブルーチンでファイルをコピーした場合、2つのファイルをたまたま
同名ファイルにコピーしようとした場合、どうなるでしょうか?またこの競合を防ぐ
にはどうしたら良いでしょうか? (例えば、コピーする時に、コピー先ファイル名を
ロックしておく等の方法があり得るのでしょうか?)

なお上記の状態で、同名ファイルへのコピーが重なり、前のファイルを後のファイルで
上書きされてしまうのは許可するとします。
519デフォルトの名無しさん:2006/05/19(金) 03:33:43
テンポラリファイルに書いてからrenameするのがいいんじゃない
たいていOS側でrename操作は排他的に処理してくれる

use File::Temp qw(tempfile);
my ($fh, $tempname) = tempfile(DIR=>'.');
$fh->print("hello world\n");
$fh->close();
rename $tempname, "real-file-name.txt"; #ここで競合が防がれる
520デフォルトの名無しさん:2006/05/19(金) 05:00:53
>>518
どうなるもなにも書き込めなかった方がエラーになるだけでしょう
>>519
リネームできなかったら残っちゃうじゃん
521デフォルトの名無しさん:2006/05/19(金) 08:23:36
>>520
わ、馬鹿だ!
522デフォルトの名無しさん:2006/05/19(金) 11:32:53
スンマセン教えてください。

$a{abc} = 'abc';
$a{def} = 'def';
$a{ghi} = 'ghi';
:
:
:

ってやったあとで、$a{*}に所属する連想配列の内容を一気に
クリアする方法がありますか?

よろしくお願い致します。
523デフォルトの名無しさん:2006/05/19(金) 11:37:37
>>522
%a = ();
524デフォルトの名無しさん:2006/05/19(金) 11:37:59
? 全部消せばいいんじゃねーの?
525デフォルトの名無しさん:2006/05/19(金) 11:42:42
>>523
ども
526デフォルトの名無しさん:2006/05/19(金) 12:05:41
>>524
わ、馬鹿だ!
527デフォルトの名無しさん:2006/05/19(金) 15:22:34
>>499
Y Combinator スゴス
1時間ネットをさまよって理解できた。かもしれん
528527:2006/05/19(金) 16:28:07
これYにプロトタイプ宣言しとくと、シンタクスシュガー的にかっこいいと思う

sub Y(&) { # >>499にプロトタイプを追加
my $f = shift;
my $m = sub { my $p = shift; $f->(sub { $p->($p)->(@_) }); };
$m->($m);
}

my $factorial = Y { # Yの後ろのsubが省略できる
my $label = shift;
sub { my $n = shift; ($n > 1) ? $n * $label->($n-1) : 1; }
};
print $factorial->(10);
529デフォルトの名無しさん:2006/05/19(金) 16:32:36
utf8で、Latin Extended とかを Basic Latin に変換するようなスクリプトって、
どっかに落ちてたりしますかね。

いや、作ろうかと思ったんですが、もしどこかに有名なのがあるとしたら、
車輪を再発明する必要もないかな、と思って。。。
530デフォルトの名無しさん:2006/05/19(金) 17:30:35
PerlでMD5を使う方法を手取り足取り教えてくれ
531デフォルトの名無しさん:2006/05/19(金) 17:34:19
use Digest::MD5;
532デフォルトの名無しさん:2006/05/19(金) 18:39:12
12chスクリプトを使ってます。
サブスクライバを取得したいのですがどうすればいいのか良く分かりません。

後docomoの端末製造番号も取得したいです。
533532:2006/05/19(金) 18:41:27
すいません。板違いみたいです。
失礼しました
534デフォルトの名無しさん:2006/05/19(金) 19:21:47
>>528
確かに。
print Y { ... }->(10);
こういう風に使ったときに優先順位の関係で嵌らないかと思ったけど、
実際やってみると望んだとおりに解釈してくれるのね。
流石Do What I Mean戦略といったところか
535デフォルトの名無しさん:2006/05/19(金) 20:33:43
sub rec(&) {
 my $f = shift;
 sub {$f->(rec($f), @_)}
}
(rec {
 my ($f, $n) = @_;
 ($n <= 2)? 1: $f->($n-1) + $f->($n-2);
})->(20);

なんかやけにトリッキーに書いてるけど、単純にこれじゃダメ?
536デフォルトの名無しさん:2006/05/19(金) 21:07:01
rec()自身を再帰するのは反則…とかなんとか404 Blog Not Foundに書かれていたような
537デフォルトの名無しさん:2006/05/19(金) 21:12:39
>>535
もともとお遊びだったしY Combinatorそのまま移植してみたけど、
確かに先に変数を宣言しないように、というだけならrecの中での直接的な再帰を許してそれで良いわな…
538535:2006/05/19(金) 21:13:50
すまんどうやら流れ読めてなかった。
なんかの競技?なのか。
539デフォルトの名無しさん:2006/05/19(金) 22:26:18
>>528
こう言うのってどういうときに便利なんですか?
前にそんなのが必要だった記憶があるんだけど思い出せない。
確かその時は引数にしてごまかした記憶が。こんな感じで。

my $f = sub { my ($f, $n) = @_; $n < 1 ? 1 : $n * $f->($f, $n - 1) };
print $f->($f, 10);
540デフォルトの名無しさん:2006/05/19(金) 22:29:37
レキシカル変数使うなら
my $f = sub { my ($n) = @_; $n < 1 ? 1 : $n * $f->($n - 1) };
print $f->(10);

こいで十分。
541デフォルトの名無しさん:2006/05/19(金) 22:43:43
>>540
myのスコープはその右辺に適用されないからそれじゃ動かん。
>>441

>>539
便利とかそういう実用性の話をするなら>>441で十分だね。
Y Combinator等を使った方法は単に(関数的なのが好きな人には)面白いというだけだから。
542デフォルトの名無しさん:2006/05/19(金) 23:01:01
無名関数を引数に取るようなサブルーチン(sortとかgrepとか)に渡すときとか。
543デフォルトの名無しさん:2006/05/20(土) 01:00:02
>>541
嘘つくな!
名前まで付いてるくらいなんだからそんなはずはない。
ほんとはすげーかっこいい使い方知ってんだろ。
教えろこのやろう。。。

>>542
もう一声。
544デフォルトの名無しさん:2006/05/20(土) 01:11:02
使い方とは存在するのではなく
創り上げるものです
545デフォルトの名無しさん:2006/05/20(土) 02:48:35
ま、諸賢はくれぐれも技に溺れないようにね。
546デフォルトの名無しさん:2006/05/20(土) 04:35:34
200万円の日本刀で鉛筆削る人生も乙なものです。
547デフォルトの名無しさん:2006/05/20(土) 10:35:50
>>203にsjisのencodingによる処理の仕方が書いてあったけど、euc-jpで
やってみたが、うまくない。「中」とか「薫」とかが出てこない。
use encoding 'euc-jp';
use open ':euc-jp';
use open ':std';
print "Test 1:\n";
open(IN, "euc.txt") or die;
while(<>) {
while(/[亜-腕]/g){ # [弌-龠] 堯槇遙瑤凜熙
print $&, "\n";
}
}
close IN;
いったい、文字クラスの正規表現[ ]はマルチバイト文字をサポート
してないのか。うまく行った人、教えてください。
548デフォルトの名無しさん:2006/05/20(土) 11:36:22
文字クラスは多分ユニコードの文字コード順なので
[亜-腕]には中も薫も含まれないんじゃないか

% cat foo.pl
use encoding 'euc-jp';

foreach (qw(亜 腕 中 薫)) {
printf "%s-%x\n", $_, ord($_);
}
% perl foo.pl
亜-4e9c
腕-8155
中-4e2d
薫-85ab
549デフォルトの名無しさん:2006/05/20(土) 14:08:44
>>548
あー、そうだったんですね。内部の処理はutfでやってると。
jperl相当のことができるって喜んでたら、あの不可解な
出来事で、悩んでいたんですが、これで目から鱗です。
ありがとうございました。
550デフォルトの名無しさん:2006/05/20(土) 16:09:57
コンビネーターのコードがまったく読めないんだが・・・
コード書いてるのはLispの人?
551デフォルトの名無しさん:2006/05/20(土) 16:11:00
>>550
荒らし乙。今度はその手で来ましたか。
552デフォルトの名無しさん:2006/05/20(土) 16:15:26
>>551
なんで荒らしなんだよw
553デフォルトの名無しさん:2006/05/20(土) 16:28:00
>>552
無内容の上さりげなく多言語使いを煽ってるのはたしかに荒らしだろうな。
数日前なんか酷いことあって過敏なんだよ。
少し考えて書き込んでくれ。
554デフォルトの名無しさん:2006/05/20(土) 16:32:33
色々浮気するが結局perlに戻ってくる俺がいる
555デフォルトの名無しさん:2006/05/20(土) 18:36:00
>>550-554
何の話だか分からんのだが、ここのこと?
http://221.112.61.214/~kzk/column/haskell_parsec.html
556デフォルトの名無しさん:2006/05/20(土) 19:06:22
>>549
漢字やひらがな等を指定したいときは文字クラスを指定するのが良いですよ。
# \p{Han}/ とか /\p{Hiragana}/ とかだったかな?

perldoc perlunicode に色々かかれてたはず。
557デフォルトの名無しさん:2006/05/20(土) 21:31:26
>>556
ありがとうございます。かなり量があって全部読むのは大変ですが
ぼちぼち見てみます。
558デフォルトの名無しさん:2006/05/21(日) 17:21:57

桁数をしていして、数値から文字列に変換したいのですがどの様な方法がよいのでしょうか?
$a=3を$b="003"の様にaをbに代入。
プリントするときは、printf "%03s",$a; でできるのですが、
桁数を指定して文字列として代入する方法がわかりません。
ご教授お願いします。
559558:2006/05/21(日) 17:36:13
すみません。
sprintf でできました。
560デフォルトの名無しさん:2006/05/21(日) 19:54:08
cryptの暗号化は簡単に解析されてしまいますか?
どうなんですか
561デフォルトの名無しさん:2006/05/21(日) 20:30:13
>>560
簡単の基準やどのcryptか言わない(言えない)なら回答は「NO」で問題ないだろう
562デフォルトの名無しさん:2006/05/21(日) 20:36:27
昔のDESハッシュの場合、専用マシンで総当りすると22時間だそうです。速っ。
http://www.ipa.go.jp/security/pki/021.html#_Toc3020742
まあ今はMD5ハッシュなどを使ってると思うので、総当り方式での解析は無理ですよね。
563デフォルトの名無しさん:2006/05/21(日) 20:37:59
ああ解析しようと思えば出来てしまうレベルの暗号化なんですね。
どうもです。
564デフォルトの名無しさん:2006/05/21(日) 21:02:21 BE:123816072-#
逆に総当りでも解読出来ない暗号ってあるのかと聞きたい
565デフォルトの名無しさん:2006/05/21(日) 21:03:40
解析できない暗号など無い
566デフォルトの名無しさん:2006/05/21(日) 21:05:16
>>563
安全性を追求するなら、今専門家が勧めているのはSHA256
# 解ってるとは思うけれど、暗号化方式がどんなに安全でも、元のパスワードの質が悪ければ辞書攻撃ですぐだから注意な
567デフォルトの名無しさん:2006/05/21(日) 21:41:05
>>565
OTPは解読不可能だぞ
568デフォルトの名無しさん:2006/05/21(日) 21:49:26
>567
OTPは盗聴されてもわからないだけで、総当たりすれば解けるのでは?
569改善派:2006/05/21(日) 22:14:31
総当りしても解けない暗号はあるよ
570デフォルトの名無しさん:2006/05/21(日) 22:39:08
>569
「総当たりに時間がかかる暗号」というのはわかるけど、「総当たりしても解けない暗号」があるとは知りませんでした。
スレ違いなのはわかっていますが、なんていう暗号か教えてください
571デフォルトの名無しさん:2006/05/21(日) 23:01:57
有名なのはワンタイムパッド暗号。あらかじめ乱数表を配っておいて
使い捨てるやつね。メッセージと同じ長さの乱数列を使ってXORする
ようなイメージ。鍵長 = メッセージ長なので、総当りするとありと
あらゆる文章が出てきます(笑)
572デフォルトの名無しさん:2006/05/21(日) 23:19:57
総当りすりゃ解けるじゃん
何を言ってるんだお前は
573デフォルトの名無しさん:2006/05/21(日) 23:23:58
解けるの定義が食い違ってそうだ。
574デフォルトの名無しさん:2006/05/21(日) 23:26:47
575デフォルトの名無しさん:2006/05/21(日) 23:30:11
「何をしても絶対解けない」暗号方式なら3分で作れるなwww
576デフォルトの名無しさん:2006/05/21(日) 23:45:48
>>572
例えば「バナナ」を暗号化して「ABCDEF」という文字列を作ったとする。
これを総当りするうちに「バナナ」という文字列は現れるが、
途中に「リンゴ」「イチゴ」などの文字列もあらわれるため、
「バナナ」が元の文字列だと断定することができない。
よって、「元の文字列を得る」という意味での「解読」は絶対に出来ない。
これがワンタイムパッド暗号。
577デフォルトの名無しさん:2006/05/21(日) 23:48:26
>>576
そういう暗号化方式がWEBサービスとかで実際に使われているんですか?
578デフォルトの名無しさん:2006/05/21(日) 23:51:38
>571
Thanks!
すっかり忘れてたけど、言われてみれば確かにそうだ。
OTPってOne Time Pad のことだったのか。
てっきり One Time Password のことだと思った。
579デフォルトの名無しさん:2006/05/21(日) 23:56:31
>>577
576じゃないけど、使い捨てる暗号なら普通に使われているのでは。
元の文字列が分からなくなれば良いんだから。
580デフォルトの名無しさん:2006/05/22(月) 00:11:44
MD5とかって違うの?
あれって復号可能なの?
581デフォルトの名無しさん:2006/05/22(月) 00:16:15
乱数列が入った HDD の運び屋も大変だよな。
582デフォルトの名無しさん:2006/05/22(月) 01:44:16
>>579
http://ja.wikipedia.org/wiki/%E3%83%AF%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0%E3%83%91%E3%83%83%E3%83%89
ワンタイムパッドは事実上ほとんど使われてません。
ワンタイムパッドだと、100メガ のデータを暗合するのに100メガの鍵が必要。
だから暗号文を送る前に>581が言うように乱数=鍵の入ったストレージを相手に届けておかなければ意味がない。
確かに解読は絶対に不可能だが現実問題として扱いにくい。
現実には、解読に要する時間が十分長いものを採用する。
(コンピュータの計算力の向上とか、数学理論の発見とかで解読に必要な時間はだんだん短くなっていくのだが....)


>>580
MD5は一方向関数。
復号は目的とされていない。というよりも、復号ができないような関数。
583デフォルトの名無しさん:2006/05/22(月) 01:51:27
質問があります。
Perl5.8を使っています。
ネットワーク経由で取得したXML(utf8, 日本語含み)を
XML::TokeParserで細切れのスカラーにして、
それらを適宜組み合わせて、XML::RSSに食わせてRSSフィードに変換しました。

# $feed = {}; $feedには元XMLから取得したutf8文字列が入っている。
use XML::RSS;
my $rss = XML::RSS->new(Version=>'1.0');
my $j = Jcode->new;
my $label = $j->set('形態:'=>'euc')->utf8;
$rss->add_item(
title=>$feed->{title},
link=>$feed->{link},
description=>$label.$feed->{description}
);

こうやってできたRSSフィードを読むと、
「形態:」の部分が「\å\½\¢\æ\…\‹:」に文字化けしていました。

内部文字コードがどうたらが原因じゃないかと調べてみましたが、
そもそも中で何が起こっているのかわからないので困っています。
どうすればまともに文字コードを扱えるでしょうか?
584デフォルトの名無しさん:2006/05/22(月) 06:41:48
>>580
暗号じゃなくてダイジェストだからな。
585デフォルトの名無しさん:2006/05/22(月) 06:45:41
>>583
Jcode って utf8 フラグ立てるんだっけ?
Encode で utf8 文字列にしたらどうよ。
586デフォルトの名無しさん:2006/05/22(月) 10:04:59
>>576
だから、『解読』自体は出来るでしょ?
お前本当の馬鹿だな
587デフォルトの名無しさん:2006/05/22(月) 10:14:38
>>586
暗号無知は黙ってた方がいいよ?wwww
588デフォルトの名無しさん:2006/05/22(月) 10:19:22
無知は言い負けてからがしつこいんだよねえ。
内容で勝てないことで狂って、「最後まで粘ったほうが勝ち」って勝負に走るから。
589デフォルトの名無しさん:2006/05/22(月) 10:20:03
>>587
いや…この暗号方式はシーザー暗号並に単純だと思うんだけど…
辞書で解読の意味でも調べたら?
590デフォルトの名無しさん:2006/05/22(月) 10:20:52
勝手に負かされても困るんですけど
ちゃんと反論して下さいよ全く
591デフォルトの名無しさん:2006/05/22(月) 10:22:25
勝手に言葉の意味を俺流に脳内変換しといて勝ったとか言われるのも困り物ですよね
592デフォルトの名無しさん:2006/05/22(月) 10:26:28
>>572=586=589=590=591
>>587=588
両方消えて下さい
593デフォルトの名無しさん:2006/05/22(月) 10:29:24 BE:636768689-#
(・∀・)ニヤニヤ
594デフォルトの名無しさん:2006/05/22(月) 10:32:22
>>592
それ復号?w
595デフォルトの名無しさん:2006/05/22(月) 10:33:56
>>594
彼は落雷に遭ってから不思議な能力を身に付けたのです
もう通信記録とか全部見えちゃうんですよ
596デフォルトの名無しさん:2006/05/22(月) 10:34:23
>>576の理論で行けば共通鍵の暗号でも偶然で文章になる可能性があるよね。
>>576の言ってる事はおかしいよね。変だよね。
597デフォルトの名無しさん:2006/05/22(月) 10:37:43
>>596
7を9に変えれば同意
598デフォルトの名無しさん:2006/05/22(月) 10:43:59
逆に貴方が必死になってるんじゃないですかぁ?
599デフォルトの名無しさん:2006/05/22(月) 10:47:19 BE:221100555-#
webprogでやりなよ〜(・∀・)
600デフォルトの名無しさん:2006/05/22(月) 10:49:10
webprog板に来られても迷惑。
要はネットでわめく暇があったら勉強すればいい話。
601デフォルトの名無しさん:2006/05/22(月) 10:50:39
君が勉強しなよw
602デフォルトの名無しさん:2006/05/22(月) 11:01:52
質問の内容が内容だし、反応した奴は全部まとめてアホでいいよ。
603デフォルトの名無しさん:2006/05/22(月) 11:04:18
根本の原因:>>560>>563
604デフォルトの名無しさん:2006/05/22(月) 11:21:02
べつに匿名で勘違いとか物を知らないことがバレても
害は無いと思うんだがなあ

なんで名無しで粘るんだろうね
605デフォルトの名無しさん:2006/05/22(月) 11:26:53
BAKAだから
606デフォルトの名無しさん:2006/05/22(月) 11:30:52
だから勝手に勝ち逃げしないでよ
ちゃんと反論してくださいー
607デフォルトの名無しさん:2006/05/22(月) 11:32:41
反論もせずに悪口ばっか垂れてても何も始まりませんよー
608583:2006/05/22(月) 11:35:04
>>585
アドバイスありがとうございます。
# $feed = {}; $feedには元XMLから取得したutf8文字列が入っている。
use XML::RSS;
my $rss = XML::RSS->new(Version=>'1.0');
my $label = '形態:';
from_to ( $label, 'euc-jp'=>'utf8' );
$rss->add_item(
title=>$feed->{title},
link=>$feed->{link},
description=>$label.$feed->{description}
);
このようにしてみましたが、結果は同じでした。

色々考えた挙句に、utf8で書いてuse utf8;したモジュールを作り、
そこから文字列を返してXML::RSSに食わせると望む結果が得られました。
ちなみに大元のスクリプトをutf8にすると、
鯖が何故かCGIとして認めてくれずにエラーを起こしたので、
このような事態になりました。
あんまりすっきりしませんが、ありがとうございました。
609デフォルトの名無しさん:2006/05/22(月) 11:40:22
>>608
> 大元のスクリプトをutf8にすると、鯖が何故かCGIとして認めてくれずにエラー
タイムリーだな。ちょうどWebProgのほうでその質問が出てるから参考に
http://pc8.2ch.net/test/read.cgi/php/1146042050/721-725
多分同じ原因だと思うが違ったらスマソ
610デフォルトの名無しさん:2006/05/22(月) 11:40:46
僕の言ってる事が正し過ぎて言い返せないのかなぁ
611デフォルトの名無しさん:2006/05/22(月) 12:15:57
最近はCGIであることを隠して質問するのか。
余計なところはしっかりと学習してるんだな。
612デフォルトの名無しさん:2006/05/22(月) 13:46:03
↑これが自演しまくりで煽ってる奴。
613デフォルトの名無しさん:2006/05/22(月) 13:52:03
>>611-612
自演乙
614デフォルトの名無しさん:2006/05/22(月) 14:05:03
Perl使いってこんなキモイ奴ばっかなの?
615デフォルトの名無しさん:2006/05/22(月) 14:41:17
ウフフフ・・・
616デフォルトの名無しさん:2006/05/22(月) 14:43:05
>>614
まあ Perl そのものがキモイ言語ですから。
617デフォルトの名無しさん:2006/05/22(月) 14:49:07
この荒らし方はPHP厨ぽいな。
618デフォルトの名無しさん:2006/05/22(月) 15:12:31
あのシメジ野郎…ッ!!
619583:2006/05/22(月) 18:08:49
>>609
原因かどうかはわかりませんが、確かにUTF-8Nで保存するとちゃんと実行してくれました。
なんだこりゃ?
次からは、UTF-8Nでスクリプト書いてuse utf8;しようと思います。
ありがとうございました。
620デフォルトの名無しさん:2006/05/22(月) 18:59:37
すごい初歩的な質問なんですけど…

文字列を扱う時、シングルクォーテーションかダブルクォーテーションか
どっちで挟むのがいいんでしょうか。
スクリプトによってバラバラなので気になっています。
621デフォルトの名無しさん:2006/05/22(月) 19:04:46
>>620

my $str = "うん";

print '$strちがいっぱいでたよ!\n'; #出血
print "$strちがいっぱいでたよ!\n"; #脱糞
622デフォルトの名無しさん:2006/05/22(月) 19:11:17 BE:132660353-#
shift_jisで書くならとりあえずシングル使っとけ
623620:2006/05/22(月) 19:13:53
>>621>>622
なるほど、ありがとうございます。
624デフォルトの名無しさん:2006/05/22(月) 19:55:18
>>620
どっち使ってもいい場面なら
基本シングル
シングルクォート含んでてダブルの方がすっきり書けるときはダブル
625デフォルトの名無しさん:2006/05/22(月) 20:29:50
>>620
ちなみにベンチしてみればはっきりわかるが、
シングルのほうが早い
626デフォルトの名無しさん:2006/05/22(月) 20:36:23 BE:53064432-#
>>625だと思ってベンチしたらダブルの方が速かった件について…
627デフォルトの名無しさん:2006/05/22(月) 20:43:45
>>626
あ・・・・れ・・・・?もう一回やってみよう
628デフォルトの名無しさん:2006/05/22(月) 20:57:58
>>626
なんかダブルのほうが速いな・・・・
すまん>>625間違いだった
629デフォルトの名無しさん:2006/05/22(月) 21:50:24
初歩的な質問ですが…

純粋なPerlのプログラムには、
CGIと同様に一行目に
#!C:/perl/bin/perl/
みたいなのを書く必要がありますか?
630デフォルトの名無しさん:2006/05/22(月) 21:59:00
windowsならいらんよ
631デフォルトの名無しさん:2006/05/22(月) 22:02:01
>>629
書かなくても

perl 目的のスクリプト

で実行できるよ。
632デフォルトの名無しさん:2006/05/22(月) 22:22:45
>>629-630
Windows(というかDOS)でも、(書式は違うが)似たようなのを書く場合もある。
例えば ftp://hayabusa.ics.nara-wu.ac.jp/pub/nide/dosutil/sos111a.tgz みたいな環境を使う場合。
これを使うと、スクリプトのソースを(テキストのまま)直接 COM ファイルにできるので、
Unix みたいに progname arg ... のように実行できて便利。
633デフォルトの名無しさん:2006/05/22(月) 22:31:48
>>632
そういう事をするための pl2bat じゃないの?
634デフォルトの名無しさん:2006/05/22(月) 22:36:30
>>633
第一ヒント:汎用性
635デフォルトの名無しさん:2006/05/22(月) 22:38:14
cygwinでならc:\…でも動くよ。
636デフォルトの名無しさん:2006/05/22(月) 22:41:35
>>629

儀礼的に書くようにしてる。
あと、winとかでもPerlがその文を読み取ってスイッチとか判断してる。
だから、基本的に書はいとけ、ってコトだと思う。

637629:2006/05/22(月) 22:49:21
>630-636
ありがとうございます

なくても動くんですね
でも、あった方がいい、と。

ずっと悩んでたのがすごくすっきりしました。
どうもありがとう
638デフォルトの名無しさん:2006/05/22(月) 23:47:34
>>625-628
シングルの方が余計な解釈しないから早そうに思えるんだけど、なんで?
639デフォルトの名無しさん:2006/05/22(月) 23:56:53
>>638
コンパイル時点でシングルとダブルを解釈するから速度差には影響しにくいという話を聞いたことがある。
それはあるバージョンからそのようになったとかなんとか。
このスレか?

ようわからんが、「ダブルだったら展開出来そうな文字列を探せ」みたいな解釈をしてないってことだろ。
640デフォルトの名無しさん:2006/05/23(火) 00:03:03

曖昧な記憶ではコンパイル時に

"aaa$sss\n";

'aaa' . $sss . "\n";

こんな感じになるんだけど、
すでに aaa と \n は畳み込まれているって聞いたことが。
シングルの場合はなにもされない。

違ったらスマソ

641デフォルトの名無しさん:2006/05/23(火) 00:15:27
>>637
>なくても動くんですね
>でも、あった方がいい、と。
「あったほうがいい」だけの理解だとすっきりしないと思うので。

#!/usr/bin/perl とかコマンドへのパス書くのは元々UNIXのシェルが
ファイルとプログラムを関連付けるルール。
Windowsではファイルの拡張子がその役割を担っているのでいらん。

でも、ApacheでCGIとして動かすなら、Apacheがファイルの一行目を
解析するのでWindowsでもUNIXでも必要だおy。

>>639
そうなのか。なんかダブルのほうが速いのがちょっと不可解だけど。
642デフォルトの名無しさん:2006/05/23(火) 00:30:38
a.pl と b.pl の両方で、同じ変数 $name を参照したいのですが、設定は一カ所でしたいのです。
こういう場合、perl での定石としてはどうするのでしょうか?
643642:2006/05/23(火) 00:32:00
ちなみに、これらのプログラムはcgiとして動かそうと思っています。
環境変数とかになるんでしょうか?
644デフォルトの名無しさん:2006/05/23(火) 00:54:25
>>642
設定ファイルを c.pl にしてそこで$nameを定義。
a.pl と b.pl で c.pl を読み込む。
645デフォルトの名無しさん:2006/05/23(火) 00:59:00
>>644 ありがとうございました。
646デフォルトの名無しさん:2006/05/23(火) 15:52:12
>>640
なるほどね
ってことはシングルで . でつなげたほうがコンパイルは速いのか
確か2,3ヶ月前にベンチしたときはシングルのほうが速かった気がした。
647デフォルトの名無しさん:2006/05/23(火) 16:46:57
早いことは早いが、0.1%以下の差を気にしても意味ないと思うけどな。
648デフォルトの名無しさん:2006/05/23(火) 17:21:29
ましてやコンパイル時のことはねえ。
649デフォルトの名無しさん:2006/05/23(火) 18:07:13
読みやすい方が重要
650デフォルトの名無しさん:2006/05/23(火) 18:09:07
>>646
> ってことはシングルで . でつなげたほうがコンパイルは速いのか
そりゃないでしょ。
スクリプトレベルでそういう風に書くと、明示的に処理が入っちゃうから
返って遅くなるはず。
651デフォルトの名無しさん:2006/05/23(火) 18:29:20
速度が気になるならインタープリタの言語を使うのは間違いのような気がするが…。
高速化したい所だけCで書いたコマンド作って動かすということを、俺はたまにやる。
652デフォルトの名無しさん:2006/05/23(火) 18:44:29
>>651
言語のインタプリタなら分かるがインタプリタの言語というのは聞いたことがない
653デフォルトの名無しさん:2006/05/23(火) 18:53:01
>>652
ああ、そうか。そうだな。
654デフォルトの名無しさん:2006/05/23(火) 19:27:00
インタプリタ型言語だな
655デフォルトの名無しさん:2006/05/23(火) 20:23:34
>>652
勝ち誇り、おめ。
656629=637:2006/05/23(火) 21:30:07
>641
すごくよく理解できました。
ありがとうございました
657デフォルトの名無しさん:2006/05/24(水) 01:55:13
シングルクォート vs ダブルクォートでいくつかベンチを取ってみたけど、同一ベンチでも結構ばらつくね。
傾向としてはシングルクォートがやや優勢。またデータセットがある程度を超えて大きくなるにつれ、差が縮まっていくように見える。

で、パフォーマンスチューニングって Perl でも話題としてはアリだと思うんだ。「ここボトルネックなんだけど、書き方次第でもちっと早くなんね?」的なね。
もちろんこのスレ的には「まず読みやすいコードを書きましょう」が基本だし、試さないうちから「どちらが早い?」なんて訊かれてもがっかりするんだけどさ。
658デフォルトの名無しさん:2006/05/24(水) 08:14:30
同意。
最大のボトルネックに気付かず、大した影響のないクォートの話であーだこーだ言うのも滑稽だよね。
659デフォルトの名無しさん:2006/05/24(水) 08:15:48
>>658
勝手に人の話を妙な風に解釈するなよwww
660デフォルトの名無しさん:2006/05/24(水) 15:14:41
リファレンスについて

sub reff {
  my @a = qw(a b c);
  my @b = \@a;
}
my @list = reff()
print @{ $list[0] };;

このコードではサブルーチンreffの最後の行
my @b = \@a
の評価結果(つまり@b)が返されて@listに格納されるので
サブルーチン内でmy宣言された@aのリファレンスは
スコープを出ても生きています。
もしも上のコードを

sub reff {
  my @a = qw(a b c);
  my @b = \@a;
}

reff();

としてしまったら、@aのリファレンスはどうなりますか?
メモリリークになるのでしょうか?
それともreff()が無効コンテキストだから破棄される?
661デフォルトの名無しさん:2006/05/24(水) 15:22:38
破棄
662デフォルトの名無しさん:2006/05/24(水) 15:35:32
>>660
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlref.html
> ハードリファレンスは賢く実際に参照されている数を管理していて、
> その数が 0 になれば自動的に解放を行ないます。(注意: 自己参照や
> 循環データ(cyclic data)にある値に対する参照カウントは、ちょっと
> した手助けなしにはゼロにはなりません。詳しくは perlobj を参照
> してください。)
663660:2006/05/24(水) 15:50:34
わかったーーありがとうございましたーー
664デフォルトの名無しさん:2006/05/24(水) 16:01:31
ぶっちゃけperlって手続き型言語の中じゃ
一番学習コストかかるよね?
665デフォルトの名無しさん:2006/05/24(水) 16:04:01
>>664
ただでできるよ?
666デフォルトの名無しさん:2006/05/24(水) 16:07:49
>>664
安く上げることも出来ると思うが。
本を買わないで perldoc とウェブ検索で済ますんだよ。
667デフォルトの名無しさん:2006/05/24(水) 16:26:14
リファレンスついでに前から聞きたかったこと

\*globb
これは型グロブのリファレンスらしいんだが
いったいどういう用途があるの?

サブルーチンの引数として\@arrayを渡すと
配列のコピーコストがカットできるっていうのは
読んだことがあるけど型グロブならコピーのコスト
なんて発生しないでしょ?
668!664:2006/05/24(水) 16:31:05
コストって、値段のことじゃないんじゃない?時間とか。
なんにしろ他と差があるとは思わないけど。
669デフォルトの名無しさん:2006/05/24(水) 16:33:06 BE:231821273-#
またブログで見かけたネタ持ってくるのかよ
670デフォルトの名無しさん:2006/05/24(水) 16:58:22
こんなことができたりする。

use IO::Handle;
open(F, '> test.txt') or die;
my $fh = \*F;
$fh->print("aaa\n");
$fh->close();
671デフォルトの名無しさん:2006/05/24(水) 17:14:02
>>667
リファレンスにしなくても配列のコピーは無料ですよ?
672デフォルトの名無しさん:2006/05/24(水) 19:32:40
>>671
667じゃないですが横から失礼します。Perl勉強中の者です。

> 配列のコピーは無料ですよ?

ラクダ本には、関数の引数は参照渡し(@_ に入っているのはエイリアス)と書いてありますが
これはつまり $_[0]++; などと書けば、第一引数として渡した左辺値がインクリメントされる、
という理解でいいんでしょうか。この場合、左辺値になれない値を渡すとエラーになるんですよね?

その前提でいくと、配列を渡した場合も、個々の要素(スカラー値)のエイリアスが @_ に入るだけで
コピーは発生しないはずでは? それとも、@_ にエイリアスが入る事を「コピー」と呼ぶのでしょうか?
673デフォルトの名無しさん:2006/05/24(水) 20:42:23
例えば
hoge[test]hoge
という文字列があったとして、"test"を取り出したい場合、
"[" と "]"をindexで探してsubstringする方法しかないでしょうか。

他の方法があれば教えてください。
674デフォルトの名無しさん:2006/05/24(水) 20:48:25
>>673
正規表現
675デフォルトの名無しさん:2006/05/24(水) 20:49:17
$foo = "hoge[test]hoge";
$foo =~ m/[a-z]+\[([a-z]+)\][a-z]+/;
print($1);

とか?
676デフォルトの名無しさん:2006/05/24(水) 21:17:52
レス有難うございます。
実験させていただきます。
677デフォルトの名無しさん:2006/05/24(水) 21:59:10
>>672
@array = (1..1000);
&func(@array); # scalar @_ == 1000
&func(\@array);  # scalar @_ == 1
678デフォルトの名無しさん:2006/05/24(水) 22:03:58
@array[0..9] という風に、配列の範囲を指定出来るようになったのは
バージョン何のPerlからですか?
679デフォルトの名無しさん:2006/05/24(水) 22:07:06
>>678
4? もっと前かなぁ。まぁ、配列スライスの実装はかなり前だ。
680デフォルトの名無しさん:2006/05/24(水) 23:51:30
C言語のヘッダファイルのように、
定数を設定するファイルをプログラム本体と分離しようと
プログラム本体側から変数に値を代入するプログラムをrequireしたのですが、
strictだと、変数を参照するときに怒られてしまいます。
strictの場合はどのようにするのが一般的なのでしょうか。
681デフォルトの名無しさん:2006/05/25(木) 00:01:41
>>680
sub PI () { 3.14 }
1;

な pi.pl を用意しておいて、

BEGIN { require 'pi.pl' }

した上で、

print PI;

なんてやり方もあるけど、どう?
682酩酊 ◆TWARamEjuA :2006/05/25(木) 00:17:02 BE:2940293-#
683デフォルトの名無しさん:2006/05/25(木) 01:00:38
>>671
そうじゃなくて
sub subroutine {
  my @list2 = sfhit;
}

subroutine(@list);

ってするときに
subroutine(\@list);
とした方がコピーのコストが省けるでしょって意味
684デフォルトの名無しさん:2006/05/25(木) 01:25:55
>>683
subroutine(\@list);と渡したら

sub subroutine {
  my $ref = shift;
  my @list2 = @$ref;
....
}
などとする必要があるぞ。

例示として適当なのは
sub my_sort { map{ undef $_ } @_; }
@list = my_sort(@list);
としたときに、
@listで受け取る以前にsub my_sortが@_に対する直接の操作をしているので
my_sort(@list);
と等価になると言う辺りか。

参照渡しでメモリの節約だとかスピードアップだとか言われるけど
本当の意味が分からんやつはしなくてよろしい。
685デフォルトの名無しさん:2006/05/25(木) 01:26:47
array を渡すと、各要素のコピーが発生するの?
686デフォルトの名無しさん:2006/05/25(木) 01:27:31
うぉ、サブルーチン名間違ってるなw
687672:2006/05/25(木) 01:27:39
どうも、「コピー」と「エイリアス」という使い分けは一般的ではないのでしょうか?
「コピー」は「値は同じでも実体が異なるもの」
「エイリアス」は「別名だが実体は同じもの」という意味ですよね?

手元の「第2版 プログラミングPerl VOL.2」の P1193 にある「エイリアス」の定義では、
> サブルーチン呼び出しの実引数が入る @_ の各要素に対して、それぞれ暗黙の
> 一時的なエイリアスが作られる。
となっています。

>>671>>683 では「コピー」と書いていますが、「エイリアスを作る事」を「コピー」と呼ぶのですか?
>>672でお聞きしたつもりでした。書き方が悪かったようで申し訳ありません。
688672:2006/05/25(木) 01:30:37
失礼。間違えました。
>>687 =~ s/第2版/第3版/;
689672:2006/05/25(木) 02:05:17
連続カキコ&スレを止めてしまったようで、すいません。
どうも定義を明確にする癖があって・・・ ここではそういう厳密さはNGみたいですね・・・ もうねるぽ。。。
690デフォルトの名無しさん:2006/05/25(木) 03:14:09
エイリアスはコピーではない。
コピーにたいする操作はコピー元に影響を与えない。
エイリアスへの操作は参照元と影響を共有する。
691デフォルトの名無しさん:2006/05/25(木) 03:32:12
>>687
>>683じゃないけど

確かに@_はエイリアスだけど
my @a = @_;
ってやった時点でコピー。
@aに何しても元の配列に影響なし

配列のコピーが無料なのは
my @a = @_;
をやらない場合

だとおもう
692デフォルトの名無しさん:2006/05/25(木) 03:32:57
いやだから
サブルーチン内で@_を直接操作するなんてのは
トラブルのもとだからサブルーチン内で局所変数
用意してそこに引数をぶち込むのが定石で
ぶち込むときには当然
sub subroutin {
my $class = shift;
my @list = @_;
}
とかってするけどこのときに@_から@listへの配列の
コピーが発生してうざいからサブルーチンの引数を
配列のリファレンスにしてサブルーチン内で
デリファレンスして使った方がちょっとだけ速度改善
という話じゃないのかい?
693692:2006/05/25(木) 03:33:55
>>691と全く同じことをいっている・・うつだもうねるぽ
694デフォルトの名無しさん:2006/05/25(木) 03:40:08
>>692
> サブルーチン内で@_を直接操作するなんてのは
> トラブルのもと

どの辺がトラブルのもとになるのか詳しく教えてください><
695デフォルトの名無しさん:2006/05/25(木) 03:44:34
>>694
> どの辺が
「サブルーチン内で@_を直接操作する」辺りが。
696デフォルトの名無しさん:2006/05/25(木) 04:55:02
ドキュメントで明示化すればよろしい。

別にトラブルにならんと思うがね。
実際に使ってるモジュールもあるし。
697デフォルトの名無しさん:2006/05/25(木) 06:12:22
再帰処理でコピーなんか多用したらあっという間に
OutofMemory
698デフォルトの名無しさん:2006/05/25(木) 11:33:02
>>694
perlのサブルーチンはCなんかの
int subroutine (int x, int y) {
  return x * y;
}

とは違って"基本的に"引数の型や戻り値の型を指定できない
sub subroutine {
  return $_[0] * $_[1];
}
こんなサブルーチンがあったら何をやっているか激しく意味不明だろ?
数字同士を掛けてるのかそれとも文字列同士を掛けてるのかもしれない
qmailの作者のコードじゃないんだから意味不明さは避けなきゃ
699デフォルトの名無しさん:2006/05/25(木) 11:46:31
それが

sub subroutine {
my($x, $y) = @_;

return $x * $y;
}

だとしても意味不明なのは一緒だと思うのだが。
700デフォルトの名無しさん:2006/05/25(木) 11:49:46
$xと$yだったら面積の計算だとわかるだおうが!
701デフォルトの名無しさん:2006/05/25(木) 11:50:36
(゚д゚)ハァ?
702デフォルトの名無しさん:2006/05/25(木) 11:51:54
置換系のサブルーチンとか、渡す値自体がコピーだったりする場合が@_を直接弄っても大丈夫な例か?

好みの問題というか、宗教の問題というか。
正解はないが、そこまで毛嫌いする処理じゃないと思うぞ。

よほどでかい配列を扱うか、使用頻度の高いサブルーチンでも無い限り
速度どうのこうの言うのは馬鹿げてると思うぞ。
なぁ>>692
703デフォルトの名無しさん:2006/05/25(木) 11:59:14
サブルーチンへの引数の参照渡しの利点は
引数のグルーピングができるってことじゃないの?

@a = qw(a b c);
@b = qw(3 2 1 0);
s(\@a,\@b);

みたいな
これをリファレンス使わなかったら引数の解析だけで
えらい手間だと思う
704デフォルトの名無しさん:2006/05/25(木) 12:17:03
変数の値をサブルーチンの名前として指定する方法ってありますか?
$name = "sub1";
として、
&sub1();
を実行するような感じです。
705デフォルトの名無しさん:2006/05/25(木) 12:27:05 BE:70752724-#
&{$name};
706デフォルトの名無しさん:2006/05/25(木) 12:40:49
>>705
できましこ。ありがとうございます!
707デフォルトの名無しさん:2006/05/25(木) 12:51:33
あと、そのサブルーチンが処理しようとしてる
引数の個数とかも明示されない
これはあとでそのサブルーチン呼ぼうとしたとき
いちいち全部に目を通さないとならんくなるよな

それに、サブルーチンの引数を変更したときに
変更箇所が増える、というのもある
708デフォルトの名無しさん:2006/05/25(木) 13:11:28
@pairs = split(/&/,$buffer);
{
my $a = $pairs[1];
709デフォルトの名無しさん:2006/05/25(木) 13:15:44
@pairs = split(/&/,$buffer);
{
my $a = $pairs[1];
}
クエリかなんかでおくられていたデーターをアパサンドで分割
配列変数@paisrに入れて一番上最初の文字列をスカラー変数$aに代入
したいのですがこれであってますか?
710デフォルトの名無しさん:2006/05/25(木) 13:20:35
コンストラクタでblessする変数は$thisじゃなくて$dickにしてもいいですか?
711デフォルトの名無しさん:2006/05/25(木) 13:24:01 BE:495264487-#
日本語でおk
712デフォルトの名無しさん:2006/05/25(木) 13:53:40
#!/usr/bin/perl

# レスポンスヘッダの出力
print "Content-type: text/html", "\n\n";
# 代入
$buffer = "abcdef";
@pairs = split(/&/,$buffer);
{
my $a = $pairs[1];
}

# HTMLの出力
print "<HTML>\n";
print "<BODY>\n";
print $buffer, $a, pairs[1], "<font size=7>ハローワールド</font><BR>\n";
print "</BODY>\n";
print "</HTML>\n";
うわぁぁん ウゴカネ('A':)
713デフォルトの名無しさん:2006/05/25(木) 13:57:54 BE:716364599-#
お前は何がしたいんだ
714デフォルトの名無しさん:2006/05/25(木) 15:06:03
配列の一番最初は1じゃなく0だから。つかしね。
715デフォルトの名無しさん:2006/05/25(木) 16:40:38
死ねと言いながらも教えてあげる>>714に萌えた
716デフォルトの名無しさん:2006/05/25(木) 17:11:25
@pairs = split(/&/,$buffer);
{
my $a = $pairs[1];
}
print $a; # undefined value

これは何か期待できる。
717デフォルトの名無しさん:2006/05/25(木) 18:52:32
すごいのがきたな
718デフォルトの名無しさん:2006/05/25(木) 19:00:56
何がしたいんだろう。難解だな。
719デフォルトの名無しさん:2006/05/25(木) 19:05:55
>>716
$bでもやってみれば
720デフォルトの名無しさん:2006/05/25(木) 19:07:08
使用するモジュールを引数によって変更したいのですが書き方がわかりません。

use や new するときのモジュールに変数を使えないでしょうか?

sub hogehoge()
{
 my $pm_name = shift;
 use $pm_name;
 my $obj = new $pm_name();
}
721デフォルトの名無しさん:2006/05/25(木) 19:16:07
>>720
最初から全部 use しとけば?
722デフォルトの名無しさん:2006/05/25(木) 19:30:48
>>710
おk

>>720
eval 等を使うべし。
723デフォルトの名無しさん:2006/05/25(木) 19:40:12
>>720
autouseを使ってなんとかならんか?
724720:2006/05/25(木) 19:53:46
ありがとうございます。

use を require にしたら変数を指定しても動きました。

evalだと何故か「Can't locate object method "new" via package "モジュール名" (perhaps you forgot to load "モジュール名"?) at hoge.pl line 行番号.」となりました。
725デフォルトの名無しさん:2006/05/25(木) 20:09:09
なんのモジュールだかは知らんけど、useをrequireにするとタイミングが変になるからBEGINだといいよ。
しかもuseとかサブルーチンで囲んだりしてもスコープの変化以上の意味はないよ。
726デフォルトの名無しさん:2006/05/25(木) 20:29:07
ほんの数日前にPerlを始めたものですが質問をさせてください。
・RedHatLinux上で動作させるプログラムを書きたいと思っています。
・開発はWindowsでやりたいです。
開発はActiveperlで行えそうですが改行コードが異なる点が問題です。
改行コードの一括返還の行えるソフトや
もともとLinuxでの改行コード(LF?)で開発のできるソフトなどありましたら
教えていただきたいです。
始めたばかりで質問に必要な情報を提示しているかどうかもわからない状態です。
かけていることがありましたら指摘お願いします。
727デフォルトの名無しさん:2006/05/25(木) 20:32:06
>>726
Windows の方は Cygwin 使えばいいんじゃないか?
多分そのままじゃ漢字使えないけど。

ああ、でも、Linux側に ftp で put して動かすという場合は
改行コードは ftp が変換してくれるよ。ascii モードで送れば
いいの。漢字のコードについては Windows では MKEditor とか
使えばいいんじゃないのかな。
728デフォルトの名無しさん:2006/05/25(木) 20:49:52
Perlについての質問なのか?
729デフォルトの名無しさん:2006/05/25(木) 21:03:39
>>726
何もしなくていい。改行コードの違いなんて問題にならない。
730デフォルトの名無しさん:2006/05/25(木) 21:16:58
>>729
#! の行の改行コード違うとちょっと困りそう。
-- で回避するのめんどくさい。
731デフォルトの名無しさん:2006/05/25(木) 21:53:09
>>726
>改行コードの一括返還の行えるソフトや

perl -i.bak -pe "binmode(select);s/\r//g;" *.pl
とか?
732デフォルトの名無しさん:2006/05/25(木) 22:23:51
733デフォルトの名無しさん:2006/05/25(木) 22:24:58
>>730
最初からLFで書いておけ、って話じゃないの?
734デフォルトの名無しさん:2006/05/25(木) 22:38:46
引数の@_はエイリアスなんだけど、戻り値については必ず値のコピーが発生するよね?
735デフォルトの名無しさん:2006/05/25(木) 22:59:47
2chのトリップ生成のperlのソースコードってありませんか
736デフォルトの名無しさん:2006/05/25(木) 23:11:59
http://age.s22.xrea.com/talk2ch/
トリップとIDの算出方法
737デフォルトの名無しさん:2006/05/25(木) 23:36:02
>>734
戻り値を何かに保存するなら、という条件付。
その場合は間違いなく値のコピーが発生するぞ。
たとえ戻り値が巨大な配列のリファレンスだったとしても、ちゃんと一つの「配列リファレンス」という値が、な。
738デフォルトの名無しさん:2006/05/25(木) 23:40:13
C言語でUnixを作ったように、
PerlのみでOSを書くことはできますか?
739デフォルトの名無しさん:2006/05/25(木) 23:40:57
>>736
どうも有難う御座います
740デフォルトの名無しさん:2006/05/25(木) 23:43:46
>>738
無理って言いたいけど
741デフォルトの名無しさん:2006/05/25(木) 23:48:04
叶?
742デフォルトの名無しさん:2006/05/25(木) 23:48:53
♀?
743デフォルトの名無しさん:2006/05/25(木) 23:49:20
>>738
どうだろね。 perlは何らかのソフト環境上で
動作してる様だし、原則無理ではないかな。
エミュレーターぐらいならなんとか。
744デフォルトの名無しさん:2006/05/25(木) 23:51:32
>>737
grepやmapは内部でどういう処理してるんだろう?
Perlの組み込み関数はさすがにやってないよね?
745デフォルトの名無しさん:2006/05/25(木) 23:51:50
>>743
ということは Perl machine を開発すれば解決ということか。
746デフォルトの名無しさん:2006/05/25(木) 23:53:49
ネットワーク基盤とかミドルウェアなら作れそうですか?
747737:2006/05/25(木) 23:54:25
>>744
文意はいまひとつ取れないけれど、興味があるなら調べてレポートよろしく。
748デフォルトの名無しさん:2006/05/26(金) 00:08:58
>>746
可能かどうかなら、可能なのかもね。
しかしそれを使うソフトは、どうすることもできない
パフォーマンスの頭打ちに悩まされる。
749デフォルトの名無しさん:2006/05/26(金) 00:12:59
そこでparrotですよ!!
(徴妙にスレ違い。)
750デフォルトの名無しさん:2006/05/26(金) 00:23:56
ああそうか、その上で動かすソフトがある門ね。
最近Perlが好きになったんだけど、テキスト処理しかしてないから、もっとなんか作れないかなと思って。
751デフォルトの名無しさん:2006/05/26(金) 00:40:14
コンパイル出来るんだからその気になれば作れるし速度の問題もそれなりになるんじゃね?

しかし、作る理由が「興味」以外にない。
752デフォルトの名無しさん:2006/05/26(金) 00:41:27
>>731
入力時に既にCRは消えてるからARGVOUTをbinmodeにするだけでLF出力になるよ
753デフォルトの名無しさん:2006/05/26(金) 02:17:01
>>750
そういうレベルの話なら
ImageMagick あたりの画像加工モジュールとか試して
みたら?(ピュアパールではないが)
754デフォルトの名無しさん:2006/05/26(金) 06:30:40
PerlでDOS画面に同じ文字を繰り返したら指定されたコマンドを動かすときどうすればいいんでしょうか('A`)
755デフォルトの名無しさん:2006/05/26(金) 06:41:20
>>754
日本語でおk
756デフォルトの名無しさん:2006/05/26(金) 06:57:17
唯一相手にまともに伝わってるのが顔文字による感情表現ってのが
実に象徴的だよな。
757デフォルトの名無しさん:2006/05/26(金) 11:16:23
>>738
perl -e 'for(;;){print"a:\\> ";$s=<>;chomp($s);if($s eq"dir"){system"ls"}}'
758デフォルトの名無しさん:2006/05/26(金) 12:38:59
>>757
妙にPerl使いっぽくない書き方だな。いや別にだからどうしたってこともないけど。
759デフォルトの名無しさん:2006/05/26(金) 12:51:41
まーたはじまった
760デフォルトの名無しさん:2006/05/26(金) 14:00:41

これが荒らし。言うまでもないか。
761デフォルトの名無しさん:2006/05/26(金) 17:47:05
特殊変数 $/ を、特定のファイルハンドラについてのみ変更したいのですが、可能でしょうか?
もしできなければ、他の方法を教えていただけるとありがたいです。
762デフォルトの名無しさん:2006/05/26(金) 17:52:51
local とか
763デフォルトの名無しさん:2006/05/26(金) 18:32:30
open IN, $ARGV[0] ;
my $test = do { local undef $/ ; <IN> } ;
close IN ;


my $file = 'hoge' ;
my $test = do { local ( @ARGV, $/ ) = $file ; <> } ;

ttp://search.cpan.org/~uri/File-Slurp-9999.12/extras/slurp_article.pod
764デフォルトの名無しさん:2006/05/26(金) 19:36:28
>>757
何を言いたいか全くわからないがOSのつもり....なのか?
OSとか、shellとかが何なのかわかってる?
765デフォルトの名無しさん:2006/05/26(金) 20:23:19
そういえばperlのネイティブコンパイラってどうなったの?
実用化されたの?
766デフォルトの名無しさん:2006/05/26(金) 20:24:01
OSよりさきにブラウザから始めれば?
CSS2に完全準拠してくれるとかだとありがたい。
文法エラーをどれだけ精度良く無視できるかがキーだけどOSよりは難易度低いかと。
767デフォルトの名無しさん:2006/05/26(金) 22:05:45
perlで計算科学のプログラムを書きたいんだけど,
そうなるとCかFrotranの独壇場なんだよね。MPIもないし。
768デフォルトの名無しさん:2006/05/26(金) 22:09:00
>>767
適材適所って言葉知ってる?
769デフォルトの名無しさん:2006/05/26(金) 22:47:10
言われなくてもしってるよ。 疲れる
770デフォルトの名無しさん:2006/05/26(金) 23:30:19
今はその辺りはHuskel
771デフォルトの名無しさん:2006/05/26(金) 23:40:28
Haskell じゃ?
772デフォルトの名無しさん:2006/05/27(土) 00:05:40
HuskelとHaskellは違うぞ。
773デフォルトの名無しさん:2006/05/27(土) 00:15:12
ハッスル!ハッスル!
774かえる:2006/05/27(土) 00:27:03
最近 perlを勉強し始めたんですが 構文エラーで
Unrecognized character \81 at ファイル名. pl line 4.
と表示されます。

\81とは何を示しているんですか? お願いします教えて下さい。
775デフォルトの名無しさん:2006/05/27(土) 00:32:14
おそらくShift_JISの全角スペース文字(0x8140)の1バイト目だと思う
776デフォルトの名無しさん:2006/05/27(土) 00:39:21
>>772
Huskel ってどういう意味ですか><

Huskel の検索結果 約 480 件中 1 - 10 件目 (0.06 秒)
Haskell の検索結果 約 18,200,000 件中 1 - 10 件目 (0.16 秒)

見た感じ特別な意味はなくてただのtypoか人名っぽいんだけど・・・
なんだろ。Haskell の親戚かなにか?
777デフォルトの名無しさん:2006/05/27(土) 00:48:39
親戚っていうか俺
778デフォルトの名無しさん:2006/05/27(土) 01:01:18
Huskelさんは算数が得意な日系コロンビア人です。
779デフォルトの名無しさん:2006/05/27(土) 01:13:12
だれか>>765に答えてくれろ
780デフォルトの名無しさん:2006/05/27(土) 01:22:37
parrot のこと?じゃないよなあ…
781デフォルトの名無しさん:2006/05/27(土) 01:30:24
まさかperlcc
782デフォルトの名無しさん:2006/05/27(土) 02:08:35
typoで盛り上がってるのは自演ですか?
783デフォルトの名無しさん:2006/05/27(土) 04:34:30
>>775みたいなプログラマになりたいな。
784デフォルトの名無しさん:2006/05/27(土) 12:17:07
全角スペースを入れてしまうような阿呆にマジレスするような奴にか?
785デフォルトの名無しさん:2006/05/27(土) 15:01:24
>>784
\81から始まるのは、別に全角スペースに限らんだろうが。
use encodings を宣言せず、sjisの全角文字を入れたことが原因と思われ。
786デフォルトの名無しさん:2006/05/27(土) 15:52:15
>>783は素直にお礼を言えないアホ>>774
787デフォルトの名無しさん:2006/05/27(土) 17:00:42
>>785
ちょ、 \81 って、それ >>774 と同レベル。
788デフォルトの名無しさん:2006/05/27(土) 17:42:00
質問です。

mainパッケージで@hogeリスト変数に値をいれておき、
その後実行するサブルーチンの中で、以下の処理を実施します。

while(<FH>){
  #なんか処理
  #なにもしなくてもOK
}

するとなぜか@main::hogeのある値が更新されてしまいます。
上記ループ処理がないと更新はされません。
こういった現象が起こるにあたって、なにかこれが問題では?
というような心当たりとかありましたら教えてほしいです。

よろしくおねがいします。
789酩酊 ◆TWARamEjuA :2006/05/27(土) 17:46:57 BE:5336677-#
>>788
あると云えばあるしないと云えば無い。
という回答を所望なのかしら?

具体的にソースを晒した方がより具体的な回答が得られるかと。
790デフォルトの名無しさん:2006/05/27(土) 17:49:35
>>789
りょうかいしました。
ちょっと可読性あげと個人情報保護対策しますので
少々おまちを・・・
791788:2006/05/27(土) 18:06:14
#ソースです。

use Data::Dumper;
use strict;
use constant DEBUG => '1';
my $target;

while(<DATA>){
  if(/^target=(.*)$/){
    $target=$1;
  }
}

open FH,"<$target" or die $!;
opendir DIR,"./" or die $!;
@main::pkgs = readdir DIR or die $!;
my $target_result = $target."_result.txt";
open FOUT,">$target_result" or die $!;

#続く
792788:2006/05/27(土) 18:07:27
#続き

while(<FH>){
  my $line = $_;
  $line =~ s{
    ([^A-Za-z0-9_]+)
    (?:
      (
        (?:[A-Z]+_{1})+PKG\.
        (?:[A-Z0-9]+|(?:[A-Z0-9]+_{1})+?[A-Z0-9]+)
      )
    )
    ([^A-Za-z0-9_]+)
  }{$1.trans($2).$3}egx;
  print FOUT $line;
}
close FH;
close FOUT;

#さらに続く
793788:2006/05/27(土) 18:08:05
#続き

sub trans(){
  my $arg = shift;
  
  foreach(@main::pkgs){
    my ($pkgN,$val) = split /\./,$arg;
    $pkgN .= ".sql";
    if($_ eq $pkgN){
      return search($pkgN,$val);
    }
  }
  return $arg;
}

#さらに続く
794788:2006/05/27(土) 18:09:14
#続き

sub search(){
  my ($pkgN,$val) = @_;
  open FH1,"<$pkgN" or die $!;
  print "**sub search**\n",Dumper(@main::pkgs),"*******\n";
  while(<FH1>){
    print "**sub search**\n",Dumper(@main::pkgs),"*******\n";
    if($_=~ /^$val[\s]+CONSTANT[\s]+.*[\s]+:=[\s]+('[A-Z0-9]+');.*$/){
    }
  }
  close FH1;
  NOHIT:
  return $val;
}

__DATA__
target=HOGE_HOGE.sql

#以上

788でいっているのが上記のwhile(<FH1>){あたりからの処理です。
795デフォルトの名無しさん:2006/05/27(土) 18:42:01
sub search の中で @main::pkgs が更新されるって事?
どういう風に値が変わるのかも書いたほうがいいんじゃないかな。
さすがに、テストデータ作ってまでデバッグしてくれる人はいないでしょ。
796デフォルトの名無しさん:2006/05/27(土) 18:44:07
$_ がパッケージ(グローバル)変数だからやね。

while(<FH1>) は while(defined($_ = <FH>)) なんだけど、これが
for (@pkgs) つまり for $_ (@pkgs) 中で呼ばれているので、
while(<FH1>) が実行されるときの $_ は @pkgs 中の1要素(のエイリアス)になってる。
797788:2006/05/27(土) 18:57:04
ちょっくら試してみます。
798デフォルトの名無しさん:2006/05/27(土) 19:33:36
へーなるほど。知らなかった・・・。これはハマリやすそうな罠。勉強になるなぁ。

my @arr = (1, 2, 3, 4);
print "**@arr**\n";
foreach (@arr) { read_data() }
print "**@arr**\n";

sub read_data { print while (<DATA>) }

__DATA__
AAA
BBB

実行結果
**1 2 3 4**
**   **
799デフォルトの名無しさん:2006/05/27(土) 19:34:58
あ、>>798の実行結果はこうだった。ちなみに僕は>>788とは別人です><

**1 2 3 4**
AAA
BBB
**   **
800デフォルトの名無しさん:2006/05/27(土) 21:11:43
>>788
while は $_ を破壊してしまうから foreach を使うべし。
801デフォルトの名無しさん:2006/05/27(土) 21:32:48
>>800
ネタだと思うけど一応。

while (my $hage = <>) {}

と書け。

{
local $_;
while () {}
}

って解決策もあるけど、こんなんだったら my 使ったほうがいいべ。

802デフォルトの名無しさん:2006/05/27(土) 21:40:54
>>800
詳しく
803デフォルトの名無しさん:2006/05/27(土) 21:44:22
>>800
ネタなんだろうけど、そんなことくらい気にするなよ。
$_は自分で使うときは必ずlocal $_する。
何かの関数を呼び出したら$_が破壊されていると考える。
それで充分。
804デフォルトの名無しさん:2006/05/27(土) 22:12:37
>>802
ネタ……だよね?
「必ずlocal $_する」くらいなら、名前を付けてあげようよ。w

スコープについての心配が煩わしいなら、すでに $_ を使う理由がないということなのだから。
805804:2006/05/27(土) 22:14:08
s/>>802/>>803/
失礼。
806804:2006/05/27(土) 22:26:04
>>802
失礼のお詫びにサービス。

foreach はループ変数がグローバルである場合、自動的に変数の局所化を行う。対して while はそれをしない。
>>800 の「破壊」ってのはそれを指していると思われるけれど、うん、100% ネタということで。
807デフォルトの名無しさん:2006/05/27(土) 23:04:52
あーごめんごめん。
>>806 の意味です。
808デフォルトの名無しさん:2006/05/27(土) 23:55:11
質問です。
なんかbbs.cgiの仕様がこう(次レス)変わったらしいんですが、
これにage2ch.plを対応させるにはどこをどう変えたらいいんですか?
search.plもだいぶ前から使えなくなってますが、串使うことないので別にいいです。



age2ch.plダウンロード先
http://prdownloads.sourceforge.jp/age/8541/age2ch.pl0.04.04.01.tar.gz
http://sourceforge.jp/projects/age/
809808:2006/05/27(土) 23:55:48
http://pc8.2ch.net/test/read.cgi/tech/1057329161/459-461

459 :stream ◆PNstream2s :2006/05/27(土) 16:31:16
新しい書き込みの仕様
レス
FROM= ←名前
mail= ←メール欄
MESSAGE= ←本文
bbs= ←板のディレクトリ名。operateとかtechとか
time= ←現在時刻より小さい値を適当に。1を送っておけばよい
key= ←スレッドキー
hana=mogera ←追加。常にmogeraを送っとけばいいのかな。
Cookieは不要。


460 :stream ◆PNstream2s :2006/05/27(土) 16:35:43
スレ立て
subject= ←スレッドのタイトル
FROM= ←名前
mail= ←メール欄
MESSAGE= ←本文
bbs= ←板のディレクトリ名。operateとかtechとか
time= ←現在時刻より小さい値を適当に。1を送っておけばよい
hana=mogera ←追加。常にmogeraを送っとけばいいのかな。


461 :stream ◆PNstream2s :2006/05/27(土) 16:36:37
Cookieは不要と書きましたが、sports2はCookie無しじゃ書けないので
Cookieも今までどおり必要ですね
810デフォルトの名無しさん:2006/05/28(日) 00:05:46
Perlででかい何かを作りたいよぅ
811デフォルトの名無しさん:2006/05/28(日) 00:16:41
foreach (<FH>) って、とても素敵。

呼び出した先での $_ の破損を調べるのに &hogehoge for 1; とか、
$_ を無駄に保護するのに &hogehoge for 1..1; とかどうですかね。

>>806 さん
重箱の隅ですが、foreach のループ変数局所化はmy変数にも有功ですだよ。
812デフォルトの名無しさん:2006/05/28(日) 00:49:48
>>810
> Perlででかい何かを作りたいよぅ

Winnyノード
813808:2006/05/28(日) 00:56:01
華麗にスルーしないで下さい><
814デフォルトの名無しさん:2006/05/28(日) 01:06:25
わかったよ。

>>808
がんばれ。
815808:2006/05/28(日) 01:08:51
>>814
マジで頼むよ・・・
816デフォルトの名無しさん:2006/05/28(日) 01:09:51
結局、Perlってテキスト編集くらいしか役に立たんのか?
817デフォルトの名無しさん:2006/05/28(日) 01:16:06
>>816
テキスト編集って言ってもイロイロあるんだぞ。
ISPなんかでは、アカウントの作成やらユーザの設定変更やらでPerl大活躍だ。
818デフォルトの名無しさん:2006/05/28(日) 01:21:22
>>816
無知乙
819808:2006/05/28(日) 01:38:17
ここでなんと神降臨!!!
↓ ↓ ↓
820デフォルトの名無しさん:2006/05/28(日) 01:44:44
>>819
スレ違い。改造スレに池。
821sage:2006/05/28(日) 01:49:43 BE:41273524-
>>810
俺のチンコをモデリングするコード
822808:2006/05/28(日) 01:51:18
>>820
改造スレってどこですか?
823806:2006/05/28(日) 02:26:45
>>811
ツッコミさんきゅー。で (レキシカル|ダイナミック) スコープが継承される、と。

お返しに、

>呼び出した先での $_ の破損を調べるのに &hogehoge for 1; とか、
>$_ を無駄に保護するのに &hogehoge for 1..1; とかどうですかね。

デバッグ用としてはアリかと。でも可読性はイマイチ。
>>806 でもちょっと書いたけれど、「これってスコープどうなってんの」な心配が要る時には、$_ を使うべきじゃない。
呼び出し側で $_ を使っていなければサブルーチンが何やっててもその点での心配はしなくていい。
そんなところに神経使うのは無駄ざます。w
824823:2006/05/28(日) 02:31:27
s/>>806/>>804/
毎度毎度……、僕ってダメなやつ。
825デフォルトの名無しさん:2006/05/28(日) 13:34:01
ここで質問に答えている香具師どもはプログラミングPerlとかクックブックとかちゃんと読んでるんだろうな?
826デフォルトの名無しさん:2006/05/28(日) 13:45:55
>>821
小さいから却下。
827デフォルトの名無しさん:2006/05/28(日) 13:50:21
>>825
今度の荒らし君は少しは勉強してきたようですね。えらいえらあい。
828デフォルトの名無しさん:2006/05/28(日) 14:03:19
>>816
つまり、>>817を要約すると、テキスト編集くらいしか役に立たんということだ。

あとは一応、コマンド実行できるから、シェルスクリプト(バッチファイル)の代わりとか、
ネットワーク周りも使えるから、ネットワークのクライアントとかサーバとかそんなもん。
でもやっぱり一番用途が多いのはテキスト編集で、テキストファイルの変換とか多いと気がするな。xxx2htmlとか。

>>822
        ,.-─ ─-、─-、
      , イ)ィ -─ ──- 、ミヽ
      ノ /,.-‐'"´ `ヾj ii /  Λ
    ,イ// ^ヽj(二フ'"´ ̄`ヾ、ノイ{
   ノ/,/ミ三ニヲ´        ゙、ノi!
  {V /ミ三二,イ , -─        Yソ
  レ'/三二彡イ  .:ィこラ   ;:こラ  j{
  V;;;::. ;ヲヾ!V    ー '′ i ー ' ソ
   Vニミ( 入 、      r  j  ,′
   ヾミ、`ゝ  ` ー--‐'ゞニ<‐-イ
     ヽ ヽ     -''ニニ‐  /
        |  `、     ⌒  ,/
       |    > ---- r‐'´
      ヽ_         |
         ヽ _ _ 」

   ググレカス [ Gugurecus ]
  ( 西暦一世紀前半 〜 没年不明 )
829デフォルトの名無しさん:2006/05/28(日) 14:37:21
>>828
ウpレカス
830デフォルトの名無しさん:2006/05/28(日) 14:57:12
ダガコトワル
831デフォルトの名無しさん:2006/05/28(日) 15:05:43
質問お願いします
WEB上のファイルをURLからそのファイル内容を取得したいと思ったのですが
そういったことはできるのでしょうか?

ちなみにファイル開くopen関数で開こうとしてみましたがだめみたいでした;;
open(FILE,
832デフォルトの名無しさん:2006/05/28(日) 15:06:12
requireされたモジュールにおいて、自身のファイルのあるパスを取得するのはどうすればいいでしょうか?
833デフォルトの名無しさん:2006/05/28(日) 15:06:40
>>831
できない。
はいさようなら。
834デフォルトの名無しさん:2006/05/28(日) 15:08:25
>>833
そうですか;;ありがとうございます
835833:2006/05/28(日) 15:09:51
>>834
きにするな。俺はアホだ。
836デフォルトの名無しさん:2006/05/28(日) 15:10:40
>>833
CGIからはどの言語からでも無理ということでしょうか?
837デフォルトの名無しさん:2006/05/28(日) 15:10:50
>>831
google: LWP
838デフォルトの名無しさん:2006/05/28(日) 15:14:18
こんな感じのはどうだい
#!/usr/bin/perl

use strict;
use LWP::UserAgent;

main();

sub getUA {
my $timeout = $_[0] ? $_[0] : 10;
my $ua = LWP::UserAgent->new();
$ua->agent('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)');
$ua->timeout($timeout);

return sub { # new($method, $url, $header)
my $res = $ua->request(HTTP::Request->new($_[0], $_[1], $_[2]));
return ($res->is_success) ? $res : 0;
}
}

sub main {
my $ua = getUA(10);
my $res= $ua->('GET', "$ARGV[0]");
$res or die "$ARGV[0] error\n";

print $res->content;
}
839デフォルトの名無しさん:2006/05/28(日) 15:16:21
GETするだけならLWP::Simple使えよ…。そっちのが早いし。
840デフォルトの名無しさん:2006/05/28(日) 15:29:40
>>83<7-9>
回答ありがとうございました〜LWP::Simpleで調べてみたところ

use LWP::Simple;
$doc = get 'http://www.yahoo.co.jp/';

こんな感じでできるようです^^ありがとうございました〜〜
841デフォルトの名無しさん:2006/05/28(日) 15:55:56
PerlでGCA解凍出来る?
842デフォルトの名無しさん:2006/05/28(日) 15:56:57
>>835
荒らし自演乙。
843デフォルトの名無しさん:2006/05/28(日) 15:57:36
>840
氏ね。
844デフォルトの名無しさん:2006/05/28(日) 16:05:45
>>832
__FILE__

たぶん。
845デフォルトの名無しさん:2006/05/28(日) 16:11:22
Perlプログラムを起動すると、ターミナルの上部が常に同じ表示をしている状態にしたいのですが、
どうしたらよいでしょうか?

たとえば、Perlプログラム起動直後、ターミナル上に
****************************
* This is a Perl program. *
****************************

と表示されるようにします。この後、ほかの動作が入るとターミナルがスクロールされて、
上記の表示はなくなってしまいます。
標準入出力やファイル表示を行っても、常に上記の表示がされているようにしたいのですが、
どうしたらよいでしょうか?
Perlならできるのか、Unixのシステム関数が必要なのかもよくわかりません。
846デフォルトの名無しさん:2006/05/28(日) 16:12:21
>>844
サンキュ!!!
847デフォルトの名無しさん:2006/05/28(日) 16:12:31
>>841
GCA形式とはまたマニアックな。
作ればできるが、今のところそういったモジュールはないと思われる。
848デフォルトの名無しさん:2006/05/28(日) 16:32:36
>>845
できなくはないが…めんどくさいな。

使ったことはないがncursesとかのコンソール用のライブラリを
インストロールする必要があると思われる。

とりあえず、簡単にはできないかと。
849デフォルトの名無しさん:2006/05/28(日) 16:36:06
インストロール
850デフォルトの名無しさん:2006/05/28(日) 16:55:07
空気嫁
851デフォルトの名無しさん:2006/05/28(日) 20:57:50
難問が出されたのでみんな黙ってしまった
852デフォルトの名無しさん:2006/05/28(日) 21:02:52
どれが難問なの?
853デフォルトの名無しさん:2006/05/28(日) 21:35:23
linuxのtopコマンドとかってどうやってるんだろう?
854デフォルトの名無しさん:2006/05/28(日) 21:41:57 BE:132660735-#
PerlっつーかUNIXAPIの質問だろ
http://e-words.jp/w/E588B6E5BEA1E69687E5AD97.html
855デフォルトの名無しさん:2006/05/28(日) 21:55:54
>>845
コマンドラインでの実行が必須の前提なのか?
見た目に拘るならuse Tk;

856デフォルトの名無しさん:2006/05/28(日) 22:53:28
>>845
例によって環境が隠蔽されているでアレだが、
UNIX世界なら、Curses*のモジュールのどれかとか
あるいはTerm*に何かあるかも知れんね。
857デフォルトの名無しさん:2006/05/28(日) 23:23:27
terminfoとか調べてみる必要あるね('A`)
858デフォルトの名無しさん:2006/05/29(月) 01:00:04
>>844
あーやっぱりこれじゃだめですた。
ファイルの置かれてるパスが知りたいので
859デフォルトの名無しさん:2006/05/29(月) 01:15:21
漢字だけ、ひらがなだけをマッチングさせたいのですが、わかりません。
Activeperlでeucで書いています。
下のコードは、適当にテストしたもの。
リンクとかでも良いので、教えて頂けると助かります。

あと、Jcodeの->m(って$1とかは返さないのでしょうか。マッチングだけ?

#perl 5.8.7
use Jcode;
sub getSJIS{
my $x = shift;
return Jcode->new($x)->sjis;
}
$j = "ここが漢字です。abcここカタカナ。";
#$k = Jcode->new($j,"euc");
#$pat = "([亜-熙]+)";
#$opt = "i";
#if ( $k->m($pat,$opt) ){
if ( $j =~ m/([亜-熙]+)/ ){
print getSJIS("漢字 [".$1."]\n");
}else{
print getSJIS("NOT 漢字\n");
}
if ( $j =~ m/([ぁ-ん]+)/ ){
print getSJIS("ひらがな [$1]\n");
}else{
print getSJIS("NOT ひらがな \n");
}
860デフォルトの名無しさん:2006/05/29(月) 01:21:26
mod_perlとサーブレットってどっちが速いの?
861デフォルトの名無しさん:2006/05/29(月) 02:01:11
>>860
「速い」のはサーブレットかな。大抵の場合。
862デフォルトの名無しさん:2006/05/29(月) 02:02:54
そうなんだ。残念だね('A`)
863デフォルトの名無しさん:2006/05/29(月) 02:52:03
864デフォルトの名無しさん:2006/05/29(月) 03:44:22
>>863の図によると、mod_perlのほうがサーブレットより3倍くらい速いね。
っていうか、当たり前か。
865デフォルトの名無しさん:2006/05/29(月) 09:29:46
>>832
%INC
866デフォルトの名無しさん:2006/05/29(月) 14:20:45
>>859
[-]はjperlにするかperlならencoding使わなきゃ無理やろ。
しかも、perlはutf-8で内部処理してるから[亜-腕]じゃ漢字の
範囲を捕らえられない。
参照url:http://plaza.rakuten.co.jp/unixmemo/
867T女の竹田:2006/05/29(月) 14:22:24
>>859
PerlはPHPのようなローカルエンコーディング対応正規表現はないから、
昔のJPerlを引っ張り出してくるか、そうじゃなければutf8でやるしかないよ。

↓こんな感じ。

use encoding 'euc-jp', STDOUT => 'shift-jis';
use Encode;

$j = "ここが漢字です。abcここカタカナ。";
if ( $j =~ m/([\x{4e00}-\x{9fff}]+)/ ){
print "漢字 [$1]\n";
}else{
print "NOT 漢字\n";
}
if ( $j =~ m/([ぁ-ん]+)/ ){
print "ひらがな [$1]\n";
}else{
print "NOT ひらがな \n";
868T女の竹田:2006/05/29(月) 14:24:01
かぶった。

あと、use Encode; は余計でした。
869デフォルトの名無しさん:2006/05/29(月) 14:28:55
[S[NP [Det The][N man]][VP [V ate][N apples]]]
みたいなのをtreeの図(gifとかpngとかの画像)に変えてくれる
モジュール知りませんか?
S
/\
       NP  VP
      /\ /\
Det N V N
| | | |
The man ate apples
870デフォルトの名無しさん:2006/05/29(月) 14:32:04
うお、2chて半角スペースは無視されちゃうんだ。もう一度。
         S
        /\
       NP   VP
      /\  /\
      Det N V   N
      |  | |   |
      The man ate apples
871デフォルトの名無しさん:2006/05/29(月) 15:09:02
>>869
GD かな。
872デフォルトの名無しさん:2006/05/29(月) 15:14:26
>>869
NLPだね。
図にしてくれるのは見た事が無いな。というか図にしようと思わなかった。
Perlであるかどうかも分からないし、自分でぐぐるしか無いのでは。
873デフォルトの名無しさん:2006/05/29(月) 15:34:06
>>869
perlでわざわざ作らんでもgraphvizで一発よ
874デフォルトの名無しさん:2006/05/29(月) 16:49:27
わざわざコンピューター使わなくても紙と筆ペンで一発よ
875デフォルトの名無しさん:2006/05/29(月) 16:53:27
T女の竹田を久しぶりに見た
876844:2006/05/29(月) 21:18:20
>>858
ん?「ファイルの置かれているパス」?相対パスでなくて絶対パスがいいってこと?
__FILE__が相対パスなら、カレントディレクトリ取ってきて__FILE__をくっつければ?

と適当な回答。
877デフォルトの名無しさん:2006/05/29(月) 21:37:38
>>876
アナルほど。__FILE__はカレントディレクトリに対しての
ファイルの位置が得られるんですね。実行ファイルとしての
Perlのモジュールを別のモジュールからrequireしようとして、
そのモジュール内でのrequireに不都合があったんですが、
カレントを取るように書き換えるのがいいみたいですね。
ありがとうございました。
878デフォルトの名無しさん:2006/05/29(月) 21:38:29
>>866
>>867

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

なるほど、内部utf-8ですね。ちらっとその情報は見たことがあるのですが、
昔とかわらない感覚でいました。
日本語に問題あればEUCにすればいいだろ、みたいな。はは。

勉強になりました。
879859:2006/05/29(月) 21:44:01
これからはencodingが便利そうだ、というのはわかったのですが、ファイル出力のところがよく分かりません。
読み込むファイルはsjis。出力もsjisとしたい場合、どうすればよいのでしょうか?
少し調べたときに、ファイル出力は別、というのを見たのですが、、、

これは、思考錯誤している途中のものです。
use encoding 'euc-jp', STDOUT => 'shift-jis';
#use Jcode;

$outfile = "output.txt";
$infile = "input.txt";

#open OUT , '>:encoding(shift-jis)', $outfile or die $!;
#open IN, '<:encoding(euc-jp)', $infile or die $!;

open OUT , '>'. $outfile or die $!;
open IN, '<'. $infile or die $!;

while(<IN>){
if ( $_ =~ m/([ぁ-ん]+)/ ){
# print OUT $_ . "\n";
print $1."\n";
}
}

close(OUT);
close(IN);
880877:2006/05/29(月) 21:59:19
use Cwd;
my $path=getcwd() . "/" . __FILE__;
$path=~s/[^\/\\]+$//;
require $path."jcode.pl";

こうやることにしました
881T女の竹田:2006/05/29(月) 22:15:53
>>879
文字境界とかの問題のためにEUCを使うつもりだったけど
実際にはSJISが扱えればいい、ということであれば

use open ':encoding(shift-jis)';
use encoding 'shift-jis';

で、ソースの文字コードもファイルの読み書きも標準入出力もSJISで行けるよ。
あと、Windowsの話ならshift-jisよりcp932のほうが安全だと思う。
882デフォルトの名無しさん:2006/05/29(月) 22:21:04
>>879
分かってないならuse encodingは使わないほうがいいよ。
#メンテナの人は非推奨だってさ

それはそれとしてサンプルでおかしいのは

open IN, '<:encoding(euc-jp)', $infile or die $!;

の部分かと。shiftjisのファイルを開くなら

open IN, '<:encoding(shiftjis)', $infile

でしょう。ついでに余計なお世話を言うと、
WindowsなファイルならCP932にしたほうが幸せになれるかもしれません。

883デフォルトの名無しさん:2006/05/29(月) 22:32:52
perl 5.8以降で、UTF-8でスクリプトとデータを書いていいのなら、

use strict;
use warnings;

use utf8;

my $idx = 0;
$_ = "漢字カナ混じりの文章で試してみる";
while (m/\p{IsHiragana}+|\p{IsKatakana}+|\p{InCJKUnifiedIdeographs}+/g) {
  print ++$idx, ": $&\n";
}

とかやると、漢字、ひらがな、カタカナの切り分けができる。
漢字はJIS X 0208のだけとかできないけど(がんばれば可能)、
まあ実用上問題になることも少ないんじゃないかと。

詳しくは perlunicode を参照してちょ。
884879:2006/05/29(月) 23:09:29
>>881-883

みなさん、ありがとうございます。
過去のレスにあった、
use encoding "cp932";
use open ":encoding(cp932)";
use open ":std";
でうまくいけそうです。それで、cp932とかたくさん書いてあったんですね。
今、基本的にWindowsなので、sjisで書こうと思っています。
でも、utf8のほうが問題が少なくなるとか、後が楽なら、それもよいと思うのですが、
みなさんはutf8は結構使っているのでしょうか?
どうもutf8とか慣れて無くて、、、
885デフォルトの名無しさん:2006/05/29(月) 23:25:48
windowsで、parとThe Gui Loftで今遊んでいます。

共通化したモジュールを作ったのですが、parのために他のディレクトリからいつもコピーしています。
面倒なので、use libで相対パス指定しようと思ったのですが、
use lib '..\common';
use CheckData;
こんな感じ。
parでexe作成したものだとモジュールを読んでくれないのですが、
何が問題なのでしょう。-a CheckDataで指定しても駄目だし。
私のuse libの使い方とか認識が間違っていると予想。

言いたいこと伝わるかな〜。
886デフォルトの名無しさん:2006/05/29(月) 23:47:02
>>885
使ったことないからわかんないけど、

use lib '../common';

とかじゃダメかな?
887デフォルトの名無しさん:2006/05/30(火) 00:43:10
>>880
遅レスだが、
use FindBin;
$path=$FindBin::Bin . '/' . __FILE__;

の方が良くないか?
モジュールとスクリプトをどうしても別ディレクトリにしたい
ってのなら別だが。
888デフォルトの名無しさん:2006/05/30(火) 01:12:47
>>887
foo.plというスクリプトがあって、それが同じディレクトリにあるjcode.plをrequireしてる。
bar.plというスクリプトはfoo.plをrequireしたい。bar.plの実行は任意のディレクトリで行われる。

/foo/foo.pl
/foo/jcode.pl

/bar/bar.pl

/test において実行

>>880はfoo.plのことです。
カレントディレクトリがどこであろうと、foo.plがjcode.plをrequireできるようにしたい。
であるなら、モジュール内においてカレントディレクトリをチェックしなくてはならないかなと。
889883:2006/05/30(火) 01:39:40
>> 884

use encoding 使うなら(882も云ってる通りお勧めしないけど)、内部的には
変換されてるんで、\p{} プロパティも問題なく使えるよ。

CJK領域からJIS (0208)と重なる分を抜き出して定義するのはちと
手間かもしれんが。
890デフォルトの名無しさん:2006/05/30(火) 02:53:55
>>888require 'foo.pl' したら$INC{'foo.pl'} にfoo.pl のabsolute path が格納されるので、それを元に調べればok
891887:2006/05/30(火) 08:13:35
>>888
__FILE__なんて書いたから真意が伝わらなかったか?
単に趣味の問題のお話しなんだ。

##/foo/foo.pl
#!/usr/local/bin/perl -w
use FindBin ;
#use lib $FindBin::Bin ;
#require 'jcode.pl' ;
require $FindBin::Bin . '/' . 'jcode.pl' ;
print 'foo.pl' .
892887切れてもた。:2006/05/30(火) 08:14:57
print $FindBin::Bin . "\n" ;

##/foo/jcode.pl
#!/usr/local/bin/perl -w
print 'jcode.pl' . "\n" ;

##/bar/bar.pl
#!/usr/local/bin/perl -w
use lib '/絶対パス/foo' ;
#use FindBin ;
require 'foo.pl' ;
print 'bar.pl' . "\n" ;
print $FindBin::Bin . "\n" ;
それとも俺、完全に読みちがえてる?
893885:2006/05/30(火) 08:25:40
>>886
レスありがとう。

駄目でした。
今のところ、致命的なものではないので、バッチファイルを使って、
コピー、コンパイル、削除、という形にしようかなと思っています。
894デフォルトの名無しさん:2006/05/30(火) 09:21:46
>>892
$ cat ~/foo/foo.pl
#!/usr/bin/perl
use FindBin;
print "---- foo.pl ----\n";
print "__FILE__ = ".__FILE__."\n";
print "FindBin::Bin = $FindBin::Bin\n";
print "FindBin::Script = $FindBin::Script\n";
print "FindBin::RealBin = $FindBin::RealBin\n";
print "FindBin::RealScript = $FindBin::RealScript\n";

$ cat ~/bar/bar.pl
require "$ENV{HOME}/foo/foo.pl";

$ perl ~/bar/bar.pl
---- foo.pl ----
__FILE__ = /home/Administrator/foo/foo.pl
FindBin::Bin = /home/Administrator/bar
FindBin::Script = bar.pl
FindBin::RealBin = /home/Administrator/bar
FindBin::RealScript = bar.pl

という具合にFindBinはrequireされた場合を考慮してくれません。使い方間違ってるかもしれませんが・・・

あるモジュールをrequireするには (1)絶対パス (2)カレントディレクトリに対する相対パス
のどちらかが必要ですよね。__FILE__なら、require時においてモジュール自身がどう指定されたのか、
そのパスが取得できます。

よく考えてみたら、カレントディレクトリを取得しなくても
require sub{$_=__FILE__;s/[^\/\\]+$//;$_}->()."jcode.pl";
foo.plにおいてこれで、絶対パス、相対パスのどちらにも対応できたっぽいです。
895デフォルトの名無しさん:2006/05/30(火) 10:17:35
bar.plからfoo.plをrequireできているということはfoo.plのあるディレクトリをbar.plは
知っているわけだからuse libしとけばいいはなしで、そんなしちめんどくさいことを
するのは無駄にしかみえないわけだが。
896844:2006/05/30(火) 11:14:38
>>895
まあ、ちょっと汎用的に作りたかったとかそういう理由じゃないかね。
毎回use lib→requireして使うライブラリより、require一発で取り込めるようにしたかった。今は反省している。とかそんな理由では。
897デフォルトの名無しさん:2006/05/30(火) 12:06:09
〜/foo/foo.pl で、require 'jcode.pl' ;すればいいだけの話では?
/usr/local/lib/...../jcode.pl が呼びだされてないかどうか
心配なら、%INC, @INC のチェックをしてみればいいだけの事。
898デフォルトの名無しさん:2006/05/30(火) 12:48:45
>>897
>〜/foo/foo.pl で、require 'jcode.pl' ;すればいいだけの話では?
それだと、>>888の問題を解決できないでしょ。
jcode.plは 〜/foo/jcode.pl に存在してて、〜/fooにはパスが通ってないから、
require 'jcode.pl'; ではファイルが見つからないエラーになるか、
/usr/local/lib/...../jcode.pl が取り込まれるはず。
899897:2006/05/30(火) 13:14:04
出来るんだけど?
もしかして環境依存なの?
solaris / OSX で確認。
900デフォルトの名無しさん:2006/05/30(火) 17:40:07
>>899
/bar/bar.pl の中で use lib qw( /PATH/foo ) ; してない?
それしてるんだったら、897 は正しい。してなくて
require '/PATH/foo/foo.pl' ; だと 898 が正しい。
流れを読むと、質問者は「/bar/bar.pl の中で
use lib qw( /PATH/foo ) ;」はしない方向。で、答はでてる。

俺だったら、/bar/bar.pl の中で use lib qw( /PATH/foo ) ; する。
901デフォルトの名無しさん:2006/05/30(火) 17:49:08
みんなおはよう
902デフォルトの名無しさん:2006/05/30(火) 18:08:10
>>900
横入りごめん。
前から気になってたんだけど、なんでそういうところでqw使うの?
903デフォルトの名無しさん:2006/05/30(火) 18:20:06
>>901
横レス
俺は癖…てのは冗談で lib を複数指定するときに
use lib ( '/foo', '/bar', '/piyo' ) ;
ってやるよりは
use lib qw( /foo /bar /piyo ) ;
ってやった方が可読性がいいから
ま、すきずき
904デフォルトの名無しさん:2006/05/30(火) 18:20:27
>>902
パスが増えた時に備えてでしょ
905デフォルトの名無しさん:2006/05/30(火) 18:21:40
s/901/902/ orz...
906デフォルトの名無しさん:2006/05/30(火) 19:03:09
>>903, >>904
Thx. その答えだとおかしい例がたまにあるけどそういうのはわかってないでやってる奴なんだろうな。。。
907デフォルトの名無しさん:2006/05/30(火) 19:21:12
俺が理解できないのは、"$hoge" みたいに書いてる人。
ダブルクォート全然要らないじゃんっていう。
908デフォルトの名無しさん:2006/05/30(火) 19:27:19
>>893
そりゃ、駄目だろうね。
lib.pm の認識も間違っていそうだけど、parに関しても間違ってるみたいだから。
exe作成したものがモジュール読まないってのも認識違いで、885の場合だと
カレントディレクトリ相対で ..\common , アーカイブ内の順で捜してくれる。

とりあえず、par(むしろpp)を読む事を薦めとく。
perlコード部分だけでもね。
それが面倒なら、何も考えずに site/lib にでもモジュールを放りこめば?
(site/lib を使いたくないなら、perlrunでも読むといいよ)
909デフォルトの名無しさん:2006/05/30(火) 19:36:51
>>907
文字列じゃないと嫌だったとかいう理由では?

my $hoge = \@_; # $hoge はリファレンス
&foo("$hoge"); # "$hoge" は文字列
みたいな。
910デフォルトの名無しさん:2006/05/30(火) 19:57:56
あるいは未定義値を未定義ではない空文字列に変換したかったのかもしれん。

911デフォルトの名無しさん:2006/05/30(火) 21:59:21
いや、ウォーニング出るし。
912デフォルトの名無しさん:2006/05/30(火) 22:06:46
ウォーニング娘。
913デフォルトの名無しさん:2006/05/30(火) 22:14:27
>>912
お前今度から語尾は ごめんなさい な
914デフォルトの名無しさん:2006/05/30(火) 23:11:36
Perlのソースに自動的に着色(HTML等を使用)してくれるモジュールってありますか?
915デフォルトの名無しさん:2006/05/30(火) 23:23:36
>>914
エディターとかじゃなくて、モジュールなのな?
916デフォルトの名無しさん:2006/05/30(火) 23:27:52
>>915
はいそうです
エディタは着色機能のあるTeraPadを使っています
917885:2006/05/31(水) 00:33:35
>>908
レスTHANKSです。

今のところ、頻繁に書き換えているので、site/libには入れないつもりです。
でも、そういう考え方もあるのは考えていませんでした。

parを少し見てみました。すらすら読めないので時間がない。。。
見たエラーは書いて有りました。

やっている動作は想像つきそうだし、勉強ついでにあとで見てみることにします。
918デフォルトの名無しさん:2006/05/31(水) 00:44:36
>>914
モジュールではないが、perltidyの-htmlオプションとか。

ttp://perltidy.sourceforge.net/
ttp://perltidy.sourceforge.net/Conf.pm.html (htmlの出力例)
919デフォルトの名無しさん:2006/05/31(水) 00:54:08
Perl::Tidy


920デフォルトの名無しさん:2006/05/31(水) 01:21:44
>>911
ワーニング  ×
ウォーニング ○
921デフォルトの名無しさん:2006/05/31(水) 02:03:53
WindowsでGDを利用したいのですが (5.8)
普通の方法ではインストール出来ません
有名なインストール方法は何なのでしょうか?
922デフォルトの名無しさん:2006/05/31(水) 02:41:35
>>921
ActiveStateからダウンロードできなくても、
CPANでppmのレポジトリが見つかることがあるぞ
今のとこは、これでいけるはず
C\>ppm install http://theoryx5.uwinnipeg.ca/ppms/GD.ppd

ちゃんと自分でCPANを探して、上のURLが正しいことを確認してね
2chに書かれたURLを軽々しく信用するやつはいないと思うが念のため
923デフォルトの名無しさん:2006/05/31(水) 03:49:34
>>922
ありがとうございます
『CPANのppmレポジトリ』というのはどこにあるんでしょうか?
すみません…CPANの中を結構探してるんですが見つからなくて…
924デフォルトの名無しさん:2006/05/31(水) 11:46:36
この二つってどう違うんですか?
print "Exists\n" if exists $hash{$key};
print "Defined\n" if defined $hash{$key};
925デフォルトの名無しさん:2006/05/31(水) 11:55:08
ハッシュは対応するキーが存在しないときもundefを返すので、
definedだとキーが存在して値がundefなのかキーがそもそも
存在しないのかが区別できない。

existsは値に関係なくハッシュにそのキーが存在するか
どうかを返す。

%hash = (
a => 1,
b => undef,
# キー 'c'は存在しない
);

foreach my $key (qw(a b c)) {
print "key=$key\n";
print "Exists\n" if exists $hash{$key};
print "Defined\n" if defined $hash{$key};
}

とかしてみればわかるかな。
926デフォルトの名無しさん:2006/05/31(水) 12:00:47
5.6.0 → 5.6.1のperldeltaの和訳されたのって無いでしょうか?
927デフォルトの名無しさん:2006/05/31(水) 12:01:32
>>921
インストール  ○
インストロール 玄人

>>924
exists は$hashの中の$keyが存在するか調べる。
defined は$hash{$key}が返した結果がundefかどうか調べる。

内部処理的にはexistsのほうが無駄がなさそう。
928927:2006/05/31(水) 12:03:12
>>926
>definedだとキーが存在して値がundefなのかキーがそもそも
>存在しないのかが区別できない。

あっ、確かに。いい事しった。
929928:2006/05/31(水) 12:04:13
>>928 =~ s/926/925/;

orz
930デフォルトの名無しさん:2006/05/31(水) 22:34:53
みなさまご苦労様です。

教えていただきたいことがあります。

csvやtabular形式のファイルがあり、
内容は50〜5000行程度、
一列目のkey名から2列、3列目を検索とさせるツールを探しています。
読み込むファイル数はだいたい2から5程度。
一般的に何を使用すればよいのでしょうか。
うーん、5000行程度なら読んでメモリに保持しても問題ないのかな。

File::TabularというのをCPANから取ったのですが、マイナーっぽいし、
cp932のコードで使うときに、エラーが起きてしまって諦めました。
sjisだと問題ないんだけど、なんでだろ。
(本当は対処法を調べられる実力があればいいのですが)

もっとメジャーな物はあるはず、ということで、どなたか教えて頂けるとうれしいです。
931デフォルトの名無しさん:2006/06/01(木) 00:00:40
Text::CSV_XS とかは? TSVも扱えたはず
932デフォルトの名無しさん:2006/06/01(木) 00:33:24
>>930
5000行程度ならまず平気でしょう。その判断は当然、レコード長と実行環境によります。

CPAN の Data::Table なんてのもありますけど、使ったことないんでなんとも。
933930:2006/06/01(木) 01:55:23
>>931-932
返事、ありがとうございます。

検索して、少し見てみました。
Text::CSV_XSは、MANUALを見た限り指定行を指定文字列で検索できなさそう。
でも、excelとかのデータを扱うときに便利そうですね。メモしておきます。

Data::Tableは複雑そう。検索するだけの、すぐ動かなくていいから簡単なサンプルだれか持ってないかな。

やりたいのは、ファイルを一括で読んでくれて、
タブで区切られたフィールドがあり(データにタブが入ることが無いデータ、"で囲むなども無し)、
f1f2f3
A001appleりんご
A002pineぱいなっぷる
こんなの(\t区切り)。一行目は、検索のために必要ならおいてもいいし、置かなくてもいい。
探しているのは、第一列のフィールドを検索(A002)して、その行の2,3のフィールドを取得できるもの、という簡単なものです。
第一列のフィールドからだけ検索出来ればOK。
1データ、だいたい、1KB - 6KBぐらいのファイルサイズ。
みんな自分で作るのかな。

キャッシュやインデックスのディレクトリなどを作成してもよいので、
簡単なインデックスを作成して読み込みが早くなるような物ってないものでしょうか。
まあ、無くてもどっちでもよいのですが、誰か作ってないのかな。
適当に書いてみるけど、
タイムスタンプ保持、その比較、なければインデックス作成、インデックスは、アルファベット順に並べた第一フィールド、
行番号があって、効率よい検索して行番取得、指定ファイル行だけを読み込み、って感じ。ここらへん専門じゃないので突っ込みは無しね。

でも、たいしてデータないときは速くならなくて、かえって遅くなるのかな〜。
まあ、速度は重要じゃなくて、

簡単なのがないかなー、と。
934デフォルトの名無しさん:2006/06/01(木) 02:23:48
殺意を覚えるのは俺だけ?
935デフォルトの名無しさん:2006/06/01(木) 02:33:34
5000行程度で、タブ区切り、1列目が「A001」みたいなユニークなIDなら、
my %data = join("", <DATA>) =~ /^(.+?)\s+(.+)$/mg;
とかでハッシュに全部読み込んでから処理するのが一番楽で速いんじゃ?
936デフォルトの名無しさん:2006/06/01(木) 02:34:07
「りんごとぱいなっぷる大ちゅき♥」まで読んだ
937デフォルトの名無しさん:2006/06/01(木) 03:57:07
>>934
俺とお前の他にも結構いると思う。
938デフォルトの名無しさん:2006/06/01(木) 04:21:58
最近は、100行を越えるコードを書くと、「スゲエ長いプログラム書いちゃった」
「新記録?」と自慢してまわる人がいるそうです。
939デフォルトの名無しさん:2006/06/01(木) 04:23:29
全てのプログラムは7行で書くべきだと
940デフォルトの名無しさん:2006/06/01(木) 05:04:46
口数は多いが内容が実に馬鹿馬鹿しい。
941932:2006/06/01(木) 05:14:44
>>933
うんよしわかった、いいからまず書いて。
自前で実装しても全然大したコード量にはならないから練習がてら書いてみてくださいな。

それと、「突っ込みは無しね」なんてのは議論の上で重要な項目とそうでない項目が峻別できる水準にある人同士でのみ意味を持つんです。
「わからないので教えて」という人がそれを使った場合、
「ぼくのアイデアに対して否定的なことは言わずに、ぼくが気分良く採用できる実装だけをください」
と言っているに等しいので、どう見ても "回答者避け" にしか見えません。気をつけましょう。

あとね、とりあえず紹介したモジュールのドキュメントくらいは、役に立つかどうか判断できる程度に眼を通して欲しいなと思ったりする…orz
942933:2006/06/01(木) 06:02:48
たくさんの反感を買ってしまった。
少し甘えていました。ごめんなさい。
とりあえず自分で調べてみます。
943933:2006/06/01(木) 06:16:18
>>935
ありがとうございます。

perlって、こういうやり方が有効なんだとはっとさせられます。

もう少しperlの癖や常識みたいなのを身につけようと思います。
944デフォルトの名無しさん:2006/06/01(木) 07:58:19
933です。
ハッシュを使えば済む話でした。すみません、無駄な長文書いてしまって。
945デフォルトの名無しさん:2006/06/01(木) 12:43:12
どーでもいい memo
<10万行の \S+\t\S+ なファイルを読みこんだ場合の
ハッシュにするまでの速度。>

-- my %hash = map { chomp; split/\t/, } <> ;
1.71s user 0.22s system 93% cpu 2.067 total
-- my %hash = split /[\t\n]+/, do { local $/ ; <> } ;
1.05s user 0.12s system 95% cpu 1.227 total
-- my %hash = join("", <>) =〜 /^(.+?)\s+(.+)$/mg;
3.04s user 0.30s system 94% cpu 3.540 total
946デフォルトの名無しさん:2006/06/01(木) 12:44:46
Back スラッシュとエンマークが混じってもうた。。。。
947デフォルトの名無しさん:2006/06/01(木) 19:52:39
>>945
勉強になったけど >>933 は \S+\t\S+\t\S+ だから split じゃだめじゃね?
948デフォルトの名無しさん:2006/06/01(木) 20:42:07
t\S 

↑これが鳥に見える俺
949デフォルトの名無しさん:2006/06/01(木) 21:15:51
>>948の見えているものが俺には見えない件について
950デフォルトの名無しさん:2006/06/01(木) 21:20:34
t\ が翼で、 S が鳥の首〜頭?
確かに言われてみれば・・・


やっぱねーな
951デフォルトの名無しさん:2006/06/01(木) 21:33:33
どーでもいい memo
933 対応版(敗北宣言)

10万行の ^\S+\t\S+\t\S+$ なファイルを読みこんだ場合の
ハッシュにするまでの速度。

1. my %hash = map { chomp; split/\t/, $_, 2 } <> ;
1.73s user 0.23s system 92% cpu 2.115 total

2.1. my %hash = do { local $/ ; <> } =〜 /^(.+?)\s+(.+)$/mg ;
2.43s user 0.21s system 91% cpu 2.869 total

2.2. my %hash = map { split /\t/, $_ , 2} split /\n/, do { local $/ ; <> } ;
1.46s user 0.16s system 92% cpu 1.752 total

945 の 2 はストレートに split できませんですた orz...
952デフォルトの名無しさん:2006/06/02(金) 00:08:10
my %hash;
while (<>) {
  chomp;
  my ($key, @fields) = split /\t/;
  $hash{$key} = \@fields;
}

これだとハッシュの値には配列リファレンスが入ってスマートかつ高速。
ハッシュ格納前提だとアロケートサイズも最小限、だと思う。ヒネりはないけどなあ。w
953デフォルトの名無しさん:2006/06/02(金) 00:48:12
>>951>>952の条件にして確認。
それだと、たしかに一番早かった。
行毎の処理なら、普通がー番って事だな。
954デフォルトの名無しさん:2006/06/02(金) 01:40:39
>>953
検証あいがと。
正直なんつーかこう、巨大な一時リストを作業用に展開して丸ごとコピー、とか抵抗あんだよね。
貧乏性は治らないらしい。^^;
955デフォルトの名無しさん:2006/06/02(金) 02:02:41
俺の対局にいる人かもw。
…もしかして、俺の上司?
956954:2006/06/02(金) 02:53:27
>>955
たぶん上司殿じゃないと思ふが。上司殿によろしく。w

でもアロケートやらコピーってのは、ディスク I/O やサブプロセス起動ほどには高価じゃないけれど、単なる主記憶の読取ほどには安価じゃないわけで。
だから本質的に不要な場所でそういった操作が大量発生するコードってのは、やっぱり筋が悪く見えちゃうんだろう。
957デフォルトの名無しさん:2006/06/02(金) 04:11:34
f1が連番でソートされてるんでしょ?
それなら1億行でも
log(100000000) / log(2) * 2
程度のseekで抽出できるので恐らく実行時間は0.1秒以内のはず。
自分で関数を作っても50行以内のはず。
958デフォルトの名無しさん:2006/06/02(金) 07:44:57
検索するのにいちいちハッシュに突っ込む時点で違和感を覚える貧乏性は俺だけか。
959デフォルトの名無しさん:2006/06/02(金) 07:54:48
せっかくあるんだし、お手軽でいいんじゃないかな。
ソートしてバイナリサーチするの?
960デフォルトの名無しさん:2006/06/02(金) 08:39:36
>>959

>一列目のkey名から2列、3列目を検索とさせるツールを探しています。

ごめんここ読み落としてたorz
忘れて。
961951=953:2006/06/02(金) 12:02:03
検証不足スマソ。
これでこの件を引きずるのは終りにしますので、「判りきったこと書くな」
という先輩諸氏は御勘弁を。

夜中にやった(>>593)のは
- マシンが違う。
- @_ = split/\t/, $_ ; $_[0], [$_[1], $_[2]]
つーことで、マシンを同じにして
my ( $var, @arr) = split/\t/, $_ ; $var, \@arr
の条件にてもいっぺん検証。

1. >>952 の while 及び for / map でもほぼ同じ結果。
4.33s user 0.27s system 91% cpu 5.051 total ( foreach, map も )
2. my %hash = map { chomp; my ( $var, @arr) = split/\t/, $_ ; $var, \@arr } <> ;
4.57s user 0.42s system 91% cpu 5.463 total
3. my %hash = map { chomp; @_ = split/\t/, $_ ; $_[0], [$_[1], $_[2]] } <> ;
5.91s user 0.44s system 94% cpu 6.713 total
4. my %hash = map { my ( $var, @arr ) = split /\t/, $_ ; $var, \@arr} split /\n/, do { local $/ ; <> } ;
2.54s user 0.26s system 93% cpu 2.983 total
5. my %hash = map { @_ = split /\t/, $_ ; $_[0], [$_[1], $_[2]]} split /\n/, do { local $/ ; <> } ;
5.32s user 0.35s system 94% cpu 6.012 total

962デフォルトの名無しさん:2006/06/02(金) 16:51:27
カレントディレクトリの中にあるディレクトリのリストを得るにはどうすれば良い?
いちいち opendir してみなきゃいけないの?
963デフォルトの名無しさん:2006/06/02(金) 17:02:53
推奨はしない( glob 展開は非常にリスキー)が、
@list = glob "*" ;
964デフォルトの名無しさん:2006/06/02(金) 17:10:56
リスキー? じゃあ File::Glob は?
965デフォルトの名無しさん:2006/06/02(金) 17:12:21
あと <*.c> のようなのも使えるな。
966デフォルトの名無しさん:2006/06/02(金) 17:26:34
すまん、専門家ではないしうろ覚えなのだが、
「UNIX のグロブ展開を利用するから、カレントのファイル数が
膨大だった場合最後までリスト化出来ない可能性がある。」
(引数が多すぎますエラーが起こる可能性がある。)と習ったし、
別意見として
ttp://www.ipa.go.jp/security/awareness/vendor/programming/a04_02_main.html
なのもある。
File::Glob は使ってない。ので判らん。すまぬ。
967デフォルトの名無しさん:2006/06/02(金) 17:43:34
Perlの内部実装は新バージョンごとにどんどん変更が加えられている。
前バージョンの常識すら疑ってかかるべき。
968966:2006/06/02(金) 17:45:51
捕捉
引数が多すぎエラーは perl 5.005 以下のみ発生するみたいね。
ttp://www.jp-z.jp/perlmemo/file_globlimit.html
習った時代が古かった orz...

969デフォルトの名無しさん:2006/06/02(金) 17:47:28
リロードしてから書くんだった。。。
970デフォルトの名無しさん:2006/06/02(金) 18:29:10
なるほど。
まあ、不安なら opendir 使って関数自作すりゃいい。
971デフォルトの名無しさん:2006/06/02(金) 18:31:33
>>962
File::Slurpのread_dirとか。
972デフォルトの名無しさん:2006/06/02(金) 19:00:44
>>962はファイルの一覧じゃなくてディレクトリの一覧が知りたいってことじゃないの?
まあ、ひとつ筒-dすれ。
973デフォルトの名無しさん:2006/06/02(金) 19:07:45 BE:353760858-#
次スレまだぁ
974デフォルトの名無しさん:2006/06/02(金) 19:12:02
ファイルのサイズをチェックして、ファイルサイズが小さいときに、
ファイルコピーをしようとおもいます。
どんなやり方がスマート?
で、
大きすぎるときは、
最後の1000行ぐらいをファイル作成しようと思っています。
これは、やり方がよくわかりません。

975デフォルトの名無しさん:2006/06/02(金) 20:14:44

my @ring;
my $n;
open(my $fh, "unko.log");
open(my $fh_, "last100ls.log");
while(my $L = <$fh>) {
 $n = 0 if $n == 100;
 $ring[$n++] = $L;
}
print $fh_ (@ring[$n..$#ring], @ring[0..($n-1)]);

ファイルのコピーはFile::Copyってのがあったと思うからそいつを使ってやると良い。
976デフォルトの名無しさん:2006/06/02(金) 20:23:29
unko.log wwwww
977デフォルトの名無しさん:2006/06/02(金) 20:27:42 BE:238789139-#
最近のPerlは読み取り属性で開いても書き込めるのか
978デフォルトの名無しさん:2006/06/02(金) 21:17:02
あら、間違えちった。まあその辺は適当に脳内修正頼む。
979デフォルトの名無しさん:2006/06/02(金) 22:37:02
>>974
頭から全部読むのが問題なほど大きいのならFile::ReadBackwardsで後ろから読む手もある。

次スレか。テンプレについて提案。
過去ログのところhttpをttpに変えて一レスに纏めない?
980デフォルトの名無しさん:2006/06/02(金) 23:14:41
>>979
>過去ログのところhttpをttpに変えて一レスに纏めない?
いいと思う。まあ、最終決定はスレ立てる人がどうぞ。
981デフォルトの名無しさん:2006/06/02(金) 23:19:00
次スレ立ては >>980 に任せた。
982デフォルトの名無しさん:2006/06/02(金) 23:20:46
URLまだぁ〜? チンチン  (AA略)
983デフォルトの名無しさん:2006/06/02(金) 23:23:32
984デフォルトの名無しさん:2006/06/02(金) 23:27:44
There's more than one way to wait it.
985979:2006/06/02(金) 23:33:37
980じゃないけど立ててきちゃって良いかな
準備やってたらごめん
986デフォルトの名無しさん:2006/06/02(金) 23:46:17 BE:750910278-
$$self{next} = new BBS2ch::Thread 'Perlについての質問箱 25箱目';

次スレ
http://pc8.2ch.net/test/read.cgi/tech/1149259409/
987デフォルトの名無しさん:2006/06/02(金) 23:51:37
乙。
988デフォルトの名無しさん:2006/06/03(土) 00:29:18
Template Toolkitで使用する
テンプレートファイルをうまくデバッグする方法はありませんか。

テンプレートに誤りがあるときのエラーメッセージ
は決まって "Bad file descriptor at ..."であり、
テンプレート修正の手がかりになりません。
989974:2006/06/03(土) 00:40:31
>>975-979
ありがとーです。
全部試してみます。
1MB程度だから、975さんので問題ないのかな。

File::ReadBackwardsもよさげ、というか、こういうの標準でありそでないのかー。
990デフォルトの名無しさん:2006/06/03(土) 02:16:33
991デフォルトの名無しさん:2006/06/03(土) 02:17:05
992デフォルトの名無しさん:2006/06/03(土) 02:26:24
993デフォルトの名無しさん:2006/06/03(土) 02:51:47
ume
994デフォルトの名無しさん:2006/06/03(土) 03:16:38
 
995デフォルトの名無しさん:2006/06/03(土) 04:15:32
1000を取りたければ、私を越えて行くがよい。
996デフォルトの名無しさん:2006/06/03(土) 04:34:41
別にこんなところで1000取ってもなぁ
997デフォルトの名無しさん:2006/06/03(土) 05:57:04
そうは言いなら柄も人は乗り越えてゆくのだ
998デフォルトの名無しさん:2006/06/03(土) 09:20:00
Rubyに完全に取って代わられちゃったね。
正確に言えば、まともなプログラマはみんなRubyに流れちゃって、
自分が書いたコードの効率もろくに把握できていないようなアホだけが
未だにぶら下がっている・・・っていう、ある意味過疎より酷い惨状だけど。
999デフォルトの名無しさん:2006/06/03(土) 09:45:03
>>998
3年前の状況としてなら賛成。
1000デフォルトの名無しさん :2006/06/03(土) 09:50:59
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。