トップページphp
981コメント337KB

くだすれPerl(超初心者用)3

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2009/03/31(火) 22:20:27ID:???
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Perl使いが優しくコメントを返しますが、
お礼はPerlの布教と初心者の救済をお願いします。

前スレ
くだすれPerl(超初心者用)2
http://pc11.2ch.net/test/read.cgi/php/1204488452/

関連スレ
Perlについての質問箱 39箱目
http://pc12.2ch.net/test/read.cgi/tech/1234181856/
Perlコーディング初心者質問スレ Part 59
http://pc11.2ch.net/test/read.cgi/php/1234752149/
【Perl上級者コーナーPart01】
http://pc11.2ch.net/test/read.cgi/php/1024741312/
0552nobodyさん2010/01/06(水) 07:43:05ID:???
突っ込まれそうだから一応いっとくけど厳密にはPSGI対応な。
0553nobodyさん2010/01/06(水) 13:08:53ID:???
ド初心者にCatalystを勧める男の人って・・・
0554nobodyさん2010/01/06(水) 17:26:03ID:U4hPtr/3
〜日で覚える

みたいなシリーズは一番買ってはいけない本だと思うのだが・・・
0555nobodyさん2010/01/06(水) 17:28:41ID:???
他サイトで教えていただいたPerlのプログラム(?)なんですがわからないので
解説をしていただきたいのですがここに載せても大丈夫なのでしょうか?

教えていただいた方とは連絡がとれなくなってしまいその人に解説していただくのは不可能です。
捨てメールアドレスを作ってここに載せ連絡をくれた方に送り解説していただく、という形のほうがいいでしょうか?…
0556nobodyさん2010/01/06(水) 17:47:20ID:???
後出しじゃんけんなしで、長くならないように。
あとソースをどこかにアップして、それへのリンクを貼ればよいかと。
0557nobodyさん2010/01/06(水) 18:26:00ID:???
http://www.dotup.org/uploda/www.dotup.org534661.zip.html
pass:2perl です

アップローダーを使ったことないのでちょっと不安ですが…
.txtファイルを一応ALZipで圧縮しています…
0558nobodyさん2010/01/06(水) 18:35:10ID:???
s{qw /:seandard/}{qw/:standard/};

>>557
昨日辺りに「10日でおぼえる Perl/CGI 入門教室 第2版」を買った記憶はない?
0559nobodyさん2010/01/06(水) 18:49:20ID:???
>>558さん
 
購入しました。

use CGI qw /:seandard/;っていうのが買った本には載っていなく検索してみたら
モジュール(?)みたいなことがでてきてここで戸惑っていました
 
他の部分は見て、調べてを繰り返していてparamがパラメータを指している(?)
などということがわかってきたって感じです
0560nobodyさん2010/01/06(水) 23:50:12ID:???
連絡が取れなくなってしまいってこのスレだろwwwwwwww
何モンだあんた
0561nobodyさん2010/01/07(木) 13:58:16ID:???
>>507を書いた自分が来ましたよ
0562nobodyさん2010/01/07(木) 18:03:26ID:cG1x4224
>>560さん
>>557を教えていただいたのはこのスレではなく違うサイトでメールで個人的に教えていただきました。

>>557はまだよく理解できていません…
 
>>561さん
あれから動かなく(?)なってしまいました
 
携帯サイトで使いたいです。
また一度に複数送信したいのですが…
0563nobodyさん2010/01/08(金) 08:56:16ID:???
>>562
ご自分のパソコンにWebサーバーの構築はされましたでしょうか?
ご購入された本にWebサーバー構築のことは書かれてはいませんか?

それから、まずコマンドラインから実行して、最低限のバグは取りましょう。
DOSプロンプトから

C:\>perl xxx.cgi

と打てばいいだけです。

>#!/usr/bin/perl
これは必ずファイルの”先頭行”に書かなければいけません。
Perlを実行するプログラムがどこにあるのかを記述しています。

>use CGI qw /:seandard/; → use CGI qw/:standard/;
use文は、モジュール(特定の機能を集めた関数とデータ群)を現ファイルに読み込みます。
この場合、CGIに必要な機能を集めたCGIモジュールをこのファイルに読み込んでいます。

qw/ /で、その機能のどれを(どのように)使うかを指定します。
今回の:standardは、オブジェクト指向形式でなく関数形式でも使うという指定です。
0564nobodyさん2010/01/08(金) 08:57:47ID:???
>my $q = new CGI → my $q = new CGI;
CGIモジュールのオブジェクトを作り、それを$qという変数に入れています。
$qには、各種データが入っています。
以降、この$qを用いて様々な処理をすることができます。

