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

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

■ このスレッドは過去ログ倉庫に格納されています
0001Mr. MoonlightNGNG
"The duct tape of the Internet"こと、
Perlについての質問箱です
"There's more than one way to do it"ということで
Perlの奥深さについて皆で語り合い、追求してまいりましょう。

CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
0153デフォルトの名無しさんNGNG
>>148
ppm2 install HHTP-Lite
詳しくはactiveperl 5.8.0 Build804 をインストールした
ディレクトリのhtml/index.htmlを開き、ActivePerl FAQの
Using PPMを読め。
英語がわからんなどと泣き言はいうなよ。
0154デフォルトの名無しさんNGNG
>>153 おッっと、チョンボ
s/HHTP/HTTP/
0155デフォルトの名無しさんNGNG
チョンボ ふるっ
0156麻雀大好きNGNG
いつも使ってるが、何か?
0157デフォルトの名無しさんNGNG
↑いつもちょんぼしてる奴
0158デフォルトの名無しさんNGNG
そういえば、麻雀プログラムのスレってあったっけ?
ネットワーク対戦プログラムならコードが小さく収まるし
他にも応用がきくと思うんだが。
0159148NGNG
>>152,153
助言ありがとうございました。
ppmコマンドプロンプトで
ppm> install Lite.pm
って打ってたので出来ませんでした。正しくは
ppm> install HTTP-Lite
ヘルプ読んだら一発…。お恥ずかしい限りです。
0160デフォルトの名無しさんNGNG
MCrypt-0.92を使っていますが、mcrypt_ecb関数で
暗号を復号時にうまく変換ができません。
どうも変数に入っているバイナリデータ(\0を含む)の
受け渡しがうまくいってないようなのです。
サブルーチンへバイナリデータを受け渡すいい方法って
ないでしょうか?

# それともどうしようもないのかねぇ・・・
0161デフォルトの名無しさんNGNG
$name = system( hostname )
画面に表示される方を変数に入れたいのですが・・・
0162デフォルトの名無しさんNGNG
しばらくぶりにこのスレ覗いたけど、まだ荒らし常駐してんのか。
0163デフォルトの名無しさんNGNG
>>160
ここでボヤクより、駄目な場合をテストスクリプトにして
MCryptの作者に直接メールした方が早いんではないかい?
0164デフォルトの名無しさんNGNG
>>161
$name = qx( hostname );
0165160NGNG
>>163
うーむ。やはりそうですね。
メールしてみまッス
0166デフォルトの名無しさんNGNG
画面から入力した文字でログのgrepをかけるスクリプトを書きたいと考えています。
変数でgrepするスクリプトを書いてみましたがうまくいきません。
どうすればいいでしょうか?
0167デフォルトの名無しさんNGNG
>>166
どう書いてどう動かないのか。

やる気はございますでしょうか?
0168166NGNG
166です 初心者ですみません

>>167さま
@logにログを入れた後
$a=<>;
@output = grep /$a/,@log;
と言うような感じで@outputに出力しようと考えていました
0169デフォルトの名無しさんNGNG
>>168
別段問題ない気がするんだけどな。……あー。
chomp $a;っていれたらいいんでないかしらん。
0170デフォルトの名無しさんNGNG
>>167
それイイ!! 禿しくワラタ。

>>168
>>169のとおりですが、パターンの中が変数じゃないと困るけど、1回代入したら変更なし、という
時は、後ろに /pattern/o とつけてやると少し速くなりますYO。
0171山崎渉NGNG
(^^)
0172デフォルトの名無しさんNGNG
LWP::UserAgentで requestしたあとで
print $res->content;
とやると、何故か改行一つが改行二つになってしまいます。
なんで?
0173デフォルトの名無しさんNGNG
>>172
OSの名前くらい書け。
MS-WindowsならLF->CRLFになるからCRLF->CRCRLFになる。
0174デフォルトの名無しさんNGNG
コマンドラインオプションを認識するようなコードを書きたいんだけど
for ( @ARGV ){
if( $_ =~ m/-test/ ){
print "TEST MODE\n";
}
}
これよりもスマートに行けるかな?
0175デフォルトの名無しさんNGNG
>>174
use Getopt::Long;
0176デフォルトの名無しさんNGNG
LWP を使ったユーザエージェントに wget -k とおなじことをやらせるには
どうしたらいいですか?
読みにいったページ内のアンカータグとイメージタグのURLを
絶対パスに変換して保存させたいんです。
(URLを抽出するなら変換するメソッドもURL::URIあたりに
用意されてるみたいなんですが。)
0177デフォルトの名無しさんNGNG
>>176
$r->base
0178デフォルトの名無しさんNGNG
>>176
HTTP::Response#base
0179デフォルトの名無しさんNGNG
Win32環境でイベント(ファイルシステムからディレクトリとファイルを削除した際)を常時監視するスクリプト作りたいのですが
どのモジュール使えばいいのでしょうか?
0180デフォルトの名無しさんNGNG
>>179
Win32::EventLog
ファイルを監視出来るのかは知らない。
Win32モジュールはWindowsでしか動作しない。
0181デフォルトの名無しさんNGNG
ActivePerl(Build633)のインストーラが、%Path%中で指定している環境変数を
勝手に展開しちゃう件はガイシュツでつか?
かなり糞な不具合だと思うんだけど。
0182デフォルトの名無しさんNGNG
↑意味不明
0183デフォルトの名無しさんNGNG
>>182
分かり難くてスマソ。環境変数「Path」が、元々は、

