Perlについての質問箱 28箱目
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/10/31(火) 14:52:21"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 http://pc8.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
http://www.perl.org/get.html
● 2006/10/31現在の最新版: 5.8.8
● 2006/10/31現在の開発版: 5.9.3
前スレ
Perlについての質問箱 27箱目
http://pc8.2ch.net/test/read.cgi/tech/1157874614/
リンク集は>>2-3
過去スレは>>4
0686683
2006/12/03(日) 15:38:28君のようなスーパーハカーには関係ない。
ぼくのような未熟者にとっては「ぼくは Perl について知らないことばかりだけれど、知っている範囲で遊んでもいいのだ」と思える点でうれしいかもしれない。
0687デフォルトの名無しさん
2006/12/03(日) 16:43:50そうだな、
C/C++ は、入門してから遊ぶことが出来までの道程が長いから、
そこで挫ける者も多かろう。
Perl はその道程が短いぶんいいよな。
0688デフォルトの名無しさん
2006/12/04(月) 07:57:510689デフォルトの名無しさん
2006/12/04(月) 09:51:250690デフォルトの名無しさん
2006/12/04(月) 11:00:24誰だよお前w
0691デフォルトの名無しさん
2006/12/04(月) 16:02:48if ($str =~ /foo/) {
# $strのどの場所にマッチしたか(index)知りたい
}
0692デフォルトの名無しさん
2006/12/04(月) 17:17:08if ( $str =~ /foo/ ){
print $-[0] . "\n" ;
}
後は @+ と pos 関数
0693デフォルトの名無しさん
2006/12/05(火) 14:11:23thanks
0694デフォルトの名無しさん
2006/12/05(火) 16:18:06use strict;
use utf8;
open(OUT, '>:encoding(UTF-16LE)', 't:\tmp\16LE.txt') or die;
print OUT "\n";
close(OUT);
↑の処理で"16LE.txt"の内容が16進数で「0D,00,0A,00」になることを期待したのですが
実際には「0D,0A,00」でした。期待した結果を得るはどうしたらいいですか?
XPPro sp2
ActivePerl 5.8.8.817
よろしくお願いします。
0695デフォルトの名無しさん
2006/12/05(火) 16:32:31require 5.8.1;
use strict;
use utf8;
open(OUT, '>:encoding(UTF-16LE):crlf', '16LE.txt') or die;
print OUT "\n";
close(OUT);
手元のlinuxの5.8.8ではこれでいけた。
0696デフォルトの名無しさん
2006/12/05(火) 17:20:44ありがとうございます。早速コピペして実行したのですが、結果は変わりませんでしだ。
試しにFreeBSDの5.8.8でコピペして実行したら期待した結果が得られました。
WinのPerlをインストールし直してやってみます。
0697デフォルトの名無しさん
2006/12/05(火) 17:34:24あー、インストールしなおしても同じだよ、それ。
Cのライブラリ内で行われている改行の変換が原因だから。
(C/OSがテキストモードとバイナリモードを区別しない環境ではPerlIO内で処理される)
">:raw:encoding(utf-16le)" で開いて、最初から print "\r\n" するのが楽だと思う。
0698デフォルトの名無しさん
2006/12/05(火) 18:12:09言われた通りに書き直したら出来ました ! !
ありがとうです。助かりました。
0699デフォルトの名無しさん
2006/12/05(火) 21:00:30バグじゃないかという気がするので
バグレポしたほうがいいんじゃないか。
0700デフォルトの名無しさん
2006/12/05(火) 21:06:08思いっきり「仕様」だろーが。
0701デフォルトの名無しさん
2006/12/05(火) 21:19:162.\nがperl.exeでUTF-16LEの0x0A,0x00に変換される
3.perl.exeが書き込む際にfputsか何かで0x0Aが0x0D,0x0Aに変換される
って認識でおk?
0702デフォルトの名無しさん
2006/12/06(水) 16:22:480703デフォルトの名無しさん
2006/12/06(水) 16:46:56いったん:rawで剥がしてからあとで付け加えるといいらしい。
ttp://blogs.msdn.com/brettsh/archive/2006/06/07/620986.aspx
俺はwindows環境のperl持ってないので試してないが。
0704デフォルトの名無しさん
2006/12/06(水) 16:57:340705デフォルトの名無しさん
2006/12/06(水) 17:25:47perldoc -f binmode
に明記されてる現象の何をもってバグと云うんだ?
(しかも BUGS 等に書いてある訳じゃない。注意書きとして書いてある)
仕様だよ。
0706デフォルトの名無しさん
2006/12/06(水) 17:55:160707デフォルトの名無しさん
2006/12/06(水) 18:05:10英語力無いオレには読みとれん。 Programing Perl 3rd Edition の binmode に
その旨、明記されてない。問題点間違えてない?
まあ、安易にバグだって云うのもなんだかなとは思うが。
0708デフォルトの名無しさん
2006/12/06(水) 18:13:010709デフォルトの名無しさん
2006/12/06(水) 20:47:05駱駝の 3rd は 5.6 ベースの内容で、5.8.x とはかなり違いがある。
5.8.x 使ってるなら perldoc なり >>2-3 に挙がってる訳なりで
確認した方がいいよ。
0710デフォルトの名無しさん
2006/12/06(水) 21:16:31明示的には何も書かれてないように読めた。
705の言っている部分がどこだか示してもらえるとありがたい。
0711デフォルトの名無しさん
2006/12/06(水) 21:30:49The operating system, device drivers, C libraries, and Perl
run-time system all work together to let the programmer treat a
single character ("\n") as the line terminator, irrespective of
the external representation. On many operating systems, the
native text file representation matches the internal represen-
tation, but on some platforms the external representation of
"\n" is made up of more than one character.
0712デフォルトの名無しさん
2006/12/06(水) 21:39:26思いっきり書いてあるだろ。
それとも翻訳させるための釣りか?
The operating system, device drivers, C libraries, and Perl run-time system all work together to let
the programmer treat a single character ("\n") as the line terminator, irrespective of the external
representation. On many operating systems, the native text file representation matches the internal
representation, but on some platforms the external representation of "\n" is made up of more than
one character.
Mac OS, all variants of Unix, and Stream_LF files on VMS use a single character to end each line in
the external representation of text (even though that single character is CARRIAGE RETURN on Mac OS
and LINE FEED on Unix and most VMS files). In other systems like OS/2, DOS and the various flavors
of MS-Windows your program sees a "\n" as a simple "\cJ", but what’s stored in text files are the
two characters "\cM\cJ". That means that, if you don’t use binmode() on these systems, "\cM\cJ"
sequences on disk will be converted to "\n" on input, and any "\n" in your program will be converted
back to "\cM\cJ" on output. This is what you want for text files, but it can be disastrous for
binary files.
0713デフォルトの名無しさん
2006/12/06(水) 22:13:19encoding(...)と:crlfの順序で結果が違ってくるから:rawで
順序調整しないとおかしくなるってあたりの話じゃないだろ。
0714デフォルトの名無しさん
2006/12/06(水) 22:31:32つーか脊髄反射で物事を処理していると上達しないよ。
0715デフォルトの名無しさん
2006/12/06(水) 23:14:09当然だ
今は改行文字の変換についての仕様がperldocに載ってるかどうかの話だろ
:rawの順序云々は>>703が言及してるが、それがperldocに書いてあったとは一言も言っていない
0716デフォルトの名無しさん
2006/12/06(水) 23:22:33windows環境のperlでencodingをUTF16-LEにしたときに\nが0D,0A,00になって
変だっていう>>693が話の始まりなんだから。
とりあえずお前とは話がすれ違ってることはわかった。
0717697
2006/12/06(水) 23:26:27その手があったのか、気が付かなかった。
:encodingを先に指定してから:crlfを指定すれば良かったのか。
中途半端な事を書いてスマンかった >694氏
>>699
バグレポは出さなくても大丈夫だと思いたい。
既に
#36659: UTF-16 endianess switch after line break
http://rt.perl.org/rt3/Public/Bug/Display.html?id=36659
があるから。
0718デフォルトの名無しさん
2006/12/07(木) 06:50:16やっぱり俺はrubyで行こう。
0719デフォルトの名無しさん
2006/12/07(木) 07:15:49PHPとRubyはいまだにバッファオーバーフローのセキュリティホールで
バージョンアップを楽しめるぞ。
0720デフォルトの名無しさん
2006/12/07(木) 10:10:440721デフォルトの名無しさん
2006/12/07(木) 10:43:25それはencodingプラグマのことで。最近話題のPerlIOレイヤのencodingとは
全く無関係ではないが別の話かと。
0722デフォルトの名無しさん
2006/12/07(木) 10:55:17$buf に外部メールサーバから情報をとってきて格納するプログラムを作成して
いるのですが、容量が大きくなりすぎると処理が重くなるので変数の
容量に上限をもうけたいと思っています。
0723デフォルトの名無しさん
2006/12/07(木) 11:21:31ただし、$aか$bのどちらかが0のときは$cに0を代入します。
という課題が出ているのですが、ただし以降がわかりません。
どのように入力すればよいのでしょうか?
0724デフォルトの名無しさん
2006/12/07(木) 11:30:34っつーかまんまだろうが・・・
0725デフォルトの名無しさん
2006/12/07(木) 11:33:30$c = ($a == 0 or $b == 0) ? 0 : ($a > $b) ? $a / $b : $b / $a;
0726デフォルトの名無しさん
2006/12/07(木) 11:41:08tie使えば指定した長さ以上入れようとするとエラーになるスカラーとか作れるけど、
普通は格納するときにlengthをチェックするようにすりゃいいだけじゃねーの?
0727デフォルトの名無しさん
2006/12/07(木) 12:24:22似たようなもんだろ…常識的に考えて…
0728デフォルトの名無しさん
2006/12/07(木) 13:23:38ワロタ
0729デフォルトの名無しさん
2006/12/07(木) 15:00:23( ´,_ゝ`)プッ
0730デフォルトの名無しさん
2006/12/07(木) 15:03:27変数名に$aや$bは使うな、って先生に言ってやれ
0731デフォルトの名無しさん
2006/12/07(木) 18:15:15$number2 = $b;
$answer = $c;
if (($number1 == 0) or ($number2 == 0)) {
$answer = 0;
} elsif ($number1 >= $number2) {
$answer = $number1 / $number2;
} elsif ($number2 > $number1) {
$answer = $number2 / $number1;
}
$c = $answer;
0732デフォルトの名無しさん
2006/12/07(木) 18:38:04$c = 0+eval { pop(@{[sort $a,$b]}) / shift(@{[sort $a,$b]}) };
や
$c = 0+eval { length('a'x$a|'b'x$b) / length('a'x$a&'b'x$b) };
で。
0733デフォルトの名無しさん
2006/12/07(木) 18:54:260734デフォルトの名無しさん
2006/12/07(木) 18:57:13間違ってないがわかり辛いから>>731の書き方のがいい
0735733
2006/12/07(木) 19:01:47すごくわかりやすいと思うんですが・・・
俺もこう書くねーフンフンと思ってたら笑われてて焦りました
if文で複数行で書くかどうかは好みですかね?
0736デフォルトの名無しさん
2006/12/07(木) 19:06:44そう書くなら関数でくるむのが正解
このパターンぐらいなら分かるけど ?が連続するのはちょっとな
0737デフォルトの名無しさん
2006/12/07(木) 19:34:330738デフォルトの名無しさん
2006/12/07(木) 19:45:10思いっきり普通だろ。「宿題の提出にはいじわる」ってんで笑っただけだ。
>>736
>関数でくるむのが正解
臨機応変に使うのが正解じゃねw
0739デフォルトの名無しさん
2006/12/07(木) 19:47:43?:三項演算子の読みやすさって整形次第で結構化けると思うんだ。どうよ?
$c = ($a == 0 or $b == 0) ? 0
: $a > $b ? $a / $b
: $b / $a;
$c = $a == 0 ? 0:
$b == 0 ? 0:
$a > $b ? $a / $b
: $b / $a;
# 等幅フォントのエディタにコピペしてみとくれ
0740デフォルトの名無しさん
2006/12/07(木) 19:52:10$c = ($a == 0 or $b == 0) ? 0
: ($a > $b) ? $a / $b
: $b / $a
;
なにが条件で代入するものがなにか判りやすいからだと。
ちなみに「elsif を使うんじゃねえ」とも書いてあったw
これには同意しかねるが。
0741740
2006/12/07(木) 19:53:55739氏のを採用してください orz...
0742デフォルトの名無しさん
2006/12/07(木) 20:00:54$c = ($a == 0 or $b == 0) ? 0
: ($a > $b) ? $a / $b
: $b / $a
;
ね。等幅エディタで。@Perl Best Practice
0743デフォルトの名無しさん
2006/12/07(木) 20:02:11簡単な質問でスミマセン
ある配列に
AAA
BBB
CCC
CCC
DDD
と格納されているとします。
ダブってるCCCをひとつ消して
AAA
BBB
CCC
DDD
とするにはどうすればいいのでしょうか
0744デフォルトの名無しさん
2006/12/07(木) 20:07:06@hoge = qw( AAA BBB CCC CCC DDD ) ;
%seen ;
@uniq = grep { ! $seen{$_} ++ } @hoge ;
0745デフォルトの名無しさん
2006/12/07(木) 20:11:12テンプレ>>3あたり全部読めば載ってるはず
0746デフォルトの名無しさん
2006/12/07(木) 20:14:31それいったらここんとこの質問全てが…
>>742
補足 THX
0747デフォルトの名無しさん
2006/12/07(木) 20:18:20知られています。
0748デフォルトの名無しさん
2006/12/07(木) 20:26:460749デフォルトの名無しさん
2006/12/07(木) 20:47:370750デフォルトの名無しさん
2006/12/07(木) 20:48:02答える側の住人も注意すべきかなと。
自治しなきゃ誰かが解決してくれるわけでもなし。
0751デフォルトの名無しさん
2006/12/07(木) 21:07:23質問者は同一人物だろ?
そのうち飽きるさ
0752デフォルトの名無しさん
2006/12/07(木) 21:11:15uniq するときの有名な手法の一つだよ。応用も効くので覚えておいて損はない。
下の例は拡張子を判断して各拡張子の一番若いものを grep する。
@list = qw( 00.jpg 10.png 05.png 01.jpg ) ;
%seen ;
@grepped = grep { $suf = (/\.(.*?)$/)[0] ; ! $seen{$suf} ++ } sort @list ;
print @grepped , "\n" ;
# まあ名前の長さが違えばもう一工夫必要になるけどね。
0753デフォルトの名無しさん
2006/12/07(木) 21:36:132ch見てるとたま〜にあってそれを読むとすごく気持ちいい。
0754デフォルトの名無しさん
2006/12/07(木) 21:46:540755デフォルトの名無しさん
2006/12/07(木) 22:34:392ch見てるとたま〜にあってそれを読むとすごく気持ちいい。
0756デフォルトの名無しさん
2006/12/07(木) 22:38:170757デフォルトの名無しさん
2006/12/07(木) 22:38:480758デフォルトの名無しさん
2006/12/07(木) 23:42:090759デフォルトの名無しさん
2006/12/08(金) 00:03:57やっぱりあまり綺麗だとは思わないけどなぁ
ダミアン・コンウェイは尊敬しているが
0760デフォルトの名無しさん
2006/12/08(金) 00:14:43splitを使って2次元関数を作りたいのに、うまくいきません
たとえば、
@tnk = split(/,/,"a,b,c,d");
@unk[3] = split(/,/,"a,b,c,d");
tnk[0]に"a"、[1]に"b"が入っていくように、
これでunkの[3][0]に"a"、[2][1]に"b"・・・と入れたいのに、うまくいきません
どうすれば2次元配列が作れますか?
0761760
2006/12/08(金) 00:15:54[2][1]ではなく、[3][1]です
0762デフォルトの名無しさん
2006/12/08(金) 00:32:12$unk[3] = [ split(/,/, "a,b,c,d") ];
以下、詳しい説明が必要なら。
配列変数はあくまで「スカラ値」の集まりなので、
split が返す「スカラ値のリスト」を1つの要素として代入する事はできません。
Perl での2次元配列は、配列変数のリファレンスを利用します。
リファレンスはスカラ値の一種なので、配列の要素として利用できるからです。
配列変数のリファレンスを作成するには [ LIST ] という構文が便利です。
LIST が入った匿名の(名前を持たない)配列変数へのリファレンスが作成できます。上の例なら
@unnamed_array = split(/,/, "a,b,c,d");
$unk[3] = \@unnamed_array;
とほぼ同じ意味です。
ちなみに、配列の中の1要素を添え字で参照する場合、取り出される値はスカラ値なので
@unk[3] ではなく $unk[3] のように、スカラ値を表す「$」を使う必要があります。
0763デフォルトの名無しさん
2006/12/08(金) 00:37:57インストールパッケージを開けませんでしたとでてインストールできませんでした
ActivePerl 5.6.1.638のほうはうまくいったんですが、最新版の方は
何か特別な制約があるのでしょうか
0764デフォルトの名無しさん
2006/12/08(金) 00:40:24スレ汚し申し訳ないです。。。
0765デフォルトの名無しさん
2006/12/08(金) 00:50:05TMTOWTDI だから使わなきゃいいだけじゃねw
俺にとっては三項演算子は必須になってる
0766デフォルトの名無しさん
2006/12/08(金) 00:50:26sexを使って3次元の子供を作りたいのに、うまくいきません
たとえば、
$tnk->setSpirit("どどどどうていちゃうわ");
$mnk->setJob("風俗嬢");
sex($tnk, $mnk);
$manの$man{'osiri'}に$tinkが入っていくように、
$mnkに$tnk・・・と入れたいのに、うまくいきません
どうすれば3次元の子供が作れますか?
マジレスお願いします。
0767デフォルトの名無しさん
2006/12/08(金) 02:05:300768デフォルトの名無しさん
2006/12/08(金) 02:34:30標準出力がティッシュのままなので、selectで正しく指定し直し。
sex関数も基本的には、先入れ先出し(FIFO)処理に書き換えて下さい。
0769デフォルトの名無しさん
2006/12/08(金) 03:32:170770760
2006/12/08(金) 09:19:04想定どおり動きました!
単なる知識不足だったようで、現に詳しい説明の部分が理解できません
そのあたりを勉強しなおしてきます
ありがとうございました
0771デフォルトの名無しさん
2006/12/08(金) 16:07:27#例
#
$url= http://www.youtube.com/v/2m0P-Q0joxU
#↓(リダイレクト先に変換)
$url= http://www.youtube.com/p.swf?video_id=2m0P-Q0joxU&eurl=&iurl=http%3A//sjc-static6.sjc.youtube.com/vi/2m0P-Q0joxU/2.jpg&t=OEgsToPDskKKNZHbTD7d-oE2My88f86P
0772デフォルトの名無しさん
2006/12/08(金) 16:34:19http://d.hatena.ne.jp/shag/20060920
のコードを読んでみれば分かるんじゃね?
0773デフォルトの名無しさん
2006/12/09(土) 01:24:37どうか教えてくださいm(_ _)m
Perl v5.8.8 built for i686-linux
#!/usr/local/bin/perl
$a='A¥[B¥]C';
if ( $a =~ /A¥[B¥]C/ ){
print "OK¥n";
}else{
print "NG¥n";
}
あと、任意の文字列を=~で比較しなくてはいけないとき、
"["のような都合が悪い文字列が入ってきた場合にそなえるのは
「quotemetaで処理」が適切なのでしょうか
quotemetaし忘れて=~で落ちるバグを修正しようとしたのですが、
上記のプログラムがなぜかNGになるので修正しきれないのです(; ;)
0774デフォルトの名無しさん
2006/12/09(土) 02:14:57if ($a =~ /A¥\[B¥\]C/ ){
print "OK¥n";
}
else {
print "NG¥n";
}
0775デフォルトの名無しさん
2006/12/09(土) 04:52:25(全角記号がもともとは半角であると仮定して)
正規表現では \[ は '[' という文字にマッチするので、 '\[' という二文字にはマッチしません。
'\[' にマッチするのは \\\[ です。
つまり 'A\[B\]C' にマッチする正規表現は /A\\\[B\\\]C/ です。
0776773
2006/12/09(土) 07:59:13言われて気づきましたorz (バグであせっていたのかも)
なんでもかんでもquotemetaすりゃいいってもんじゃないんですね・・・
どうもありがとうございましたm(_ _)m
0777デフォルトの名無しさん
2006/12/09(土) 08:09:37> 「quotemetaで処理」
えと、正規表現側の話だよね?まさかと思うけど変数側(ここで云う $a)じゃないよな?
この前提だと御前さんの提示したスクリプトに quotemeta の入る余地はないんだけど。
(quotemeta 使用例)
$str = 'a\[b\]c' ;
$quo = quotemeta $str ;
print $quo . "\n" ;
if ( $str =〜 /$quo/ ){ print "quote\n" ; }
if ( $str =〜 /$str/ ){ print "not quote\n" ; }
変数側の話しだとすると「すごおおおおく間抜けな事をやってる」とだけコメント
しとく。
(間抜けな例)
$quoquo = quotemeta $quo ;
if ( $quo =〜 /$quoquo/ ){ print "quotequote\n" ; }
それと 「quotemeta しわすれ」てのが理解できん。何せ提示された例の正規表現
は、直接文字列で作成されてて変数なんて見に行ってないから。
0779デフォルトの名無しさん
2006/12/09(土) 21:30:22↓のスレッドにレス付けておきました。
Perlコーディング初心者質問スレ Part 53
http://pc8.2ch.net/test/read.cgi/php/1164519503/
0780デフォルトの名無しさん
2006/12/11(月) 22:10:460781デフォルトの名無しさん
2006/12/12(火) 21:41:11windowsのシェルはsjisしか表示できないらしいので、
nkf.exeを使って、perl a.pl | nkf -sとしたんですが、
リアルタイムで実行結果が表示されず、実行しているときの状況が分りません。
a.plに$|=1;と記述してもだめです。
どうすればいいでしょうか?
0782デフォルトの名無しさん
2006/12/12(火) 22:29:490783デフォルトの名無しさん
2006/12/12(火) 22:51:420784デフォルトの名無しさん
2006/12/12(火) 23:13:35File::Path
■ このスレッドは過去ログ倉庫に格納されています