>my $a = $cgi->param('a'); → my $a = $q->param('a');
>my $b = $cgi->param('b'); → my $b = $q->param('b');
フォームで送られてくるデータを取り出します。
name="○"の○を引数にすることで、そこで入力された値が取り出せます。
$q->xxxとは、$qというオブジェクトに関連付けされた関数xxxを呼び出すという記述です。

>print $q->header;
サーバーからブラウザに送られてくるデータ(レスポンス)はヘッダーと本文に分かれますが、
ブラウザに出力されるのは本文のみです。

ヘッダーには、様々な制御命令が記述されています。
この文は、そのヘッダーを出力しています。

>print $q->start_html;
HTMLの冒頭に必要な各種情報を出力します。

>print << "EOF";
>$aはaで受け取る
>$bはbで受け取る
>EOF
ブラウザに実際に書かれるHTML文章です。

>print $q->end_html;
HTMLの最後に必要なタグを出力をします。

>exit;
プログラムを終了する関数です。
0565nobodyさん2010/01/08(金) 17:40:50ID:???
解説ありがとうございます。

私自身がCGIモジュールというものを作らなければならないのでしょうか?…
サーバーにはよくわからないのでパーミッションを700であげています

外部のサイトには送れるんですが自分のサイトの中でフォームの送受信がいまだにできない状態です…
難しいですね…
0566nobodyさん2010/01/08(金) 17:42:37ID:???
自分のサイト内ってのがよくわからんのだけど、LAN内にメールサーバー立ててるの?
だとするとDNSも立てないとダメだよ?
0567nobodyさん2010/01/08(金) 18:01:17ID:???
今の目標がページAで入力した文字列「あいうえお」をページBに送り「あいうえお」と表示させたいのです。
携帯でも使えて、表示する部分は自分で選べる、複数(入力欄1に「あいうえお」、入力欄2に「かきくけこ」)にも対応させたいです。
 
一番簡単にたとえると、メールフォームで文字を打つ→送信前の確認ページ→送信完了
の「メールフォームで文字を打つ→送信前の確認ページ」ここです。
 
説明が下手で申し訳ないです。
0568nobodyさん2010/01/08(金) 18:05:11ID:???
いや、そうじゃなくて「自分のサイト」ってどこの話?
LAN内? レン鯖?
0569nobodyさん2010/01/08(金) 18:46:14ID:???
LAN内ってなんでしょうか…?

レンタルサーバーです。
0570nobodyさん2010/01/08(金) 18:51:46ID:???
>>565
CGIモジュールは先駆者が既に作っています。
標準で入っているので、どこからか持ってくる必要はないです。

use CGI;の一文で使えるようになります。

Perlの場合、必要そうなモジュールは大概、誰かが作っていて、様々なモジュールを組み合わせて
プログラミングしていくことになります。

WAF(Web Application Framework)と呼ばれている大きなモジュール群あり、これはページ遷移等
の大枠が既に作られていて、比較的簡単に大規模Webアプリを作ることができます。
0571nobodyさん2010/01/08(金) 19:27:43ID:gGxGm+Hx
sub password{
my @u; open(IN,$guestfile); @u=<IN>; close(IN); chomp(@u);
@u=grep($in{'handle'},@u);
return $u[0];
}

● $guestfile: 文字通りゲストの password, handle, etc. を記録したファイルの path.
● $in{'handle'}: STDIN から受け取ったゲストのハンドル.

