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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
"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
0002デフォルトの名無しさんNGNG
[プログラミング自体の経験が無い奴はまずココを読め]
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/
0003デフォルトの名無しさんNGNG
[モジュール]
CPAN.com: http://search.cpan.org/
河馬屋二千年堂: http://homepage3.nifty.com/hippo2000/

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

[Perl5.8Unicodeメモ]
http://www.pure.ne.jp/~learner/program/Perl_unicode.html
http://www.namazu.org/~tsuchiya/perl/perl-5.8.html
http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
0004デフォルトの名無しさんNGNG
[過去ログ]
1 http://pc.2ch.net/tech/kako/1017/10177/1017736187.html
2 http://pc3.2ch.net/tech/kako/1033/10336/1033688230.html
3 http://pc2.2ch.net/tech/kako/1041/10412/1041205885.html
4 http://pc2.2ch.net/tech/kako/1048/10485/1048519394.html
5 http://pc5.2ch.net/tech/kako/1053/10530/1053053082.html
6 http://pc5.2ch.net/tech/kako/1060/10606/1060689008.html
7 http://pc2.2ch.net/test/read.cgi/tech/1068051036/
8 http://pc2.2ch.net/test/read.cgi/tech/1074151549/
9 http://pc5.2ch.net/test/read.cgi/tech/1079114157/
いつも連投規制に引っかかるので1レスに纏めようとしたらhttpが多すぎといわれたorz
0005デフォルトの名無しさんNGNG
10 http://pc5.2ch.net/test/read.cgi/tech/1085564875/
11 http://pc5.2ch.net/test/read.cgi/tech/1090889189/
12 http://pc5.2ch.net/test/read.cgi/tech/1094579428/
13 http://pc5.2ch.net/test/read.cgi/tech/1097851764/
14 http://pc5.2ch.net/test/read.cgi/tech/1101649274/
15 http://pc5.2ch.net/test/read.cgi/tech/1105953092/
16 http://pc8.2ch.net/test/read.cgi/tech/1111034732/
17 http://pc8.2ch.net/test/read.cgi/tech/1117870308/
18 http://pc8.2ch.net/test/read.cgi/tech/1121804136/
19 http://pc8.2ch.net/test/read.cgi/tech/1126977805/
20 http://pc8.2ch.net/test/read.cgi/tech/1131286411/
21 http://pc8.2ch.net/test/read.cgi/tech/1134327348/
22 http://pc8.2ch.net/test/read.cgi/tech/1138519327/
23 http://pc8.2ch.net/test/read.cgi/tech/1141742901/
0006デフォルトの名無しさん2006/04/26(水) 12:40:45
こんな時間に乙!
0007デフォルトの名無しさん2006/04/26(水) 12:58:10
乙〜
0008デフォルトの名無しさん2006/04/26(水) 13:02:20
Perlで2つのプロセスを動かして同時に同じファイルを参照したり書き込むとき
がたまにある場合、非同期書き込みか排他制御?みたいなのしないといけないと思うけど
どうやってするの?
0009デフォルトの名無しさん2006/04/26(水) 13:04:59
次からはググってから質問してね
http://www.google.co.jp/search?hl=ja&q=Perl+%E6%8E%92%E4%BB%96&lr=
0010デフォルトの名無しさん2006/04/26(水) 14:06:03
ある変数 $kekka に、20バイト分のバイナリデータを代入した場合、
それらの値を1バイトずつ表示したいのですが、どうすれば良いのでしょうか?
unpack("C16", $kekka)とすると、16バイト分しか表示できませんでした。
0011デフォルトの名無しさん2006/04/26(水) 14:06:22
久々にエロ小説埋めきたな
0012デフォルトの名無しさん2006/04/26(水) 14:07:20
@list = unpack('C*', $kekka);
0013デフォルトの名無しさん2006/04/26(水) 14:15:47
>>12 Thx!!
0014デフォルトの名無しさん2006/04/26(水) 14:43:29
>>8
flock とか fcntl の F_SETLKW とか。
ロックファイルとかセマフォとか。
0015デフォルトの名無しさん2006/04/26(水) 16:15:07
あげ
0016デフォルトの名無しさん2006/04/26(水) 20:13:17
>>1
乙

