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

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

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

CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 http://pc5.2ch.net/php/ )

CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするので
WEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。

姉妹スレッド(Perl コーディング初心者質問コーナー Part37@WebProg)
http://pc5.2ch.net/test/read.cgi/php/1093106507/

過去ログは>>2-1001あたり
0232デフォルトの名無しさんNGNG
>>231
>>3
0233デフォルトの名無しさんNGNG
>>223
おまえCSVファイルって何のことか分かってて言ってる?
0234デフォルトの名無しさんNGNG
>>231
Perlの勉強よりアルゴリズムの勉強が必要だと思う
手順を論理的に考える能力が足らないんじゃないのかな
0235デフォルトの名無しさんNGNG
perl hoge.pl foo bar aho
で、foo bar ahoを文字列のリストとして取得するのはどうやるんでしょうか。
my $input = $_;はできても
my @inputs = @_;はできないですよね。
0236デフォルトの名無しさんNGNG
@ARGV
0237デフォルトの名無しさんNGNG
>>233
カンマ区切りテキスト
0238デフォルトの名無しさんNGNG
>>236
thx
0239デフォルトの名無しさんNGNG
なんか・・・ね・・・
0240デフォルトの名無しさんNGNG
やっぱり・・・だよ・・・ね・・・
0241デフォルトの名無しさんNGNG
PerlでWindowsのスクリーンセーバーを作るには
Win32モジュール使えばいいんですか?
0242161NGNG
PARで上手く実行ファイル化できないと質問した>>161です。

根本的な解決方法かどうかはわかりませんがPARのアップグレードを試みたので状況報告です。
(PAR-0.85の)makefile.plを実行してmissingと出たものをppmで追加し、全てloadedと表示されるようにしました。
しかし、Fetching 'PAR-0.85-MSWin32-x86-multi-thread-5.8.2.par' に失敗し、'script/parl.exe'の生成にも失敗しました。
そこで独自にparファイルをダウンロードしたのですが、@INCやMakefile.plと同じディレクトリに置いてもそれを使ってくれません。
parファイルを解凍しての手動インストールは難しそうなので断念しました。
0243デフォルトの名無しさんNGNG
漏れは、chompのソースコード書き換えて、
s/\x0d\x0a?$//;
にしてる。
0244デフォルトの名無しさんNGNG
>>242
ttp://www.bribes.org/perl/ppmdir.html は見たのか?
0245デフォルトの名無しさんNGNG
>>242
私も同じようなエラーが出たので
ttp://aut.dyndns.org/par/
から使っているPerlのバージョンにあう
PAR-0.XX-*.parをダウンロードして
手動でインストールした所、エラーが出なくなりました。
(Win2K Perl 5.8.3)

でも、結局、
PAR-0.85はエラーが出てインストールできなかったので、
もしかしたらPerlを最新バージョンにアップするとうまくいくかもしれません。
0246161NGNG
結果:できました!
---
>>245 回答ありがとうございます。
今Perlを5.8.2->5.8.4にバージョンアップさせました。

>>244 回答ありがとうございます。
そのサイトは見ていませんでした。
コンパイル済みPARの配布を行っているんですね。

・Perlのバージョンアップ
・ttp://www.bribes.org/perl/ppm/PAR.ppd からインストール
両方行ったところ「pp --gui -a test.gld -o test.exe test.pl」で実行ファイルを作成でき、起動も無事行えました。
具体的な原因は判らなかったもののこれが過去ログとなった時に役立てば幸いです。