「%SystemRoot%\system32;%SystemRoot%;・・・」

と環境変数を使って値が設定されているのに、ActivePerlのインストーラが
Perlのパスを追加するときに、既存の値の中の環境変数を展開しちゃって、

「X:\Perl\bin\;C:\WINNT\system32;C:\WINNT;・・・」

と設定しちゃう。

build62xの頃のインストーラは問題無かったハズだけど、何故にあとから
こんなバグ組み込んじゃったんだろ。
0184デフォルトの名無しさんNGNG
馬具とはいえんだろ。仕様の変更か、お宅がOSを変更したかだな。
インストールの中では、環境変数とかPathの設定をさせないようにして
後で自分の趣味に合わせて勝手に設定したらどうよ。
俺はいつもそうしてる。
0185デフォルトの名無しさんNGNG
>>184
>馬具とはいえんだろ。仕様の変更か、お宅がOSを変更したかだな。
OS変更してません。Win2000で再現可能です。
もし仕様変更としても、こんなアホな仕様にする必要性が理解できません。
つーか単純に、環境変数展開の考慮漏れでしょ。

>インストールの中では、環境変数とかPathの設定をさせないようにして
>後で自分の趣味に合わせて勝手に設定したらどうよ。
そりゃーこの現象に気が付いていれば、インストール後に直してやるなり対応は
可能だけど、気が付かない人はまずいでしょ。
ちなみに>>184は、これまでにこの現象、知ってましたか?
0186デフォルトの名無しさんNGNG
>>185
環境変数の
%SystemRoot%\system32〜
が
?:\windows\system32〜
に置き換わるって言っているのか?

同じくBuild633でwinXP環境だけど全然置き換わっていないぞ。。
0187Mr. Moonlight≠184NGNG
今試しにインストールしてみたけど確かにそうなるね。なんかキモいなコレ。
でもま、バグなんだろうけど%SystemRoot%なんて
実際のトコ変わることなどなさそうだし、
あまり神経質に気にしなくてもよさそうな気がするよ。
0188デフォルトの名無しさんNGNG
>>186
XPでつか。こんど検証してみます。
>>187
>でもま、バグなんだろうけど%SystemRoot%なんて
>実際のトコ変わることなどなさそうだし、
>あまり神経質に気にしなくてもよさそうな気がするよ。
まあね。
でも%SystemRoot%以外の環境変数も展開されるし、気をつけないとまずいかなと。
客先の既存環境に導入するようなケースもあり得るだろうし。
0189デフォルトの名無しさんNGNG
>>186
WinXP Proクリーンインストールしてサービスパック等は入れない状態で
試してみたけど、Win2000と同様に展開された値になりました。
0190デフォルトの名無しさんNGNG
>>189
?
ActivePerlをインストしてあるXP2台と殆どなにも入れていないXPで
環境パスはなにも変わっていないよ
0191184NGNG
>>185
納得するかも?って書いたんだけど甘かったな。まっ、本家にブー垂れたら?
と逝っても、もう、633はサポートしないだろうけど。
http://bugs.activestate.com/ActivePerl/query.cgi
0192デフォルトの名無しさんNGNG
形勢不利と見るや知ったような事を言う>>184がいるスレはここでつか?
0193恵理@言問橋NGNG
お祭りだ、ワーイワーイ。
0194デフォルトの名無しさんNGNG
ここは英語が分からない馬鹿がブー垂れるスレですか?