>>15
マターリ=サゲシンコ
0017デフォルトの名無しさん2006/04/26(水) 21:34:40
>>970
環境変数?の変更ですか?
ご教授ください。
0018デフォルトの名無しさん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;
0019デフォルトの名無しさん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いらない
0020デフォルトの名無しさんNGNG
>>17
環境変数とは違うものなんだけど…作業ディレクトリ=カレントディレクトリといえば分かる?
もし分からないなら、自分で調べれ。Perl以前の基本中の基本だから。
# 時々知らない香具師が現れる…

$FindBin::Binのほう、起動されたスクリプトが配置されているディレクトリの絶対パスが入っている。
そもそもそのスクリプトは、スクリプトのあるディレクトリにあるファイルを操作する、
つまり作業ディレクトリがスクリプトのある場所になっていることを前提に作ってあるわけだ。
だから、その前提に合うように作業ディレクトリを変えてやれば望んだとおりに動作する、と。
0021デフォルトの名無しさん2006/04/27(木) 14:19:38
windowsへのコンパイルってどれ使えばいいの?
perl2exe以外で
0022デフォルトの名無しさん2006/04/27(木) 15:57:31
PARとか
0023デフォルトの名無しさん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
0024デフォルトの名無しさん2006/04/27(木) 16:09:15
>>23
……覚醒剤でもやってるのか?
0025デフォルトの名無しさん2006/04/27(木) 16:14:35
>>23
ヒント: 優先順位
0026デフォルトの名無しさん2006/04/27(木) 16:31:32
サンスコ!わかった。
()でくくらないと、演算子の優先順位の問題があるのね。
0027デフォルトの名無しさん2006/04/27(木) 16:33:57
え?でも変だな、、、。
stat の結果が、優先順位の問題で返ってこないとすると、
その場合、die が実行されてないか?
逆に、dieが実行されず、stat しか実行されなければ、statの結果が返るはず。

あー、もうわかんねぇ。
だれかわかりやすく教えて!。
0028デフォルトの名無しさん2006/04/27(木) 16:38:55
>>27
ヒント: コンテクスト
0029デフォルトの名無しさん2006/04/27(木) 16:41:12
>>27
ヒント:or
0030デフォルトの名無しさん2006/04/27(木) 18:56:26
>>27
hint: stat の引数がない
0031デフォルトの名無しさん2006/04/27(木) 19:01:38
>>27の人気に脱糞
0032デフォルトの名無しさん2006/04/27(木) 19:19:35
>>27
||はスカラーコンテキストで評価される
だから@valにはstatの戻り値としてリストは格納されていない
試しにprint $val[0];とやってみ1って出るから
つまりstatが成功したことを示すスカラーが返却されている
つぅか||なんて使うな
orにしとけ
0033デフォルトの名無しさん2006/04/27(木) 20:10:56
>>27
read <perldoc> or die;
0034デフォルトの名無しさん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
0035デフォルトの名無しさん2006/04/27(木) 21:07:04
>>21
PerlAppオススメ。有料だけど起動時間は最速だと思う。
0036182006/04/27(木) 21:20:48
>>19
あり。
Encode::JP::H2Z使う時はencodingプラグマは使えないという仕様なんですかね〜
0037デフォルトの名無しさん2006/04/27(木) 23:13:01
>>20
お前の勘違いじゃね?
環境変数だろ
0038デフォルトの名無しさん2006/04/27(木) 23:21:20
また知らない香具師が現れたな・・・
0039デフォルトの名無しさん2006/04/27(木) 23:23:43
ごめんなさい。わかりません。
カレントディレクトリの意味はわかるけど
>>20のいうようなカレントディレクトリの変更方法がわからんw
004020NGNG
>>37
そうか、スマソ
「環境変数」で意味が解る香具師がいるなら漏れの勘違いなんだろうな。
漏れには話のつながりが解らんから質問に対する答え頼んだ。
0041デフォルトの名無しさん2006/04/27(木) 23:32:57
pathのこと?
0042デフォルトの名無しさん2006/04/27(木) 23:33:43
>>40
おいコラ、諦めんな!
0043デフォルトの名無しさん2006/04/27(木) 23:36:41
>>40
ごめん、、、ヒントをくれ・・・カレントディレクトリの意味しかわからんよ。
0044デフォルトの名無しさん2006/04/27(木) 23:43:01
俺も白根
教えて栗
0045デフォルトの名無しさんNGNG
>>43
| use FindBin;
| chdir $FindBin::Bin;
のchdirについて訊いているのかと思って解説しただけ…

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

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

