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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/10/17(月) 00:47:17ID:???
Perlのコーディングで困ってる人のスレです。

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

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

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0666age2005/11/25(金) 18:55:49ID:PaUDYDn8
>>665
バイナリーファイルは何でもありだからだめだよ
0667nobodyさん2005/11/25(金) 19:09:11ID:???
>>664
http://perldoc.jp/docs/perl/5.8.0/strict.pod
http://perldoc.jp/docs/perl/5.8.0/perlstyle.pod
0668nobodyさん2005/11/25(金) 19:18:35ID:???
>>665
> バイナリファイルに\rのない\nが含まれていることはありえない、

扱うバイナリファイルがその前提なら、
その方法でもいいと思うよ。
0669nobodyさん2005/11/25(金) 19:49:39ID:???
バイナリかアスキーかなんて、拡張子で判断すればいいんでないの
0670nobodyさん2005/11/25(金) 19:54:43ID:???
なぜファイルテスト演算子を使わないのかと
0671nobodyさん2005/11/25(金) 19:55:27ID:???
(´・д・)エー
0672nobodyさん2005/11/25(金) 20:19:10ID:???
ファイルテスト演算子って\0が含まれてるかどうかだけじゃなかったっけ?
0673nobodyさん2005/11/25(金) 20:21:34ID:???
すまん、違ったようだ。
0674nobodyさん2005/11/25(金) 20:51:44ID:???
x0D x0Aで改行ってのはWindows限定だから他のOSじゃ通用しないよ。
自前でチェックするならx00のあり/なしだな。手抜きの場合は。
0675nobodyさん2005/11/25(金) 20:55:26ID:???
>>664
使用者感想

use strictで肩こりが解消しました。(茨城県 I.・Y様)
もうuse strict無しではコーヒーは飲めません。(北海道 H・N様)
use strictのお陰で宝くじが当り、彼女もできました。(東京都 A・J様)
0676nobodyさん2005/11/25(金) 21:22:52ID:???
>>664
>>675みたいなおちゃらけじゃなくマジレス