氏寝予、おめー
0195デフォルトの名無しさんNGNG
>>194
どっか書いてあるの?
0196デフォルトの名無しさんNGNG
ageちゃったスマソ。
0197デフォルトの名無しさんNGNG
Perl6はいつになったらできるんだコラ!あぁ?
0198デフォルトの名無しさんNGNG
use と require の違いをおしえて
0199デフォルトの名無しさんNGNG
use vars qw($VERSION);
$VERSION = 1.00;

ってどういうこうかがあるんですか?
0200デフォルトの名無しさんNGNG
>>198
require は実行時に検査される。
useはコンパイル時に検査される。

--
print "hoge";
require Hoge::Fuga;
--
だと、 "hoge" が出力された後に エラー(Hoge/Fuga.pm がねぇよ)を吐くけど
use にした場合は、実行する前にHoge::Fugaがチェックされて、
無い場合は実行されない(hogeも出ない)
更に use は import() を自動的に呼ぶ

嘘臭い説明するとこんな感じ。
更にインチキな説明をすると
「Perlモジュールとして作られ物(.pm) はuse そうじゃないなら require」

>>199
そのスクリプト(モジュール)のバージョン設定だよ
0201デフォルトの名無しさんNGNG
対象の「/hogehoge」ディレクトリの全ての「*.txt」ファイルに
ある処理をあてるにはどういう流れですれば良いでしょう?
今までは "perl -i.bak script /hogehoge/*.txt" とかやって
いたんですが、流石にちゃんとした検索がしたくなったので・・・
0202デフォルトの名無しさんNGNG
>>201
UNIX なら find を組み合わせた方が UNIX 的で美しいですが。
いかがでしょう?
find /hogehoge -name "*.txt" -exec cmd.pl {} \;
0203デフォルトの名無しさんNGNG
acitiveperl dev kit をアンインストしたらデバッガが起動しなくなりました

C:\>perl -d -e '0'
Unable to connect to remote host: 127.0.0.1:2000
Compilation failed in require.
main::BEGIN() called at C:/Perl/lib/perl5db.pl line 0
eval {...} called at C:/Perl/lib/perl5db.pl line 0
BEGIN failed--compilation aborted.

たすけてやってください
0204デフォルトの名無しさんNGNG
>>201
glob() 多少手が込んだ事やるなら File::Find
0205デフォルトの名無しさんNGNG
perl5.8のデバッガ ポインタが実行行を示してくれないんですが。
激しく使えません。
0206デフォルトの名無しさんNGNG
>>205
あ、ActivePerlのです。
0207デフォルトの名無しさんNGNG
>201
opendir(DIR,".");
@d=readdir(DIR);
closedir(DIR);
for(@d){print("$_\n")if($_=~/\.txt$/);}
これで如何?
0208デフォルトの名無しさんNGNG
今、多人数参加型のオンラインゲームを作ろうと思っています。

ステータスなどの管理を「ユーザー名.dat」などのように、
ユーザー個別のファイルで行いたく、新規登録時にファイルを作成させたいのですが
とほほなどを見ても、それらしきコマンドが見あたらず、困っています。

