くだすれ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/
0582nobodyさん
2010/01/08(金) 20:34:14ID:???> 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;(;_;);
>>582
自給自足で使うつもりだったので他人様に見せようとは夢にも考えてなかったんれす.
取り敢えずは動いているものの完成にはまだまだ遠い道が...
ところで "古文書" とは どういうことでしょうか ?
正直, 本よりも web で調べて アレコレ試行錯誤中なんですが.
0585nobodyさん
2010/01/08(金) 21:13:55ID:???古文書って書いたのは>>583の通り。わざわざ昔の手法を覚えてしまってる。
例えば sub decode {} するより CGI.pm を使いましょう、なんだけど
参考にしてるリソースがよろしくないんだろうね。
0587nobodyさん
2010/01/08(金) 21:16:25ID:gGxGm+Hxなるほど. (σ(^_^;)の脳味噌が まさに旧時代の遺物だったりして.)
参考までに新時代のコードってのはあるんすか ?
まさか, OOP ?
perl の OOP って, おいらにはサパ〜リ.
0589nobodyさん
2010/01/08(金) 21:49:30ID:???アドバイスくださった方々, ありがとうございます.
ご指摘いただいたことを参考に, 調べなおします.
また来る事になるかもしれません, そのときは よろぴく.
0590nobodyさん
2010/01/09(土) 18:37:43ID:???結局, 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:???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:???>パスワードを記述したファイル:
TSV 形式で {cipher, handle,IP} を記録してます.
ついでに書きこみ回数なども記録するのも おもしろいかも ?
で, 仮にハンドルに数字を使われた場合に
IP とマッチングする可能性も考えられるので今のやり方に落ち着きました.
わざわざサンプルを書いてくださり, ありがとうございます.
0596nobodyさん
2010/01/09(土) 19:44:07ID:???0598nobodyさん
2010/01/09(土) 19:58:23ID:???0599nobodyさん
2010/01/09(土) 20:06:03ID:???記録するときにもチェックをして重複記録しないようにしてます.
それと, そもそも書きこむのが自分だけだったりして... (;_;)
個人サイトでのゲストの人数なんて問題にならないかと.
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:???すみません、失念していました。
仕様通りに動いてくれないのは、
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:???で質問は、結果がこうなってしまうってことだよな?
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:???こんな短時間で…ありがとうございます!
見たところchompしている部分と@tmp2を使わない以外は同じのようですね。
0607604
2010/01/11(月) 02:48:37ID:???答える奴が手元で実行しやすいようにと思ってさ。
for my $tmpl (@template) {
my $t = $tmpl;
$t =~・・・
と一度他のレキシカル変数に代入して、そちらを置換すれば望んだ結果は得られるんだが、
$tmplの置換で@templateの中身も書き換わってしまう理由が俺には分からなくて説明できないんだ。
誰か他の奴頼む。
0608nobodyさん
2010/01/11(月) 03:08:41ID:???>LIST の要素が左辺値であった場合、ループの中で VAR を変更することにより、
>対応する値を変更することができます。逆に、LIST の要素が左辺値でない場合は、
>この要素を修正しようとしても失敗します。言い換えると、foreach ループの
>帰納変数がループの対象となっているリスト中の個々のアイテムに対するエイリアスになっているからです。
0609601
2010/01/11(月) 03:13:29ID:???むつかしいですね。
ひとまず他の変数に代入してやると言う方法で、この場はしのいでみようと思います
こんな遅くまでありがとうございます!
>>608
ありがとうございます!
perldocも良く読んでおくべきでしたね。。。
0610nobodyさん
2010/01/14(木) 13:58:55ID:???0611nobodyさん
2010/01/16(土) 21:41:57ID:???ところが sub() てな感じでも良いらしいことをこの板のスレッドで発見.
だまされたつもりで試して見ると普通に通る模様.
js と同じスタイルになるので こっちの方が良さそう.
ところで, これって perl 使いに取っての常識 ?
(Google でヒットする解説サイトの どこにも書かれてなかったけど)
もしそうだとするのなら, 他にも同様なことが あるのかしらん ?
0612nobodyさん
2010/01/16(土) 22:13:58ID:???とりあえずここ参照。コメント欄も含めて。
http://blog.livedoor.jp/dankogai/archives/51237271.html
0613nobodyさん
2010/01/16(土) 22:33:59ID:???ありがとうございます.
掲示板自作に半年 ? いや, かれこれ 5年目かも (゜w゜)
いつになったら完成するのやら.
でも, 最初の頃と比べれば...
0614nobodyさん
2010/01/26(火) 00:22:20ID:???というのも、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 -->
0616nobodyさん
2010/01/26(火) 00:35:33ID:???http://search.cpan.org/~tskirvin/CGI-SHTML-1.29/CGI/SHTML.pm
多分SHTMLのパーサ
0617nobodyさん
2010/01/26(火) 00:39:47ID:???0618nobodyさん
2010/01/26(火) 01:36:08ID:???これかな?(検索したら出てきた)
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
0620614
2010/01/26(火) 22:09:36ID:???0621nobodyさん
2010/01/26(火) 23:06:18ID:???>#include virtual
おいら, まだヒヨッコだけど,
そして, SSI はまったく調べたことがないけれど,
要はhtml ファイル (template)を読み込んで
部分的に replace するだけじゃないのかな ?
だったら おいらでも なんとか...
(だけど ここの先輩たちの回答がないのはなぜ ?)
0622nobodyさん
2010/01/26(火) 23:24:53ID:???で、「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');
0625614
2010/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>に入れて出力 |
|_______________|
0626614
2010/01/27(水) 05:30:17ID:???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:???全然なにがやりたいかわからんから>>621と同じ解釈してパーサーっぽいの探してきたんだけど
あと前提条件として何があって、結果何がしたいのか言ってもらわんと誰も疑問に答えることはできんと思うが
0628nobodyさん
2010/01/27(水) 08:30:00ID:???SSI もどきの動作を CGI に置き換えたいのかと思いきや, 違うようだねぇ.
というか, 余計, やりたいことが見えなくなったですぜぃ.
どこでも回答を得られなかったそうだけど, 合点が行きますぜ.
固定観念を捨てて すなおにやりたいことを書くようにしないと...
漂流の旅は 延々と...
0629614
2010/01/27(水) 18:18:11ID:???質問文に基礎的な欠陥がありました。すみません。
>>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:???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:???次は同じ数値のやつで値が重複してれば取り除くことかな
更に値を昇順に並べる
できればだけど、初心者にできるだけわかり易いコードで書くか、難しいコードにはコメント付けることかな
0635630
2010/02/07(日) 18:32:40ID:???書式の意味はさっぱり分かりませんが、思い通りに出来ました。
ありがとうございました。
>>634
これは、とあるデータファイルなのですが、現在の仕様では書き込み時に
行頭のデータを見つけて同じなら追加できるようになっています。
また重複しないようにもなっています。
今回、過去のデータが1データ1行という仕様だったものを現在の仕様に
合わせて効率化(読み込み回数の減少)を図りたかったので知恵を
拝借させていただきました。
では、これから数十万ファイルを変換します。。。
ありがとうございました。
0636nobodyさん
2010/02/10(水) 04:24:28ID:SN+dhl64ですので、受信メールを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:???0638636
2010/02/11(木) 20:43:34ID:???0639614
2010/02/12(金) 07:09:14ID:0arSSMW8質問はこうです。
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文で書いてみろよ。添削はしてやるから。そうじゃないと身に付かない。
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:???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:???まぁいいか
0645614
2010/02/12(金) 17:12:40ID:0arSSMW8>>640
ですね。やってみたんですがエラーx20over
根気がなくてなおかつ焦っているのが見え見え。
もうちょうっと根気良くやってみます
>>641
配列に入れるのは
リンク先相対URL,リンクテキスト,更新フラグ
を一列にして入れていきます。
更新フラグが立つ(1になる)条件は、LastModifiedが1日以内であることです。
それでできたデータをfor文で1行ずつ書いていくということです。
>>642
もしかしたらページのテンプレート化は全部これで解決かと思い、別ディレクトリ作って仮導入してみたところ
アップローダーのCGIがHTML書き出し型で謎の二重呼び出し、エラーを返すかと思いきやApacheが落ちてしまいました。
>>643
がんばって雛形に従って書いてみます。
0647nobodyさん
2010/02/12(金) 17:30:03ID:???リアル中学生だっけ。親御さんは気の毒になぁ。
0648nobodyさん
2010/02/12(金) 17:40:13ID:???http://pc11.2ch.net/test/read.cgi/php/1222645553/
0649614
2010/02/12(金) 18:00:22ID:0arSSMW8なぜ落ちるのか原因が解析できないのが技術力の足りなさでしょうか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:???こんな感じで要求仕様だけ細かいけど何も考えてくれないから添削にもなってないよ。
CLIで叩くもんをCGIで動かして
> 改行コードとパーミッションを確認すること5回。何故だあああああ!?
ってやかましいわ。
0653nobodyさん
2010/02/12(金) 18:48:15ID:???コマンドラインからperl test.plで試せ
つーか>>643に2,3行足して軽く変更するだけで要求されてるものはバッチリ完成するんだが
まぁそこまでやる義理も無いしな
おまけでヒント
http://www.ksknet.net/cat41/stat_1.html
0655614
2010/02/12(金) 19:00:45ID:0arSSMW8とりあえず手前なんとかなっても
自分で構造を読めないスクリプトだと
仕様変更した時にサーバー障害の原因になってしまっていても気づかないので
自分で構造を読めないスクリプトの導入は控えています。
>>650 >>651
#!/usr/bin/perl
@menu=( "/music.shtml<>演奏活動",
"/NNB<>NicoNicoBrowser",
"/live.shtml<>ネットワーク機器監視カメラ",
"/uploader<>アップローダー",
"/ntp.shtml<>公開NTP",
"/manage.shtml<>管理・障害情報",
"/info.shtml<>サーバー情報",
"/contact.shtml<>管理人へ連絡",
);
print "Content-type: text/html\n\n";
foreach $i (@menu){
@ancker = split(/<>/, $i);
print "<a href=\"$ancker[0]\">$ancker[1]</a>\n";
}
exit;
書いてきました。
CLIだったんですか。ActivePerlを使って叩くんですか……o....rz
それじゃあ動くわけがなかった。
サーセン。いつも自宅鯖管しててCGIで動かすのが基本になってました。
LastModifiedを使った日時計算をどうすればいいのでしょうか。
ヒントがあればorz
0656nobodyさん
2010/02/12(金) 19:13:04ID:???0657nobodyさん
2010/02/12(金) 19:13:44ID:???0658nobodyさん
2010/02/12(金) 19:16:54ID:???>とりあえず手前なんとかなっても
>自分で構造を読めないスクリプトだと
>仕様変更した時にサーバー障害の原因になってしまっていても気づかないので
>自分で構造を読めないスクリプトの導入は控えています。
んじゃ、導入自体あきらめろ。
この程度のスクリプトを自力で書けない奴が偉そうな口を叩くな。
0659nobodyさん
2010/02/12(金) 19:18:52ID:???ちょっとガキをからかってやるかくらいの心持ちでいいんですよ
0660nobodyさん
2010/02/12(金) 19:24:31ID:???スクリプトの先頭には↓を絶対入れるべき
use strict;
use warnings;
0662614
2010/02/12(金) 19:55:57ID:0arSSMW8SSIばっかりやっていてPerl移行になったので。
SSI時代にまだ自分で適度に構造が分かるスクリプトを持ってきていた程度です。
Perl打ち込みを始めてからまだ15日しかたってません。勘弁してください。
>>660 >>651
挿入しました。指摘ありがとうございます。
>>654
入ってました。
>>653 >>656 >>657
先ほどCGIをローカルにもってきてActivePerl入れました。ご指摘ありがとうございます。
ActivePerlでは最終更新時間取得までいったので今度はサーバーに置いて練りこんでいけばできそうな
兆しが見えてきました。
本当に回答ありがとうございます。
最近アップローダーが閑散としていて帯域制限忘れたのが祟ったorz
アップローダーが混み合ってきてまともにファイル変更もできなくなったのでまた明日。
0664614
2010/02/12(金) 20:33:45ID:0arSSMW8はい。すぐ把握できました。1日の秒数です。
0665614
2010/02/12(金) 23:25:55ID:0arSSMW80666nobodyさん
2010/02/12(金) 23:35:23ID:???そんなことまでいちいち書かなくていいんだよ
0667614
2010/02/13(土) 00:01:25ID:fcRfq/Wtサーセン。深夜ボケして妙にハイテンションになって、注意欠陥状態です。
最後にサーバーにCIFSで送って、
相対パスを展開しないstatの実装に七転八倒するかと思いきやchdirであっさり・すっきりでした。
chdir("/var/www");
@menu=( "/music.shtml<>演奏活動",
"/NNB<>NicoNicoBrowser",
"/live.shtml<>ネットワーク機器監視カメラ",
"/uploader<>アップローダー",
"/ntp.shtml<>公開NTP",
"/manage.shtml<>管理・障害情報",
"/info.shtml<>サーバー情報",
"/contact.shtml<>管理人へ連絡",
);
foreach $i (@menu){
@ancker = split(/<>/, $i);
$mtime = (stat".$ancker[0]")[9];
$new =1 if(time <= ($mtime+86400));
print "<a href=\"$ancker[0]\">$ancker[1]";
if($new==1){
print "<img src=\"/main.files/new.png\">";
}
print "</a>\n";
}
また質問段階からgdgdでしたが、
レスを頂き、Perl打ち初め〜15日の初心者が助かりました。
本当にありがとうございました。
0668614
2010/02/13(土) 00:12:40ID:fcRfq/Wt#/usr/bin/perl
use strict;
use warings;
chdir("/var/www");
@menu=( "/tsubuyaki.shtml<>呟き",
"/music.shtml<>演奏活動",
"/NNB<>NicoNicoBrowser",
"/live.shtml<>ネットワーク機器監視カメラ",
"/uploader<>アップローダー",
"/ntp.shtml<>公開NTP",
"/manage.shtml<>管理・障害情報",
"/info.shtml<>サーバー情報",
"/contact.shtml<>管理人へ連絡",
);
foreach $i (@menu){
@ancker = split(/<>/, $i);
$mtime = (stat".$ancker[0]")[9];
if(time <= ($mtime+86400)){
$new = 1;
}else{
$new = 0;
}
print "<a href=\"$ancker[0]\">$ancker[1]";
if($new==1){
print "<img src=\"/main.files/new.png\">";
}
print "</a>\n";
}
exit;
無事動きました。
0670nobodyさん
2010/02/13(土) 09:57:02ID:???0671nobodyさん
2010/02/14(日) 17:46:27ID:???それにしても ここの話題が 易しくないと感じる あっしって,
ミジンコ ? ゾウリムシ ? (はぁ)
0672nobodyさん
2010/02/14(日) 18:03:55ID:???opendir(DIR,$logs);
@u=readdir(DIR);
closedir(DIR);
とやると
$u[0]='.', $u[1]='..', $u[2]='log0.tsv', ...
"." で始まるファイルは不可視ファイルなのだとか...
他のサーバーでも同様なのかしらん ?
0673nobodyさん
2010/02/15(月) 01:23:48ID:???$u[1]='..' 一つ上
ファイルだけの一覧が返って来るわけじゃないよ。ドットファイルの話はまた別。
0674nobodyさん
2010/02/15(月) 07:33:04ID:???お返事ありがとうございます.
つまり, 返って来るリストに {'.', '..'} は必ず含まれると解釈して良いのでしょうか ?
言い換えるとサーバーが異なるなどの条件の変化には左右されないと...
(これらが含まれることを前提することが bug の発生源になりうるか どうかが気掛かりなのです)
0675nobodyさん
2010/02/15(月) 09:36:38ID:???「.」はカレント(今いる)ディレクトリへのリンクファイルで
「..」はその親ディレクトリへのリンクファイル
含まれていようがなかろうがif文使えば条件の変化に左右されない書き方ができる
0676nobodyさん
2010/02/15(月) 17:55:20ID:???回答ありがとうございます.
>if文使えば
log0.tsv, ... , logN.tsv は 10 record (10行) ごとのデータファイル.
末尾のファイルが 10 rec 埋まるまでは追加記録の対象となります.
さらに この directory には他のファイルを追加することはありません.
したがって $n=@u とやって logN.tsv の個数だけ求まれば良いのです.
ところが予想と反した結果となったので調べて見ると "未知のファイル" がぁ〜.
UNIX では必ず存在するのなら 一安心です.
0677nobodyさん
2010/02/15(月) 18:09:17ID:???$n= grep(/^log\d+\.tsv$/, readdir(DIR));
0678nobodyさん
2010/02/15(月) 18:46:35ID:???なるほど, 勉強になります !
(そう言えば以前 grep() で迷ったことが...)
(/ / が " " と同様に展開解釈することを知ったのは最近のことです)
(思い違いかもしれませんが js では ' ' と同等かと...)
お蔭様で基本的な機能は ほぼ装備できたかと...
あとは bug-fix... (password check が おかしい w )
0679nobodyさん
2010/02/15(月) 19:57:40ID:???この場合 // は正規表現であって、 "" の展開解釈とは全く別物。
677 氏のを丁寧に書くと、
grep( $_ =~ /^log\d+\.tsv$/, readdir(DIR));
ついでに grep { ! /^\./ } readdir DIR ; は、ほぼお約束。
0680nobodyさん
2010/02/15(月) 21:12:43ID:???>"" の展開解釈とは全く別物
たとえば
$str='RegExps'; $re='RegExp';
と言う条件で
1. $x=~s/$re//;
2. $x=~s/RegExp//;
の両者は
perl では等価とみなされるけれど,
js では /$re/ 内の $re は単なる文字列と見なされる (思い違いかも ?)
と言いたかっただけで...
" " と / / とが同等な意味を持つとは思ってません.
それはさて置き, わざわざありがとうございます.
0681nobodyさん
2010/02/15(月) 21:14:44ID:???0682nobodyさん
2010/02/18(木) 07:19:57ID:???けど、いきなり専門用語ばかりで結構厳しい。
もう少し優しいところから解説してくれるPerlの参考書って無いですかね。
■ このスレッドは過去ログ倉庫に格納されています