use strictでkentの呪縛から逃れることが出来ますた。(京都府 M・N)
0677nobodyさん2005/11/25(金) 21:31:13ID:???
問い)xxxのCGIを改造したいのですが。
答え)use strict;の一文を削除してからどうぞ。
0678nobodyさん2005/11/25(金) 21:32:34ID:???
>>664
残尿感もなく、スッキリです!(東京都 W・C)
0679nobodyさん2005/11/25(金) 21:41:37ID:???
ヒント:グローバル変数
0680nobodyさん2005/11/25(金) 21:47:22ID:???
ヒント:グローバル経済
0681nobodyさん2005/11/25(金) 21:48:38ID:???
バイナリかどうかのチェックとはちょっと違うかも知れないけど File::MMagic とか。
0682nobodyさん2005/11/26(土) 00:24:41ID:???
>>664
use strictを使う理由は、use strict 'vars';が一番大きいかな。
完全に修飾されてない、宣言の無い変数を使うとエラーになる。
つまり、タイプミスなどで間違った変数名を使うとエラーで教えてくれる。
0683nobodyさん2005/11/26(土) 02:02:52ID:???
でも use strict; 使っておいて、一番上に my $変数; をずら〜って書いてるひともいるけど、それは文法上 strict だけど、本質的に strict じゃないんじゃないかなー、って思う。
0684nobodyさん2005/11/26(土) 02:32:09ID:???
strictって名前だけど、機能を若干制限するだけで、
スタイルを強制するわけじゃないからね。
0685nobodyさん2005/11/26(土) 08:54:19ID:???
>>683
いるいる
その人おっさんじゃない?
0686nobodyさん2005/11/26(土) 09:02:53ID:???
でも、解って使っていればOKかなと思う。
例えば、上のほうに設定系の変数をわかりやすくまとめておいて、ここまでが
設定ですよ〜、、、みたいな。。
0687nobodyさん2005/11/26(土) 09:07:23ID:???
極力そんな変数は減らすべきだよ
0688ゆーき2005/11/26(土) 09:27:08ID:yGTXOsFB
print "Location: mailto:〜でメーラーを開いて、本文に改行交じりの文字を入れることが出来ません。なぜでしょうか? 
print "Location: mailto:aaa\@aaa.com?subject=件名\&body=1行目%0D%0A2行目\n\n";
「%0D%0A」を入れてみましたがだめでした。文字コードや、URLエンコード関係が原因なんでしょうか???
ちなみにPERLのスクリプト自体はShift-jisで書いています。
0689愛とゆーきだけが友達さ2005/11/26(土) 09:33:48ID:???
もっとスマートなやり方でできないのか?
bodyなんてメーラー依存度が高いわけだし。。
0690ゆーき2005/11/26(土) 09:42:03ID:yGTXOsFB
メルマガを一斉配信する前に、一旦Outlook Expressでプレビューしたいわけなんですが、他にいい方法ご存知ですか?
0691nobodyさん2005/11/26(土) 11:46:44ID:???
>>690
一度、自分だけに同じ内容のメールを送ってみる。
0692ゆーき2005/11/26(土) 11:51:53ID:yGTXOsFB
>>691
それも、最終手段としては考えていますが、
ユーザのひと手間が増えますので、なるべく他の方法を使いたいと思っているのですが...
0693nobodyさん2005/11/26(土) 12:00:07ID:???
>>692
Outlook を使ってない人、プレビューしたく無い人もいるわけだけど、
そういう人の手間が増えたり、ウザいと感じるのはいいわけ?
0694Perl初心者2005/11/26(土) 12:13:53ID:???
>>688
”%”の前に”\”がいるとか
0695ゆーき2005/11/26(土) 12:29:09ID:yGTXOsFB
>>693
今回は、1人のクライアント専用に作っていまして、こちらの要望なんです。
0696ゆーき2005/11/26(土) 12:49:51ID:yGTXOsFB
>>694
print "Location: mailto:aaa\@aaa.com?subject=件名\&body=1行目\%0D\%0A2行目\n\n";
としてみましたが、だめでした。
0697nobodyさん2005/11/26(土) 13:18:09ID:???
<head>
<meta http-equiv="refresh" content="0; url=mailto:[email protected]?subject=件名&body=1行目%0d%0a21行目">
</head>

HTMLタグで飛ばしてやるのはだめなの?
0698nobodyさん2005/11/26(土) 13:49:44ID:???
Perlコーディング
0699ゆーき2005/11/26(土) 13:51:51ID:yGTXOsFB
>>697
完璧です!!!(^^)!
上手くいきました!ありがとうございましたm(_ _)m。
とても丁寧にアドバイス頂きまして、本当にありがとうございました。
おかげさまでクライアントにも顔がたちます。感謝!感謝!感謝!感謝!感謝!
07002892005/11/26(土) 14:52:54ID:EqqUKm3R
perl5.8、FreeBSDの環境です。
連想配列をファイルやDBのカラムに保存したいのですが、
可能でしょうか?
可能であれば方法をご教授お願いいたします。
0701nobodyさん2005/11/26(土) 15:26:01ID:???
>>700
もちろん可能だけどどのあたりがわからないの?
連想配列にどんなキーがあるのか知る方法がわからないとか→keys, each
ファイルへの記録方法がわからないとか→open, print, close
PerlからDBを使う方法がわからないとか→http://search.cpan.org/modlist/Database_Interfaces
それを連想配列に戻す方法がわからないとか→それぞれのキーに対して値を代入
0702nobodyさん2005/11/26(土) 15:35:34ID:???
そういうモジュールを探してるって事じゃない蟹
0703nobodyさん2005/11/26(土) 16:18:41ID:???
シリアライズして放り込めば…と思ったけど、
ハッシュをそのままDBのテーブルにマッピングしたいってこと?
0704nobodyさん2005/11/26(土) 16:33:28ID:???
ああ、一つのカラムの中に連想配列を丸ごと押し込みたい、とも取れるのか…
それならStorableだよな
07057002005/11/26(土) 17:02:03ID:EqqUKm3R
>>703
>>704
そういう事です。説明足りなくてすいません。
普通に連想配列をファイルやカラムにinsertしても
読み取りにに失敗したので(当然)。
Storableとはなんでしょうか?ググってみます。
0706nobodyさん2005/11/26(土) 20:35:13ID:zmLMleB6
Javaのプロパティファイルと同じことをperlでもやりたいのですが、できますか?
2chのSETTING.TXTみたいなのです。
2chってどうやってるんだろう・・・。
0707nobodyさん2005/11/26(土) 20:38:46ID:???
出来ます
と言うか物凄く初歩です
0708nobodyさん2005/11/26(土) 20:42:51ID:???
現在CGI経由で画像を表示させる簡単なCGIスクリプトをテストしています。
こんな感じで・・・

