Perl コーディング初心者質問コーナー Part36
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/07/14 13:23ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0357nobodyさん
04/08/05 17:28ID:???test
%s = subroutine(%s)
EOF
でもいいと思うし。
0358nobodyさん
04/08/05 17:29ID:???> printf <<EOF,$value, subroutine($value);
逆だ鬱。
printf <<EOF, subroutine($value),$value;
0359nobodyさん
04/08/05 19:46ID:???早速ありがとうございます!
>>356
ばっちりできました!
>>357-8
printfについて勉強が浅かったので、今解説サイトのprintfとsprintfのページみて少しは
わかってきましたが、>>357-8さんのコーディングがまだ理解できませんorz
難しいですね
0360354
04/08/05 20:06ID:???>>356さんの教えてくれた方法は、サブルーチンが返す値を出力するときのみなんですよね?
サブルーチンでprintしてる場合は何故か変なところに出力されてしまいました;
printが2重になってしまうのでやっぱり無理ですよね。
0361nobodyさん
04/08/05 20:18ID:???AUTOLOADは早くないと思う。
>>353
アクセッサーの自動生成なら。他 CPANに 同様のClass::モジュールが多数有
http://perldoc.jp/docs/modules/Class-Accessor-0.18/Accessor.pod
0363nobodyさん
04/08/05 21:08ID:???たかだがアクセスメソッドのために、モジュールを一個useするのって重くないか?
極力削りつつ、汎用的でいけてるプログラムを目指さなきゃ。
0364nobodyさん
04/08/05 21:38ID:???別の方法もあるが、一度ヒアドキュメントを終了して書く方が後々面倒じゃないので、
ヒアドキュメント閉じる方がいい方法だと思う。
0365361
04/08/05 22:41ID:???ごめん。実行速度の事だと勘違いしてました。
>>363
でも、頻繁に使われるものだから、何度も書き直すものではないよ。
似たようなコードが複数のファイルに散らばると保守が面倒になるし、
僕ならモジュール使う方を選ぶけど。
主張の違いは置いておいて、AUTOLOAD使うとしたらこんな感じかな。
sub AUTOLOAD {
# getter/setterを呼出時に自動定義
my ($self, $value) = @_;
return if $AUTOLOAD =~ /::DESTROY$/;
if ($AUTOLOAD =~ /::((get|set)_?(\w+))$/) {
if ($2 eq 'get') {
eval "sub $1 { my (\$self) = \@_; return \$self->{lc($3)} }";
return $self->{lc($3)};
}
if ($2 eq 'set' and defined $value) {
eval "sub $1 { my (\$self,\$val) = \@_; \$self->{lc($3)} = \$val }";
$self->{lc($3)} = $value;
}
}
}
書いてて思ったんだけど、>>353 のコード
配列とかハッシュはリファレンスを返せば充分じゃない?
0367nobodyさん
04/08/06 00:59ID:???print <<EOF,&subhoge('hoge'),<<EOF;
hogehoge
EOF
hogehogehoge
EOF
0368nobodyさん
04/08/06 01:16ID:Qwf6u7BBperldoc -f pack
を読むと template の S, I, L のバイトオーダは機種依存とありますが
N, V の方はどうなんでしょうか?
N は big-endian, V は little-endian と機種に依存しないような体で書かれているんですが。
0369nobodyさん
04/08/06 01:27ID:???一つずつの配列を出力する時にhogehage.gif hagehoge.gif honehone.gif...と出力
させたいのですが、楽な方法はありますかね?
bashの
for $i in *.png
do;echo ${i%.png}.gif;done;
と同じように考えていただければ良いのですが…。
0372368
04/08/06 01:58ID:???間抜け晒してお恥ずかしい
0373329
04/08/06 05:44ID:???>書いてて思ったんだけど、>>353 のコード
>配列とかハッシュはリファレンスを返せば充分じゃない?
漏れ的にはオブジェクトをとても親切な人として想定してるので、
リファレンスのまま返すのはちょっと無愛想かなって;
0374nobodyさん
04/08/06 06:33ID:???foreach (/x=(\d+)/g) { $sum = $sum + $_; }
としたのですが、もっと綺麗とか高速とかな書き方はないでしょうか?
0376nobodyさん
04/08/06 07:03ID:???前にどこかでサブルーチン名にアンダースコアを含ませる時は何かの注意をするように
って書いてるサイトを読んだ。
うろ覚えでどこのサイトかもどんな注意かも忘れちゃってて、今ググテみたけどそんな注意らしきことは
どこにも見当たらない。サブルーチン名にアンダースコアを含んで、含まないときと異なる注意点ってあったっけ?
0377nobodyさん
04/08/06 08:45ID:???<q cite="http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlstyle.html">
単語を区切るためにアンダースコア (_)を使いましょう。これは、
一般的に言って $VarNamesLikeThis よりも $var_names_like_this の
ほうが、特に英語のネイティブスピーカーでない人にとっては、読む
のが簡単です。 これは VAR_NAMES_LIKE_THIS のような場合でも
有効である単純な 規則です。
<snip />
名前の先頭にアンダースコアを使うことで、その変数や関数がそれが
定義されているパッケージの外では使うべきでないということを表わす
ために使うことができます。
</q>
__LINE__ や __FILE__ といったリテラルトークンと同名のサブルーチン
は作るのも呼び出すのも難しい。
*__LINE__ = sub { 1 };
print &__LINE__;
0379376
04/08/06 09:04ID:???ありがとう!多分先頭がアンダスコアの変数、サブルチンはパッケージ外では使わない
っていうのを中途半端に覚えていたせいで、変に怖かったんだ;
0380nobodyさん
04/08/06 10:49ID:DHgT8QqI文字列 =~ //aa/
でいいの? それとも/の前になんか必要?
0383nobodyさん
04/08/06 11:21ID:???エスケープをエスケープして↑じゃ駄目か?
0384nobodyさん
04/08/06 11:48ID:???bmpファイルから画像情報を抜き出そうとしています。
$hexdata = unpack("H*",$bindata)として
424d36e80300000000003604000028000000fe0200004c010000 (0x1A以降略
ここまで取得することができました。 ↑
矢印の「fe02」の部分がWidthで「766」に変換したいのですが、
どのように変換するのがスマートでしょうか?
hex(substr($hexdata,36,2))+hex(substr($hexdata,38,2))*256
で一応取得はできるのですが文字列として扱ってる時点から冗長過ぎる気がします。
0385nobodyさん
04/08/06 14:07ID:???unpackでv使え。
% perl -e '$s="\xfe\x02"; ($w)=unpack("v", $s); printf "%d\n", $w;'
766
bmpのファイルフォーマットは知らんので前後をどうべきかは
わからん。
0386nobodyさん
04/08/06 14:14ID:???my @TagsBITMAPFILEHEADER = qw/
bfType
bfSize
bfReserved1
bfReserved2
bfOffBits
/;
my @TagsBITMAPINFOHEADER = qw/
biSize
biWidth
biHeight
biPlanes
biBitCount
biCompression
biSizeImage
biXPelsPerMeter
biYPelsPerMeter
biClrUsed
biClrImportant
/;
my $bmp = {};
@{$bmp}{@TagsBITMAPFILEHEADER} = unpack('a2VvvV', substr($bindata, 0, 14));
@{$bmp}{@TagsBITMAPINFOHEADER} = unpack('VVVvvVVVVVV', substr($bindata, 14, 40));
print $bmp->{biWidth};
0387nobodyさん
04/08/06 14:35ID:???http://search.cpan.org/~gaas/Image-Info-1.16/
0388384
04/08/06 21:58ID:???回答ありがとうございます。
>>386
unpackに配列を返させてまとめてハッシュに格納してるのはなんとなく分かるのですが、
以下の読み取り方法では何も表示されませんでした。
他の方法をとらなければならないのでしょうか?
$file = './tmp.bmp';
open FH, $file;
binmode FH;
read FH, $bindata, -s $file;
close FH;
0391nobodyさん
04/08/07 00:19ID:???0392384
04/08/07 00:52ID:???LANケーブルで首吊って死につつ蘇って精進します。
0393nobodyさん
04/08/07 03:22ID:???$a2 が $aa に当てはまっていれば、その行の $b を $b2 に代入
という風にを、 $a1 〜 $a13 までやって、それに応じて $b1 も $b13 まで用意する、とやるのに、
13個ルーチンを書くのは無駄が多いような気がするんですが、簡素に書く方法ありませんか?
0397nobodyさん
04/08/07 06:38ID:???パッケージ=ルーチン
メソッド=サブルーチン
と言う感じですか..?
メインルーチン=ルーチン?
0398nobodyさん
04/08/07 07:03ID:???http://www.mikeneko.ne.jp/~lab/kcode/jcode.html#h2-2
を読みましたが知りたいことが書いてないみたいなので質問させて下さい。
$a = \"あいうえお";
リファレンスを格納している変数の中身を文字コード変換するにはどうすればいいでしょうか?
jcode::convert(\$a,"sjis");
jcode::convert($a,"sjis");
jcode::convert(\($$a),"sjis");
できないのでしょうか?
0399nobodyさん
04/08/07 07:42ID:WwZLffmc調べろ
http://e-words.jp/w/E383ABE383BCE38381E383B3.html
0401nobodyさん
04/08/07 09:41ID:???それを抜きにしても、型グロブ受け取るサブルーチンに
スカラーのリファレンス渡すのはどうすりゃいいか
わからんな。
やりたいことが文字コード変換ならJcode.pm使え。
0402nobodyさん
04/08/07 10:06ID:M9c7I24Iしてたのですが、�鰍ネどは判定してくれるのですが、
��のような文字は判定してくれません。
92区(0xEE9F~0xEEFC)にあたるのでこの正規表現に
含まれると思うのですが、どうしてでしょうか。
教えてください。お願いします。
# 機種依存文字の有無確認
# 有→1、無→0 を返す
sub depend_kisyu{
my $name = shift;
if($name){
# 機種依存文字発見のためにsjisに変換
&Jcode::convert(\$name, "sjis","auto");
my $ascii = '[\x00-\x7F]';
my $sjis_twoBytes = '[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]';
my $sjis_pattern='[\x87\xED\xEE\xFA-\xFC][\x40-\x7E\x80-\xFC]';
if($name =~ m/\G(?:$ascii|$sjis_twoBytes)*?((?:$sjis_pattern)+)/og){
return 1;
} else {
return 0;
}
}
}
0404nobodyさん
04/08/07 11:34ID:???なぜ正規表現が正しいかという話なのに、ifだの
Jcode::convertだのがついた関数にして質問するかな?
前後に余計なものがついてると問題がぼやけるので、
$nameにいきなりその"��"をSJISで入れて、その関数の
正規表現の部分でマッチするかどうか、というところ
を調べてから出直して来い。
0405nobodyさん
04/08/07 11:56ID:20zkJ4Vm改行の場所にスペースも入ってしまって困っています。
改行などもそのままで表示したいのですが…。お願いします。
(ファイルはアスキーモードで転送しています)
open(PAGE_FILE, "test.txt");
@page = <PAGE_FILE>;
close(PAGE_FILE);
print <<"";
<form action="$program_name" method="GET">
<input type="hidden" name="title" value="$title">
<input type="hidden" name="mode" value="write">
<textarea cols="80" rows="20" wrap="off" name="text">@page</textarea><br>
<input type="submit" value="送信">
</form>
0406nobodyさん
04/08/07 12:12ID:???(解決法1)
ファイルを読むときに配列じゃなくてスカラーに読んで
そっちを使う
{local $/; $page=<PAGE_FILE>;}
(解決法2)
配列を文字列に埋め込んだときに要素間に挟む文字を
空文字列にする。
{ local $" = '';
print ...
}
0408nobodyさん
04/08/07 13:52ID:???my( $sec,$min,$hour,$mday,$mon,$year,$wday,$isdat,$yday ) = gmtime (time);
my $a = sprintf "%02d:%02d:%02d GMT",($hour,$min,$sec);
他にどんな使いかたがあるでしょうか?この二つの関数についての理解を深めたいので
いろんな使い方を知りたいです。
どうぞおながいします。
0409nobodyさん
04/08/07 14:21ID:???http://perldoc.com/perl5.8.4/pod/func/sprintf.html
0411nobodyさん
04/08/07 14:48ID:???0412nobodyさん
04/08/07 14:52ID:???my( $sec,$min,$hour,$mday,$mon,$year,$wday,$isdat,$yday ) = gmtime (time);
my $a = sprintf "%4d/%02d/%02d GMT",($year,$mon+1,$mday);
0413nobodyさん
04/08/07 15:14ID:???my $a = sprintf "%4d/%02d/%02d GMT",($year+1900,$mon+1,$mday);
0417nobodyさん
04/08/07 17:06ID:???のサイトの
printf '%2$d %1$d', 12, 34; # prints "34 12"
はどういうことだろう?テストコピペして動作確認したが期待通りにはならなかったぞい。
英語が嫁ねと駄目だなorz
0419nobodyさん
04/08/07 17:26ID:???その変換指定子の書き方は 5.8.0 からサポートされた。
http://perldoc.com/perl5.8.4/pod/perl58delta.html
0421nobodyさん
04/08/07 18:07ID:???最後の文字がxなら @xに
最後の文字がx以外なら @yに
こういう正規表現を絡めたコーディングがしたいです。
@x = grep { /x\z/ } @a;
@y = grep { /[^x]\z/ } @a;
で一応できるんですが、一度目でfalseだったものはそのまま@yにいれていくような感じにしたいんですが
どうすればいいでしょう?
foreach ( @a ) {
if (/x\z/) {push @x,$_}else{push @y,$_};
}
できました^^ところで{push @x,$_}の部分、{push @x}では$_の値を自動で追加してくれないんですが
ifの実行文内では、デフォルトで$_に作用する法則?が崩れるんですか?
0422nobodyさん
04/08/07 18:19ID:???そんな法則は存在しない。
foreach ループの変数名を省略した場合は $_ に代入され、
マッチ演算子に対してマッチ結合演算子で文字列が指定
されていない場合は $_ が対象となるだけ。
0423nobodyさん
04/08/07 18:22ID:???for($i=0 ; $i<6 ; $i++ ){
print "$i回目開始<br>";
if ( $i == 3 ){
print "$i回目終了できず<br>";
真であればこの後の処理をループして4回目に移行
}
print "$i回目終了<br>";
}
って残りの処理をelseに書けばいいんですよね;
でももっとなんか強制的に次回に移行するようなのってないですかね?
0425nobodyさん
04/08/07 18:26ID:???0429nobodyさん
04/08/07 18:38ID:???jsの
for( i in obj.array ) 〜
みたいな
0430nobodyさん
04/08/07 18:49ID:???http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlsyn.html#Loop_Control
>>428
後置 foreach は 5.005 で実装されたので記憶違いだろう。
http://perldoc.com/perl5.8.4/pod/perl5005delta.html#EXPR-foreach-EXPR-is-supported
>>429
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlsyn.html#Foreach_Loops
0432423
04/08/07 19:19ID:???for($i=0 ; $i<6 ; $i++ ){
print "$i回目開始<br>";
/3/ && print "$i回目終了できず<br>" && next;
print "$i回目終了<br>";
}
できました!ありがとうございました。
0433nobodyさん
04/08/07 20:37ID:pd//1imi★あなたのHPのアドレス長くて憶えられません!
【独自ドメインでホームページを作るならここ!】
A:無難なサーバー。 お勧め!!
http://www.webspeed.ne.jp/
http://www.wadax.ne.jp/
http://www.ktplan.ne.jp/
http://domainya.net/
http://www.cpi.ad.jp/
http://solid.ad.jp/
B:ある程度の障害は大目に。
http://www.binboserver.com/
http://s55.net/
http://www.j-navi.com/
http://www.wakuwaku.ne.jp/
http://www.j-speed.net/main/
http://www.cyberjellyfish.com/
0435nobodyさん
04/08/08 00:09ID:???0436nobodyさん
04/08/08 06:38ID:???っていうか付属ドキュメント読めたらCGIレベルでのコーディングスレなんかいらねよ。
0438nobodyさん
04/08/08 10:16ID:???入力しないと終わらないもの(例えば"tail -f")をPerlで取り込んで
webで表示したいのですが、方法はありませんか?
open(AA,"コマンド|")で取り込んだ場合、コマンドが終了しないために
うまく取り込めないようで困っております。
0441nobodyさん
04/08/08 12:19ID:???ログが増える度に画面更新して欲しい
・定期的にクライアント側で更新 -> javascript + tail
・サーバから垂れ流したい
-> ログチェック用のデーモン作成。Java Flash等コネクションを貼れるものを使う。
0442nobodyさん
04/08/08 14:31ID:???コマンドはなんでもいいとして、キーボードからの入力で終わるコマンドを取り込む場合はどうすりゃいいんだろね。
0443nobodyさん
04/08/08 14:50ID:???0444nobodyさん
04/08/08 15:44ID:???<q cite="http://perldoc.com/perl5.8.4/pod/func/open.html">
You are not allowed to open to a command that pipes both in and out,
but see IPC::Open2, IPC::Open3, and perlipc/"Bidirectional Communication
with Another Process" for alternatives.
</q>
0445nobodyさん
04/08/08 17:47ID:???ここは日本人が見るスレなんだから他国語じゃ通じないよ。
正直おまいみたいに頭のいいやつはこのスレで質問しない。でもおまいみたいに頭のいいやつがいないと
このスレは成立しない。だからやさしくしてね^^
0447nobodyさん
04/08/08 18:29ID:???0448nobodyさん
04/08/08 18:37ID:???英語が読めないとほざくバカチョン様へ
まずは、コード例をみてみましょう。
そして気になるところがあったら、その部分の解説英文をコピーして、
http://www.excite.co.jp/world/english/
に貼り付けてみましょう。
バカチョンな訳しかできないけれども、それなりに真意は読めてきます。
気をつけるところは大文字の MUST や MAY などの大文字を小文字に変換してみましょう。
あとは脳内で「日本語置換」するのではなく、「英文を感じ取る」のです。
と、ここまで書いてみたところで、バカチョン様には無理でしょうねぇ。
0449nobodyさん
04/08/08 18:49ID:???>>6
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_open_FILEHANDLE_MODE_LIST
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq8.html#How_can_I_open_a_pipe_both_to_an
0450nobodyさん
04/08/08 18:51ID:???$aが未定義であれば代入するっていうunlessを使った処理だけど、
たいていのリファレンスサイトではこの処理を↓で説明してるよね。
unless ( $a ){ $a = 1 }
簡単な処理の場合は一行目の書き方のほうがいいと思うんだけど、何故か一行目の書き方も
できると説明してるサイトは見たことない(perl.doc等ならあるだろうけど日本人の作ったサイトでは見てない)。
perlのバージョンによって通用するか異なる書き方だからかな?それともなんかやめておいたほうがいい理由があるのかな?
0451nobodyさん
04/08/08 18:54ID:???0452nobodyさん
04/08/08 18:56ID:???0453445
04/08/08 18:57ID:???俺は何も質問してないよ;
>>446
で、試しに>>444と同じ事を日本語で説明してるサイト探してみなよ。
面倒くさくないか?
>>447
せっかくの回答者に暴言吐くな
>>448
今度疑問があったときにやってみるね。
0454nobodyさん
04/08/08 18:57ID:???0455nobodyさん
04/08/08 18:58ID:???thx
■ このスレッドは過去ログ倉庫に格納されています