トップページ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/
0099nobodyさん2007/06/12(火) 12:43:17ID:???
>>93=>>97
氏ね
$_[0] =~ s/([^=^\"]|^)(https?\:[\w\.\~\-\/\?\&\=\@\;\#\:\%]+)/$1 . '<a href="' . $2 . '">' . (length $2 > 30 ? substr($2, 0, 30) . '…' : $2 ) . '<\/a>'/egx;
0100nobodyさん2007/06/12(火) 12:44:13ID:???
キチガイの相手なぞしてやるな。
0101972007/06/12(火) 12:56:27ID:???
>>98
申し訳ない。
少し有名なもんで天狗になっていた。
ソースを提示してもらえないでしょうか。
0102nobodyさん2007/06/12(火) 13:12:38ID:???
>>83
use String::Multibyte;

my $mcbs = String::Multibyte->new('shiftjis');

(my $str = <<"EOF") =~ tr/\r\n//d;
前走の大敗がよく分からないが、引き続き毛ヅヤや馬体の
張り等は際立って良く、見える。
EOF

my $length = 6;

my @array;
my @str = $mcbs->strsplit('', $str);
while(@str){
foreach(0..$length-1){
unshift(@{$array[$_]}, shift(@str) || ' ');
}
unshift(@{$array[$length]}, ($mcbs->strspn($str[0], '、。') ? shift(@str) : ' '));
}

foreach(@array){
print @{$_}, "\n";
}

# つか、乗り遅れた感。

>>92
一度、MIME::LiteやMIME::toolsとかモジュール使ってみて比較してみれば。
0103nobodyさん2007/06/12(火) 13:25:10ID:???
有名ってなんだよwwww
ふつーに変数2つとか配列とかハッシュとかに突っ込んで片方cutすりゃいいだけだろ
ソースもクソもねえよ
0104nobodyさん2007/06/12(火) 13:25:13ID:???
文字列を禁則を考慮しつつ行に分けるのとそれを縦書きに組み替えるのは
一度にやらない方が見通しがよいんじゃないか? 前半はJcodeのjfoldとか
使えばいいわけだし。
0105nobodyさん2007/06/12(火) 13:43:40ID:???
愚直に作るとこんな感じだけど、ちょいと微妙。
文字の切り分けは、どこかで一文字単位にしないといけないので、一度にsplitした方がいいように思う。

my @str = $mcbs->strsplit('', $str);
my @array;
# 一定の長さで区切って配列を作る
while(@str){
my $l = [map{shift(@str) || ' '}(1..$length)];
push(@{$l}, ($mcbs->strspn($str[0], '、。') ? shift(@str) : ' '));
push(@array, $l);
}
# 縦横を変える
my @array2;
for my $i (0..$length){
push(@array2, [reverse map{$array[$_]->[$i]}(0..$#array)]);
}

foreach(@array2){
print @{$_}, "\n";
}
0106nobodyさん2007/06/12(火) 13:47:43ID:???
>>102
mcbsとヒアドキュメントのダブルクォートと\rに突っ込んどくw

>>103
だから相手にするなって。
0107nobodyさん2007/06/12(火) 13:51:06ID:???
おまえも文章の誤解をしている時点で初心者以下の糞レベルであることには変わらんよ
0108nobodyさん2007/06/12(火) 13:54:55ID:???
はいはいおもしろいおもしろい
0109nobodyさん2007/06/12(火) 14:02:36ID:???
>>106
mcbsは… orz
脳内 =~ s/mcbs/mbcs/g;
0110nobodyさん2007/06/13(水) 07:53:10ID:???
聞く方も答える方も初心者かよ
0111nobodyさん2007/06/13(水) 09:14:14ID:???
はいはいおもしろいおもしろい
0112nobodyさん2007/06/13(水) 18:24:42ID:???
変数に代入できる値の制限はあるのでしょうか?
文字列だと1000文字まで、数値だと100桁まで...等
検索してもそれらしい情報が見つかりません…。
0113nobodyさん2007/06/13(水) 18:59:02ID:???
数値はあったが忘れた。Math::BigIntで検索すれば何か出る。
0114nobodyさん2007/06/14(木) 19:22:36ID:???
CGIで質問フォームを作ってそれが完了したと同時にメールが送られるようにしてるんだけど、
一定文字数を越えると文字化けしてしまう。。
誰かこの文字化けが何系の文字コードか分かる方います??

$"$($($($($($($($($($($($($($($($($($($($($($($($($($($($($($($($($($($($3$3$G2~9T$*$*$*$*$*$*$*$*$*$*$*$*$
0115nobodyさん2007/06/14(木) 19:39:52ID:???
普通に考えりゃ7bitJISだよね
そんな風に出るわけねーと思うけど
0116nobodyさん2007/06/14(木) 19:52:43ID:???
ありがとうございます。
ヘッダに
Content-Transfer-Encoding: 7bit
を付加してみましたが結果変わらず。。
途中までは普通に文字が表示されてるんだけど途中から急に上みたいな文字列になってしまう。
メール分を生成してるところで本文が入っている変数をDumpしてみたけど
そこは特に文字化けも無く全ての文字が正常に格納されている状態。。。
メールのヘッダとかその辺の設定しか考えられる余地が無いのだけど、うーん。。。
0117nobodyさん2007/06/14(木) 19:55:49ID:???
>>114
見るからにJISのひらがなあたりだろ。EUCのMSB落ちかもしれない。
とりあえず頭にESC-$-B補ってnkfに食わせたら

あえええええええええええええええええええええええええええええええええええここで改行おおおおおおおおおおおお

と出ました。
0118nobodyさん2007/06/14(木) 20:01:39ID:???
すごい!そう打ちましたw

>頭にESC-$-B補ってnkfに食わせたら
この部分がさっぱりですがググリながら実装方法を調べてます。
感動しましたw
0119nobodyさん2007/06/14(木) 20:07:49ID:???
$B$J$K$2$J$/BG$C$?J*$,;/$5$l$A$c$&$N$O0U30$HCQ$:$+$7$$$+$b$J!D#w
0120nobodyさん2007/06/14(木) 20:10:02ID:???
実装というか欠落したメールを復元するだけなのか(´・ω・`)
0121nobodyさん2007/06/14(木) 20:11:35ID:???
>あえええええええええええええええええええええええええええええええええええここで改行おおおおおおおおおおおお

わらたw
0122nobodyさん2007/06/15(金) 09:18:42ID:???
まあ、テスト時に特に意味の無い文字列を送るのはEメールの伝統ではあるが。
0123nobodyさん2007/06/15(金) 10:00:59ID:???
open(FH, 'test.txt');
$content = <FH>;
$content or die;
close(FH);

みたいに、closeする前に終了する(可能性がある)のはあまりよろしくないでしょうか?
0124nobodyさん2007/06/15(金) 10:09:53ID:???
終了する時にはcloseするので何の問題もない。
01251232007/06/15(金) 10:12:39ID:???
>>124
即レスthx
0126nobodyさん2007/06/15(金) 23:57:47ID:???
個人的にはちゃんと閉じたいけどね
0127nobodyさん2007/06/16(土) 02:33:58ID:???
そんなことを気にしているくらいならopen文のエラーも気にしろよ
0128nobodyさん2007/06/16(土) 03:01:26ID:???
俺はかならずifの中でopenしてる
0129nobodyさん2007/06/16(土) 03:12:20ID:???
unlessじゃ駄目?
0130nobodyさん2007/06/16(土) 04:00:22ID:???
>>128
Cから来た奴は必ずそうするがorが最もスマートだ
0131nobodyさん2007/06/16(土) 04:25:42ID:???
> Cから来た奴は必ずそうするがorが最もスマートだ

or のあとにブロック書ける?
0132nobodyさん2007/06/16(土) 05:43:36ID:???
... or do{ ... };
0133nobodyさん2007/06/16(土) 05:46:41ID:???
え?
こんな高い位置にブロック書くの?
ちょっと書いてみて。

sub error
{
    my($str) = @_;
    print $str;
    exit;
}
sub main
{
    open(FILE, "< uso.txt") or &error("そんなファイルないよ");
    my @lines = <FILE>;
    close(FILE);
    $#lines < 0 and &error("中身ないよ");
    # 以下略
}

はースッキリ快適。
0134nobodyさん2007/06/16(土) 09:51:02ID:???
>>133
「 can か cannot」かって聞かれて(と判断して) can と答えたんじゃね?
実際やるか とは別でしょ。
01351322007/06/16(土) 12:14:24ID:???
>>133
>>131
> or のあとにブロック書ける?
を質問と捕らえて回答したまで。
0136nobodyさん2007/06/16(土) 12:43:25ID:???
2引数openとか古臭い書き方だなあ
0137nobodyさん2007/06/16(土) 13:49:35ID:???
批判はするが例を示さない
この板らしいっちゃらしいな
0138nobodyさん2007/06/16(土) 17:06:40ID:???
示すまでもなくperldocに書いてあります
0139nobodyさん2007/06/16(土) 17:39:20ID:???
今後当スレはPerlDocに統合します。
長らくの御愛顧ありがとうございました。
ttp://www.ayni.com/perldoc/

--完--
0140nobodyさん2007/06/16(土) 17:51:06ID:???
確かにこの低レベルなスレはperldocと統合しても何ら差支えはないだろう
あ、ム板の方は高レベルなので残して置いて下さいね^^
0141nobodyさん2007/06/16(土) 17:53:36ID:???
ム板ならともかくこっちなら2引数で正解だな。
どこにでも5.6以上のPerlが置いてあるなんて考えるのは甘い。
0142nobodyさん2007/06/16(土) 18:25:16ID:???
顔赤すぎ
0143nobodyさん2007/06/16(土) 18:25:26ID:???
まあ現代の大抵のレン鯖は5.8なのが事実ですけどね
0144nobodyさん2007/06/16(土) 18:36:36ID:???
ム板って何?
前スレの終わり辺りから何かあると盛んに出てくるけど
0145nobodyさん2007/06/16(土) 18:50:25ID:???
OS再インストールしたら自己解決しました。
ttp://pc11.2ch.net/test/read.cgi/tech/1173880452/
2chか。レベル高いってネタだよね?

105 デフォルトの名無しさん [sage] Date:2007/03/22(木) 22:45:19  ID: Be:
    HTTP 500 - 内部サーバー エラー です
106 デフォルトの名無しさん [sage] Date:2007/03/22(木) 22:48:42  ID: Be:
    なんでブラウザにエラーが出るわけ?

いやApacheの設定なんですけどね…
前スレの終わりでuse Benchmark;使ったら全員で猿のようにベンチマーク。
未だに。2chばかり見てるとますますバカになるよ。
0146nobodyさん2007/06/16(土) 20:33:02ID:???
>>141
粘着君の相手するなよ。
0147nobodyさん2007/06/16(土) 21:07:50ID:???
>>141
FileHandleやIO::Fileモジュールを使おうよ。
0148nobodyさん2007/06/16(土) 21:08:54ID:???
だって遅いしー
0149nobodyさん2007/06/17(日) 00:01:52ID:???
PerlモジュールのEmbed::Persistentはどこにありますか?
Win (no cygwin) + lighttpd + FastCGIでPerl 5.8を動かしたいのですが、ppmで引っかかりませんでした
0150nobodyさん2007/06/17(日) 10:35:59ID:???
普通にいつものページで検索すればありましたが

Win32 PPM packages for "ExtUtils-Embed"
trouchelle.com Perl 5.8 repository [ v 1.14 ]
0151nobodyさん2007/06/18(月) 00:25:21ID:k4WptDOc
メールで送信した内容をCGIで処理するには、
どうしたらよいでしょうか?
MovableTypeやWordPressのメール投稿のようなイメージです。
mail@hoge.comに送信して、www.hoge.comのCGIで
その投稿内容を読むといった感じです。

PerlでPOPクライアントを書いて、内容を取得して、
それをcronで回すくらいしか思いつかないのですが、
cronを回せるレンタルサーバも少ないですし、
回せても1時間毎くらいがせいぜいだったりしますし。
0152nobodyさん2007/06/18(月) 00:46:35ID:???
ログイン時に受信すればいい
0153nobodyさん2007/06/18(月) 05:55:05ID:???
151 さんは、メールを送った直後に自動更新されることを期待していると思うんだ。
152 みたいなバカは死ぬとよい。
0154nobodyさん2007/06/18(月) 06:31:20ID:???
>>151 = >>153
バカな153のせいで、151の質問に答える奴はいなくなりましたとさ(終)
0155nobodyさん2007/06/18(月) 06:32:06ID:???
>>152 == >>154 ?
0156nobodyさん2007/06/18(月) 06:45:55ID:???
ここまで俺の
01571542007/06/18(月) 07:36:43ID:???
>>155
まぁ、そうくるだろうと思ったよ。マジレスすると152は漏れじゃない。
信じなくても良いけど、>>153を援護すればする程、>>151の質問に
答える奴はいなくなるよ?(w
0158nobodyさん2007/06/18(月) 07:57:34ID:???
ここまで俺の
0159nobodyさん2007/06/18(月) 08:46:27ID:???
神経戦乙
0160nobodyさん2007/06/18(月) 09:05:53ID:???
> 答える奴はいなくなるよ?(w

答える能力はないが煽っていますということ?
0161nobodyさん2007/06/18(月) 09:30:18ID:???
qmailならhomeディレクトリにメール受信時にスクリプトを動作させることはできるが、
他のメールサーバーでも同じことはできるかと思う
0162nobodyさん2007/06/18(月) 13:27:43ID:???
答える答えない以前に、Perlの質問じゃないから。
0163nobodyさん2007/06/18(月) 13:29:32ID:???
> 答える答えない以前に、Perlの質問じゃないから。

それがどうしたの?
0164nobodyさん2007/06/18(月) 13:59:19ID:???

それがどうしたの、と言われましても…
ここはPerl"コーディング"質問スレな訳ですし。
ロジック的なことを聞きたいのならば、
この板にも適切なスレッドがありますし、
更に深い内容ならUNIX板とかに行けば良いでしょう。
しかし、そのロジックを理解した上でのコーディングに関する
質問はスレ違いではありませんが、レベル的に
"自分で考えれば分かる"程度なので、処理をアシストする
モジュールくらいしか案内出来ないでしょう。
少なくとも 151 の書き込みを読む限りでは。
0165nobodyさん2007/06/18(月) 14:18:33ID:???
>>153>>152 を煽る理由がわからん
152 が質問者なのか
違うのなら質問に答えると思うが
0166nobodyさん2007/06/18(月) 14:47:39ID:???
上島竜平は まで読んだ。
0167542007/06/18(月) 15:51:47ID:???
>>152-155まで皆氏ねば済む話じゃないか
0168nobodyさん2007/06/18(月) 15:52:52ID:???
名前欄誤爆った…54ってorz
0169nobodyさん2007/06/18(月) 16:14:07ID:???
情けない質問するやつも氏ねば済むんじゃね?
0170nobodyさん2007/06/18(月) 16:21:21ID:???
メール着信でスクリプトをキックする方法は、管理者に訊いた方がいい。
システム構成によって方法が違うから。
禁止されてるかも知れないし、maildropが使われてるかも知れない。

ここからPerlコーディングについての質問。
0171nobodyさん2007/06/18(月) 18:46:23ID:???
もうバレバレじゃん(w
>>153を援護する奴が>>151(質問者)だろ?
大体、質問した奴がこの流れで16時間も静観してる訳無いだろ?
しかも口調が一緒だし(w

>>151 = >>153 = >>155 = >>160 = >>163

質問に答えてもらおうと必死。
0172nobodyさん2007/06/18(月) 19:28:33ID:???
>>171
スレ違い
0173nobodyさん2007/06/18(月) 19:32:33ID:???
+= >>172
0174nobodyさん2007/06/18(月) 19:39:27ID:???
my $intAnchor = 1;

while( $intAnchor < 1001 ) {
>>172 += $intAnchor;
$intAnchor++;
}
0175nobodyさん2007/06/18(月) 19:57:19ID:???
0176nobodyさん2007/06/18(月) 20:07:15ID:???
いや>>151 = >>153 = >>155 = >>160 = >>163も十分見苦しいけど、
>>152 = >>154 = >>157 = >>165 = >>171もなんか必死すぎて嫌いだ
お前ら皆どっかいっちゃえ!!!11
0177nobodyさん2007/06/18(月) 21:04:16ID:???
>>151
CGIで読むってことは、CGIがメーラー(POPクライアント)の役割をするわけだから、
CGI起動時にメールボックスから届いたメールを読み出せばいいのでは。
Net::POP3でも使ったらどうですか? 読み出したらサーバから削除するなどの
処理はすべて自分で書く必要があります。GUIのないメーラーを作るようなもんです。
…ていうことではなくて、届いたタイミングで、届いたメールデータを処理したい
ってことかしら。であれば、perlというよりは、.forwardまたはdot-qmailファイル
にでもプログラムにパイプで渡す設定をしておけば、プログラムから標準入力
を読んで処理すれば済む。MIME::Parserを使うと便利。
まずはコードを書いてみることです。
0178nobodyさん2007/06/18(月) 21:31:22ID:???
素朴な疑問。
CGIで、場合によってLocationヘッダを返した場合、
ユーザからみると、即座にページを飛ばされるんですが、
そのCGIはLocationヘッダを返したあともexitしない限り、
以後の処理をし続けるんでしょうか。
0179nobodyさん2007/06/18(月) 21:41:57ID:???
#!/usr/bin/perl

use strict;
print "Location: http://www.yahoo.co.jp/\n\n";
sleep(10);
exit;
0180nobodyさん2007/06/18(月) 21:45:01ID:???
どうも。確かめる方法がわかりました。つまらん質問すみません。
飛ばした後にファイル出力できたので、ちゃんと最後まで処理しますね。
てことは飛ばした場合もちゃんとexitしたほうが無駄が少ないということ
ですよね??
0181nobodyさん2007/06/18(月) 21:57:32ID:???
きみの言う無駄とは?
0182nobodyさん2007/06/18(月) 22:27:24ID:???
ああ、そういう突っ込みになりますよね。無駄があるのは僕だけの事情でした。
例えば、通常、ウェブページをきちんと出力するルーチンの途中で例外的に
飛ばした場合の、その後のページ出力処理、とか。
0183nobodyさん2007/06/18(月) 23:07:27ID:???
179さんの言ってる意味がいま解りました。最後まで処理しないと
飛ばないんですね。面目ない。
0184nobodyさん2007/06/18(月) 23:15:58ID:???
そりゃ単にバッファをフラッシュしてないだけだろ
01851512007/06/18(月) 23:52:23ID:k4WptDOc
質問の仕方等々で至らぬ点があり、なんだか揉めてしまったようで申し訳ないです。
普通に帰るのが遅い人間&出先から書きにくい状態でした。

意図としては>>177さんが書いてくださったような、
「届いたタイミングで、届いたメールデータを処理したい」、
つまり、メールを受けたことをトリガとしてバックエンドの処理を動かすという
というものでした。
例えば、メールで「1+1」と送ると、バックエンドで計算処理をして、
答えを「2」で返す、というような。

ご指摘いただいたように、Perlコーディングという内容ではないので、
いただいたお答えを元に、うちの環境で確かめることにしてみます。

ほんとうにありがとうございました。
0186nobodyさん2007/06/20(水) 13:54:26ID:???
改行を含む文字列の中の一部分を取りたいときに、直近の改行コードまでという指定は出来ないものでしょうか?

kani
kanimiso@
kanikama

上のような文字列(@部分がいろいろ変わる)からmiso@を抜き出したいんだけど

s/.*kani(.*)\n/$1/;

みたいにするとmiso@\nkanikama\nまでが取れてしまいます。
0187nobodyさん2007/06/20(水) 14:25:25ID:???
最短マッチとかs修飾子とか
0188nobodyさん2007/06/20(水) 14:53:02ID:???
最短マッチで出来ました。ありがとうございました。
0189nobodyさん2007/06/20(水) 18:37:42ID:???
中身が空っぽもしくは
<html>
<head></head>
<body>
</body>
</html>
になってるファイルに<p>hogehoge</p>を書き込んで
<html>
<head></head>
<body>
<p>hogehoge</p>
</body>
</html>
にしたいのですがどうしたらよいでしょうか。
0190nobodyさん2007/06/20(水) 18:40:27ID:???
>>1
0191nobodyさん2007/06/20(水) 18:40:41ID:???
質問ってレベルじゃねえぞ…
0192nobodyさん2007/06/20(水) 18:40:54ID:???
>>189
それだけの条件なら何も考えずに最終結果を固定で上書きするだけでいいんじゃねーの?
0193nobodyさん2007/06/20(水) 18:43:32ID:???
すみません>>189に追加させてください

<body>〜</body>に<p>hogehoge</p>以外に既に何か文字が入っていても
それを消さずにその下に追記するようにしたいのです。
<body>
<p>fugafuga</p>
</body>

<body>
<p>fugafuga</p>
<p>hogehoge</p>
</body>
こんな感じです
0194nobodyさん2007/06/20(水) 19:04:32ID:???
HTML::Templateでも使っとけよ・・・
0195nobodyさん2007/06/20(水) 20:24:57ID:???
open(FILE,"<index.html");
my $html = <FILE>;
close(FILE);
$html =~ /<\/body>/;
my $top = $`;
my $bottom = $';

$top .= "<p>追加する文字列</p>\n";
$top .= $bottom;

open(FILE,">index.html");
print <FILE> $top;
close(FILE);

exit;

This is not confident.
Please point it out when the mistake is found.
0196nobodyさん2007/06/20(水) 21:07:55ID:???
perl -MIO::All -e '($tmp = ${io("index.html")}) =~ s{(</body>)}{<p>hogehoge</p>$1}, $tmp > io("index.html")';
0197nobodyさん2007/06/20(水) 21:32:55ID:???
perl -0777 -i.bak -pe 's{(</body>)}{<p>hogehoge</p>\n$1}' index.html
0198nobodyさん2007/06/20(水) 22:14:26ID:???
>>189です。みなさんありがとうございます。
ご飯食べてお風呂入ってるあいだ自分でもこんなの思いついたんですけど
>>195さんのとかのほうがスマートでしたね

if (-e $xmlfile && -s $xmlfile) {

open (FILE, "<test.htm") or die "$!";
@file = <FILE>;
close (FILE);

foreach $line (@file){
if($line =~ /<\/body>/){
$line =~ s/$追加する文字列\n$&/;
}
}

open (FILE,">test.htm");
print FILE @file;
close(FILE);

} else {

open (FILE, ">test.htm") or die "$!";
print FILE "<html>\n<head>\n</head>\n<body>\n$追加する文字列</body>\n</html>\n";
close (FILE);

}

■ このスレッドは過去ログ倉庫に格納されています