open IMAGE, "<:raw", "img.gif";
print "Content-type: image/gif\n\n";
print <IMAGE>;
close IMAGE;

しかしこれを実際にテストしてみると、ブラウザには
画像がシュレッダかけられたみたいなへんてこりんな
画像で、しかも縦の長さが押しつぶされてしまった
感じの画像が表示されます。要は、正しく表示されません。
jpeg画像にしてやってみると、今度はバッテンのアイコンが
でてしまいます。

なぜうまく表示できないのでしょうか?
0709nobodyさん2005/11/26(土) 20:49:30ID:???
binmode
0710nobodyさん2005/11/26(土) 20:51:22ID:???
>709
:rawだから違うんじゃね?
07117102005/11/26(土) 20:52:06ID:???
何アホなこと言ってんだオレ…
STDOUTに対してbinmodeか
0712nobodyさん2005/11/26(土) 21:15:24ID:???
>>708
まぁ、違うと思うけど
ASCIIモードでFTPうpしたとか
07137082005/11/26(土) 21:19:39ID:???
レスどうもです。
一応raw指定でbinmodeのつもりです。
あと自鯖でやってます。Apache2です。
07147082005/11/26(土) 21:29:15ID:???
あ、たしかにbinmode STDOUTでうまくいきました。
逆にIMAGEに対してはbinmodeにしなくてもいいようですね。
ありがとうございました。
0715nobodyさん2005/11/26(土) 21:29:21ID:???
>>713
binmodeは2箇所ってこと
0716nobodyさん2005/11/26(土) 21:37:16ID:zmLMleB6
>707
そんじゃおしえてください
0717nobodyさん2005/11/26(土) 21:41:42ID:???
ex.

open(FH, 'SETTING.TXT');
while (<FH>) {
chomp;
my($key, $val) = split(/=/, $_, 2);
$set{$key} = $val;
}
close(FH);

print $set{'BBS_TITLE'};
0718nobodyさん2005/11/26(土) 21:47:02ID:???
>>706
この程度のテキスト処理はどんな Perl の本でも最初の方でやるじゃんよ。
勉強不足なんじゃね?
07197082005/11/26(土) 21:47:53ID:???
>>715
それがですね、読み出し元ファイル(IMAGE)に対してはbinmodeにしなくても
いいようなんです。書き出し先ファイル(STDOUT)に対してはやらねば
ならないようです。
それと、1つサンプルコードを見つけたのですが、これは読み出し元ファイルに
しかbinmodeやってないですね。
http://www.aimix.jp/cgi/syohoimgview.html
この辺があやふやというか・・・。
0720nobodyさん2005/11/26(土) 21:55:55ID:???
Windowsの特徴
07217082005/11/26(土) 22:10:24ID:???
いろいろやってみましたが、原因わからずじまいです。
>>720ということで、結論付けてしまいたい気分です。
やってられんです。
ようはI/O両方バイナリにしとけば確実ってことですね。
0722nobodyさん2005/11/26(土) 22:10:48ID:???
"<:raw" ってしてるから binmode になってんじゃなくて?
07237202005/11/26(土) 22:12:35ID:???
"ということ"っていうかそういう仕様なんだけど