答え絶対いわないよな
0050デフォルトの名無しさん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" です
0051デフォルトの名無しさん2006/04/28(金) 01:50:50
またエラー内容隠蔽者か。

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

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

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

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

use constant で定義した定数は使えませんよね?
0060デフォルトの名無しさん2006/04/28(金) 20:57:51
>>59
え? スカラにさえなるなら何でも使えると思うけど?
0061デフォルトの名無しさん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

ファイルハンドルについては…どうだっけ。文字列として扱って良いんだっけ?
0062デフォルトの名無しさん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という方向自体が間違っているような気がしています。
ヒントだけで良いので教えていただけないでしょうか?
0063デフォルトの名無しさん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};
}
}
0064622006/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
のように出力させたいのです。
0065 ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄2006/04/28(金) 22:34:42
___ ミ
┌ ┌ | ζ
┌ ┌ |
┌ ┌ |
┌ ┌ |
┌ ┌ |
┌ ┌ |
┌ ┌ |
0066デフォルトの名無しさん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]});
}

}
0067デフォルトの名無しさん2006/04/28(金) 23:01:17
ぁ cmpじゃなくって<=>だった;
0068622006/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で作るのがポイント。

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

でもこんなことやるより最初にハッシュキーの組み合わせのリストだけ作ってsortしたほうが読みやすいし、
>>69の人が言ってるようにそもそもデータ構造を変えたほうが正解かもしれない
0071622006/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にあんまり慣れていないので、こっちのほうがわかりやすいような気がします。
0072デフォルトの名無しさん2006/04/29(土) 00:26:44
憧れのDANさんが最近の記事で書いていたんですが

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

は || じゃなくてorにしろありました
どうしてでしょうか?
上記のコードは別に||でもうまくいってるみたいなんだけど
0073デフォルトの名無しさん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 のような素直な書き方の方がいいかもね。
0074デフォルトの名無しさん2006/04/29(土) 03:23:18
>>72
> 憧れのDANさんが最近の記事で書いていたんですが

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

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

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

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

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

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

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

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

$all_line .= $line;

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

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

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

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

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

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



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

でも、試しに今、自宅で上記の再現コードを書いても発生しないから、
どこかで自分が改行コードを壊して、やらかしている予感・・・・
0089デフォルトの名無しさん2006/04/29(土) 16:23:21
ファイルのバイナリをみればいいじゃない
0090デフォルトの名無しさん2006/04/29(土) 16:45:30
プログラムは、あなたの「思えない」を考慮しない。
0091デフォルトの名無しさん2006/04/29(土) 19:02:58
http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Remove
0092デフォルトの名無しさん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 の環境で試してみると・・・
0093デフォルトの名無しさん2006/04/30(日) 13:37:39
青ラクダ本って日本語訳されたperldocが本になってるだけと思ってたんですが、
本にしか書かれていない章もあるようです。
perldocに無くて、本にだけ書いてあることってどれくらいあるんでしょう?
0094デフォルトの名無しさん2006/04/30(日) 13:53:59
当たり前のことだが perldelta や CPAN から入れたモジュールに関しては,逆に perldoc を読むしかない.
必要なことはすべて perldoc に書かれているので, 英語が読めればラクダ本は不要.
0095デフォルトの名無しさん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
0096デフォルトの名無しさん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'
こんな感じにしたいです。
0097962006/05/01(月) 16:37:39
抜けが有りそうだけど、結局手作業で簡単なものを作りました。
0098デフォルトの名無しさん2006/05/01(月) 17:59:03
threads使いたくてベースの5.6に、5.8を追加して共存させたいんですが
既に共存成功している人で、ppmでのインストールとかどうなってますか?
やっぱりppm利用時に絶対パスでppmの場所を指定しないと、
目的のPerlバージョンのあるところにインストールされないものですか?
0099982006/05/01(月) 17:59:43
環境書き忘れましたが、WindowsXPでPerlはActivePerlです。
0100デフォルトの名無しさん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));

下の方で書きたいんですが、どうにかなりませんか?
0101デフォルトの名無しさん2006/05/01(月) 23:10:10
&hoge({a => 1, b => 2});
■ このスレッドは過去ログ倉庫に格納されています