Perlコーディング初心者質問スレ Part 41
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
05/03/10 00:47:16ID:sT66OcmD【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0175nobodyさん
05/03/17 16:56:31ID:???・・・・あなた俺より詳しいじゃない。
個人的には48はこのスレで一番まともな回答者だと認知している。
なのであなたに「どうでしょうか」といわれるととても恐縮だorz
なんか鬱だな・・・
0176nobodyさん
05/03/17 17:01:32ID:Ykle1A6kどうすればいいのでしょうか?
なお、サーバはApacheです
0177nobodyさん
05/03/17 17:29:39ID:???ひとつのプロセスで複数のファイルを作る場合は、
time + ランダムな文字列(a-z..A-Z..0-9)数桁
でやってます。
100%名前が重ならないとは言えないけど、
仮に6桁の文字列を付加したとして、1秒に10個ファイルを作成した場合でも、
各ファイル名の重なる確率は約568億分の1
$time = time
@key = ('a'..'z','A'..'Z','0'..'9');
1 while (length($keys .= $key[rand(@key)]) < 6);
0178nobodyさん
05/03/17 17:33:19ID:???$name = time;
@key = ('a'..'z','A'..'Z','0'..'9');
1 while (length($name .= $key[rand(@key)]) < 16);
0179171
05/03/17 17:47:25ID:???本格的にやるなら Data::UUID を使うという手もあるかもしれません。
大袈裟過ぎるかもしれませんが。
0180nobodyさん
05/03/17 20:30:18ID:???マッチの誤動作防止のためにEncodeのdecode関数を使っているのですが処理がこれでもかと言うほど遅くなってしまいます。。
どなたかもっと早く処理できる方法をご存じでしたら教えて頂けないでしょうか。
0181159
05/03/17 20:47:11ID:???一意的な方法があるのかと思っていました。
今回使うファイル名はそのままURLになるので、単純なモノを使いたいと思います。
あと、これは興味本位なんですが2chのスレッド名に使われている方法はどんな方法なんでしょう?
0183nobodyさん
05/03/17 21:08:51ID:???うーん、マシンをもっと速いのに替えるとか
でもそんなに遅くなる? 俺んちの自宅鯖だと1Mbyte decode するのに0.3秒ぐらいだけど
>>181
There's more than one way to do it が perl の哲学だからな
2ちゃんねるのスレッドURLは unix timestamp
だから同一時刻に複数スレッドが立つと同じURLになってしまう
これを避けるために1秒に1スレしか立てられないよう排他処理をしているはず
0184nobodyさん
05/03/17 21:35:20ID:???utf8で処理している方は数分掛かり、そうでない物はすぐ処理が終わりますorzなんでだろう、、
もし宜しければソースを見て頂けると幸いです。指定されたスレッドのレス範囲から四桁の数字を抜き出し、
ヤフーファイナンスから取得した各種データと四桁の数字、その四桁の数字を指定したスレッドをeuc-jpで出力するスクリプトです。
http://noiser.info/script/utf8.txt
http://noiser.info/script/shift_jis.txt
0185nobodyさん
05/03/17 21:39:04ID:???Compress::Zlibのソース見ると、圧縮レベルを決め打ちしているので、
gzopen(),gzsetparams()を使うしかないと思われ。
>>183
> これを避けるために1秒に1スレしか立てられないよう排他処理をしているはず
仕様が変わっていなければの話だけど、
既に同じ番号のスレがあるときは+1して同じスレがあるかを再度チェック。これを繰り返してる。
0187nobodyさん
05/03/17 22:01:44ID:???漏れの環境 (Linux + perl 5.8.4) で実行させてみたが、どっちもすぐ終った
CPU時間でsjis版が0.199秒、utf8版が0.258秒
0190nobodyさん
05/03/17 23:02:05ID:???WindowsXP + perl 5.8.4 + CPU 700 (w で、 utf8 : 0.52 , shiftjis : 0.27 だった。
まー、UTF8 経由する分、ある程度は遅くなって当前なのでは?
0191エディタスレの416
05/03/17 23:25:47ID:???今、言語覚えようとはじめたんですが、
エディタをテラパッドに決め手
プログラムを打ち込んだのですが
プログラムはどうやって動かして確認するんですか?
winXPです。
0192nobodyさん
05/03/17 23:30:31ID:???0193nobodyさん
05/03/17 23:32:40ID:???0194nobodyさん
05/03/17 23:46:15ID:???0195エディタスレの416
05/03/17 23:48:07ID:???一歩踏み出せそうです感謝。
0196エディタスレの416
05/03/18 00:08:00ID:???独学が大変なのはわかりました^^;
0197nobodyさん
05/03/18 00:14:39ID:???まー 「サーバ立てる」 つっても、Apache (か Httpd とか) インストールするだけだし、実際やってみると思うよりは簡単だと思うけど。
0198nobodyさん
05/03/18 00:27:56ID:???0199184
05/03/18 06:37:22ID:???テストして頂いて恐縮です。僕の実行環境に問題があるみたいですね。。
僕の環境だとutfが二分ちょい、shiftjisが数秒です。(Athlon XP 2500+)
Perl入れ直したりしてみます。どうもありがとうございました(_ _)
0200nobodyさん
05/03/18 07:56:29ID:YtF+f69M登録後にメールを送る処理をするのに、次のように書いています。
メールは送られるのですが、なぜか一部の文字が化けてしまいます。
上の例だと「貼」、「構」あたりで化けてしまいます。
文字コードの関係で漢字が化けてしまうのでしょうか?
他の部分は化けていません。
解決策や原因がわかる方がいたら、教えてください、よろしくお願いします。
0201200
05/03/18 07:57:55ID:???sub mail_send{
my $temp=$_[0];
my $mail;
if ($m_sendtome){$temp.=" , $m_mailad";}
$mail = "To: $temp\n";
$mail .="From: $m_mailfrom\n";
$mail .="Subject: $_[1]\n";
$mail .="Errors-To: $m_mailad\n" if $m_sendtome;
$mail .="Content-Transfer-Encoding: 7bit\n";
$mail .="Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n\n";
$mail .=$_[2];
&jcode::convert(\$mail,'jis');
open (OUT,"| $sendmailpath -t") || die &error("sendmailが使用できませんでした。");
print OUT $mail;
close (OUT);
}
# メール本文
sub mail_ok{
return <<EOD;
登録が完了しました。下記のタグを貼り付けてください。
必要のない方は貼り付けなくても構いません。
署名
EOD
}
#メインの中でmail_sendを実行
&mail_send($mailadd,$honbun,&mail_ok());
0202200
05/03/18 07:59:27ID:???mail_ok の中の改行と違って1行になってしまいます。
原因・解決策わかる方、よろしくお願いします。
0204nobodyさん
05/03/18 08:17:16ID:???普通は、
use Fcntl;
...
my $name;
do{
$name = 適当に生成;
} until(sysopen(FH, $name, O_WRONLY|O_CREAT|O_EXCL));
...
close(FH);
みたいな感じ。
O_EXCLを使うことでファイルオープンとファイルの存在確認をアトミックに行えるところがミソ。
sysopenではなく、FileHandleまたはIO::Fileモジュール使うことが多いけど。
クックブックのレシピ「一時ファイルを作成する」を参照のこと。
もうちょっと複雑な処理が混ざったり、sysopen()やモジュールを使いたくないなら、
処理をきっちり排他制御する。
0205nobodyさん
05/03/18 08:23:44ID:???貼にx5Cが含まれているからでしょうね
return <<'EOD';
とシングルクォートでエスケープされないようにしたらいいかな
それとメールのヘッダーの改行は\r\nと決められてます。\nでも動作するようですけど。
0206200
05/03/18 08:32:51ID:???そういう風にしないとだめなんですね。
\nも直しました。
そしたら、文字化けが直りました!!!
なのですが、行数の関係で、実は省略してあったのですが、
sub mail_ok{
return <<EOD;
登録ID : $_[0]
登録が完了しました。下記のタグを貼り付けてください。
必要のない方は貼り付けなくても構いません。
署名
EOD
}
などとして、引数を含めています。
returnで返す前に、普通に変数に入れてから返したほうがよいでしょうか?
それとも、他にこの中でそのまま変数を表示させるよい方法があるのでしょうか?
重ね重ねすみませんが、可能かどうかだけでも教えてください。
よろしくお願いします。
0207nobodyさん
05/03/18 08:42:42ID:???じゃあ文字化け文字に\をつける
sub mail_ok{
return <<EOD;
登録ID : $_[0]
登録が完了しました。下記のタグを貼\り付けてください。
必要のない方は貼\り付けなくても構\いません。
署名
EOD
}
0208200
05/03/18 08:48:48ID:???漠然と中の文字がおかしいんだろうと思ってたものの、
原因がわからずに他のとこをいじったりして、ずっと悩んでました。
これでうまくいきそうです。
原因がわかったので関係するサイト等をぐぐって勉強してきます。
ほんとにどうもありがとうございました。
0209nobodyさん
05/03/18 20:32:06ID:???webページをhttpダウンロードしてくるプログラムを作りたいのですが、参考に
http://x68000.q-e-d.net/~68user/net/http-2.html
をコピペして実行すると、
print SOCKET "GET /index.html HTTP/1.0\r\n";
で止まって進まなくなります。
winME時代に同じことしたときは動いた覚えがあるので、
winXPのファイアウォールとウィルスセキュリティのファイアウォールを切ったのですが、まだ変わりません。
ほかにチェックする場所はありますか?
winXP sp2+perl 5.005_03+コマンドラインから実行中です。
0210209
05/03/18 20:33:20ID:???0211nobodyさん
05/03/18 21:12:40ID:???バカか
0212nobodyさん
05/03/19 01:17:30ID:???ヽ/⌒ヘ~ ,、
., 't,_,ノ丶 (__,\、 r'~゙i、 ばっかでーす♪
/ ! '` / ● ⌒ ヽ,、\,
(〇'゙ l__/ ● | `〜 〜 △v��
i、_,゙i し'i ゙〇ノ L,_il �厦
゙゙ー| ii r'゙\/゙i,~、 ∧∧∧
| " ij ノ/゙、/ ( )
,;、 > ゝ~゙ ゝ ソ ~ T ~
、(_/ (,,/ <ヽ | //
0213nobodyさん
05/03/19 12:39:33ID:VZlT0CLhperlは画像加工に弱いとのことで、調べてみた結果imagemagicというものをインストールするという手があるようですが、
しかし恐らくソースコードを置くだけのライブラリならともかく、稼働先でインストールのようなことは出来ない可能性があり
他の手段を探しています、何かメジャーな手はありませんでしょうか?
0214nobodyさん
05/03/19 13:26:09ID:a8Nv17ZI↓
また$textに別の文字を入力、『$textに入力された文字群』というくくりの中で、上のとは別の文字として保存
この保存した二つの文字を取り出して
『$textに入力した文字群から●を抽出し、@save内の変数$plusを付加する』
……というのは可能でしょうか?
『$textに入力された文字群』というくくりの中で、上のとは別の文字として保存
この動作が、どう書いたらいいものか解らなくて…
0216nobodyさん
05/03/19 14:24:33ID:???どちらも同じ大きさ?だと解釈されてしまって結果的にちゃんとフォーマット通りに出力されません。
どなたか解決方法を教えて頂けると嬉しいです。。
0217nobodyさん
05/03/19 14:36:51ID:???0218nobodyさん
05/03/19 15:08:22ID:a8Nv17ZI$textっていう変数に文字や数を複数回代入
その文字や数の中から特定の文字を検索する
という作業です
0219nobodyさん
05/03/19 15:24:36ID:???「フォーマット」 の意味がわからんw
>>218
@save = ( 'かくかく $text しかじか', 'あれこれ $text どれ●これ');
$text = 'ほげ●はげ';
foreach (@save) { s/\$text/$text/; }
したあと、
$plus = 'ひげ';
foreach (@save) { s/●/$plus/; }
ってこと?
でも 「●」 が $text 内にあったのかどうかは区別できないし、って?
さっぱりわからんw
同じプロセス内でやるなら、テキストに使われない文字でマークアップしとけばいいんじゃない?
0220nobodyさん
05/03/19 15:33:07ID:???もっとわかりやすく言わないとだめだよ。君の質問をイチイチ時間かけて解釈してまで
回答してくれるひとは滅多にいないから。
さぁもう1回頑張ってまとめてみなさい。
0221nobodyさん
05/03/19 15:34:20ID:???みんなformatって知らないのか…。俺もつかわんけど。
これ参考になる?
http://search.cpan.org/~dankogai/Encode-2.09/encoding.pm#KNOWN_PROBLEMS
0222nobodyさん
05/03/19 15:36:04ID:???$textの中から任意の文字列を取り出したいだけでしょ?
my ($new_text) = $text =~ /任意の文字列正規表現/;
0223nobodyさん
05/03/19 15:37:45ID:???my $kanji = "あああ青春の歌";
format STDOUT =
@<<<<<
$kanji
.
write;
これをこのままで実行すると「あああ」という結果が得られて、
use encodingなんかを使うと「あああ青春の」になるという話だとしたら、
フォーマットを書き直した方がいいと思うけど。
0224216
05/03/19 16:08:00ID:???Perlのformat機能です。
>>221
ありがとうございます。私も初めて使いました。少し必要になったので。。
なるほど。UTF8を一回shift_jisなどに変換して処理するという手もありますね。
>>223
わかりにくくてすみません。大体そんな話しなんですが、
format STDOUT =
@<<<<<<<@<<<<<<<に
'てすと','てすと2'や'tst,'tst2'をぶち込んだときに、
どちらも二つの要素の間の半角スペースの数が同じになってしまうので
フォーマットに一貫性が無くなってしまうんです。
つまり、'てすと','てすと2'や'tst,'tst2'を先ほどのフォーマットに入れると、"
てすと てすと2
tst tst2
となってしまうんです。use encodingしてない時みたいに
てすと てすと2
tst tst2
(半角スペース二個を全角一つに置き換えてます。)となって欲しいんですが。。(等幅フォントじゃないと分かりにくいかもです。)
0225nobodyさん
05/03/19 17:09:58ID:???Shift_JISと仮定して書いてみた。
use encoding "shiftjis";
use Encode;
my @str;
format RAW_FORM =
@<<<<<<<@<<<<<<<
map{ encode("shiftjis", $_) } @str
.
open(RAW_FORM, ">&STDOUT") or die $!;
binmode(RAW_FORM=>"raw");
@str = qw(てすと1 てすと2);
write RAW_FORM;
@str = qw(tst tst2);
write RAW_FORM;
close(RAW_FORM);
exit;
かなり強引。
0228218
05/03/19 18:44:09ID:???●は便宜上の記号でした。
もう最初書いたのから掛け離れてるんですが、やりたかったのは
@saveの中には$textと$plusと$rimitと$resultがある
$textが設定されたテキストフィールドに『ほげ』と入力すると、
datファイルに『ほげ』が保存される
処理A------------------------------------------------
$rimitが100に達した時、$result = $text . $plusみたいな感じで$textと$plusが連結
$resultがdatに保存される
-----------------------------------------------------
$textに改めて文字『ほげ』が入力される→datに保存される
※最初の『ほげ』とは別物として認識させたい
二度目の『ほげ』が処理A後$resultとしてdatに保存される時、
前回の『ほげ』と見分けがつかなくなるので
$plusは00、01…のようにナンバリング等で別々の値にしたい
$textに二度目以降文字が入力された時、datに保存されている$textの値が
上書きされるのかされないのかがまず判らなくて悩んでいた次第です
ホントすみません…
0231nobodyさん
05/03/19 22:08:29ID:???さっきまでたっぷり寝たのに日本語がわかんない
今度は寝すぎかな?
0234nobodyさん
05/03/19 22:51:45ID:???つまんないネタになるだけだと思うので
お邪魔しました
0235nobodyさん
05/03/20 00:27:27ID:???0236nobodyさん
05/03/20 00:33:08ID:???0237nobodyさん
05/03/20 02:15:24ID:???print "Hello Unko World!\n";
}
0238nobodyさん
05/03/20 03:10:16ID:???0239nobodyさん
05/03/20 03:22:48ID:???0240nobodyさん
05/03/20 11:54:57ID:???datファイルに書き足していきたいだけだろ?
ファイル操作のあたりを調べてみなさい。
それとテスト環境を作って自分で色々試しなさい。
どうせサーバーで直接試してるんだろうから。
0241nobodyさん
05/03/20 13:14:23ID:RNFnJUaq動作確認後、サーバーにアップロード、という手順で開発してるのですが、
perlスクリプトの一行目のperlスクリプトの指定を、
#!c:/Program Files/perl/bin/perl
から、アップロードの時だけいちいちサーバのパス指定に合わせて
#! /usr/local/bin/perl
と書き換えています。結構面倒だし、変更を忘れてエラーになることも
しばしばです。何かスマートな方法があるのではと思ってるのですが、
アドバイスいただければ幸いです。
0242nobodyさん
05/03/20 13:30:13ID:???0243nobodyさん
05/03/20 14:04:16ID:???Apache 1.3.xなら、.cgiの拡張子をPerlに関連付けすると、
シェバングパスを無視して実行してくれる。
私はそうしてる。
0245nobodyさん
05/03/20 16:24:18ID:???0246nobodyさん
05/03/20 17:22:51ID:Z0GAs5yv編集画面はしっかり編集されるのですが編集を実行すると
$params{'body'}の値が数字になってしまいます
$params{'body'}の部分にはタグも表示できるようにしてあるのですがそれが関係しているのでしょうか
三日三晩眺めてみてもどうしてもわかりません…
ご教授お願いします。
0247nobodyさん
05/03/20 17:26:02ID:???my $kugiri = "<<>>";
if ($params{'pass'} ne $pass) { &error("パスワードが違います"); }
# 編集
if ($params{'c'} eq "topedit") {
if (!$params{'body'}) { &error('入力がありません'); }
$params{'body'} =~ s/\r\n/\n/g;
$params{'body'} =~ s/\r//g;
$params{'body'} =~ s/\n/<br>/g;
$params{'body'} =~ s/&/&/g;
$params{'body'} =~ s/</</g;
$params{'body'} =~ s/>/>/g;
$params{'body'} = ~s/"/\"/g;
open(OUT,">setup.dat") || &error("setup.datを開くことができません");
print OUT "$params{'body'}$kugiri$params{'title'}$kugiri$params{'text'}$kugiri$params{'bgcolor'}$kugiri$params{'link'}$kugiri$params{'vlink'}$kugiri$params{'alink'}$kugiri";
close(OUT);
# 完了
&head;
print "<b>設定完了</b>\n";
&footer;
exit;
}
0248246-247
05/03/20 17:26:57ID:???$file = <IN>;
close(IN);
($body,$title,$text,$bgcolor,$link,$vlink,$alink) = split(/$kugiri/, $file);
$body=~s/<br>/\n/ig;
$body=~s/&/&/g;
$body=~s/</</g;
$body=~s/>/>/g;
$body=~s/\"/"/g;
&header;
print <<"EOM";
編集<br>
<form action="$cgi" method=post>
<input type=hidden name=pass value=$params{'pass'}>
<input type=hidden name=mode value=top>
<input type=hidden name=c value=topedit>
<textarea name="body" rows="10" cols="50" istyle="1">$body</textarea>
<br>
$title,$text,$bgcolor,$link,$vlink,$alinkのinputフォームは割愛<br>
それときったないソースでスマソ
<input type=submit value=送信>
EOM
&foot;
exit;
}
sage忘れスマソ…_| ̄|○
0249nobodyさん
05/03/20 17:58:57ID:???>$params{'body'} = ~s/"/\"/g;
0250T女の竹田
05/03/20 18:16:49ID:???せっかくPerlには便利なデバッガが付いてるんだから、使わないと損だよ。
三日三晩眺めてた、って。
CGIならその場で環境変数とか設定したらいいから。
0251246-248
05/03/20 19:22:11ID:???こういうポカミスって気付かないものですね
>250
Σ(´д`)それがありましたね
今度からはしっかりそれ試してます…
ではありがとうございました
0253nobodyさん
2005/03/21(月) 18:10:57ID:3f95qFz7何かよい方法はありますか?
具体的に言いますと、
$aaa[0]='bb';
$aaa[1]='aa';
$aaa[2]='cc';
を各値で昇順ソートし場合、@result=(1,0,2) という結果が欲しいのです。
下記のコードでは、それらしい結果は得られるのですが、確信が持てないのです。
$aaa[0]='bb';
$aaa[1]='aa';
$aaa[2]='cc';
$xxx[0]=0;
$xxx[1]=1;
$xxx[2]=2;
@result=sort {$aaa[$a] cmp $aaa[$b]} @xxx;
よろしくお願いします。
0254nobodyさん
2005/03/21(月) 19:48:18ID:???@result = sort{ $xxx[$a] cmp $xxx[$b] } (0..$#xxx);
@result = sort{ $xxx[$a] <=> $xxx[$b] } (0..$#xxx);
0255254
2005/03/21(月) 19:50:42ID:???my @result = sort{ $aaa[$a] cmp $aaa[$b] } (0..$#aaa);
0257nobodyさん
2005/03/25(金) 22:58:43ID:???0259nobodyさん
2005/03/26(土) 09:14:22ID:???0260nobodyさん
2005/03/26(土) 09:17:47ID:pZwBUwH20261nobodyさん
2005/03/26(土) 12:04:22ID:???0262nobodyさん
2005/03/27(日) 02:19:06ID:eF4YrThJaaa
aab
aac
aad
........
zzx
zzy
zzz
のように上から舐めていくのってどうすればいいですか?
0263nobodyさん
2005/03/27(日) 02:46:04ID:???for $y('a'..'z'){
print "$x$y\n";
}
}
0264nobodyさん
2005/03/27(日) 05:22:23ID:???while (++$str =~ /\A[a-z]{3}\z/) {
print "${str}\n";
}
0267262
2005/03/27(日) 10:17:27ID:???perlだけに時間さくわけにもいかんしな。
0268nobodyさん
2005/03/27(日) 10:18:22ID:???0269nobodyさん
2005/03/27(日) 15:26:22ID:???人にラクダ本すすめといて自分で読んでないやついるだろ!
0270nobodyさん
2005/03/27(日) 17:51:21ID:???0271nobodyさん
2005/03/27(日) 17:56:41ID:???perlだけに限らんけど、
there's more than one way to do it.
'aaa'..'zzz' つー記法はperlってこんなこともできるんだよスゲー、て紹介の仕方で良く引用されてるような。
0274nobodyさん
2005/03/27(日) 20:04:20ID:???■ このスレッドは過去ログ倉庫に格納されています