ttp://www.sixnine.net/cygwin/translation/cygwin-ug-net/using-textbinary.html
07247152005/11/26(土) 22:12:44ID:???
>>719
・テキストモード入力時の変換:0D 0A → 0A
・テキストモード出力時の変換:0A → 0D 0A
・たまたま画像に0D 0Aが無かった
・サイトが間違ってる # コピペして試してみな
07257082005/11/26(土) 22:16:09ID:???
なるへそ。
画像ファイルに<CR><LF>がなければ、読み込みでは変換されず
しかし<LF>があれば、書き出しで変換されるという寸法ですかね。
0726nobodyさん2005/11/27(日) 06:03:43ID:PNI5NdX4
すいません、質問させてください。


unless($codeflag){ &error("不正投稿の可能\性があります。リロードして再投稿して下さい。");}
if ($allow_submit && !$letout_ip) {
if (($cc_time - $last_ctime) { &error("アクセスしてから投稿するまでは$noprx_stime秒以上開けて下さい。");}
}
elsif (($cc_time - $last_ctime) { &error("アクセスしてから投稿するまでは$submit_time秒以上開けて下さい。");}


で構文エラーがでます。

Perlのエラー出力は

syntax error at tmp.pl line 749, near ";}"
syntax error at tmp.pl line 751, near "elsif"
tmp.pl had compilation errors.

でした。

ちょっと原因がわからないんで、おしえてください。
0727nobodyさん2005/11/27(日) 06:22:19ID:???
  , ‐、     , ─‐ 、 , ‐ 、 ,r─── 、 r───‐ 、 , ───‐、
  |   |(_)(_)l    .l |   | ,'        |│      | |      │
  l  └─‐、 `ー─ ' l  レ   ,'=コ   |└─‐┐   ! `ー─┐   !
  |     ノ     /  lゝ-'ゝ、   l     l   |     /   〈
  l   l ̄ ̄  r─‐ ´  / r─‐´   / ┌─‐┘   ! r─‐´   ヽ
  |   !    │     , r'  l     , r'   |      |│     ,r、  ,!
  └‐┘   └─ ' ´   └─ ''´   └───‐' └─ ' ´ `ー'
                                  /\___/ヽ
    (.`ヽ(`> 、                      /''''''   '''''':::::\
     `'<`ゝr'フ\                 +  |(●),   、(●)、.:| +
  ⊂コ二Lフ^´  ノ, /⌒)                 |  ,,,ノ(、_, )ヽ、,, .::::|
  ⊂l二L7_ / -ゝ-')´                .+ |   `-=ニ=- ' .::::::| + .
       \_  、__,.イ\           +     \   `ニニ´  .:::/    +
        (T__ノ   Tヽ        , -r'⌒! ̄ `":::7ヽ.`- 、   ./|  .
         ヽ¬.   / ノ`ー-、ヘ<ー1´|  ヽ | :::::::::::::ト、 \ (  ./ヽ
          \l__,./       i l.ヽ! |   .| ::::::::::::::l ヽ   `7ー.、‐'´ |\-、
     _,∩_         _,∩_           _,∩_
    (_____)ゝ、     (_____)    y     (_____)
    / :: :: :: ヽ 〉     /-‐:: ::‐-ヽ /       / :: :: :: ヽ
   _./ (・ )ll(・ ) ∨     _/  0) i! 0) ∨      _/ ( ・)i!(・ ) ゙、_
 // :: :: ∈ゝ :: ::ヽ   // ::  ‐-‐ :: ヽ    //  :: ー一 :: ヽ\
