Perlコーディング初心者質問スレ Part 53
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/11/26(日) 14:38:23ID:SlmGsFMB【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >>2-10
前スレ http://pc8.2ch.net/test/read.cgi/php/1153987463/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0282nobodyさん
2006/12/13(水) 11:01:17ID:???File::Pathはデフォで入ってないっけ?
>>277
順序が保証されてるなんて書いてないだろ
順序は知らんがひとつずつ順番に入ってくるってのは合ってるんじゃね?
0283275
2006/12/13(水) 15:21:34ID:???ありがと。
>279
それやるとシステム依存するかなと思ってさ。
>280,282
ごめん、探し方が足りなかったみたい。吊ってくるorz
0284nobodyさん
2006/12/13(水) 16:44:36ID:???$n= 1000000;
if (($c1=chr(int($n / 256**2)))){
$n= $n % 256**2;
}
else { $c1= "\0"; }
if (($c2=chr(int($n / 256)))){
$n= $n % 256;
}
else { $c2= "\0"; }
$c= $c1 . $c2 . chr($n);
0285nobodyさん
2006/12/13(水) 16:52:52ID:???0287nobodyさん
2006/12/14(木) 13:53:01ID:???LWP::UserAgentなどを使用してCGIからアクセスするのは無理でしょうか?
一定時間経過するとセッションが切れて再ログインしないとダメだったり
サイト内での検索結果などをコピペするのがマンドクサイのです
0288nobodyさん
2006/12/14(木) 16:20:40ID:???やっぱ256**4で割るっきゃないか
0289nobodyさん
2006/12/14(木) 22:55:01ID:???0290nobodyさん
2006/12/15(金) 03:08:09ID:???ランダム数値を返すとなっていたので、7年間ずっと
rand(3)は0〜3までを返すと思っていたのですが、実際は
3未満(つまりは2.99999...)だったんですね。
上記の場合だと、3が出る確率は限りなく少ないことになる
ので今まで面倒なことをしてましたが、これから今まで
書いたプログラムの見直しをするようになるっぽいです。
一応同じように思い込んでた人のためになればと書き込
んでおきました。
0292nobodyさん
2006/12/15(金) 10:52:56ID:???$sex = substr(キーワード, カット開始位置, 文字数);
print "$sex<br>\n";
とするとたまに改行タグがおかしくなってしまう
print "$sex.<br>\n"
とすると改行タグはちゃんとされるけど・が$sexの後に表示されてしまう
0293nobodyさん
2006/12/15(金) 10:59:38ID:???0294nobodyさん
2006/12/15(金) 10:59:58ID:???「perl substr 日本語」でぐぐるといい
0295nobodyさん
2006/12/15(金) 12:26:12ID:???0296293
2006/12/15(金) 12:49:12ID:???$count= 5;
$s=~/(?:[\201-\237\340-\374]?.){$from}((?:[\201-\237\340-\374]?.){$count})/;
print $1,"\n";
0297293
2006/12/15(金) 12:56:47ID:???0298nobodyさん
2006/12/15(金) 13:54:29ID:???0299nobodyさん
2006/12/16(土) 14:00:26ID:???文字のマッチングしたいのですが、何をやってもうまくいきません。
どうか助けてください。
<例>
use CGI;
use Encode;
my $query = CGI->new;
foreach ($query->param() ){
$form{$_}=$query->param($_);
}
open (FILE,"<:encoding(shiftjis)","text.txt");
@aaa = split(//,<AAA>);
if ($form{bbb} eq $aaa[0]) {
print "一致";
}
close(FILE);
0300nobodyさん
2006/12/16(土) 14:02:20ID:???<訂正>
open (FILE,"<:encoding(shiftjis)","text.txt");
@aaa = split(//,<FILE>);
if ($form{bbb} eq $aaa[0]) {
print "一致";
}
0302299
2006/12/16(土) 16:25:29ID:???htmlのフォームに入力された文字と、txt(本当はcsv)のデータとが合致するときに、
なにかを表示するという簡易なデータベースを作っているところなんです。
open (FILE,"<:encoding(shiftjis)","text.txt");
とかでtxtを開いて、クエリと合致するかどうかをみたいのですが、
cgi.pmでデコードした文字(クエリ)と、openで開いた文字の
デコード(?)が違うようで、他のコーディングとやらの
何をやっても一致しないという状態に陥ってます。
ものすごく初歩的・根本的な間違いをおかしているとは思います。
0303nobodyさん
2006/12/16(土) 16:36:16ID:???text.txtのカンマ区切りのデータとフォームが一致するかを見たいということかな?
text.txtは1行のみ?
改行は入っている?
split /,/, <FILE>; じゃだめ?
文字コード気にする前に、単純な英数字で確認してみて。
0304299
2006/12/16(土) 18:07:20ID:???>>299のようにクエリを受け取ってから、
自分のやりたいことをカンタンにしたのが下記のプログラムです。
open (FILE,"<:encoding(shiftjis)","aaa.csv");
while(<FILE>) {
@aaa = split(/,/,$_);
foreach(@aaa) {
if ($form{namae} eq $aaa[$i]) {
print encode("shiftjis","$aaa[$i]:match<br>");
} else {
print encode("shiftjis","$aaa[$i]:---<br>");
}
$i++;
}
$i =0;
}
close(FILE);
カンマ区切りのデータとフォームの一致をみるのが目的で、
csvは複数行に渡っています(改行入り)。
半角英数の場合はマッチングできるのですが、
平仮名・漢字は一致しません。
また、半角英数・仮名漢字に共通して、
open FILEで引っ張ってきた@aaa{$1}を表示しようとすると
文字化けが起こってしまいます。
0305nobodyさん
2006/12/16(土) 18:35:53ID:???ひとまず、エンコードの処理を忘れて、全てのファイルの文字コードを統一して保存して下さい。
次にコードをシンプルにして、試してみましょう。
open FILE, 'aaa.csv' or die;
while( <FILE> ){
chomp;
my @aaa = split /,/;
for( my $i = 0; $i < @aaa; $i ){
print $form{namae} eq $aaa[$i] ? 'true' : 'false';
}
}
close FILE;
余計なお世話だけど、そんなforeachの使い方教えてるところは参考にしないほうがいいと思われ。
0306nobodyさん
2006/12/16(土) 19:07:56ID:???0307nobodyさん
2006/12/16(土) 20:54:54ID:???こっちのが書くの楽だろ常識的に考えて
楽と云うよりも効率が良くなったからこちらの方が良さそうな。
という思想で。
それはそうともう $i とはもう書かなくなったよなぁ。。。
ついでに回数を指定したループも書かなくなったよなぁ。。。
0309nobodyさん
2006/12/16(土) 22:24:50ID:???0310nobodyさん
2006/12/16(土) 22:27:29ID:???0311299
2006/12/16(土) 22:32:58ID:???アドバイスの通りにしたら無事解決しました。
結局エンコード云々はいじらないでよかったようです。
ありがとうございました。
0312nobodyさん
2006/12/16(土) 22:42:14ID:lMy9T+vRperlに触れて2日目です。。かない痛いミスしてるかもしれませんが、何方か教えてください。
Flashからcgiへ変数$nameを渡す実験をしているのですが、$nameを日本語にすると
すべて文字化けしてしまいます。手元にある入門書を参照したところ、jcode.plを使えばよいとあったので、
require 'cgi-lib.pl';
require 'jcode.pl';
&ReadParse(*name);
&jcode::convert(*name,'sjis');
print "$name";
としたのですが、まだ文字化けします。sjisにしてもeucにしても同じ結果です。
どうすればよいでしょうか。jcode.plが存在するディレクトリは確認しました。
0313nobodyさん
2006/12/16(土) 22:55:56ID:???&jcode::convert(\$name{$_},'sjis');
}
0314nobodyさん
2006/12/16(土) 23:05:09ID:lMy9T+vR0316287
2006/12/17(日) 12:12:23ID:???java.lang.NullPointerException のみが出力されてくるのですが、御教示お願いします。
use LWP::UserAgent;
$url = "https://example.com/test.jsp"; #実際にはログイン画面のURLが入ってる
$ua = LWP::UserAgent->new;
$req = new HTTP::Request GET => $url;
$res = $ua->request($req);
print "Content-type: text/html\n\n";
print $res->content;
0318287
2006/12/17(日) 13:35:07ID:???やっぱ皆さんこういう高度なのもサクっと作ってcron自動化とかしてたりするんでしょうか
ID・PASSなどをフォームに入れるログイン作業程度なら、
ローカルHTMLのformにhiddenで入れてしまって、jsで一発ログインとかしてるのですが、
一定時間ごとに自動ログイン→一連の作業→処理保存までするのは難しいですね。
もっと色々頑張ってみます
その点、LWPモジュールも然りサンプルが必ずと言っていいほど掲載されているので、熟読すると良いかもしれませんです♪@CPAN
あっと、そのときには、解説の英文を1から10まで読むよりも、サンプルを1から10まできっちりと読むと判りやすいかと♪
0320nobodyさん
2006/12/17(日) 15:56:53ID:8qXdAMYDwww.xxx.com/aaa.php?id=1&next=1
nextの1で処理を行っているのですが
リロードでも有効になってしまいます。
これを回避する方法などありますでしょうか。
submitからなら対策できるのですが、埋め込んだURLからは
どうしたら回避できるかわからず詰まっています。
0321nobodyさん
2006/12/17(日) 15:58:27ID:8qXdAMYD0323nobodyさん
2006/12/18(月) 16:04:35ID:otF+VpE2POSTで$nameを送信($nameは日本語)
↓
cgi側が$nameを受け取って、namelist.datをオープンして、$nameを書き込んでクローズ。
↓
namelist.datを開くと、日本語が%83g%83%7D%83gといった感じで書き込まれている。
これを直したいのですが、namelist.datに書き込む前にjcodeで変換しても駄目でした。
文字コードはsjisで統一してあります。どのようにすれば文字化けせずに書き込めるのでしょうか。
0324nobodyさん
2006/12/18(月) 16:09:24ID:???0325nobodyさん
2006/12/18(月) 16:27:36ID:otF+VpE2>>324
お手数かけました。
0326nobodyさん
2006/12/18(月) 20:56:29ID:???print "Content-type: text/html\n\n";
print <<EOS;
<HTML lang="ja">
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<TITLE>$_[0]</TITLE>
</HEAD><BODY>
$_[1]
</BODY></HTML>
EOS
exit;
}
POSTされた文字列が不正だった場合等に、ちょっとしたエラー出力をするのに、
こんな感じで単純な出力をするサブルーチンを作って実行するのと、
print "Content-type: text/html\n\n";
print <<EOS;
<HTML lang="ja">
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<TITLE>エラー</TITLE>
</HEAD><BODY>
えらーです
</BODY></HTML>
EOS
exit;
}
そのままサブルーチンを作らずにHTMLを出力するのとではどれくらい速度に違いが出たりするのでしょうか。
0327nobodyさん
2006/12/18(月) 21:00:45ID:???またはテンプレート化する。
しかし、速度を気にするほど頻繁にエラー画面が出てしまう設計はどうかと。
0328nobodyさん
2006/12/18(月) 21:03:25ID:???0329nobodyさん
2006/12/18(月) 21:14:08ID:???どうもです。
エラーは極力でないように、悪意に対応できるようには作っているつもりなんですが
なんせ自分で一から作るのは初めてなもので、単純に速度が気になったのです。
それほどアクセスが掛かるようなものでもないですし、自分で使う分にはエラーなんて出さないように使うので
そんなに問題でもないんですが一応。
>>328
具体的にはどうすればよいのでしょうか。
print "Content-type: text/html\n\n";
はサブルーチンにせずに都度出力すると言うことでしょうか。
0330nobodyさん
2006/12/18(月) 21:25:58ID:???いちいちフラグ確認しないとダメな書き方はよほどおかしい
0331nobodyさん
2006/12/18(月) 21:39:31ID:???処女作おめでとう。
速度なんか後回しで、まずは思うように作ってご覧。
そして、>>330が正解。
エラーチェックを全て終わらせてから出力をはじめよう。
0333nobodyさん
2006/12/18(月) 23:22:23ID:???条件として、サブルーチン自体にエラーがない保証というのがあり、
evalだと単純に$@の有無だけでサブルーチンの有無とすることができません。
シンボルテーブルを覗いたり、いろいろ調べてはいるのですが、よく分かりません。
シンボルのハッシュを参照したら、サブルーチンがないのに、参照したことによって
シンボルが追加されてしまうようです。
↑よく理解してないためか、そのように見えます。
ご助言いただければと思います。
0334nobodyさん
2006/12/18(月) 23:23:54ID:???0335nobodyさん
2006/12/19(火) 00:17:15ID:???0336nobodyさん
2006/12/19(火) 00:27:12ID:???どんな設計だ
0337nobodyさん
2006/12/19(火) 00:39:23ID:???やっぱ使ってる奴いないのか?
0338nobodyさん
2006/12/19(火) 00:41:15ID:???できちゃいました。すみません。そんな簡単だったんですね。
シンボルテーブル参照は、単純にパッケージ修飾の仕方で間違ってたようです。
ありがとうございました。
0339nobodyさん
2006/12/19(火) 06:32:32ID:???>>316
LWPでhttpsはCrypt::SSLeayが要るんだけど、入ってないからダメって落ちじゃないよね?
0340nobodyさん
2006/12/19(火) 09:33:57ID:???$OLDには 0-6の数字または文字列が入ります。
数字の時には10〜60代を、文字列の場合はそのまま代入したいのですが、
if ( $OLD == 0 ){ $OLD = "10代"; }
elsif ( $OLD == 1 ){ $OLD = "20代"; }
.
.
.
elsif ( $OLD == 6 ){ $OLD = "60代"; }
else { $OLD = "$OLD"; }
このようにかいているんですが、最後のelseが反応せず、文字列はすべて10代と表示されてしまいます。
なにか書き方が間違っていると思うんですが、わかりませんorz 指摘してください。
0341nobodyさん
2006/12/19(火) 10:25:25ID:???つ eq、正規表現
0342340
2006/12/19(火) 10:34:36ID:???試したら・・・できました。ありがとうございました! 勉強になりましたorz
0343nobodyさん
2006/12/19(火) 10:44:06ID:???mod_perlは、
はじめの一回コンパイル→メモリ上に常駐
とネットで解説されていたんですが、
perlでもコンパイルしたものを配ったりってできるんでしょうか?
ソースを公開しないで、スクリプトが配布できたら
いいなと思いまして。
0344nobodyさん
2006/12/19(火) 11:15:24ID:???0345nobodyさん
2006/12/19(火) 12:09:00ID:???あと、コンパイルは同じ環境でやらないといかんから配布向きじゃない
0346nobodyさん
2006/12/19(火) 12:10:49ID:???(出来るには出来るがkillされるのがオチw)
0347nobodyさん
2006/12/19(火) 15:31:43ID:???>>346
なるほどです。ソースは公開しないといけないんですね。
>Perlで言うコンパイルはその場合意味が違うよ
・コンパイルって、コンピュータ用のオブジェクトコードに
することでよかったですよね?
・Perlでおいコンパイルは、機械語に直したオブジェクトコードを
メモリに保存しておいて2回目の起動以降は、ソースにアクセスしないで
メモリのオブジェクトコード読んで実行するということでよかったでしょうか。
・機械語は機械語でもC、Perl、JAVAでできたものは、全く別物なんでしょうか。
こういうのはどうやって勉強すれば。コンパイラの本読むとわかるでしょうか。
なんかネットに書いていることをそのまま質問していて、
ほんとアレなんですが、よろしくお願いします。
0348nobodyさん
2006/12/19(火) 15:44:15ID:???いろんなページさまよっているところなんですが。
JAVAは中間コードっていうのみたいですね。
C言語はexeファイルができます。
ちょっと手がかり見つかってきました。
JAVAマシーンが中間コードを読んで実行するみたいに、
mod_perlマシーンが、中間コードみたいなの動かすんでしょうか。
0349nobodyさん
2006/12/19(火) 16:07:15ID:???0350nobodyさん
2006/12/19(火) 16:08:29ID:???0351nobodyさん
2006/12/19(火) 18:18:58ID:???どうしたらよいでしょう?
@nakami = (0, 8, 4, 12, 23, 55);
foreach $aaa(@nakami){
if(rand $aaa){
0353nobodyさん
2006/12/19(火) 18:54:33ID:???ラストね
コンパイルの解釈はまぁ OK
Perl でのその解釈は mod_perl の解釈
CGI で動く perl はその都度コンパイルされます
0354nobodyさん
2006/12/19(火) 20:41:11ID:???0355nobodyさん
2006/12/19(火) 23:24:08ID:???log.txtを開いてハッシュとしてセットの上、ペアごとにズラズラ並べたいのですが、
open(f,"log.txt");
%file = <f>;
while ( ($key, $val) = each (%file) ) {print "キー $key 値 $val\n";}
close(f);
これだと何も反応してくれません。
間違ってるでしょうか?
log.txtの中身は、
"●●","A組","◎◎","B組","■■","C組",
といった感じです。
0356nobodyさん
2006/12/19(火) 23:37:17ID:???ファイルから読み込んだ文字列は、そのままではリストとして扱われません。
文字列をハッシュ変数に代入しても意味がありません。
例えば、以下のような方法で、文字列をリストに変換する必要があります。
・split でカンマ区切りのリストに分解する(ただし二重引用符の除去が必要)
・Text::CSV_XS などのモジュールを利用する(二重引用符も考慮してくれるが少し大げさ)
・正規表現(http://www.din.or.jp/~ohzaki/perl.htm#CSV2Values)を利用する
・eval で評価する(読み込むファイルが外部からの入力を記録している場合は危険)
この場合、正規表現が一番現実的でしょうか。
0357355
2006/12/20(水) 00:01:50ID:???ありがとうございます。
%file = <f>; ←こんな式はないんですね。お恥ずかしい限りです。
まだcgiを作っている途中で二重引用符を外す事はわけないですので、
最初の方法か、正規表現かで検討してみます。
わざわざすいません。
0358nobodyさん
2006/12/20(水) 00:38:56ID:???もちろんキーにも値にも最後に改行がつくからchompとかしなきゃだめだけど
こんな感じで
●●
A組
◎◎
B組
■■
C組
0359nobodyさん
2006/12/20(水) 00:50:18ID:???print "$virtues{ONE}\n";
print "$virtues{TWO}\n";
print "$virtues{THREE}\n";
__DATA__
ONE
Laziness
TWO
Impatience
THREE
Hubris
なるほど。
0360nobodyさん
2006/12/20(水) 07:51:48ID:???my %virtues = map { chomp; split /,/, } <DATA>;
print "$virtues{ONE}\n";
print "$virtues{TWO}\n";
print "$virtues{THREE}\n";
__DATA__
ONE,Laziness,TWO,Impatience
THREE
Hubris
0361nobodyさん
2006/12/20(水) 07:54:31ID:???「そこまでするなら」に代えてくれ
0362nobodyさん
2006/12/20(水) 11:11:45ID:S+pohGEQ0363nobodyさん
2006/12/20(水) 11:33:14ID:???びっくりするほどスレ違い
0365nobodyさん
2006/12/20(水) 13:09:42ID:???少なくとも、ロボ物は適当で簡素なHTMLの方が拾ってくれたりするよ
<html>
<head>
<title></title>
</head>
<body>
</body>
</html>
こんな感じの
0366nobodyさん
2006/12/20(水) 13:20:25ID:???0368nobodyさん
2006/12/20(水) 14:35:34ID:???0369nobodyさん
2006/12/20(水) 14:54:20ID:???0370nobodyさん
2006/12/20(水) 16:33:01ID:???0372nobodyさん
2006/12/20(水) 20:05:38ID:???0373nobodyさん
2006/12/21(木) 13:16:34ID:???して読み込もうと思ったのですが、
if (!open(WORD,"bad.txt")) { &error('データベース読取エラー'); }
foreach(<WORD>){
if ($name eq $_){ $name = "禁止";}
}
close(WORD);
この記述では反応してくれません。(errorはでません)
外部ファイルにする前はできていたのですがなにか書き方が違うのでしょうか・・・?
bad.txtの中身はすべて改行区切りです。
また名前欄に特化した禁止ワードなので、eqで問題ありません。
よろしくお願いします。
0374nobodyさん
2006/12/21(木) 13:34:43ID:???0375nobodyさん
2006/12/21(木) 13:35:57ID:???0376nobodyさん
2006/12/21(木) 17:21:37ID:???掲示板の本文中にurlがあったとき自動リンクさせますが、
jpg、png、gifのときは画像を小さく表示させたいです
正規表現で末尾を(jpg|png|gif) として区別しますが、
そうでない場合の表現はどうしたらいいですか?
0377nobodyさん
2006/12/21(木) 17:25:31ID:???0379nobodyさん
2006/12/21(木) 18:29:02ID:???まさに阿鼻叫喚の地獄絵図ってやつだ。
0380nobodyさん
2006/12/21(木) 19:11:28ID:???画像でない方のリンクがなされません
ええと、自分のところのアップローダです
既に過去の掲示板投稿がたまっているので、アップローダ
において、リンクしてもらうようにするためです
これなら1発言中に何個画像があっても自由ですし、
組み込みより楽ですので
■ このスレッドは過去ログ倉庫に格納されています