本当にありがとうございました・゚・(ノД`)・゚・
0247デフォルトの名無しさんNGNG
>>246
情報Thx.
0248デフォルトの名無しさんNGNG
>>243
Mac 使い?
0249243NGNG
間違えた。s/\x0d?\x0a?$//;

0250デフォルトの名無しさんNGNG
>>249
chomp使わないで、
そうする利点がわかってんなら、
それでいいんじゃない。
あーっそって感じ。
0251デフォルトの名無しさんNGNG
人をばかにして折れが一番といいたい絶頂厨がいるな。
0252243NGNG
悪かったなー。二度と来る
0253デフォルトの名無しさんNGNG
>>251
勘弁してくれよ。
終わった話を得意気に持ってくるヤツに、
あっそ。と言ってあげたまでの話。
お前には、はいはい。と言ってあげよう。
0254デフォルトの名無しさんNGNG
まぁ、まったりいこうや。
取敢えず、駄目ならソース出せということで。
0255デフォルトの名無しさんNGNG
二つのファイルを使う時、変数の取り扱い方がわかりません。
>b0005 gtgaaaaagatgcaatct
>yaaA atgctgattcttatttca
>Zaw atgaggttggccccccca
...

>Z0005 gtgaaaaagatgcaatct
>yaaA atgctgattcttatttca
>Eae atgagagagagccgagccgag
...
を
gtgaaaaagatgcaatct b0005 Z0005
atgctgattcttatttca yaaA yaaA
...
と表示させる方法を教えてください。
(二つのファイルを比較して、塩基配列(右の部分)が等しいものの名前を表示する。
同じファイル内では等しくても表示しません。)

自分は塩基配列をそれぞれ変数にして等しい時表示すると書きたかったのですができませんでした。
0256デフォルトの名無しさんNGNG
宿題は自分でやろうな。
0257デフォルトの名無しさんNGNG
my %enkis;
open A, "file-a.txt" or die;
while(<A>){
my ($tag, $enki) = split;
$enkis{$enki} ||= [$tag];
}
close A;

open B, "file-b.txt" or die;
while(<B>){
my($tag, $enki) = split:
unless($enkis{$enki}){
$enkis{$enki} = [$tag];
}else{
push $enkis{$enki}, $tag;
}
close B;

print qq/$_ @$enkis{$_}\n/ foreach (keys %enkis);
0258デフォルトの名無しさんNGNG
>>255を軽くプロファイリングしてみます。
>>255は、自分が分かっているんだから相手もわかる。
相手が理解しやすいよう伝えようとは考えない。
この辺で、自己中心的な部分があります。
また、こういう考えをする人は頭の良い人に多いように思います。

また、他人が自分に力を貸すのは当たり前。
そういう思想の持ち主のように思います。

また、物を例えて表現するのが苦手に思います。
これは逆に、例えた物を置き換えて理解するのが苦手に繋がります。
たとえば、ライターの火は危ないよ、と教えてもらっても、
「ライターの火は危ない」とだけ学習し、コンロの火も危ないとは学習しません。
「火は危ない」そう学習するのが苦手に思います。

こういう人は、人とのコミュニケーションが苦手で、
自分を表現するのが下手な奥手な人。
以外な所で知的で、内面は大胆不敵。
しかし、外には出さない。
煽りっぽくなりましたが、正直なあなたの印象です。
たとえ、ここで答えを聞いても、
応用し、違う局面で生かす事ができないと思うのであります。
0259デフォルトの名無しさんNGNG
258 を要約すると 256 となります。
0260デフォルトの名無しさんNGNG
255=257というのはどうだろう?
0261デフォルトの名無しさんNGNG
何か最近255みたいな質問多いな
0262デフォルトの名無しさんNGNG
回答者のレベルが下がったら
質問者のレベルも下がってしまった。
0263デフォルトの名無しさんNGNG
 と馬鹿が申しております
0264デフォルトの名無しさんNGNG
落ち着け!
落ち着くんだ!(# =ΦωΦ=)フーフー…!!
0265デフォルトの名無しさんNGNG
>>263
図星を指されてむかついた時は、もっと文章を捻ろう。
定型文に依存すると、真っ赤な顔したDQNってバレちゃうぞ☆
0266デフォルトの名無しさんNGNG
ここでいいのかな?
Perlで次のようなHTTPクライアントプログラムを作ったのですが、
iswebのcgiを取得しようとすると、どうしても403になってしまいます。
何か解決策知ってる方いませんでしょうか?

#!/usr/bin/perl
use Socket;
$u = "http://nekyo.hp.infoseek.co.jp/cgi-bin/wiki/wiki.cgi";
if($u =~ m|^http://([-_\.a-zA-Z0-9]+)/?(.*)$| ){
$host = $1; $port = getservbyname('http', 'tcp'); $path = $2;
}elsif($u =~ m|^http://([-_\.a-zA-Z0-9]+):([0-9]+)/?(.*)$| ){
$host = $1; $port = $2; $path = $3;
}
$iaddr = inet_aton($host) || die 'err';
$sock_addr = pack_sockaddr_in($port, $iaddr) || die 'err';
socket(SOCKET, PF_INET, SOCK_STREAM, 0) || die 'err';
connect(SOCKET, $sock_addr) || die 'err';
select(SOCKET); $|=1; select(STDOUT);
print SOCKET "GET $u HTTP/1.0\r\n";
print SOCKET "Referer: $u\r\n";
print SOCKET "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705)\r\n";
print SOCKET "Host: $host:$port\r\n\r\n";
while(<SOCKET>){ print; m/^\r\n$/ && last; }
while(<SOCKET>){ print; }
0267デフォルトの名無しさんNGNG
たかが2chで何か言われたぐらいで
顔を真っ赤にする奴がいるんだろうか。
0268デフォルトの名無しさんNGNG
>>266
LWP使えって。
0269デフォルトの名無しさんNGNG
>>266

GET /cgi-bin/wiki/wiki.cgi HTTP/1.0

っとするべきところが

GET http://nekyo.hp.infoseek.co.jp/cgi-bin/wiki/wiki.cgi HTTP/1.0

となったるだーよ
0270263NGNG
俺さっききたばかりで何となく煽っただけです☆
0271デフォルトの名無しさんNGNG
と、顔を真っ赤にしながら馬鹿が負け犬の遠吠えをしております
0272263NGNG
本当だもん。。。
0273デフォルトの名無しさんNGNG
と馬鹿が申しております
0274263NGNG
なんでIO::Socket使わないの?
0275デフォルトの名無しさんNGNG
>>269
ありがとう!できました!
0276デフォルトの名無しさんNGNG
初心者なんで、なんか的外れな質問でしたらすみません。
マルチコアプロセッサ対応版のperl、みたいなのはあるんでしょうか。
0277デフォルトの名無しさんNGNG
閉ループを、ブラウザを開いている間だけ実行させ、
ブラウザを閉じたら閉ループから抜け、プロセスを終了させる方法とかりますでしょう
か?

監視処理的な事をやらせたいので、
閉ループとsleepとを使って行なわせてるのですが、
ブラウザを閉じてもプロセスが動きっぱなしになるので、
タスクマネージャーでいちいち終了させるのが、
面倒でありまして。
0278 ◆FIcNi4f8js NGNG
HTMLの中にreloadを書いて、自分は終了。
0279277NGNG
>>278
すいません。
初心者なもので、
もう少し詳しく教えて頂きたいのですが。
0280デフォルトの名無しさんNGNG
>>279
HTML、reloadでぐぐるぐらいのことが出来なくてどうする。
それにもうPerlの話じゃないし、初心者だという開き直りも印象が悪い。
出直して来い。
0281デフォルトの名無しさんNGNG
全部わかった上で嫌味を書いてみただけなのでは?

OSもわからんし監視処理「的」ってのも意味不明だけど
forkしてexecして親からpid監視すりゃいいンじゃないの?

って既に他所で開いてあるブラウザを監視したいとかいう話だったら
もう知らんけど。
0282デフォルトの名無しさんNGNG
ちんぽに真珠を埋め込みたいのですが、
おすすめは何ですか?
ついでに手術してくれる病院も
紹介してもらえるとありがたいのですが。
0283デフォルトの名無しさんNGNG
>>282
自分でBB弾でも詰めとけよ
0284デフォルトの名無しさんNGNG
>>282
悪い事言わないから。
真珠を埋める手術受ける前に、
真性包茎の手術を受けろ。
な?
0285デフォルトの名無しさんNGNG
>>277
mod_perlみたいなのを使った場合は知らんけど、
普通cgiはブラウザ〜で読みだしたときの状態を見るものだとおもわれ。
よってブラウザリロードをしてとりこむ。->鯖のプロセス自体はその都度終了。

監視処理とやらは常駐処理になるだろうから別プログラムにせにゃならん筈。
0286デフォルトの名無しさんNGNG
use Win32::OLE::Variant;
$conn = 'Provider=Microsoft.Jet.OLEDB4.0;';
$conn .= 'DataSource=test.mdb;';
$db = Win32::OLE->new('ADODB.Connection');
$db -> Open($conn);
$rs = $db->Execute("SELECT * FROM [TEST];");
while (!$rs->EOF) {
 print $rs->Fields('ID')->Value;
 $rs->MoveNext;
}
$rs->Close;
$db->Close;

----------------
while (!$rs-EOF) { の行でエラー
Can't call Method "EOF" on an undefilned value text.cgi line xx.

今まで動いてた物が急に動かなくなりました。
原因又は、原因の突き止め方を教えてください。
Win2k-Server, IIS ,ActivePerl v5.8.4 ,Access2000
0287デフォルトの名無しさんNGNG
perlってXPでもインストールしないとできないんですか?
学校で聞いたらXPだと入ってると言われたんですが・・・
馬鹿な質問すいません
0288デフォルトの名無しさんNGNG
>>287
それどこの学校だよw
0289デフォルトの名無しさんNGNG
ActivePerlでも入れませう、基本だぞモルァ
0290デフォルトの名無しさんNGNG
こういうやりとりを想像してみるテス�d

287 「先生、学校のパソでもパールとかできるんすか?」
クソ先公 「(あ?実習室にはXP機があるし、図書館にはiMacがあるが、どっちの事だ?
     XP機には漏れが Perl をインスコしておいたが……)
     おう、Perl なんかよく知ってたな。どこで使いたいよ?」
287 「あー、実習室のパソで……」
クソ 「あそこなら使えるぞ。自由に使え」
287 「押忍! アリガトッシタ!」
0291デフォルトの名無しさんNGNG
287が脳内変換したに一票
0292デフォルトの名無しさんNGNG
>>290
多分それビンゴ
0293デフォルトの名無しさんNGNG
>>287の学校には、
XP以外に98やらMeやらMacやらLinuxやらが入ってるPCがあり、
XP(が入ってるPC)にはPerl(インストールしておいたから)入ってるよ。
の説明を受けたのをXPには最初から入ってる物と勘違いしたに1000カノッサ
0294デフォルトの名無しさんNGNG
ここでくだらん予想しても・・・(w
0295デフォルトの名無しさんNGNG
>>286
$db->Executeの戻り値がundefだから。
どういう条件でundefが返るのかは自分で調べてちょ。
(テーブルがなくなったとか、あるいはファイルに接続できなくなったとか、排他制御とか、いろいろ想像できるけど)
0296デフォルトの名無しさんNGNG
ppm しようとしたら、

C:\Documents and Settings\masayuki>ppm
Error: neither 'HKEY_LOCAL_MACHINE/SOFTWARE/ActiveState/PPM//InstallLocation' no
r 'HKEY_CURRENT_USER/SOFTWARE/ActiveState/PPM//InstallLocation' found in registr
y at E:\www\usr\bin\ppm.bat line 29.

なんて言われてしまったんですが、どうしたらいいんでしょう?
ちなみにパールはE:\usr\local\binにインストールしてあるのですが・・・

Windows XP
ActivePerl 5.8.1 Build 807

です。誰かアドバイスよろしくお願いします。
0297デフォルトの名無しさんNGNG

XPだってさ
0298デフォルトの名無しさんNGNG
>>297
それがどうかしましたか?
0299デフォルトの名無しさんNGNG
>>296
再インスコ
0300デフォルトの名無しさんNGNG
ネタにしか見えねぇし
0301デフォルトの名無しさんNGNG
携帯絵文字の変換で悩んでいます。

ボーダフォンの絵文字変換の部分らしき部分の抜粋です
else {
$str =~ s/&#(\d\d\d\d\d);/<img src=\"$ImodeEmojiDir$1\.png\" border=0 width=12 height=12>/g;
if ($str =~ /\x1B\$/) {
$str .= "\x0F";
1 while ($str =~ s/(\x1B\$[\45-\x47\x4F-\x51])([\x21-\x7A])([\x21-\x7A]+)(\x0F)/$1$2$4$1$3$4/g);
$str =~ s/\x1B\$([\45-\x47\x4F-\x51][\x21-\x7A])\x0F/'<img src="' . $JskyEmojiDir . unpack('n',$1) . '.gif" border=0 width=12 height=12>'/eg;
$str =~ s/\x0F$//; }

「Unicode E539」「ウェブコード $QY」が「20513.gif」と変換されます。
ttp://www.dp.j-phone.com/dp/tool_dl/web/picword_06.php
順序良く並んでいれば連番で問題ないのですが、変換されると番号が飛びメチャクチャになります。
何か良い方法は無いでしょうか?
0302301NGNG
ログにはウェブコードで保存されているようです、「$GBB(←$GBB※)」
←と※は半角(?)で、※の部分は小さすぎて見えませんでしたので推測です。
0303デフォルトの名無しさんNGNG
仕事上の問題をタダで解決しようなんて甘い考えはいけないよ
0304デフォルトの名無しさんNGNG
抜粋ではなく、全体を見せてくれるのならば直してあげるのになあ。残念。。
0305デフォルトの名無しさんNGNG
>1 while ($str =~ s/(\x1B\$[\45-\x47\x4F-\x51])([\x21-\x7A])([\x21-\x7A]+)(\x0F)/$1$2$4$1$3$4/g);
>$str =~ s/\x1B\$([\45-\x47\x4F-\x51][\x21-\x7A])\x0F/'<img src="' . $JskyEmojiDir . unpack('n',$1) . '.gif" border=0 width=12 height=12>'/eg;
>$str =~ s/\x0F$//; }

とりあえず、whileの中の置換gオプションは間違いじゃかと。
あと1、2行目の文字クラスで\45もおかしいよね。。。
0306デフォルトの名無しさんNGNG
>>303
仕事ではありません、まぁ甘いと言われても仕方ありませんが

>>304
全文でもいいのですが、サブルーチンなので意味が無いかと思いまして

>>305
出来ればおかしい部分を、助言して頂けませんでしょうか?
助言が得られなければ、違約金覚悟で契約してきますが..貧乏なもんで
0307デフォルトの名無しさんNGNG
↑のコード片だけ見るとあまりに奇妙なロジックだから他のサンプル探したほうがいいかもね
0308デフォルトの名無しさんNGNG
仕様はよくわかんないけどとりあえず305の指摘にある
\45は\x45の間違いだろう。そこ直してみれば?

gはなくてもいいけどあってもいいはず。

しかし「変換されると番号がとびめちゃくちゃ」と
いわれてもなにがなんだかさっぱりわかんない。
具体的に例をあげて、これを変換したらこうなった
けど自分はこうなることを期待しているというのを
はっきり書かないと。
0309デフォルトの名無しさんNGNG
$str =~ s/(\x1B\$[ry])([ry])([ry]+)(\x0F)/$1$2$4$1$3$4/g
となって
$str =~ s/\x1B\$([ry][ry])\x0F/ry . unpack('n',$1) . ry'/eg;
だから
画像ファイル名の決定には1度目の置換の $1$2$4 までしか使ってないし、なんで妙な挿入になってんのかも謎
0310305NGNG
$_ = '<bcddffff>';
1 while (s/(<)(\w)(\w+)(>)/$1$2$4$1$3$4/g);
print ;#$_ = <b><c><d><d><f><f><f><f>で表示

gオプションは正しいってことで。上の例場合、
<>内に2文字以上あったら1文字になるまで置換しつくすってことで。
0311デフォルトの名無しさんNGNG
PARで作ったexeのアイコンって自分の好きな物に変更できるのでしょうか?
0312デフォルトの名無しさんNGNG
>>311
ドキュメントくらい読めよ。またはpp --helpとかさ。

pp --icon=myicon.ico script.pl
0313デフォルトの名無しさんNGNG
つーかあの程度の数なら素直にテーブル組めばいいのに
あのコード片じゃそこまでややこしく画像ファイル名を作る理由がワカランからもうこのネタはお終いじゃ
0314デフォルトの名無しさんNGNG
>>313
文字コードに対応した絵文字の画像ファイルがあらかじめ
用意してあるんじゃないかと思われ。
0315デフォルトの名無しさんNGNG
>>314
リンク先のHTMLソース解析して、ハッシュにでも突っ込むのが一番早いと思われ
0316デフォルトの名無しさんNGNG
perl -ep と perl -pe で挙動が違うのはなぜ〜〜?
0317デフォルトの名無しさんNGNG
>>316
-ep は -e "p" とするのと同じ意味になる。
-e は後ろに引数を取るオプションだから、後ろに変なの続けちゃダメでしょ。
0318デフォルトの名無しさんNGNG
perl -e "print q[マンコ 得ろ杉]"
0319デフォルトの名無しさんNGNG
釣れたわぁ
0320デフォルトの名無しさんNGNG
「マンコ 得ろ杉」を狙い打ち?
0321デフォルトの名無しさんNGNG
perlで
mkdirで新規ディレクトリを作成し、そのディレクトリに新規ファイルを作成する事までは出来たのですが
そのファイルのパーミッションを変えることが出来ません。。
chmodでも変わらないのですが、何かいい方法ないでしょうか?
よろしくお願いします
0322デフォルトの名無しさんNGNG
そのディレクトリのパーミッションは?
0323デフォルトの名無しさんNGNG
レスありがとうございます
一応777にしてますです
0324デフォルトの名無しさんNGNG
chmod() の返り値(変更が成功したファイルの数)をチェックし、
ゼロだった場合は $! を表示。で分かるかも知れず分からぬかも知れず。

つうか書き捨てのスクリプトはともかく、なにかちゃんとしたものを
作ってるんだったら外部に作用する関数(ファイル操作とかDBとか)
を呼ぶときは必ず失敗か成功かチェックするコードを入れる癖をつけるべし。
0325perlマンNGNG
perlで 3つの変数(それぞれ変数の内容は整数値です)の $a,$b,$cがあったとして 変数$a,$b,$cの中で一番大きい値を持つ変数を検出ぢ 最終的に print (一番大きな変数)と表示させたいのですが
どのようにしたら 一番大きな変数表示が出来るperl スクリプトができるでしょうか?
0326デフォルトの名無しさんNGNG
>>325
$a = 1;
$b = 2;
$c = 3;

print "a がデケエ" if($a > $b && $a > $c);
print "b がデケエ" if($b > $a && $b > $c);
print "c がデケエ" if($c > $a && $c > $b);
0327デフォルトの名無しさんNGNG
use DBI;
$user = 'aaa';
$passwd = 'bbb';
$db = DBI->connect('DBI:mysql:localhost',$user,$passwd);
$sth = $db->prepare("SELECT * FROM hoge");
これ実行するとInternal Server Errorになるのですが
最後の$sthの行を消すとエラーはでないのです
なぜでしょうか?
0328デフォルトの名無しさんNGNG
>326
等号も入れたほうがいいかも知れない

>327
$sth = $db->prepare("SELECT * FROM hoge;");

だと思われ
0329デフォルトの名無しさんNGNG
>>327
エラーログ見ろよ。Internal Server Errorになったときの基本だ。
0330デフォルトの名無しさんNGNG
>>328
なるほど!
と思ったけどそれでも無理でした。。
0331デフォルトの名無しさんNGNG
>>330
エラーログ見ろよ。Internal Server Errorになったときの基本だ。
■ このスレッドは過去ログ倉庫に格納されています