トップページphp
1001コメント318KB

Perlコーディング初心者質問スレ Part 55

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2007/05/30(水) 11:34:01ID:???
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >>2-10

前スレ http://pc11.2ch.net/test/read.cgi/php/1171102883/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0002nobodyさん2007/05/30(水) 11:34:51ID:???
ム板Perlスレより 1 of 2

[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: ttp://www.site-cooler.com/kwl/perl/

[本]
リャマ: ttp://www.oreilly.co.jp/books/4873111269/
駱駝: ttp://www.oreilly.co.jp/books/4873110963/
Effective Perl: ttp://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: ttp://www.oreilly.co.jp/books/4873112028/

[オンラインマニュアル] (追加)
最新のドキュメント: ttp://search.cpan.org/dist/perl-5.8.8/
perl5.8.xのドキュメント(一部): ttp://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: ttp://www.kt.rim.or.jp/~kbk/perl5.005/
日本語ドキュメント検索: ttp://www.cpan.jp/search.cgi
perldoc.jp: ttp://www.perldoc.jp/
Perldoc.com: ttp://www.perldoc.com/
0003nobodyさん2007/05/30(水) 11:35:17ID:???
ム板Perlスレより 2 of 2

[モジュール]
CPAN.com: ttp://search.cpan.org/
河馬屋二千年堂: ttp://homepage3.nifty.com/hippo2000/

[テクニック]
Perlメモ: ttp://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: ttp://homepage1.nifty.com/nomenclator/perl/
Perlの小技: ttp://homepage3.nifty.com/hippo2000/perltips/index.htm

[Perl5.8Unicodeメモ]
ttp://www.pure.ne.jp/~learner/program/Perl_unicode.html
ttp://www.namazu.org/~tsuchiya/perl/perl-5.8.html
ttp://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
0004nobodyさん2007/05/30(水) 14:47:32ID:???
質問です。
web(charset=euc-jp)から入力された内容を送信し、Jcodeを通して、utf8でテキストファイルを
作成しています。
入力時に、例えば「りゅうべい(立方メートルの記号)」などを登録すると、㎥のような
記号でデータが送信されます。
この文字列(𘚟)から、Jcodeを通してutf8の文字列を取得するには、どうすればいいでしょう?

my $result = Jcode->new(■)->utf8;

■の部分をどうにかすれば可能かと思うのですが、どうすればよろしいでしょうか?
0005 ◆TWARamEjuA 2007/05/30(水) 19:15:21ID:????2BP(6824)
(´-`).。oO(実体化すればよいだけのような。。。)
0006nobodyさん2007/05/30(水) 21:42:29ID:???
こっちがホントの次スレか。
言われるまで気付かなかったよ。
0007nobodyさん2007/05/31(木) 02:45:33ID:???
>>4
use CGI;
use Jcode;

my $q = CGI->new;
my $result = Jcode->new($q->param('hoge'), 'euc')->utf8;
0008nobodyさん2007/05/31(木) 04:54:07ID:???
use Unicode::String qw(utf8 ucs2);
...
$result =~ s/?(\d+);/ucs2(pack('n', $1))->utf8/eg;

こういうことかしらん。
000942007/05/31(木) 12:37:01ID:???
>>5-8
レスありがとうございます。>>8さんの方法でうまくいきました。
有難うございました。
0010nobodyさん2007/05/31(木) 18:33:42ID:5ZmU8rMz
1:CGIでフォルダの中のものすべてのコピーをしたい。
#!/usr/bin/perl
print "Content-type: text/html", "\n\n";
$folda = 5555;
opendir(DIR , '.');
@view = readdir(DIR);
$xx = pop @view;
until ($xx eq ()) {
$xx = pop @view;
if ($xx == $id) {
print "elrr end2";
exit;
}
open(IN,"./$xx");
while(<IN>){
$aaa .= $_;}
close(IN);
open(OUT,"> ./$folda/$xx");
print OUT $aaa;
close(OUT);
$xx = pop @view;
}
print "elrr end";
このようにやってみましたが、ファイルは出来てもフォルダができません。
0011nobodyさん2007/05/31(木) 18:35:50ID:F65+C5fx
そりゃできんだろ・・・
0012nobodyさん2007/05/31(木) 19:29:38ID:???
>>10
再帰的にコピーするPerlモジュールがあった気がするが、Googleで
30秒探して見付からなかったので諦めた。邪道も道。

#! /bin/bash
mkdir 5555;
cp -fR ./* 5555/;
echo "Content-Type: text/html";
echo "";
echo "mission complete.";
0013nobodyさん2007/05/31(木) 19:53:59ID:???
>>12
スレタイ半分読んで100年ROMってろ
0014nobodyさん2007/05/31(木) 20:08:01ID:???
2chなんてROMってもアホになるだけだがGoogleは偉大だった。
----
#! /usr/bin/env perl
use File::Copy::Recursive qw(dircopy);
dircopy(".", "5555/");
print "Content-Type: text/html\n\n";
print "mission complete.";
----
うちのActivePerlにはモジュールが入ってないので入れた。
ppm install File-Copy-Recursive
0015nobodyさん2007/05/31(木) 21:38:40ID:???
ム板にスレ立てたキチガイが暴れてるのかw
0016nobodyさん2007/05/31(木) 22:06:41ID:oHHUgLPV
掲示板へのポストをサーバサイドでRSAの公開鍵で暗号化して保存し、
秘密鍵を入力したユーザだけが参照可能にしたいのですが、
何か良い方法はありますでしょうか?
0017nobodyさん2007/05/31(木) 23:17:43ID:???
そこまで流れ分かってるなら分かりそうだが…
0018nobodyさん2007/06/01(金) 12:46:18ID:nf+wPUUR
$str = 'AAACCBBBBBAEDAACCCCB';
という文字列(最大5種の半角英文字の羅列で最長50バイト)を
「A3コ、C2コ、B5コ、A1コ、E1コ、D1コ、A2コ、C4コ、B1コ」
というように、文字列の先頭から連続している部分を一区切りとして取り出したいんですが
何か良い方法はないでしょうか?
正規表現で可能かとも思って、チャレンジしてみたんですが頭が足りずできませんでした・・・。
答えに直結するレスがもらえれば最高ですが、
答えに近づくアドバイス(参考書籍・サイト等)でも構いませんのでよろしくお願いします。
0019nobodyさん2007/06/01(金) 13:00:54ID:???
$hoge =~ s/((.)\2*)/$1\n/g;
print $hoge;
0020182007/06/01(金) 13:17:33ID:???
>>19
ありがとうございます!希望通りできました。
こういうのは、センスなんでしょうか、慣れなんでしょうか。
単に私の努力と勉強がまだまだ足りないだけかもしれませんが・・・。
本当にありがとうございました。
0021nobodyさん2007/06/01(金) 13:32:29ID:???
my @r = $str =~ /((.)\2*)/g;
print join ',', @r[map $_*2,(0..$#r/2)];
>>19のほうがいいな。
0022nobodyさん2007/06/01(金) 18:28:10ID:???
質問させていただきたいのですが、
コマンドラインから引数を渡してPHPファイルに生成されるprint文(HTMLタグ含む)を
また別のperlファイルで読み込んで使用したいのですが、
HTMLに表示させるところまではうまくいくのですが、
表示させる場所を思い通りの場所に配置することができません。
というか、<html>〜</html>の外(直前)に出力されてしまいます。

perlファイルのソースは、
$i = 引数
open(FP,"| /hoge/file.php $i");
while(<FP>){ $s .= $_; }
close(FP);
return $s;
としています。

http://flex.ee.uec.ac.jp/texi/perl/perl_86.html
こちらのページで、別プロセスに〜と書いてありますが
何かいい方法はありますでしょうか。
0023nobodyさん2007/06/01(金) 18:37:34ID:???
俺はニュータイプになれそうにもないな
0024nobodyさん2007/06/01(金) 18:43:46ID:???
>>23
う・・・・

ちなみに上で長々と書きましたが、
open(|FILEHANDLE,EXPR)としたときの返り値はサブプロセスの pid になるので
うまくperlファイルで扱えないのですが、
対応方法を教えていただきたく書き込みました・・・。

またエスパーですね・・・
0025nobodyさん2007/06/01(金) 18:55:51ID:???
ファイルから読み込んで要素数が1000個の配列(1要素は1KBもありません)を作るのと、
必要になるたび(といっても3回程度ですが)ファイルを読み込むのとどっちがいいですかね?
0026nobodyさん2007/06/01(金) 19:13:11ID:???
>>22
> open(FP,"| /hoge/file.php $i");
|を置く場所が違う。それじゃデータの流れがperlからサブプロセス。
その結果、出力をperlが受け取ることなくその場で表示される。
正しくはこの位置
open(FP,"/hoge/file.php $i |");
# ちなみに、openじゃ入力と出力両方を接続することは出来ない。
# そういう用途ではIPC::Open2とかが必要
0027nobodyさん2007/06/02(土) 06:39:37ID:L1OVX2UL
フラッシュ(swf)から変数を受け取って、HTMLのフォームからデータを送ったときに、
POSTの中身って自分で調べることが出来るんでしょうか?
cgiのURLはソースを見れば、バレバレなんですが、変数の中身はswfから受け取ってるので、
htmlのソースには書かれてないんです。

フラッシュ内にパスワードとかを書いておきたいのですが、見られると意味ないので…。
0028nobodyさん2007/06/02(土) 06:45:27ID:???
ちなみに個人的に調べたところでは、

ttp://www1.mahoroba.ne.jp/~mitt/itmemo/webappsecurity/02.htm

 見られて困るデータの場合は GET でなく POST を使いましょう。
 そのまんまですがこれしか思い浮かばないです)
 一般にサーバ側の履歴はアクセス要求があった URL などは保持しますが、
 POST されたデータの中身まで1つ1つ保持することはほとんどありません。
 ブラウザの履歴にも URL しか残らないので、他人にパソコンを触られても
 どんなデータを送信したかまでは見られる心配はないです。


とは、書かれてあったのですが、心配なもので…。
0029nobodyさん2007/06/02(土) 07:11:54ID:???
パケットキャプチャーすれば楽勝で見ることができる。
0030nobodyさん2007/06/02(土) 07:53:56ID:???
swfファイルにパスワードを書くとな?おそロシア
0031nobodyさん2007/06/02(土) 08:02:12ID:???
Sothink SWF Decompiler
ttp://www.sothink.com/product/flashdecompiler/
0032272007/06/02(土) 08:41:15ID:???
>>31の存在は知っていたのですが、パケットキャプチャーなるものは
知りませんでした。とにかくどういう手法を使っても、
「自分のブラウザから」送信するデータを見えなくするって無理ってことですよね。

ありがとうございました。
0033nobodyさん2007/06/02(土) 08:57:40ID:???
キャプチャだけの問題ならワンタイムパスワードなりSSLなり
方法は無数にあるけどPerl関係無いからね
0034nobodyさん2007/06/02(土) 11:27:15ID:???
一般的にPOST+SSLのサイトがほとんだしね
それでいいんじゃないの
0035nobodyさん2007/06/02(土) 18:23:49ID:???
パッケージHageにTuruturuサブルーチンがあるかどうかチェックする方法はありますか?
0036nobodyさん2007/06/02(土) 18:26:37ID:???
Hage->can("Turuturu")
0037352007/06/02(土) 20:47:47ID:???
>>36
ありがとう!
0038nobodyさん2007/06/02(土) 22:23:08ID:???
UNIVERSAL の can かあ。勉強になった。
pod のディレクトリで grep してやっと所在が分ったよorz...
0039nobodyさん2007/06/03(日) 00:18:54ID:???
exists &Hage::Turuturu;

こういうのもあり。
0040nobodyさん2007/06/03(日) 12:18:02ID:???
ImageMagicに関しての質問です。

画像に文字を入れようと思って、
ttp://www.ss.iij4u.or.jp/~somali/web/im_example/character.html
こちらのサイトを参考にやってるのですが、
どうしても、styleやstretchが上手くいきません。

style=>'Italic',
stretch=>'SemiExpanded';

と入れると上手く画像は生成されるのですが、肝心の
styleとstretchの効果が見られません。
何が原因になってるかお分りになる方教えてください。

PerlはActivePerlの最新版を使ってます。
0041nobodyさん2007/06/03(日) 13:52:19ID:???
サブルーチンのプロトタイプ宣言って、みんな書いてますか?
Cとかだと当たり前だけど…
0042nobodyさん2007/06/03(日) 13:57:30ID:???
よっぽどクリティカルな場合以外書かないなあ
0043nobodyさん2007/06/03(日) 14:26:20ID:???
Perlのアレはな。値渡しする気満々にしか見えない。
0044nobodyさん2007/06/03(日) 14:37:50ID:???
Perl5 のプロトタイプはサブルーチンのインタフェース、具体的には引数リスト要素の各コンテキストを強制的に変更します。呼出しが不自由になるだけで特にコードが分かりやすくなったりしないので、ぼくは使いません。
以前にはサブルーチンによる定数定義に "()"(引数なし) を使っていたくらいかな。今は更に特別な目的がないと使わないと思います。
0045nobodyさん2007/06/03(日) 15:18:04ID:???
>>40
氏ね。

>>41
モジュールから引っ張って来れないことがわかってから使わなくなったな。
呼び出し側にプロトタイプ書かなきゃ使えないなんて無意味すぎ。
0046nobodyさん2007/06/03(日) 16:04:05ID:???
>>40 = http://pc11.2ch.net/test/read.cgi/tech/1180492034/11,21,24
なので放置推奨。
0047nobodyさん2007/06/03(日) 21:19:35ID:???
useとuse baseは継承と多重継承だそうですが、違いはなんでしょうか?
親を一つ持つか複数持つか、の違いだとは分かるんですが、継承を繰り返す=多重継承ではないんですか?
0048nobodyさん2007/06/03(日) 21:42:25ID:???
MySQL+DBIモジュールを使って、郵便番号→住所取り出したいのですが、
CGIでSELECT文を実行すると上手くいきません。

環境はwindowsXP,MySQL5.0,文字コードはsjisです。型はtextです。
--------------------------------------------------------------------------
$db = DBI->connect('DBI:mysql:zipcode:localhost', $user, $passwd);
$sth = $db->prepare("SELECT pref, area, addr FROM zipcode where post=3240021");
$sth->execute;
$num_rows = $sth->rows;
print "該当 $num_rows 件\n";
for ($i=0; $i<$num_rows; $i++) {
@a = $sth->fetchrow_array;
print "$a[0] $a[1] $a[2] \n";
}
$sth->finish;
$db->disconnect;
---------------------------------------------------------------------------
この結果は、
---------------
該当 1 件
??? ???? ??
---------------
と表示されます。マルチバイト文字が文字化けというか、
?としか表示されません。(?一つが一文字に対応しているようです。)
コマンドプロンプトからは正常に表示されました。

一つ指南のほうをよろしくお願いします。m(_ _)m
0049nobodyさん2007/06/03(日) 21:43:46ID:???
>>47
> useとuse baseは継承と多重継承だそうですが、違いはなんでしょうか?

use はコンパイル時にモジュールをロードする構文であり、use base は「所定の場所から base.pm を探してきてロードしなさいよ」といった意味です。
この場合、たまたま base プラグマが継承に関する機能を持っているというだけで、use 自体は継承とは何の関係もありません。

> 親を一つ持つか複数持つか、の違いだとは分かるんですが、継承を繰り返す=多重継承ではないんですか?

親を複数持つのが多重継承です。継承を繰り返すのが多重継承であれば、少なくとも Perl ではほとんどの明示的な継承は暗黙の多重継承となります。そうだとしたら呼び分ける必要がありませんね。

皮肉ではなく純粋に心配なので、こういうでまかせをどこから仕入れてくるのか、参考までにお教え願えませんか。
0050472007/06/03(日) 22:23:03ID:???
>>49
本やネットから正しい知識を得てきても出来の悪い頭がこんな解釈をしたようです。
回答ありがとうございました。
0051nobodyさん2007/06/03(日) 22:27:09ID:???
>>48
Perlの質問と言うかMySQLの質問に近いが…
MySQL上のどこかの文字セット設定がまずいな。多分スクリプト側だと思うが。
$db->do('SET CHARACTER SET sjis');
接続直後にやって見れ。

後、本当にsjisでいいのか?
Windowsお得意の機種依存文字を受け入れたいならcp932使っとけ。
いや、解ってて確固たる信念を持って受け入れないならそれはそれでいいんだが。
0052nobodyさん2007/06/03(日) 22:31:12ID:???
>>48
my.cnf (Windows XP ということなので my.ini とかになるのかな?) の調整で解決しないかな。
いかにも自動変換が悪さをしている気配よ。
0053nobodyさん2007/06/03(日) 23:30:46ID:???
あぁそれか。それmy.cnfにありえない一行が必要です。
0054nobodyさん2007/06/05(火) 03:15:21ID:???
ディレクトリの読み込みについて質問があります。

my $dir_name = "test";
opendir(DIR,"$dir_name");
closedir(DIR);

として、変数dir_nameに直接ディレクトリ名を入れると読み込めるのですが、

my @dir_list = (test,test2);
opendir(DIR,"$dir_list[0]");
closedir(DIR);

とすると読み込めないのは何故でしょうか?

my @dir_list = (test,test2);
my $dir_name = $dir_list[0];
opendir(DIR,"$dir_name");
closedir(DIR);

とした場合でも同様に読み込めず、原因が何なのかもわからず困っています…。
何か基礎的な部分で間違っているのかもしれませんが、教えて頂けると助かります。
宜しくお願い致します。
0055nobodyさん2007/06/05(火) 04:59:46ID:???
>>54
> my @dir_list = (test,test2);
ソースそのまま実行したのなら。
my @dir_list = ('test','test2');

opendir DIR, $dir_list[0] or die ;
する事もお勧め。
0056nobodyさん2007/06/05(火) 13:41:17ID:???
>>55
回答ありがとうございます。
こちらに書き込みをする時に""を付け忘れていました…;
実際のソースは↓の通りです。(サブルーチンの内容は省略)

my ($error,$th_max);
my (@thread,@response,@th_list);

unless(opendir(DIR,"testdir")){$error .= "魚";&error();}
@thread = readdir(DIR);
closedir(DIR);
splice(@thread,0,2);
pop @thread;
$th_max = @thread;

unless(open(FILE,"<testdir/list.dat")){$error = ."魚"; &error();}
@th_list = <FILE>;
close(FILE);

chdir("testdir");

unless(opendir(DIR,"$th_list[0]")){$error .= "魚"; &error();}
closedir(DIR);

最後の2行を消した状態では問題なく動作したので、最後のopendirの
ディレクトリ指定が間違っていると思うのですが…。
0057nobodyさん2007/06/05(火) 13:57:55ID:???
<>演算子で@th_listに代入したということは、@th_listの要素の尻に
改行が残っているということではないか
0058nobodyさん2007/06/05(火) 14:01:14ID:???
> unless(open(FILE,"<testdir/list.dat")){$error = ."魚"; &error();}

$error = ."魚"
ここで死んでるだけだと思われ

use strict;
use warnings;
くらい付けましょう
0059542007/06/05(火) 15:06:29ID:???
>>57
@th_listは
1行目:001
2行目:002
3行目:
となっています。$th_list[0]には1行目の「001」が入っています。
opendir(DIR,"001")  とした時は動作するのですが、
opendir(DIR,"$th_list[0]") とした時は動作しません…。

>>58
またまた下記間違えです…すみません;
>>56でも書きましたが、最後の2行を消した状態では問題無く動作しているので、
最後の2行に問題があると思うのですが…。
0060542007/06/05(火) 15:10:42ID:???
書き忘れましたが、動作しないというのは500エラーが出るという事ではなく、
サブルーチン&errorに飛んでしまうという事です。

>>56の最後の2行目を除いた状態では、&errorに飛ばずそのまま次の処理へ映るのですが、
unless(opendir(DIR,"$th_list[0]")){$error .= "魚"; &error();}
closedir(DIR);
という記述をすると、$th_list[0]に入っている「001」というディレクトリが開く筈のところ、
何故かディレクトリを開けずに&errorに飛んでしまうのです。
0061542007/06/05(火) 15:25:19ID:???
>>57
勘違いしていました…各行に改行が入っているという事だったんですね;
chopを使って@th_listの各行の改行を削除したところ、解決しました。

長々とすみませんでした;
ありがとうございました。
0062nobodyさん2007/06/05(火) 15:25:28ID:???
書き間違い、書き忘れ多すぎ。
自分の書き込みのチェックぐらいしろ。
てか、後出し情報多すぎ。
>>54のときと>>56のときと問題が微妙に変わってるし。
お前の書き込みを真に受けて付き合ってる方の身にもなれ。

結論は>>57が正解。
chomp使え。
0063622007/06/05(火) 15:26:20ID:???
orz.
0064nobodyさん2007/06/05(火) 17:36:05ID:???
54氏
老婆心ながら。
本当に「001」って名前のディレクトリを使ってないと思うが、
もし使ってるのなら用心した方がいいよ。ls を取りながら実際に
以下のワンライナーを実行してみると良い。
% perl -le 'mkdir 0101'
% perl -le 'mkdir q{0101}'
% touch 0101/foo
% perl -Mstrict -w -le 'opendir DIR, 0101 ; print readdir DIR '
0065nobodyさん2007/06/07(木) 10:44:45ID:???
携帯電話でアクセスしたとき、携帯電話用のページ表示したいのですが、
どういう方法がよいのでしょうか?
よろしくお願いします。
■ このスレッドは過去ログ倉庫に格納されています