Perl コーディング初心者質問コーナー Part36
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/07/14 13:23ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
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
0457!445
04/08/08 19:17ID:???甘ったれ過ぎだろ。赤ん坊か?カスどもめ。
0458nobodyさん
04/08/08 19:18ID:???0459nobodyさん
04/08/08 20:00ID:alTDDsx/特定のポートに接続があったら,スクリプトを起動すると言うことは可能でしょうか?
0461459
04/08/08 20:08ID:alTDDsx/ということは,例えば,メールを受信したらスクリプトが起動するという処理も
可能と言うことですよね?
0462nobodyさん
04/08/08 20:11ID:???可能。
サンプル ttp://www.fc-lab.com/network/program/inetd/
「inetd」でググった最初のページにあった。
0464nobodyさん
04/08/08 20:36ID:???0466nobodyさん
04/08/08 21:57ID:???inetd でどうやって「メールを受信した」が判別出来るのかを考えてみましょう。
smtp は、あくまでも「中継」だからねぇ。
個人的には .qmail に | を入れているけれども。
♪ウイルスチェックと、新着ウイルス DAT 情報から dat ファイルを取りに行くスクリプトなどなど。
0467nobodyさん
04/08/09 06:45ID:???0469nobodyさん
04/08/09 08:33ID:???真面目に相手をしてあげすぎなんじゃない?
いいやつなゆえだろうけど、気楽にいこうよ。
0470nobodyさん
04/08/09 08:43ID:???それとも、ちゃんと作れば大丈夫?
0473nobodyさん
04/08/09 09:13ID:???0474nobodyさん
04/08/09 09:15ID:???それはPerl云々よりもOSの問題もあると思うが。
Perl自体は妙な使い方をしないかぎり平気。メモリはちゃんと管理してくれる。
0475nobodyさん
04/08/09 10:10ID:???0477nobodyさん
04/08/09 11:24ID:???0478nobodyさん
04/08/09 15:37ID:???Perlはメモリの管理はしっかりしてるが、一度確保したメモリは終了まで保持される模様。
巨大なメモリが必要なところは、forkして子プロでやるのが吉。
0480sage
04/08/09 17:15ID:17VOmc59======
/folder1/
/folder2/
/folder3/
/file1/test.txt
/file1/test00.txt
/folder2/aa.txt
/folder2/
======
と、フォルダ名、ファイル名がガガっと書いてあります。
カウントしたいものは、
/folder1/
/folder2/
/file1/test.txt
へのアクセス回数です。ということで、
%count =("/folder1/"=>0,"/folder2/"=>0,"/file1/test.txt"=>0);という連想配列を作成しました。
ファイルオープン→それぞれの行を@log_gyouに入れて
while (($key,$value) = each %count){
if ($log_gyou[$cc] =~ /^$key/){
$count{$key}=$value+1;
last;
}
}
$ccを行数分繰り返してます。
結果は、カウント数がおかしいです。自分で目でカウントしたものより、少なく出ています。
連想配列のキーに、「/」とか「.」は使えない??と思いましたが、それならエラーになりますよね??
でも、やっぱ使わない方が良いんですか?
どこか、おかしなところがあったら、教えてください。
0481子プロ哲哉
04/08/09 17:15ID:???0483nobodyさん
04/08/09 17:33ID:???0484nobodyさん
04/08/09 17:35ID:???eachを使ったループを途中でlastで抜けて最後まで
使ってないので、次の回でeachがリセットされてない
ためと思われる。
この構造でいきたいなら、keysかvaluesでリセットすれ。
0485nobodyさん
04/08/09 17:41ID:???>>484さん。解決できました!!
すううげええぇえええぇえ!!
一瞬でわかっちゃう人が居るんですね!
ありがとうございました!ぺこり。
0488486
04/08/09 19:33ID:???0489nobodyさん
04/08/09 22:22ID:???0490nobodyさん
04/08/09 22:27ID:???0491nobodyさん
04/08/09 22:37ID:???必要なくなったらってことだよ
{ my $var = 1111111; }
$varはブロックを出るときに、開放されるのかってことが聞きたい
0492nobodyさん
04/08/09 23:03ID:???undefしたりスコープから抜けるとPerlが空きブロックだと認識して、別の変数でそこのメモリ空間を再利用するだけ。
0495nobodyさん
04/08/10 12:44ID:???0496nobodyさん
04/08/10 13:46ID:???外から見れば取りっぱなしなので解放されないともいえるという
玉虫色の解釈でいいと思われ。
0497nobodyさん
04/08/10 16:56ID:Rp3Iu5NLprint<<HTML_DOCUMENT;
content-type: text/html
<html>
<body>
こんにちは<br>
私の名前は藤森水絵です<br>
</body>
</html>
HTML_COCUMENT
をコンパイルすると必ず
>C:\httpd\cgi-bin>perl 52.pl
Can't find string terminator "HTML_DOCUMENT" anywhere before EOF at 52.pl line 3.
というエラーが出てきます。解決方法知っている方教えてください。
0498nobodyさん
04/08/10 17:02ID:???メッセージの意味は
「ターミネータの "HTML_DOCUMENT" が EOF まで行っても
見つからないよ、うわーん」なので、
最後の
> HTML_COCUMENT
こきゅめんと を どきゅめんと に変える、とか。
あと、
> content-type: text/html
この辺、調べなおしたほうがよいです。
0500nobodyさん
04/08/10 17:13ID:Rp3Iu5NLレス有難うございます。
こきゅめんとをどきゅめんとにしましたが
それでも上手くいきません・・・。
#!/usr/bin/perl
print<<HTML_DOCUMENT;
content-type: text/html
<html>
<body>
こんにちは<br>
私の名前は藤森水絵です<br>
</body>
</html>
HTML_DOCUMENT
> content-type: text/html
をどうしたらよいのでしょうか?
0501498
04/08/10 17:24ID:???どことかぶってるの?(丸投げスレでヘンなことになったしさ)
>>500
> 上手くいきません
の内容を書かないと伝わらないですよ。
手元の環境では、 perl -wc test.pl しても OK 出るし、
perl test.pl で標準出力に表示してくれます。
>>497のエラーは出なくなってると思うんですけど…。
0502498
04/08/10 17:33ID:???> content-type: text/html
\n\nがついてるのを見慣れすぎてただけです。すいません_| ̄|○
0503nobodyさん
04/08/10 17:57ID:???http://pc5.2ch.net/test/read.cgi/tech/1090889189/278
0504nobodyさん
04/08/10 17:57ID:Rp3Iu5NLprint <<HTML_DOCUMENT;
content-type:text/html
<html>
<body>
こんにちは<br>
私の名前は藤森水絵です<br>
</body>
</html>
HTML_DOCUMENT
をC:\httpd\cgi-bin>perl 52.pl でコンパイルしていますが
Can't find string terminator "HTML_DOCUMENT" anywhere before EOF at 52.pl line 3
. となり上手く行きませんほかにコンパイル方法あるのでしょうか?
0506nobodyさん
04/08/10 19:29ID:???ヒアドキュメントの終端識別子の後には空白行が必要。正確には空白でなくてもいいが、
ファイルの最後の行数=終端識別子のある行数ではエラーになる。
で、コピーして動作確認したが何のエラーもなく表示されたぞ?おまいは何だ?
0507nobodyさん
04/08/10 19:43ID:???これを含まないで一発で取得する方法ってありますか?
あとで拡張子等を評価するってのは思い付くのですが
何か無駄なような気がするので質問させてもらいました。
0508nobodyさん
04/08/10 20:22ID:???> ヒアドキュメントの終端識別子の後には空白行が必要。
不要。終端文字列の前後に余計な空白文字があるのは NG だが。
>>507
http://perldoc.com/perl5.8.4/pod/func/readdir.html
my @file = grep /^\.\.?\z/, readdir DIR;
0509nobodyさん
04/08/10 21:41ID:???ちゃんと最後まで読んでよ。
>ファイルの最後の行数=終端識別子のある行数ではエラーになる
って言ってるじゃないのよ。まあ初めが語弊のある言い方だったけどさ。
0510nobodyさん
04/08/10 22:26ID:???終端識別子の「HTML_DOCUMENT」のケツに、改行が入ってねぇんじゃねぇの?
>509はそういうことが言いたいのか?俺にも今ひとつ分からんかったのだが・・・
>>508
「.」と「..」を含まないでって言ってんのに、それじゃあ「.」と「..」しか得られん。
my @file = grep !/^\.\.?$/, readdir DIR;
では?
0511nobodyさん
04/08/10 22:40ID:???print <<EOF;
here-document.
EOF
この三行で普通に動くが?
ヒアドキュメントの終端は「終端文字列だけから成る*行*」でなければ
ならないので、終端文字列の後ろに改行は必要だが、それ以下には
何ら必要でない。
>>510
訂正ありがとう。
0514nobodyさん
04/08/11 04:28ID:???$a{aa} = 1;
------------------
my $a;
$a{aa} = 1;
------------------
my $a;
$a->{aa} = 1;
の違いがイマイチ分かりません。
解説してる所とか無いですか?
0516nobodyさん
04/08/11 04:37ID:???二番目はありえない気ガス
0518nobodyさん
04/08/11 08:46ID:???真ん中はスカラー変数$aをmyにしてるが、2行めは%aへの操作で
別にエラーになるような間違いじゃないがその2行はなんの関連
もない。
下はスカラー変数$aがmyになっていて、最初はundefが入っているが、
$a->{aa}=1;したときに自動的に無名ハッシュが生成されてその
リファレンスが$aに入る。で、その無名ハッシュのキーaaに対応
する値が1になる。
0519509
04/08/11 09:33ID:???>>510-511
>終端識別子の「HTML_DOCUMENT」のケツに、改行が入ってねぇんじゃねぇの?
だから
>ファイルの最後の行数=終端識別子のある行数ではエラーになる
と同じ意味だろ。改行いれずにどうやって
ファイルの最後の行数!=終端識別子のある行数
にするの?
>>513
行数がわからないと、文法チェックもできないからちゃんと勉強しれ。
0520nobodyさん
04/08/11 09:52ID:???>>506 での "空白行" が >>508 では "空白文字" と捉えられてる。
空行とか改行文字って表現にしたほうが良かったんじゃない? > 語弊の原因
# 空白行ってあまり聴かないし
0521黒死犬 ◆EgxBlf8nvc
04/08/11 11:59ID:???>>519
うちの環境だと、それでもエラーになりませんが・・・
でも前のバージョンでエラーになった覚えがあるので、ひょっとしたら改善されたのかもしれません
0522nobodyさん
04/08/11 12:30ID:???確かにふつーは空行だな。
でも空行ってのは行頭に\nがあるわけで、この場合必要ない。
必要なのは終端識別子の末尾の改行。
そこでファイルエンドなら問題ない。
>>519
>>ファイルの最後の行数=終端識別子のある行数ではエラーになる
>と同じ意味だろ。
とか言われても、お前にしか通じん言葉では同意は得られんと思うが?
行数じゃなくて行番号ならまだしも。
ただ、
HTML_DOCUMENT[\n]
[EOF]
となっている場合、終端識別子の行がファイルの最終行なわけだが、
これなら改行が入っているから問題ない。
一部のエディタじゃ[EOF]にも行番号が表示されるから、そこが最終行だと
勘違いしてんじゃねえのか?
0524nobodyさん
04/08/11 13:02ID:???$value =~ s/1/1/g;
みたいなのを1〜9まで繰り返すしか思いつかないのですが、一発でやるようなコーディングはありませんか?
0525nobodyさん
04/08/11 13:41ID:???0528nobodyさん
04/08/11 15:05ID:???$ref_exchange = ['0','1','2','3','4','5','6','7','8','9'];
$value =~ s/$ref_exchange->[$_]/$_/g for 0..9;
printf "%s\n", $value;
かなりお間抜けかも、、、
0529nobodyさん
04/08/11 15:17ID:???プラス、マイナスとかのこと?
print pack "c*" 0xa4,0xa2;
print pack "C*" 0xa4,0xa2;
EUCだと両方「あ」って表示されて差がわかりません。おながいします。
0530nobodyさん
04/08/11 15:42ID:???use Jcode;
$value = '1234567890';
$value = Jcode->new($value)->tr('0-9', '0-9')->euc;
print $value, "\n";
または
use utf8;
use encoding 'euc-jp', Filter=>1;
$value = '1234567890';
$value =~ tr/0-9/0-9/;
print $value, "\n";
0531nobodyさん
04/08/11 15:47ID:???packするときは違いがでない。unpackすると違いが出る。
print unpack "c*", "\xff";
print unpack "C*", "\xff";
0533529
04/08/11 16:09ID:???print unpack "c*", "\xaf";
print unpack "C*", "\xaf";
だと
-81
175
で
print unpack "c*", "\x7f";
print unpack "C*", "\x7f";
だと
127
127
で同じ。一体どういう仕組みですか?
0534529
04/08/11 16:13ID:???print unpack "C*", "0xff";
print qq\<br>\;
print unpack "C*", 0xff;
print qq\<br>\;
print unpack "C*", "\xff";
print qq\<br>\;
print unpack "C*", \xff;
は
48120102102
505353
255
83676576658240481204957555350489941
になるんですが、どうしてクォートありなし、\xと0xで違うものになるんでしょうか?
\xは0xと同じ意味だと思ってたのですが。
0535nobodyさん
04/08/11 16:15ID:???Perlじゃないけどこんなページ見つけた
ttp://www.kab-studio.biz/Programing/PragmaTwice/Main/056.html
0536524
04/08/11 16:16ID:???Jcodeは使ったことないので多分自宅のテスト環境用のactiveperl5.6.613には入ってないと思いますが
ppmを使ってインストールができるモジュールなのでしょうか?鯖(joe's)でも使えるか確認してみます。
0538529
04/08/11 16:58ID:???符号あり-128〜127
符号なしは0〜255
16進数二桁だとこんなかんじなんですね^^mysqlのtinyintと同じ感じ。
わかりやすいサイトでした。534については載ってませんでした。
0539nobodyさん
04/08/11 17:31ID:???perlのリテラルについてよく勉強しろ。
"0xff"
'0', 'x', 'f', 'f'の4文字からなる文字列
48120102102
'0'の文字コード48, 'x'の文字コード120,
'f'の文字コード102, 'f'の文字コード102
がくっついて出力された
0xff
16進数のff=10進数の255
505353
255がまず文字列に変換され、各桁の文字コード
'2'が50と'5'が53がくっついて出力された
"\xff"はいいだろう。
\xff
裸の文字列リテラルxffの前に\演算子がついて
それのリファレンスをとったことになる。
83676576658240481204957555350489941
スカラーのリファレンスは文字列に変換すると
SCALAR(0xほげほげ)と変換される。(0xほげほげ
はポインタかなんかを16進表示したもの)
'S'は83,'C'は67,...(以下略)
0540nobodyさん
04/08/11 17:36ID:???RGBフォーマット(ベタイメージ)の画像があるのですが、
(サイズや色数情報などば別の変数に持っています)
これをPNGとして書き出すのにいい方法はありませんか。
テンポラリファイル等はできるだけ作りたくないのですが。
とりあえず新しくImage::Magickオブジェクトを作ったあと、
SizeとDepthをセットしunpackでforで1ピクセルずつ16進表記に直してSetした後、
Writeする方法でやってみたのですが、
1ピクセルずつSetを行うととんでもなく遅いので…
0541nobodyさん
04/08/11 17:37ID:???○forで1ピクセルずつunpackで16進表記に直してから
0543529
04/08/11 18:31ID:???非常にわかりやすい説明ありがとうございます。
ところで"\xff"はどういう感じなのでしょうか?
print "\xff"とするとEUCでは「・」だけ表示されます。
0xff → 先に255に変換されてから関数に渡される。
"\xff" → 255に変換せずに16進数のffという値を関数に渡している。
であってますよね?
0544nobodyさん
04/08/11 18:49ID:???"\xff"は16進数のff(=10進の255)1バイトからなる
文字列。
これはEUCとしては使ってない部分なので、なにか
表示されるとしても苦し紛れになんか出してるだけ
だと思うよ。
0545nobodyさん
04/08/11 18:53ID:???foreach my $foo (@array){
$foo=~s/aaa/bbb/;
}
とすると@arrayに書き戻せないですよね?
for (my $i=0; $i >= @#array; ++$i){
$array[i]=~s/aaa/bbb/
}
これでいけると思うんですけど、ほかにシンプルな方法はありますか?
■ このスレッドは過去ログ倉庫に格納されています