読み取った情報からハンドルが一致するパスワードを選び出せるはずだったのに,
ハンドルが一致しなくてもパスワードが返って来るっぽ (`д´)うわぁ〜ん.
ど, どうして ?
0572nobodyさん2010/01/08(金) 19:31:55ID:???
$guestfile: $in{'handle'}: の方のコードも見せてもらえないとなんともいいようがないが
スコープ周りが怪しい
0573nobodyさん2010/01/08(金) 19:36:42ID:???
>>569
レン鯖でperlの勉強してるの!?
つかよく許してるなそのレン鯖屋も
0574nobodyさん2010/01/08(金) 19:45:07ID:gGxGm+Hx
>>572
す, 素早い回答ありがとうございます.
もしかして grep() がダメなら loop でぶん回すしかないかな? とアレコレ...

>$guestfile: $in{'handle'}: の方のコードも
zip 圧縮して後ほど upload します.
(叩きどころ満載かと思いますが...)
0575nobodyさん2010/01/08(金) 19:52:08ID:???
後怪しそうなのは、引数の型か
0576nobodyさん2010/01/08(金) 20:06:41ID:gGxGm+Hx
>>530
お手数ですが...
 ttp://homepage2.nifty.com/alter/bbs.zip
0577nobodyさん2010/01/08(金) 20:07:39ID:???
> @u=grep($in{'handle'},@u);

$in{'handle'}が真であるという条件だけで素通ししてるように見えるんですけど
0578nobodyさん2010/01/08(金) 20:10:57ID:gGxGm+Hx
>>530
母音を省略した subroutin, valiable が ほとんどなので
他人様に解読していただくのは極めて困難を極めるかと orz...
0579nobodyさん2010/01/08(金) 20:16:04ID:???
>>573さん

そうです。携帯サイトを作りながら開いたスペースで練習しています。
なのでフォームの送受信というのでしょうか、それができるようになりたいのですが…
0580nobodyさん2010/01/08(金) 20:17:54ID:gGxGm+Hx
訂正: valiable -> variable
0581nobodyさん2010/01/08(金) 20:29:36ID:???
じゃあこっちもだな
subroutine
0582nobodyさん2010/01/08(金) 20:34:14ID:???
> sub psw{
>  my @u,@v; open(IN,$gst); @u=<IN>; close(IN); chomp(@u);
>  my $hdl=$in{'hdl'}; @v=grep($hdl,@u);&dlg(@v);
>  @u=split("\t",$u[0]);
>  return $u[0];
> }

うーん、変数名の付け方とか詰めすぎは「俺の勝手だ」かもしれないけど
古文書を参考にするのはやめたほうがいいよ。sub decode とか sub tim とか。

>>577の指摘どおりなので perldoc -f grep
0583nobodyさん2010/01/08(金) 20:52:18ID:gGxGm+Hx
>>581
;(;_;);

>>582
自給自足で使うつもりだったので他人様に見せようとは夢にも考えてなかったんれす.
取り敢えずは動いているものの完成にはまだまだ遠い道が...
ところで "古文書" とは どういうことでしょうか ?
正直, 本よりも web で調べて アレコレ試行錯誤中なんですが.
0584nobodyさん2010/01/08(金) 21:07:53ID:???
>>583
旧時代の遺物と化したコードの事
0585nobodyさん2010/01/08(金) 21:13:55ID:???
>>583
古文書って書いたのは>>583の通り。わざわざ昔の手法を覚えてしまってる。

例えば sub decode {} するより CGI.pm を使いましょう、なんだけど
参考にしてるリソースがよろしくないんだろうね。
0586nobodyさん2010/01/08(金) 21:14:51ID:???
アンカーミスった。>>584の通り。
0587nobodyさん2010/01/08(金) 21:16:25ID:gGxGm+Hx
>>584
なるほど. (σ(^_^;)の脳味噌が まさに旧時代の遺物だったりして.)
参考までに新時代のコードってのはあるんすか ?
まさか, OOP ?
perl の OOP って, おいらにはサパ〜リ.
0588nobodyさん2010/01/08(金) 21:22:27ID:???
>>587
その通り
モジュールを使えって話だ
0589nobodyさん2010/01/08(金) 21:49:30ID:???
>>571 です.

アドバイスくださった方々, ありがとうございます.
ご指摘いただいたことを参考に, 調べなおします.
また来る事になるかもしれません, そのときは よろぴく.
0590nobodyさん2010/01/09(土) 18:37:43ID:???
>>571 っす.
結局, loop でぶん回すことにしました. <- ダサいやり方だとは思いますが.
(sub decode と同様なやり方です)
そもそも grep(/〜/,@a) の使い方が理解できていないっす.
(というか JavaScript の new RegExp() みたいな使い方が perl にもあるのかどうか ???)

あと, CGI.pm は nifty では使えない模様っす.
(server 借りて本格的にやるほどのネタの持ち合わせがありません)
(制限多すぎとはいえ, 100MB のスペースを利用しない手はないと考えてます)
0591nobodyさん2010/01/09(土) 19:17:04ID:???
使えないってことあるの?
入ってないなら、CPANから持ってくるとか。
0592nobodyさん2010/01/09(土) 19:24:56ID:???
パスワードを記述したファイルが
USERNAME \t PASSWORD \n
という仮定で

my $idpass;
open(INFH, '<', $guestfile);
read(INFH, $idpass, (-s INFH));
close(INFH);
$idpass =~ /\n$in{'handle'}\t(.*?)\n/s;
return $1;
0593nobodyさん2010/01/09(土) 19:32:08ID:???
>>591
 ttp://homepage.nifty.com/faq/faq_b4.htm#q5
"use/requireで外部関数(モジュール)をコールする場合は、
perlの標準モジュールを@homepageのシステムでは用意しておりませんので
使用することはできません"

"自分で用意したらどうか" と言う問題に付いては
Google でもヒットしますが実際に実験をした人はいない模様っす."
アッシがやれば それなりのネタになるかもですが そもそも .pm を使いこなせないので...
0594nobodyさん2010/01/09(土) 19:40:36ID:???
つーかこういう事は連想配列でやるだろ
0595nobodyさん2010/01/09(土) 19:43:59ID:???
>>592
>パスワードを記述したファイル:
TSV 形式で {cipher, handle,IP} を記録してます.
ついでに書きこみ回数なども記録するのも おもしろいかも ?
で, 仮にハンドルに数字を使われた場合に
IP とマッチングする可能性も考えられるので今のやり方に落ち着きました.

わざわざサンプルを書いてくださり, ありがとうございます.
0596nobodyさん2010/01/09(土) 19:44:07ID:???
strict.pm すらない環境で苦行を重ねなくてもいいと思う。
0597nobodyさん2010/01/09(土) 19:47:15ID:???
>>594
仰せの とおりです!
このケースでは たぶん これがベストのやり方かも ?
0598nobodyさん2010/01/09(土) 19:58:23ID:???
whileで回して見つかり次第returnしたほうが速くねーか?
0599nobodyさん2010/01/09(土) 20:06:03ID:???
>>598
記録するときにもチェックをして重複記録しないようにしてます.
それと, そもそも書きこむのが自分だけだったりして... (;_;)
個人サイトでのゲストの人数なんて問題にならないかと.
0600nobodyさん2010/01/10(日) 22:35:25ID:???
他のサーバでやることを勧めるが……
後、パスワードはMD5やSHA-2にして保存した方がセキュリティ上いいんじゃない?
0601nobodyさん2010/01/11(月) 00:25:31ID:???
こんにちわ、質問させてください。

今、以下の流れを処理するスクリプトを書いています。
1.ファイルを参照して、区切り文字<>で連結された文字列を取り出す
2.連結解除し、一行分の情報をハッシュにまとめた後、ハッシュの配列を一つ作る
3.ファイルを参照して、テンプレート化されたHTMLを取り出す
4.HTMLに埋め込まれた変数を正規表現で置換する

この4つ目の部分で悩んでいます。
以下が当該箇所のスクリプトです。
foreach $elm (@articles){
undef(@tmp1);
foreach $tmpl (@template){
$tmpl =~ s/\[\% name \%\]/$elm->{name}/g;
$tmpl =~ s/\[\% mail \%\]/$elm->{mail}/g;
push(@tmp1, $tmpl);
}
push(@tmp2, @tmp1);
}

もう一日考えて頭がパンクしそうなので、どなたかお答えいただけないでしょうか?
私の方でもしばらくまた考えてみます。。。
0602nobodyさん2010/01/11(月) 00:46:48ID:???
何を教えて欲しいのか書けよ
0603nobodyさん2010/01/11(月) 01:08:19ID:???
>>602
すみません、失念していました。

仕様通りに動いてくれないのは、
foreach $tmpl (@template){処理;}
の部分です。
最初の方のループで$elmを回しているにも関わらず、
@tmp2に入っている$elmの値が$elmの最初のもののみとなってしまっている状況です。
以下が処理した結果となります。

name : 1
mail : 1@hoge
name : 1
mail : 1@hoge

これを以下のように回るようにしたいのです。

name : 1
mail : 1@hoge
name : 2
mail : 2@hoge
0604nobodyさん2010/01/11(月) 01:15:38ID:???
push @tmp2は要らないだろ。
で質問は、結果がこうなってしまうってことだよな?
name1 = mail1@microsoft.com
[name1] as [mail1@microsoft.com]
name1 = mail1@microsoft.com
[name1] as [mail1@microsoft.com]

use strict;
use warnings;
my (@articles, @template);
my @data = <DATA>;
for my $d (@data[0..1]) {
  chomp $d;
  my ($name, $mail) = split(/<>/, $d);
  my $element = { name => $name, mail => $mail, };
  push @articles, $element;
}
push @template, @data[2..3];
my @output;
for my $elm (@articles) {
  for my $tmpl (@template) {
    $tmpl =~ s/\[\% name \%\]/$elm->{name}/g;
    $tmpl =~ s/\[\% mail \%\]/$elm->{mail}/g;
    push @output, $tmpl;
  }
}
print @output;
__DATA__
name1<>mail1@example.com
name2<>mail2@example.com
[% name %] = [% mail %]
[[% name %]] as [[% mail %]]
0605nobodyさん2010/01/11(月) 01:17:04ID:???
ちくしょー整形している間に先を越された
0606nobodyさん2010/01/11(月) 02:36:45ID:???
>>604
こんな短時間で…ありがとうございます!
見たところchompしている部分と@tmp2を使わない以外は同じのようですね。
06076042010/01/11(月) 02:48:37ID:???
いや、同じなんだよ。
答える奴が手元で実行しやすいようにと思ってさ。

  for my $tmpl (@template) {
    my $t = $tmpl;
    $t =~・・・

と一度他のレキシカル変数に代入して、そちらを置換すれば望んだ結果は得られるんだが、
$tmplの置換で@templateの中身も書き換わってしまう理由が俺には分からなくて説明できないんだ。
誰か他の奴頼む。
0608nobodyさん2010/01/11(月) 03:08:41ID:???
perldoc perlsyn
>LIST の要素が左辺値であった場合、ループの中で VAR を変更することにより、
>対応する値を変更することができます。逆に、LIST の要素が左辺値でない場合は、
>この要素を修正しようとしても失敗します。言い換えると、foreach ループの
>帰納変数がループの対象となっているリスト中の個々のアイテムに対するエイリアスになっているからです。
06096012010/01/11(月) 03:13:29ID:???
>>607
むつかしいですね。
ひとまず他の変数に代入してやると言う方法で、この場はしのいでみようと思います
こんな遅くまでありがとうございます!

>>608
ありがとうございます!
perldocも良く読んでおくべきでしたね。。。
0610nobodyさん2010/01/14(木) 13:58:55ID:???
ユーザー登録、認証などのサンプルコードでオススメありますか?
0611nobodyさん2010/01/16(土) 21:41:57ID:???
subroutin を呼び出すには " &sub " と言った書き方をするもんだと思ってました.
ところが sub() てな感じでも良いらしいことをこの板のスレッドで発見.
だまされたつもりで試して見ると普通に通る模様.
js と同じスタイルになるので こっちの方が良さそう.

ところで, これって perl 使いに取っての常識 ?
(Google でヒットする解説サイトの どこにも書かれてなかったけど)
もしそうだとするのなら, 他にも同様なことが あるのかしらん ?
0612nobodyさん2010/01/16(土) 22:13:58ID:???
&付きの呼び出しはPerl4時代の遺物なので避けるのが常識。
とりあえずここ参照。コメント欄も含めて。
http://blog.livedoor.jp/dankogai/archives/51237271.html
0613nobodyさん2010/01/16(土) 22:33:59ID:???
>>612
ありがとうございます.
掲示板自作に半年 ? いや, かれこれ 5年目かも (゜w゜)
いつになったら完成するのやら.
でも, 最初の頃と比べれば...
0614nobodyさん2010/01/26(火) 00:22:20ID:???
SSIから流れてきた難民です。
というのも、SSIを動かすmodにバグが見つかったからです。
出力する文字コードはUTF-8で、Perlスクリプト文字コードはEUC-JPです。

/foo.shtmlを完全にPerl化して、
/foo/bar.shtmlから読み込めるようにしたいです。

--/foo/bar.shtml--
<!--#set var="pgtitl" value="サーバー環境" -->
<!--#include virtual="/foo.(cgiにしたいなぁ……)" -->

--/foo.shtml--
<!--#if expr="${pgtitl}" -->
<h1><!--#echo var="pgtitl" --></h1>
<!--#endif -->
0615nobodyさん2010/01/26(火) 00:23:56ID:???
尚、>>614のshtmlコードはあくまでも一部分抜粋です。
0616nobodyさん2010/01/26(火) 00:35:33ID:???
>>615
http://search.cpan.org/~tskirvin/CGI-SHTML-1.29/CGI/SHTML.pm

多分SHTMLのパーサ
0617nobodyさん2010/01/26(火) 00:39:47ID:???
mod_include のバグが見つかったって何だろう。
0618nobodyさん2010/01/26(火) 01:36:08ID:???
>>617
これかな?(検索したら出てきた)
https://forums.ubuntulinux.jp/viewtopic.php?pid=48428
0619nobodyさん2010/01/26(火) 16:46:15ID:???
これかな?(検索したら出てきた)
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1035823010
06206142010/01/26(火) 22:09:36ID:???
全部俺です。全然回答が得られずにここに流れてきたというのが実情です。
0621nobodyさん2010/01/26(火) 23:06:18ID:???
>>614, >>620
>#include virtual
おいら, まだヒヨッコだけど,
そして, SSI はまったく調べたことがないけれど,
要はhtml ファイル (template)を読み込んで
部分的に replace するだけじゃないのかな ?

だったら おいらでも なんとか...
(だけど ここの先輩たちの回答がないのはなぜ ?)
0622nobodyさん2010/01/26(火) 23:24:53ID:???
意味がわからんから答えようがないだろwwwwwwwww

で、「Perlスクリプト文字コードはEUC-JP」とあるけどbar.shtmlにEUC-JPで書いた文字を
Perl/foo.cgiを#includeさせてUTF-8として表示されればいいのか?

#/path/to/perl

use Encode qw/from_to/;
from_to($ENV{pgtitl}, 'shiftjis', 'utf8');
print "<h1>$ENV{pgtitl}</h1>";

こうか?
0623nobodyさん2010/01/26(火) 23:25:54ID:???
違うか
from_to($ENV{pgtitl}, 'euc-jp', 'utf8');
0624nobodyさん2010/01/26(火) 23:52:22ID:???
>>614のどこにも質問文がないからなぁ
06256142010/01/27(水) 05:00:54ID:???
すみません、質問書き直します。
呼び出し時に、SSI変数か、CGIの引数で文字列を入力して、
UTF-8で出力するCGIを作ろうとしているわけですが、
print "<h1>$ENV{pgtitl}</h1>";
だと、SSI変数が読めません。

フローチャート
________________
|入力             |
|UTF-8(SSI呼び出し)引数付き  |
|<!--#exec cgi="foo.cgi    |
| サーバー環境" -->      |
|_______________|

________________
|処理             |
|引数が存在するか?      |
|はい>>引数をエンorデコード  |
|いいえ>>プリントしない    |
|_______________|

________________
|出力             |
|UTF--8で           |
|引数を<h1>に入れて出力    |
|_______________|
06266142010/01/27(水) 05:30:17ID:???
#!/usr/bin/perl
use Encode qw/from_to/;
print "Content-type: text/html\n\n";
print "<h1>$ENV{pgtitl}</h1>";
$niti = "FONOの日常";
from_to($niti, 'euc-jp', 'utf8');
print "$niti";
exit;

入力がUTF-8だったので、そのままスルーで良かったんですね。
CGIに書かれている文字がeuc-jpなので、変換しないとだめなようですが。
把握しました。
0627nobodyさん2010/01/27(水) 07:28:37ID:???
>>616に対してなんかリアクションしてくれないか?
全然なにがやりたいかわからんから>>621と同じ解釈してパーサーっぽいの探してきたんだけど
あと前提条件として何があって、結果何がしたいのか言ってもらわんと誰も疑問に答えることはできんと思うが
0628nobodyさん2010/01/27(水) 08:30:00ID:???
>>625-626
SSI もどきの動作を CGI に置き換えたいのかと思いきや, 違うようだねぇ.
というか, 余計, やりたいことが見えなくなったですぜぃ.
どこでも回答を得られなかったそうだけど, 合点が行きますぜ.
固定観念を捨てて すなおにやりたいことを書くようにしないと...

漂流の旅は 延々と...
06296142010/01/27(水) 18:18:11ID:???
>>616-628
質問文に基礎的な欠陥がありました。すみません。

>>616>>627
パーサーではなくて、完全にPerlに書き換えるということです。
まさか、PerlにSSIのパーサーがあるとは。今後またパーサーにもお世話になると思います。

>>621
各ページの、ヘッダー・フッター・メニューの書き出しをSSIにさせていましたが、Apacheをアップデートしたら、文字化けするようになったので、Perlに文字化けする部分を置換しようかという話になりました。

質問を落ち着いてから要約すると、UTF-8のSHTMLから引数かなんらかの形で文字列を与えて、その文字列を、HTMLにはめ込んで、出力するものです。
たとえば、ああああという文字列を与えられたら
<title>FONOの日常 - ああああ</title></head><body><h1>ああああ</h1>
というふうに同じ文字を沢山のところに挿入して出力します。手軽さや、時間の関係でSSIを使っていて、アップデートしたら、mod_includeのバグで文字化けになって慌てました。

>>622-623
まさにそれです。そのコードを少し編集し>>626になり、それをにはめ込み、文字化けが解決しました。mod_includeのアップデートが来るまで待ちたいと思います。

たくさんの回答ありがとうございました。

今度質問するときはしっかり分かるよう、慌てずに、要所を押さえてから質問します。
0630nobodyさん2010/02/07(日) 16:21:07ID:???
質問です。

以下の配列
@hoge1 = (
'01,aa,bb',
'02,aa,bb',
'03,cc,dd',
'02,cc,dd'
)
これを
@hoge2 = (
'01,aa,bb',
'02,aa,bb,cc,dd',
'03,cc,dd',
)
というように、最初の数字が一緒なら数字以降のデータを連結したいです。
よろしくお願いします。
0631nobodyさん2010/02/07(日) 17:07:49ID:???
my %foo;
for (@hoge1) {
  /\A(\d+)(.*)\z/s;
  $foo{$1} = exists $foo{$1} ? "$foo{$1}$2" : "$1$2";
};
my @hoge2 = values %foo;
0632nobodyさん2010/02/07(日) 17:15:19ID:???
順番が違う
0633nobodyさん2010/02/07(日) 17:27:28ID:???
んじゃこれで

my %foo;
my @sort;
for (@hoge1) {
  /\A(\d+)(.*)\z/s;
  if (exists $foo{$1}) {
    $foo{$1} = "$foo{$1}$2";
  } else {
    $foo{$1} = "$1$2";
    push @sort, "$1";
  }
};
my @hoge2 = @foo{@sort};
0634nobodyさん2010/02/07(日) 17:33:29ID:???
うむ、大分よくなった。
次は同じ数値のやつで値が重複してれば取り除くことかな
更に値を昇順に並べる
できればだけど、初心者にできるだけわかり易いコードで書くか、難しいコードにはコメント付けることかな
06356302010/02/07(日) 18:32:40ID:???
>>633
書式の意味はさっぱり分かりませんが、思い通りに出来ました。
ありがとうございました。

>>634
これは、とあるデータファイルなのですが、現在の仕様では書き込み時に
行頭のデータを見つけて同じなら追加できるようになっています。
また重複しないようにもなっています。
今回、過去のデータが1データ1行という仕様だったものを現在の仕様に
合わせて効率化(読み込み回数の減少)を図りたかったので知恵を
拝借させていただきました。

では、これから数十万ファイルを変換します。。。
ありがとうございました。
0636nobodyさん2010/02/10(水) 04:24:28ID:SN+dhl64
iPhoneをつかっているのですが、ケータイ相手だとメールのヘッダに差出人の名前が含まれておらず後で見返すときに不便です。
ですので、受信メールをemlで書き出して編集をしようと思っています。
今はシェルスクリプトを使って以下のように行っております。

for file in *.eml;
do

sed -e 's/From: yamada@softbank.ne.jp/From: =?ISO-2022-JP?B?GyRCOzNFRBsoQg==?= <yamada@softbank.ne.jp>/' $file > tmp.eml;
mv tmp.eml $file;
以下人数分繰り返し。。

done

ですが、これだと、置換が終わったファイルに関してもアクションが行われたりと非効率的なので、
置換が終わったらループを抜けてつぎのファイルに移動するなどすることは可能でしょうか。
0637nobodyさん2010/02/10(水) 06:33:49ID:???
スレ違い
06386362010/02/11(木) 20:43:34ID:???
失礼いたしました。
06396142010/02/12(金) 07:09:14ID:0arSSMW8
614を書いてから15日ぐらいたって、サイトテンプレートに全てPerlを採用する流れになり、急激にPerlの必要性が上がりました。

質問はこうです。

print "<td id=\"menu\" colspan=\"2\"><a href=\"/tsubuyaki.shtml\">呟き</a>$menu[0]\n";
print "<a href=\"/music.shtml\">演奏活動$menu[1]</a>\n";
print "<a href=\"/NNB\">NicoNicoBrowser$menu[2]</a>\n";
print "<a href=\"/live.shtml\">ネットワーク機器監視カメラ$menu[3]</a>\n";
print "<a href=\"/uploader\">アップローダー$menu[4]</a>\n";
print "<a href=\"/ntp.shtml\">公開NTP$menu[5]</a>\n";
print "<a href=\"/manage.shtml\">管理・障害情報$menu[6]</a>\n";
print "<a href=\"/info.shtml\">サーバー情報$menu[7]</a>\n";
print "<a href=\"/contact.shtml\">管理人へ連絡$menu[8]</a></td>\n";

リンク先のshtmlファイルのLastModifiedを取得して、1日以上新しい場合、リンクにNewラベルを追加したい
(つまりmenu[n]の部分に<img src="/main.files/new.png">をprintしたい)
のですが、どのようにすればいいでしょうか?

なおかつ、ここのメニュー生成はパターン化してしまっているので、
リンク先,リンクテキスト,更新フラグ(立ってたら<img src="/main.files/new.png">[newラベル]をプリント)
のように配列にまとめてfor文で一気にprintしまいたいところです。

多分、データ配列化でfor文によるプリントと、更新フラグでリンク画像追加を一気にやってしまえば一番すっきりしていいのですが、
サンプルを2、3件回って、打ち込んでみないと理解できない質なので、急にfor文を使うのは技術力が追いつかず無理です。

賢者の皆さん回答お願いします。
0640nobodyさん2010/02/12(金) 08:34:28ID:???
相変わらず要点のわかり辛い文章だな。「急にfor文を使うのは無理です」とか意味わからんし。
まずfor文で書いてみろよ。添削はしてやるから。そうじゃないと身に付かない。
0641nobodyさん2010/02/12(金) 09:42:53ID:/dEp/DAw
自作掲示板改良, 苦労に苦労を重ねた末, 致命的欠陥を発見. (ありがちなことです)
気晴らしに >>639 の翻訳に挑戦:

サパ〜リわからん!!!

判らない点:
1. "メニュー生成はパターン化してしまっているので"
 ・ その "パターン化メニュー生成" とは ?
2. "のように配列にまとめて"
 ・ "のような配列"とは ?
 ・ 仮に "$menu[n]" が 指し示すものだとしても その中身は "new.png" なのでは ?
3. "データ配列化で"
 ・ では "配列化" したデータのサンプルを...
 (データ構造がきちんと決まっていないのでは ?)
 (loop で ぶん回すこと以前の問題にしか思えない)
0642nobodyさん2010/02/12(金) 10:16:43ID:???
HTML::Template使えよ
0643nobodyさん2010/02/12(金) 10:48:22ID:???
あー・・・とりあえず雛形
use strict;
use warnings;
use Perl6::Say;
my @entries = (
  { url=> '/tsubuyaki.shtml',  title=>'呟き', },
  { url=> '/music.shtml',  title=>'演奏活動', },
  { url=> '/NNB',  title=>'NicoNicoBrowser', },
  { url=> '/live.shtml',  title=>'ネットワーク機器監視カメラ', },
  { url=> '/uploader',  title=>'アップローダー', },
  { url=> '/ntp.shtml',  title=>'公開NTP', },
  { url=> '/manage.shtml',  title=>'管理・障害情報', },
  { url=> '/info.shtml',  title=>'サーバー情報', },
  { url=> '/contact.shtml',  title=>'管理人へ連絡', },
);
for my $entry (@entries) {
  my $mtime = (stat($entry->{title}))[9];
  say $entry->{title}, ' (', $mtime, ') : ', $entry->{url};
}
0644nobodyさん2010/02/12(金) 10:49:19ID:???
うお、一箇所間違えた
まぁいいか
06456142010/02/12(金) 17:12:40ID:0arSSMW8
サーセン。全く文才がない。少しは文章を練ったつもりでいた。

>>640
ですね。やってみたんですがエラーx20over
根気がなくてなおかつ焦っているのが見え見え。
もうちょうっと根気良くやってみます

>>641
配列に入れるのは
リンク先相対URL,リンクテキスト,更新フラグ
を一列にして入れていきます。
更新フラグが立つ(1になる)条件は、LastModifiedが1日以内であることです。
それでできたデータをfor文で1行ずつ書いていくということです。

>>642
もしかしたらページのテンプレート化は全部これで解決かと思い、別ディレクトリ作って仮導入してみたところ
アップローダーのCGIがHTML書き出し型で謎の二重呼び出し、エラーを返すかと思いきやApacheが落ちてしまいました。

>>643
がんばって雛形に従って書いてみます。
0646nobodyさん2010/02/12(金) 17:27:10ID:???
>>645
apacheが落ちるってw
そりゃ間違いなくお前のコードの書き方が悪いわ
0647nobodyさん2010/02/12(金) 17:30:03ID:???
643は動かしてはみたのか?

リアル中学生だっけ。親御さんは気の毒になぁ。
0648nobodyさん2010/02/12(金) 17:40:13ID:???
丸投げスレに投げるのが一番平和な気がする
http://pc11.2ch.net/test/read.cgi/php/1222645553/
06496142010/02/12(金) 18:00:22ID:0arSSMW8
>>646
なぜ落ちるのか原因が解析できないのが技術力の足りなさでしょうかorz

>>643 >>647
動かしてみましたところ。
Error message:
Premature end of script headers: test.cgi
改行コードとパーミッションを確認すること5回。何故だあああああ!?
print "Content-type: text/html\n\n";
を加えてヘッダーを出すようにしてみたり、
モジュールの存在を確認したけれど動かず。
これもまた原因不明o....rz

>>648
丸投げですか。選択肢としては有r(ry……甘えだと思うんだ。

また0から自分で打ってきますので添削お願いします。
0650nobodyさん2010/02/12(金) 18:15:07ID:???
ここで延々と添削してもらうのは甘えではないのか
基準がようわからん
0651nobodyさん2010/02/12(金) 18:20:51ID:???
> 更新フラグが立つ(1になる)条件は、LastModifiedが1日以内であることです。

こんな感じで要求仕様だけ細かいけど何も考えてくれないから添削にもなってないよ。
CLIで叩くもんをCGIで動かして

> 改行コードとパーミッションを確認すること5回。何故だあああああ!?

ってやかましいわ。
■ このスレッドは過去ログ倉庫に格納されています