0728nobodyさん2005/11/27(日) 06:26:12ID:C29mLJPM
どこが 749 行目だ?
こちとらエスパーじゃねぇんだ
0729nobodyさん2005/11/27(日) 06:28:08ID:C29mLJPM
if (($cc_time - $last_ctime) { &e 〜 以下略
elsif (($cc_time - $last_ctime) { &e 〜 以下略

とりあえず文法を学んでみよか?
0730nobodyさん2005/11/27(日) 07:00:10ID:???
対応するカッコの数くらい数えられんものだろうか
0731nobodyさん2005/11/27(日) 07:59:17ID:???
まぁなんだ、茶でも飲んで一服するこった。
0732nobodyさん2005/11/27(日) 14:40:13ID:???
>>726
$cc_timeの左の ( が余分、2箇所
0733nobodyさん2005/11/27(日) 16:58:11ID:???
いくらなんでもネタだろ
0734nobodyさん2005/11/27(日) 17:21:56ID:6lDMwL/x
初歩的な質問で申し訳ないのですが、よろしくお願いします。

print "Content-type: text/html; charset=Shift_JIS\n";
print "set-Cookie: $COOKIE_NAME=$value; expires=$date\n\n";

と書いてクッキーを出力しているのですが、画面に

  Content-type: text/html; charset=Shift_JIS

の1行が表示されてしまいます。どうしてですか?一応クッキーは作成されています。
0735nobodyさん2005/11/27(日) 18:01:28ID:???
print "Content-type: text/html; charset=Shift_JIS\n";
print "set-Cookie: $COOKIE_NAME=$value; expires=$date\n\n";

この2行のあとにさらに Content-type〜 をprintしてるからでしょ。
0736nobodyさん2005/11/27(日) 18:43:40ID:???
>>734
実行環境を書け。話はそれからだ。
0737nobodyさん2005/11/27(日) 20:48:09ID:???
>>734
「画面」とは? 標準出力? ブラウザ?
0738nobodyさん2005/11/28(月) 13:58:44ID:MRaDdba7
>>737
cookieのこと言ってんなら>>734はブラウザのことなんじゃねーの?
0739nobodyさん2005/11/28(月) 17:59:22ID:cDaON9yM
松島
秩父
hogehoge 癒し系
松本

↓上のテキストを処理後、下のようにしたい↓

松島
秩父→hogehoge 癒し系
松本

処理の1つ先回りをして、対象の1つ前の行の先頭に「hogehoge」がある場合、対象の列とhogehogeが先頭に存在する列に対して指定の処理するようにしたいのですが、

for my $ii (0..$#text) {
if("hogehoge" eq substr($text[$tn+1],0,8)){
$text1 .= "$text[$ii]→$textall[$ii+1]\n";
$ii++;
}else{$text1 .= "$textall[$ii]\n";}
}
↑のように組んで実行したところ

松島
秩父→hogehoge 癒し系
hogehoge 癒し系
松本

のようになってしまいます。
ループのたびにmyで初期化してしまうため$ii++が無駄になってしまうために起こってると思うのですが、$ii++を生かすようにするには、どのように変えたらよいですか?
0740nobodyさん2005/11/28(月) 18:14:59ID:???
>>739
こっちのforループ。
for(my $ii = 0; $ii < @text; $ii++) {

どうでもいいかも知れないけど、
substr()よりindex()使ったほうがスマートに思う。
0741nobodyさん2005/11/28(月) 18:18:12ID:???
>>739
その場合、行を無視すると単純になる(sオプションを使う)

松島\n秩父\nhogehoge 癒し系\n松本 が
松島\n秩父→hogehoge 癒し系\n松本 に置換できればいい。

あとn行先読みするときはpush,shiftを一時配列に対して使うのが楽かも。
0742nobodyさん2005/11/28(月) 18:40:40ID:???
>>740-741
ありがとうございましたっ。
0743nobodyさん2005/11/28(月) 18:44:40ID:???
配列じゃなくてテキストだったらこんなのでも。

my $test =<<"EOT";
松島
秩父
hogehoge 癒し系
松本
EOT

$test =~ s/\n(?=hogehoge)/→/g;
0744nobodyさん2005/11/28(月) 18:48:54ID:???
>>743 == >>741
07457432005/11/28(月) 18:56:49ID:???
本当だ、質問レスしか見てなかったので気づかなかった。
07467412005/11/28(月) 19:32:34ID:???
「(sオプションを使う)」のところは必要なかった。訂正。
0747nobodyさん2005/11/28(月) 20:20:33ID:???
perl使いを目指しています、最近CGI.pmライブラリなるものを
知り使うようになりました、今までPOSTやGETメッソッドによる
変数の受け渡しなんか、フォームのデコード処理とか、その逆とか
ゴリゴリ書いていましたが、これを使うようになって
なんとなく、あまりにあっけなくて
( ゜д゜)ポカーン状態なのですが
こんなヌル湯に漬かって漏れは一人前のperl使いに成れるでしょうか?
それと、CGI.pmの弊害とかってありますか?
0748nobodyさん2005/11/28(月) 20:31:37ID:???
そんなもんです
わざわざ内部までさぐるのは時間の無駄ですので
その調子でモジュールを使いまくりましょう
0749nobodyさん2005/11/28(月) 20:33:10ID:???
その勢いでphpを知ると更にポカーン、な予感
07507472005/11/28(月) 20:52:10ID:???
perl使いの諸兄ども、どうもです
ライブラリ使うと確かに内部で何をやってるのか、全く分からないが
良い点としては、コードが少ない!見やすい!読みやすい!ですね
ゴリゴリ時代は自分でプログラム組んでいても3日もすればハァ?ってな
事がたまにありましたが今は逆なのらー、
ライブラリにおまかせする部分はおまかせして
簡単に正規表現による、文字処理とかハッシュによる構造体の変数の受け渡しや
参照の仕方等がスラスラできるように禿げみます。
0751nobodyさん2005/11/28(月) 20:52:24ID:???
おれは未だに自作のURLデコードや文字コード変換だな。
使うモジュールは strict, vars, lib ぐらいかな。
0752nobodyさん2005/11/28(月) 20:52:31ID:???
弊害というか、標準モジュール付いてない古いPerlの入っているサーバで動かないくらいかな。
0753nobodyさん2005/11/28(月) 21:03:26ID:???
既存モジュールの再利用のうまさも実力の内。
0754nobodyさん2005/11/28(月) 21:04:41ID:???
CGI.pmは要らないメソッド大杉。
無駄にコンパイルする時間を食ってる。
0755nobodyさん2005/11/28(月) 21:10:10ID:???
>>754
ほかに lightweight なおすすめがあればおしえてぷりーず。
0756nobodyさん2005/11/28(月) 21:15:18ID:???
CGI::Lite(笑)
0757nobodyさん2005/11/28(月) 21:38:42ID:???
(笑)
0758nobodyさん2005/11/28(月) 22:22:30ID:???
w
0759nobodyさん2005/11/28(月) 23:17:50ID:???
CGI::Liteはデフォでついてくる?
0760nobodyさん2005/11/28(月) 23:21:46ID:???
ノンノン
0761nobodyさん2005/11/28(月) 23:33:07ID:jymxeugY
ちわ。
テキストエリア(<TEXTAREA></TEXTAREA>)から送信されたテキスト内容を受け取って、
ファイルに書き出す処理を書いてます。

各行に、例えば、<BR>なんてタグをつけて出力しなおしたくて書いているんですが、どうも
意図しない改行がきてしまいます。

こいつはどこからやってきているのか。
あるいは、ここコードこうだろなんて教えていただけないでしょうか。
($buffの取得の時点でおかしい?)

コード:
#$buff取得したマルチラインのテキスト
@s_text = split(/(\r\n|r\|\n)/, $buff, 20);
open(FN, ">new.htm");
foreach $mod_line (@s_text){
$mod_line = "$mod_line" . "<BR>\n";
print FN "$mod_line";
}

元データ:
1行目
2行目
3行目

結果:
1行目<BR>

2行目<BR>

3行目<BR>
↑改行が一個多い。
07627612005/11/28(月) 23:38:52ID:jymxeugY
761の書き込みの結果嘘ついた。
出来たファイルの中身をコピペすると、以下のようになります。
コピペするとなんか改行増えてる?とにかく欲しいのは3行のデータなんです。
1行目<BR>


<BR>
2行目<BR>


<BR>
3行目<BR>
0763nobodyさん2005/11/28(月) 23:41:43ID:???
>>761
- @s_text = split(/(\r\n|r\|\n)/, $buff, 20);
+ @s_text = split(/\r\n|r\|\n/, $buff, 20);

ではどう?
0764nobodyさん2005/11/28(月) 23:46:41ID:???
>>761-762
http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify
http://www.din.or.jp/~ohzaki/perl.htm#CRLF_2BR
0765nobodyさん2005/11/28(月) 23:52:08ID:LjPWibfY
見てみ
http://www.neet-ch.net/home3.html
■ このスレッドは過去ログ倉庫に格納されています