mkdirはディレクトリだし・・・
こういうときはどうすれば良いのでしょう?
0209デフォルトの名無しさんNGNG
知識が足りないということに気付いて、
ネット上の資料だけで安くあげるのではなく、きちんとした参考書を買う。
0210デフォルトの名無しさんNGNG
open(OUT,">ユーザー名.dat");
のように'>'のようにリダイレクトを使う
リダイレクトは他にも'>>','<','+<'等あるので調べてみそ
0211デフォルトの名無しさんNGNG
>209
趣味でやるには高すぎるっす(;´Д⊂

>210
それで出来たんですね!
存在しないファイルはエラーになるって思いこんでました。(つД⊂)
有難う御座いました!
0212デフォルトの名無しさんNGNG
うーむ。趣味に金をかけずに何に金をかけるんだろうか。
0213デフォルトの名無しさんNGNG
つか、その程度のレベルでオンラインゲーム作ろうと思うのが偉いな
がんがってくれ

皮肉じゃなくて高い目標を持つのはいい事だよ
0214デフォルトの名無しさんNGNG
つか、その程度のレベルでオンラインゲーム作ろうと思うのが偉いな
がんがってくれ

皮肉だよ高過ぎる目標は挫折の元だよ
0215デフォルトの名無しさんNGNG
PGPのフィリップ・ジマーマンって、
最初はプログラミングのことは全くわからないタダのオサーンで、
いろんな人にプログラミングのこと聞きまくって勉強してPGP作ったらしいね。

目標が高いのはいいんだけど、ほんとうに真剣に打ち込める目標でナイトね。
0216山崎渉NGNG
(^^)
0217208NGNG
>212
他の趣味にお金かけますよw

>213
ども! がんがります!

>214
・・・( ´・ω・)

>215
ジマーマン(・∀・)イイ!!
久々に出会った、やってて楽しい作業なので
まだしばらくは大丈夫です!
0218213NGNG
嘘だ馬鹿
皮肉に決まってんだろ
0219208NGNG
   ∧∧
   /⌒ヽ)
  i三 ∪
 〜三 |
  (/~∪
  三三
 三三
三三
0220214NGNG
嘘だよ。皮肉じゃないよ。
高い目標を持つのはとても良いことだよ。
ただ一気に目標に向かうのはダメで、
その目標に達するために何が必要か細分化する必要がある。
まずは、その細分化された問題を解決する小さなプログラムを作ってみてはいかが?
それができてからだんだん大きくしていけば良いよ。
がんばれ!
0221デフォルトの名無しさんNGNG
default.txt(何万行もあるものです)の内容を一行ずつ読み込み
a.txt、b.txt、c.txt、d.txt、e.txt
の内容と照らし合わせ。default.txtの内容に合致する
*.txtにカウントを1ずつ増やす、というのを高速に行う
にはどうしたらよいでしょうか?
forkで子プロセスを生んで並列に処理すればいいのでしょうか。。
とは言ってみたものの、へっぽこなのでわかりません。。
どうかご教示下さい。お願いしますっ
0222デフォルトの名無しさんNGNG
a-e.txt の内容で defalut.txt に grep かければ。
0223208NGNG
      ∧ ∧
     ヽ( ´∀`)ノ >220 今はただ足下を固めるばかり♪
    へノ   /        構想の一割にもキテナイ♪
      ε ノ          がんがるよ!
       >
0224デフォルトの名無しさんNGNG
>>223
玉袋が冷えすぎると魔王が蘇えるから気をつけてね。
それがあの人の遺言だから。あまり無下に扱って欲しくない。
たましい。その。
0225デフォルトの名無しさんNGNG
open(IN, a) とかのINってなに?
0226デフォルトの名無しさんNGNG
>>225
ファイルハンドル。

INって名前の(ファイル専用の)変数に、"a" が入ってると思えばいいよ
open(IN,'a.txt')
$data = <IN>;
close(IN);

'a.txt'の別名と考えると分かりやすいかもしれない
てかドキュメント嫁
0227デフォルトの名無しさんNGNG
超初心者です。
perlでwindowsのアプリケーションとかを動かすように作れますか??
0228デフォルトの名無しさんNGNG
>>227
作れます。
0229227NGNG
良ければ作り方か、
なんか良いHPほ教えていただけませんでしょうか??
0230デフォルトの名無しさんNGNG
>>229
最初からそう言えば?もったいぶってないでさ。

system
0231デフォルトの名無しさんNGNG
パイプ
0232デフォルトの名無しさんNGNG
ある文字列を含まないものにマッチする正規表現

(?:(?!foo).)*




含まないものにマッチするってどういう意味?

マッチさせて含んでいたら、非0を返せばいいんじゃないの?

そういうのとはちがうんか?
0233デフォルトの名無しさんNGNG
あるperlプログラムから、かなり処理に時間のかかる、別のperlプログラムを起動したいのですが、
system関数ではwaitしてしまうし、exec関数では元プログラムが終了してしまいます。
返り値は必要としてないので、一方的に起動させるだけということはできないのでしょうか?
0234デフォルトの名無しさんNGNG
フォークしろ
0235デフォルトの名無しさんNGNG
forkって自分の複製をつくるものじゃないの?
forkしたあとに子プロセス側からsystemを呼べってこと?
0236デフォルトの名無しさんNGNG
パイプの処理で、
a.pl:
open(TEST, "|b.pl");
print open 'test';
close(TEST)

b.pl:
while($line=<STDIN>) {
printf"$line";
}

としても何も表示されません。
パイプのデータの受け渡しが間違ってると思うのですが、
ぐぐっても分かりません。どうすればいいのでしょうか。
環境はwindows2000+ActivePerl最新版です
0237233NGNG
>>234-235
forkで子プロセスからexec or systemしろと言うことですね。
有難うございます。無事できました。
0238デフォルトの名無しさんNGNG
ActivePerl では、fork 使わなくとも(使えなくても)

system( 1, "command ..." );

とやるとバックグラウンドプロセスを立ち上げ可能。
先頭の引数が1なのがミソ。
UNIX で system( "command ... &" ) とやるのとほぼ一緒。

>>236

open(TEST, "|b.pl");
print open 'test'; # <== これは何?
close(TEST)

○ print TEST 'test';
0239デフォルトの名無しさんNGNG
>>232
それだけだったら、あんまり意味無いけど
否定条件で組み合わせると役に立つ
例えば、HTML読み込んで
<a HREF="〜">
の部分だけ取り出したいとき
(普通はまぁ リンク文字列 </a> も取り出すだろうけど)

/<a.*?>/ # ここで言明使っても良いけど

で出来るが、<a NAME="〜"> みたいに、NAMEを含んでいるタグは要らない場合

/<a(:?(!?NAME=".*?").)*?>/

ってやると
<a HREF="〜"> はマッチするが、<a NAME="〜"> はマッチしない。

寝惚け頭でかいてるが、何とか察してくれ
# ついでに↑の正規表現間違ってるような気がするから当てにしないでくれ
0240236NGNG
>>238
すいません、書き込みミスでした。
正しくしても、標準入力から読み込んでも空になります。
b.plは動きはするのですが。
activeperlではうまくパイプが働かないのでしょうかね。
0241デフォルトの名無しさんNGNG
>>239
>それだけだったら、あんまり意味無いけど
めっちゃ意味あるだろ・・・
0242239NGNG
>>241
(?:(?!foo).)*
すまん、正規表現あんまり詳しくないんでこれに驚くほどの意味は有ると思えん
それこそ !~ /foo/ でいいじゃねぇかと思う。

否定言明だけで意味ある例解説キボンヌ
0243デフォルトの名無しさんNGNG
-d スイッチのデバッガでステップ実行中に途中の行を無視して(その行は実行しない)
次の行へ移る、なんてことは無理?
0244デフォルトの名無しさんNGNG
>>242
おいおい、、(?:(?!foo).)* ≠ !~ /foo/ 全然違うYO
0245238NGNG
>>240

>正しくしても、標準入力から読み込んでも空になります。

ああ、そういうこと…。
Cygwin 環境下でちょっと試したが、確かにundefになるね。
最初はバッファフラッシュをやってないからだと思ったのだが

select( (select(TEST), $| = 1)[0] );

それとも少し違うようだし。
cat を対象コマンドにするとちゃんとパイプ内容が渡ってるのが確認できる。
#実際 fly.exe とか sendmail.exe がちゃんと動かせるんだし(^^;

そもそも素でSTDINから読めばコマンドライン入力待ちになるのだから、
パイプ先の b.plで <STDIN>がundefを受け取ってくるのが何故なんだろう。
#らくだ本に関連項目あった気がする。IPC::Open2 の出番かもしれない。

>>243

実行前にコメントアウトしとくのはだめなの?
ブレークポイントで任意の位置で中断することはできるけど、
リスタートはその位置か、ファイル先頭からしかできなかった記憶。
0246238NGNG
あー。これで逝けたYO!

open(TEST, "| perl b.pl"); # <== ちゃんとコマンド名で叩く
select( (select(TEST), $| = 1)[0] );
print TEST "test\n";
close(TEST);

きちんと perl.exe 経由で起動すればパイプ繋がるわ。
#! 行に頼るとダメっぽい…。
0247デフォルトの名無しさんNGNG
239はアフォだな・・・ってことは232もアフォなのね
0248243NGNG
>>245
なるほどコメントアウトするしかないですか。
わりと長めのトレースの途中でコメントアウトしなきゃいけない行に
気付いたときになんとか出来ないだろうかって思ったもので。
ありがとうございます。地道にやってみます。
0249デフォルトの名無しさんNGNG
はじめて質問します。
数値を出力する時に3桁毎に「,」をつけたくてC言語だと
setlocale(LC_ALL, "");
printf("%'d\n",123456789);
とすることで、「123,456,789」の出力結果が得られますが
perlだと
use POSIX "locale_h";
setlocale(LC_ALL, "");
printf "%'10d\n", 123456789);
としても、「'10d」としか表示されません。

何か方法は無いでしょうか。

0250デフォルトの名無しさんNGNG
>>244
>>247

>239でも>232でもないが

何となく全く同じではないというのは分かるんだが、
こんな時に使うという解説キボンヌ
0251デフォルトの名無しさんNGNG
>>249
どんな方法でも構わないのなら、
正規表現でも出来る。
0252251NGNG
やり方書いてなかった。
例えばこんなの

$_= 1234567890;
() while s/^(\d+)(\d\d\d)/$1,$2/;
print;


> 1,234,567,890
■ このスレッドは過去ログ倉庫に格納されています