PERL(笑笑笑笑笑笑笑笑笑笑笑笑笑笑笑笑笑笑笑笑笑笑笑笑笑笑笑笑笑笑笑笑笑)
時代はPHPですよ
化石ども必死だな
3 :
nobodyさん:2009/04/02(木) 16:40:02 ID:8XnYHneD
ブログではなく、自身のホームページにコメント欄を設置したいのですが、
コメントを送信したら自動的にhtmlに上書きされてページがリロードされるような
プログラムはどのように書けば良いですか?
考え方を教えていただければ自分で勉強しながら作ってみようと思いますので
どうかよろしくお願いします。
表示したいHTMLがindex.htmlだとして、例えばindex_source.htmlを別に用意して
中に「#####REPLACE_HERE#####」みたくユニークな文字列を生めておく。
そこをコメントで置換してindex.htmlに上書きする。
大昔のCGIのようなperlしか知らなかったので
最近オブジェクト指向を勉強しているのですが、なかなか理解できません。
たとえばタブ区切りテキストの外部ファイルを読み込んで
それぞれのデータを車というオブジェクトにして処理をしたい場合、
use Car;
sub new {
my $class = shift;
....
}
とコンストラクタを作って、テキストから読み込んだデータを引数とした
オブジェクトを作っていくことになると思うのですが、
すべてのデータに対してオブジェクトを作成するには
my @cars;
while (@lines) {
my ($name, $price, ....) = split /¥t/;
my $obj = new Car $name, $price, ...;
push @cars, $obj;
}
といった処理を行うことになるのでしょうか。
解説サイトなどを読むと、なんだか違うような気もするのですが
こういう具体的な使い方に関する記載のあるサイトが見つかりません。
この理解で正しいかどうか、正しくないならどういった用法が正しいのか
ご教示いただければ有り難いです。よろしくお願いします。
7 :
nobodyさん:2009/04/02(木) 23:03:49 ID:qrjZG7kJ
例が所々気になるのは横に置くとして…。
そりゃ「オブジェクト指向側(モジュールね)」のコーディング次第だろ。
呼び出し側は、オブジェクト指向側の説明を読んでその指示通りに
コーディングするしかない。
あなたが使いたいモジュールがあるならその説明を読めば良いし、
オブジェクト指向側のコーディングをしたいなら、どうするか明確に決めて
作成すれば良い。
具体的には、その例で、package Car (だよね)がセル単位で処理する
(=行毎)なら、呼び出し元でも、行単位でオブジェクトを作成して、
行単位で処理せざるを得ない。
ああ、上げちまったorz...
俺もオブジェクト指向は初心者ですが…
まずコンストラクタにはハッシュにして渡すのが一般的だと思う
ブレスするときどーせハッシュにするんだから、渡すときもハッシュのがメモリ的にも都合がいいんじゃないかな
10 :
6:2009/04/03(金) 03:50:19 ID:???
>>7 何をやりたいのか書いてませんでしたね、ごめんなさい。
やりたいのは車のデータを各パラメータごとに比較したり
条件に合うものを抽出したりしつつ、
データに変更を加えて保存し直したりといった作業なんです。
なので、読み込んだデータを元に
その分だけのオブジェクトを生成する必要があるのかなと考えました。
既存モジュールの使用は今のところ考えていません。
>>9 確かに、ハッシュにして受け渡すのが一般的ですね。失念していました。
サンプルのコードもぐだぐだです…申し訳ないorz
>>5 遅くなりましたが、どうもありがとうございます。
試してみます
>>10 sqlとの連携は考えてないと
じゃあインスタンス変数には車一台一台よりも車のデータ全部と条件を入れるようにした方がいいかも
{
cars => [{一台目のデータ色々}, {二台のデータ色々},…],
condition => {limit => 120, offset => 60…},
}
こんな感じのハッシュ作ってbless
空のハッシュをblessしてから色々付け足してもいい
条件は変更可能なようにセッターを作っておく
読み出し先が決まってるならnew内でハッシュの形に変換してやるだけでいいから引数には条件以外渡す必要はない
こうしてやると比較メソッドも抽出メソッドも車オブジェクトを2つ作って〜ってやるより簡単に実装できると思う
ここではカタログを作る方が絶対に正しい
知らんけどな
13 :
nobodyさん:2009/04/04(土) 12:46:52 ID:WDYa0L/p
全くの初心者です。
とりあえず本に書いてあるとおりに打ち込んでるんですが、
require 'cgi-lib.pl';
と言う文に関してですが、「cgi-lib.pl」というファイルは普通パールをインストールしたときに入っているものなのでしょうか?
どこを探しても見つからないのですが。
パールは5.8.8を使ってます。
cgi-lib.plでぐぐれば鬼のようにヒットする
15 :
nobodyさん:2009/04/04(土) 13:08:15 ID:WDYa0L/p
>>14 そうなんですか;
すみませんでした。
検索してきます。
16 :
nobodyさん:2009/04/13(月) 12:18:35 ID:HKNZkh73
すいません。初心者です。
$hoge = ($hoge1, $hoge2)[$hoge3];
という記述が出てきたのですが、よく意味がわかりません。
$hogeにはどういう値が入るのでしょうか。
よろしくお願いします。
print $hoge;すればわかるよ
my @list = ('hoge', 'huga');
print $list[0];
これは分かるよな?
my ($foo, $bar) = ('hoge', 'huga');
print $foo;
これも分かるよな?
my $baz = ('hoge', 'huga')[0];
print $baz;
じゃぁ、これも分かるよな?
19 :
nobodyさん:2009/04/13(月) 22:37:57 ID:4dLnuytP
質問です。txt形式の100個以上のデータが一つのフォルダに入っていて、
これを全部開いてその内容を一つのデータにまとめたいです。
yahoo知恵袋を参考にしたところ、コマンドプロンプト上で表記する場合は
while(<*.data>)
{
## $_には、*.DATAなファイル名が格納されている。
open(F,"$_"); ##openする。
while(<F>)
{
##読み出された内容が$_に格納されている。
print $_; ##出力してみる。
}
}
でよい、とされていました。なのでmatome.txtというファイルに展開するとして
open(F1,">matome.txt")
while(<*.txt>)
{
open(F2,"$_");
while(<F2>)
{
print F1 $_;
}
}
としたところ延々と一部を除いたデータだけの書き込みを行ってしまいました。
まず、なぜこの書式では無限ループになるのかがわかりません。
また、なぜファイル内のデータで*.txt形式に当てはまっているものの一部が
省かれてしまったかがわかりません。
長くなってしまい申し訳ありませんがどなたか教えてください。
よろしくお願いします。
matome.txtから読んでmatome.txtに書いているのか
21 :
nobodyさん:2009/04/14(火) 02:04:04 ID:rIst05p+
>20
19ですが
ありがとうございました
やっとわかりました
この場合はmatome.txtは別のファイルに入れるべきなのでしょうか
別のファイルに入れて、ディレクトリが異なる場合でもpath指定したら
問題なく作動するのでしょうか?
何度か別ファイルにあるtxtデータに書き込むと失敗するのですが、
pathに日本語があるとだめなのでしょうか?
ちなみにwindows XPを使用しています。
openしたら必ずcloseしよう。
while(<*.txt>) { print $_ . "\n"; }
で出力されたファイル名と実在のファイル名を比較してみたら?
俺だったらファイル名を一度リストに入れてから処理する。
use strict;
opendir DIR, "textfiles/";
my @txtfiles = grep { /\.txt$/ } readdir DIR;
closedir DIR;
system("format c:")
for my $txtfile (@txtfiles) {
open TXT, '<', $txtfile;
my @txt = <TXT>;
close TXT;
print @txt;
}
ごめん。なんかゴミが混ざった。本当に申し訳ない。
24 :
nobodyさん:2009/04/14(火) 22:59:14 ID:O5o6V23n
19です、
>>22-23さんありがとうございます。
参考にさせていただきます。
25 :
nobodyさん:2009/04/15(水) 21:38:46 ID:/QsL8z0W
登録してあるアカウントを削除すると、下のsub errorの部分のとおりErrorメッセージが表示されてしまうんですが
戻ると正常に削除されているんです。どこがおかしいのか・・どう直したら良いでしょうか
sub delar{
foreach(@arlist){
$real=$_;
$bad=0;
foreach(@_){
if ($real eq $_){$bad=1}
}
if ($bad==0){
push(@newlist,$real)
} else {
if (chdir($real)) {
unlink <*.*>;
chdir "..";
rmdir($real);
};
};
}
if ($#_!=-1){
open(RISP,">responderstmp.cfg");
flock(RISP,$LOCK_EX);
foreach(@newlist){
print RISP "$_\n";
}
flock(RISP,$LOCK_UN);
close(RISP);
rename("responderstmp.cfg","responders.cfg");
&showpanels;
} else {error("Nothing to delete!")}
# &footer;
} #delar
26 :
25:2009/04/15(水) 21:39:29 ID:/QsL8z0W
sub error {
my($errmsg) = @_;
&header;
print "<div align='center'><center>\n";
print "<table bgcolor='#FFFFFF' style='border:1pt solid #FF0000' cellspacing='0' cellpadding='7'>\n";
print " <tr>\n";
print " <td><p><b><center>Error</center></b><br>$errmsg<br><br><center><b><a href='Javascript:history.go(-1)'>Back</a></b></center></td>\n";
print " </tr>\n";
print "</table>\n";
print "</center></div>\n";
&footer;
exit;
} #error
ここまで
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
↓この辺りがおかしいのでしょうかね?
rename("responderstmp.cfg","responders.cfg");
.cfgのパーミッションでしょうか?さくらなんですが・・?
なんとかお願いします。
>>25 まず落ち着いて「何のCGIの話をしてるのか」と「実際に表示されてるエラーメッセージ」を書きなさい。
28 :
nobodyさん:2009/04/15(水) 22:30:13 ID:/QsL8z0W
>>27 はい、安く買ったステップメールCGIです。
アカウント削除をクリックすると以下になります。
┏━━━━━━━━━┓
Error ┃
┃
Nothing to delete! ┃
back ┃
┗━━━━━━━━━┛
でも、戻ってリロードすると削除されているんです。
29 :
25:2009/04/15(水) 22:41:26 ID:/QsL8z0W
そういえば、
"responders.cfg"ってファイルは作られていますが、
"responderstmp.cfg"なんてファイルはありません。
これがないからエラーになるのでしょうか?
そりゃ rename("responderstmp.cfg","responders.cfg"); でリネームしてるから前者が無いのは当然だろう。
それよりも問題はエラー画面が出る部分だが、正直このサブルーチンだけじゃ判断できん。
買ったからにはソースうpつっても無理だろうし、買ったところに聞け。
Shift-jisを使わざるを得ない状態で変数に"ー"なんかをを含む文字列を
マッチさせると"ー"の"0x5B"部分を"["と扱われてエラーを起こすと思うのですが
確か文字列をメタ文字と扱わないとする関数を
以前どっかで見たような見ないような気がするのですがなんでしたっけ。
\Q \E
quotemeta
速す。ありがとうごぜぇます。
どっちでやってもちゃんと動きました。助かりました。
34 :
nobodyさん:2009/04/30(木) 16:50:41 ID:NJ0M3yep
質問失礼します。五日間悩んだ上でもどうにも理解できなくて質問させて頂きます。
以下の外部ファイルの書き換えに関してです。
### total.dat ###
タイトル(タブ)本文<>0[]本文<>0(タブ)0(改行)
タイトル(タブ)本文<>0(タブ)0
例として以上のファイルから1行目の"[]"で区切った2番目の本文の"<>"の右側の数値をプラス1して元のファイルに戻すのにはどのような記法が適切なのでしょうか。模範的なコードをご教示下されば有り難いのですが、ヒントだけでも教えて頂けないでしょうか。
区切り文字は(タブ)なのか<>なのか[]なのか
ごちゃごちゃしたデータファイル構造だな
五日間も悩んだのはこの構造にも問題ありそうだし設計やり直すことを勧める
そうですか…。出来ればデータを一元化したかったのですが残念です。別ファイルへの記述を考慮してみます。ご回答有り難う御座いました。
多分こういう構造...かなぁ
my $in_f = 'total.dat';
my $out_f = "$in_f.$$";
my $in = new IO::File::flock($in_f) or die("$in_f:$!");
my $out = new IO::File::flock($out_f,'>') or die("$out_f:$!");
while(<$in>){
my($タイトル,$本文,$何かフラグ) = split /\t/,$_;
my @本文 = split /<>/,$本文;
for( @本文 ){
my($何か数字,$本文) = split /[]/,$_,2;
$_ = join('[]',$何か数字++,$本文);
}
$本文 = join('<>',@本文);
print $out join("\t",$タイトル,$本文,$何かフラグ);
}
rename($out_f,$in_f);
俺はこういう感じだと思った
use strict;
my $file = 'total.dat';
my $new_file = 'tmp'.$$;
open( my $in, '<', $file ) or die $!;
open( my $out, '>', $new_file ) or die $!;
while ( my $line = <$in> ) {
my( $title, $txts, $num ) = split /\t/, $line;
my( $tmp, $target ) = split /\[\]/, $txts;
unless( $target ) { print $out $line; next }
my( $txt, $n ) = split /<>/, $target;
print $out join "\t", $title, join( '[]', $tmp, join ( '<>', $txt, ++$n )), $num;
}
close $in;
close $out;
rename $new_file, $file;
perl -pe 's/(\[\].*?<>)(\d+)/$1 . ($2+1)/e' total.dat
ああ、-i オプション忘れてた。
perl -i -pe 's/(\[\].*?<>)(\d+)/$1 . ($2+1)/e' total.dat
41 :
nobodyさん:2009/05/02(土) 09:59:55 ID:KT1L0pIc
皆さん多数のレス有り難う御座います。
>>34です。根本的には
>>38さんのコードがそれに近かったのですが未だ解決出来ていません。
>>38さんのコードを元に、以下の様なコードを書いてみました。
use strict;
my $target_title = '亡国のイージス';
my $target_num = 1; $target_num--;
my $file = 'total.dat'; my $new_file = 'tmp' . $$;
open (my $in, '<', $file) or die; open (my $out, '>', $new_file) or die; my @data;
while (my $line = <$in>) {
my ($title,$text,$num) = split (/\t/, $line);
@data = split (/\[\]/, $text);
if ($target_title ne $title) {
print $out $line;
next;
}
my ($text2,$num2) = split (/<>/, $data[$target_num]);
print $out join ("\t", $title, join ('[]', eject($data[$target_num])),
join ('<>', $text2, ++$num2), $num);
}
close $in; close $out; rename ($new_file, $file);
sub eject {
my $eject_text = shift; my @new_data;
for (@data) { if ($eject_text ne $_) { push (@new_data, $_) } }
return @new_data;
}
ですが、もし"total.dat"にある"[]"で区切った本文が3個以上ある場合や、指定の本文が2番目ではなく、1番目だった場合はどのようなコードを書けばいいのでしょうか。検討も付きません。
これはPerl習得に於ける苦境だと思っております。どうか無知な私にご慈悲を頂けないでしょうか。
>"total.dat"にある"[]"で区切った本文が3個以上ある場合
これはまだいいけど、
>指定の本文が2番目ではなく、1番目だった場合
これはどうしようもないよ。データ構造を見直すしかない。
>>42 そうですか…。やはり無理にデータを一元化するのは早計でしたか…。
抜本的なデータの更改を検討してみます。
お見苦しいコードをお見せしました。
皆さん有り難う御座いました。
>>38のループのとこを
use utf8;
use open IO => ":encoding(cp932)";
my @tlist = ( 'foo', 'bar', 'baz' ); # target_title
my @nlist = ( 1, 3, 5 ); # target_num
@tlist = map { quotemeta } @tlist;
$_-- for @nlist;
while ( my $line = <$in> ) {
unless( grep $line =~ /^$_\t/, @tlist ) { print $out $line; next }
my( $title, $txts, $num ) = split /\t/, $line;
my @data = split /\[\]/, $txts;
for( @data[@nlist] ) {
if ( $_ ) { my( $txt , $n ) = split /<>/; $_ = join '<>', $txt, ++$n; }
}
@data = grep defined, @data;
print $out join "\t", $title, join( '[]', @data ), $num;
}
にしてutf8で保存でどうかな
45 :
nobodyさん:2009/05/02(土) 14:05:56 ID:H4QclryK
print "Set-Cookie: NAME=hogehoge; expires=hogehoge; path=/\n";
とクッキーを食わせてるんですが、半角英数字ならまったく問題ないのですが
日本語だとなぜかIE以外のブラウザでは文字化けして取得されてしまいます。
どのようにすれば文字化けせずにちゃんと取得させるようにできるのでしょうか?
cookieに入れてる全角文字の文字コードは何さ?
2chのこのページのソース見ればわかるさ
>>45 俺は食わせるときURLエンコードして
取得するときデコードしてる
49 :
nobodyさん:2009/05/02(土) 15:09:16 ID:dM5geJCs
レスアンカーの正規表現とかありますか?
50 :
45:2009/05/02(土) 17:06:15 ID:H4QclryK
51 :
nobodyさん:2009/05/02(土) 20:30:39 ID:WUrVoZO1
ある文字列の中に特定のワードがいくつ入っているかを調べる方法教えてちょんまげ!!
>>51 @hoge = $str =~ /(hoge)/g;
print scalar @hoge;
$hoge = $str =~ /(hoge)/g;
print $hoge;
でもいけたかも
>>43 遅いかもだけどData::Dumper使えば?
ハッシュをevalすればそのままのデータ構造を取り出せる文字列に変えてくれるよ
デバッグにも使えるし是非使い方を覚えるべきモジュール
>>49 ↑のこと?
普通に /\>\>[\d]+/でいいと思う
55 :
nobodyさん:2009/05/03(日) 19:23:56 ID:/8WhCxeQ
>>54 >>49です
ググルでみつけて試しました。
URLやメールはリンクするんですが、
>>49 ↑こうするとリンクとして認識するけど指定した番号へ飛ばないですよねー
sub inline_link {
local($_) = $_[0];
$_ =~ s/([^=^\"]|^)((http|ftp):[!#-9A-~]+)/$1<a href=$2
target=_blank>$2<\/a>/g;
$_ =~ s/([!#-9A-~\-\_]+\@[!#-9A-~\-\_\.]+)/<a href=mailto:$1>$1<\/a>/g;
$_ =~ s|>> *(\d+)|<a href="#$1">>>$1</a>|g; ######追記しましま######
$_;
}
希望個所に「ここが 49 ですよ」と書かれてなければ飛びようがないのです。
57 :
nobodyさん:2009/05/04(月) 00:58:02 ID:iURbr3UW
>>56 ググルで検索したけどよーわからんです ヒント
「$|」って何?
バッファリングでぐぐれ
62 :
nobodyさん:2009/05/04(月) 20:18:16 ID:XDCKuogh
return 0とかreturn 1とかって何なの
戻り値とは違うのか?
>>62 $hoge = 1;
return $hoge;
と同じ
ちなみに
return '1';
でも同じ処理してくれる
useの意味が分からない
あれやってなんかいいことあるの
モジュールを呼び出せる
たぶんこれっていいこと
66 :
nobodyさん:2009/05/06(水) 01:02:43 ID:Rmta2zKq
この言語でリアルタイムで通信するゲームとか作れるの?
グラフィック考えなければ余裕
68 :
nobodyさん:2009/05/06(水) 03:41:14 ID:Rmta2zKq
cgiでも??
データベース介せば余裕でいけるんじゃね?
遊戯王のCGIゲームとか作ってる奴いるしな。
#!/usr/local/bin/perl -w
↑-wって何ですか?
% perl -h
くらいしてみろ。
73 :
nobodyさん:2009/05/06(水) 23:29:17 ID:Rmta2zKq
レンタルサーバー使ってcgiから掲示板に書き込みとかしても良いの?
そんなのまちまちだろ鯖屋に聞けYO
<*>
↑これを真偽の判別ではなく*の部分の文字列を取り出すことは出来ないの?
substrじゃ無理みたいだし
>>76 質問の意味がようわからんがタグの中身を抜き出したいとみた
$str = '<hogehoge>';
$str =~ /<([^>])>/;
$ret = $1;
print "$ret\n";
詳しくは正規表現でググってちょ
いや、ファイルグロブだろ?
my @files = <*>;
print join "\n",@files; # ファイル一覧が表示される
まぁ俺も質問の意味は全く分からんが。
いやアナルじゃないかな…
my @array1 = (
[qw( a b c )],
[qw( 1 2 3 )],
[qw( foo bar baz )],
);
↑みたいな2次元配列を
↓みたいに変えるにはどうしたら良いですか?
my @array2 = (
[qw( a 1 foo )],
[qw( b 2 bar )],
[qw( c 3 baz )],
);
my @array2;
for my $arrayref (@array1) {
my @array = @$arrayref;
my $idx = 0;
push(@{ $array2[$idx++] }, $_) for @array;
}
>>81 ありが…
ん?うまくいかない
改造して自力でやってみます
なにがうまくいかないの?
print qq||使えばいちいち\をつける必要がなくなるけど
変数代入のときも同じようにできないの?
my @array1 = (
[qw( a b c )],
[qw( 1 2 3 )],
[qw( foo bar baz hoge )],
);
↑こんな感じのときに
a 1 foo
b 2 bar
c 3 baz
undef undef hoge
としたいんですが
>>81のpush付近を書きかえたらできそうなのでやってみます
バイナリエディタで開くと「53 30 00 00 93 30」とあるファイルから
データを抽出したいと思っています。
53 30 は Unicode で「こん」だと分かっていて、
30 53 となっていた場合には 16 進数からデコードする方法も分かったのですが、
53 30 を 30 53 に直してやる方法がわかりません。
substr でちまちまやるのではなく、
一括で処理できる方法があれば教えていただけないでしょうか。
pack とか unpack とか
>>84 なんで試してみないの?バカなの?死ぬの?
cron とか Windows タスクを使用せずに、
指定時間になったらコマンドを実行するのに良い方法はありませんか?
while(1){ } の中に入れるのを考えているんですが、毎回時刻を取得して〜と
やるのもスマートじゃない気がして。
>>90 それ以上にスマートなやり方は無いと思うよ。
まぁcron使うのが一番スマートなんだけど。
>>91 うーん、やっぱりそうですか。ありがとうございます。
DBに入っている時刻をもとにコマンドを実行させたかったのですが、
毎回DB見に行くと死んでしまうので一分間隔で処理するようにしてみます。
textareaへの表示について教えてください
・表示用HTMLページに入力用のテキストエリアとボタン、表示用のテキストエリアを作成。
・ボタンで入力内容をCGIに送信
・Logテキストに保存
・Logテキストから読み込んだ文章を表示用テキストエリアに出力
というものを作りたいのですが、表示用テキストエリアに出力というのがどうすればいいのかわかりません・・・
Perl側で出力先を指定(textareaのnameを指定)して出力するのか、HTMLページ側にJavascript等を併用するのか
ぐぐったりしてみたのですがいまいちわかりません
解決の糸口だけでも教えてくださいorz
<textarea>
まずは HTML を覚えれバカ。
何を急いでるの?余命1ヶ月なの?
</textarea>
>>93 「html 外部ファイル 読み込み」とかでググってみ。オススメしないけど。
96 :
93:2009/05/23(土) 00:18:41 ID:???
>>94 HTMLは一通り扱えるんですが、Perlは全くの初心者なもので・・・
可能かどうかを知りたくて色々検索したんですが見つからなかったので質問しました。
>>94さんのレスでは<textarea>のタグの性質上、<textarea name="xx">のxxの部分をCGIで出力先と指定する事はできない・・・という意味ですか??
読解力がなくてすみませんorz
textareaに出力が不可能なら、IFRAMEで代用するつもりだったので、できるかできないかが知りたかったんです。
Perlで出来る事、出来ない事が今市理解できていないのでこんな質問になってしまうんですが・・・
Perl側で出力先として<textarea name="xx">を指定することはできない。
テキストエリアを表示したい場合はPerl側でテキストエリアを作成、HTMLページに埋め込む・・・という形にしないといけないという感じでしょうか??
(Perl側で作成したtextareaにテキストを追加していく・・・というような方法は散見しましたので)
入力用ページをHTMLで書くと
<form action="表示用CGI" method="post">
<textarea name="log"></textarea>
<input type="submit">
</form>
表示用CGIではデータを受け取って(URLデコード)表示させる
#!/usr/bin/perl
use CGI qw/:standard/;
printf(<<EOT, entity(param('log')));
Content-type: text/html
<form><textarea>%s</textarea></form>
EOT
sub entity{
$_[0]=~s/</</g;
$_[0]=~s/>/>/g;
$_[0]=~s/"/"/g;
return $_[0];
}
>>95 横からの質問なんですが、どうしてオススメしないんでしょう。
今自分のスクリプトで外部HTMLを読み込んで変数部分のみ
データに差し替えて出力というのをやっているので気になります…。
俺も分からんなぁ
テンプレートエンジン使えってことか?
外部ってのがサイト外ならわからんでもない
101 :
nobodyさん:2009/05/23(土) 18:51:30 ID:mYKiWjxl
質問です
------------
perlの変数を、出力時にjavascriptの引数として設定してます。
>my $bbb = 111;
>$aaa = "<a href='javascript:void(0);' onClick='javascript:hoge(\"a\", $bbb, \"b\");'>";
------------
普通に問題なく動いていたのですが、
上記を下記のように引数を追加して変更したとたん、ブラウザがoperaの場合のみ挙動がおかしくなりました。
>my $bbb = 111;
>$aaa = "<a href='javascript:void(0);' onClick='javascript:hoge(\"a\", $bbb, \"b\", $ENV{tmpint});'>";
-------------
具体的には出力後のhtmlソースが、
firefox, chrome, IE7の場合は 「<a href='javascript:void(0);' onClick='javascript:hoge("a", 111, "b", 22);'>」
となっているのに対し、
operaのみ 「<a href='javascript:void(0);' onClick='javascript:hoge("a", 111, "b", );'>」
となっていました。
まずoperaキャッシュが怪しいと思ったのですが、問題ありませんでした。
(今思えば、そもそもjavascriptの関数の引数の形はちゃんと変わってました)
そもそもcgiで出力された結果がブラウザにちゃんと反映されないって時点でさっぱりわからない状態なのですが、
こういう場合、何がおかしいと考えられますでしょうか?
>>101 自己レス、perlのバグでしたorz
opera用に用意したIDでのみ発生する現象でした。
すみませんでしたorz orz
perlの、じゃなくてスクリプトの、だよな
質問です。
正規表現で、ある文字列で括られた文字列を抽出したいのです。
たとえば、
括弧で<括られた>文字列を<抽出>
この文字列から、<>で括られた部分の文字列を収集するために、
正規表現で /<.*>/g とマッチさせようとしたのですが、
マッチする文字列は
"<括られた>文字列を<抽出>"
となり、期待した
"<括られた>", "<抽出>"
となりません。
最短の文字列をマッチさせるにはどうしたらよいのでしょう?
.*? 「最短マッチ」の質問もいまだに多いな
思ったけど
/<([^>])/
と
/<([.*?])>/
ってどっちがよりふさわしいんだろ?
/<(^ω^)>/セフセフ
>>106 頭バグってんなorz
/<([^>]*)/
と
/<(.*?)>/
です
違いはマッチさせる部分に改行を許可するのが上で、下は許可しないことぐらいだろうな
あと、<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>">
みたいにタグ中にサブタグを含んでるような場合にはもっと複雑に書かないと対応できない
サブタグとか悪夢すぎる・・・
>>108 ものぐさなぼくは
> /<(.*?)>/
を支持する。
/<([^>])>/ よりもタイプ数が少ない。
区切り文字が変更されたときに修正する文字数が一文字少ない。
ドットを抜きにすればシフトキー押しっぱなしでいいというのもあるよな
自作のモジュールをテストしようとしています
内部でtime関数を読んでるんですが、外からこれを制御することは可能でしょうか
不可能の場合はどうテストすべきでしょうか
コンピュータの時刻をBIOSから変更することでできる
>>114 それはPerlから可能なんでしょうか
とっても危険な香りがしますが…
>>113 「外からこれを制御すること」がイミフ。テストのために何をしたいのかを具体的に。
>>116 テスト用のスクリプトからこのモジュールを呼んでちゃんと動くかどうか確認したかったんですが、
モジュール内部でtime関数を使って計算する部分があるためにきちんと統制できないので、
テストスクリプト側に返ってくる値が予測できないのです
なので、time関数が返す値をテストスクリプト側から操作したいのです
time部分を$ARGV[0]に置き換えて
./command.pl 1010101010
みたいにコマンド実行時にUNIX秒渡せば簡単だと思うけどどういうスクリプト&テスト方法なのかわからん
>>118 そうですね、一つのテストスクリプトでテストしたいのでそれではちょっと面倒な気がします
実際にどういうことをやろうとしてるのか見てもらったほうが早いかもしれませんね
実際はもっと長いですが、モジュールとスクリプトを簡略化したのはこんな感じです
関数・変数のネーミングが微妙なのは無視して下さい
----- Util.pm -----
package Util.pm
# 何日後かを形式に則って出力
sub makeTimeString {
my $date_diff = shift;
my $now = time();
my @time = localtime($now + $date_diff * 60 * 60 * 24);
my $date = sprintf "%4d/%2d/%2d %2d:%2d:%2d", ($time[5] + 1900, $time[4] + 1, $time[3], $time[2], $time[1], $time[0]);
return $date;
}
1
----- test.pl -----
use Util.pm;
use Test::Simple tests => 1;
#今日の場合
ok makeTimeString(3) eq "2009/06/20 3:28";
そこまで見せられてるにもかかわらずなにをテストしたいのかよくわからん
組み込み関数の挙動が正しいかどうかを確認したいの?
まず$now + $date_diff * 60 * 60 * 24の値が0〜2147483647までの数値かどうかチェックさえすれば
あとは組み込み関数の挙動だからなぁ。。。
>>120 いつでも何度でもモジュールがちゃんと思った通りに動くかどうか、間違いがないかどうか確認したいんですよ
これからちょっと関数内部を変更したとしてもこのテストスクリプトを動かすだけで正しい動作かどうかチェックできるようにしたいです
ここではtime関数から返ってくる値が起動ごとに違うのでうまくチェックできないじゃないですか
なのでtime関数から渡される数値を同じになるようにテストスクリプト側で操作したいんです
それはテストの仕方が間違ってると思うぞ
>>123 そこで思考停止しちゃうのか・・・なんだかなぁ。
俺だったらmodule内で拾ったepoc値を外部コマンドに投げて比較すればいいかなーとか思ってるけど。
秒単位の精度はいらなそうに見えるし。
>>124 それも考えましたが、結局同じロジックにしても違うロジックにしても、自動で結果を出すことになるので信頼できないと思いまして
それに処理をしてるうちにtime関数で返ってくる値が変わる可能性がありませんか?
そこまで組み込み関数が信用ならねーってんなら
my $now = ($test)? 0 : time();
でいいじゃん。
>>126 組み込み関数自体の信頼性は疑ってないです
ただ、スクリプト側でtimeを呼んだときとモジュール側でtimeを呼んだとき、
処理の時間があるのでどうしてもズレがあるわけじゃないですか
それからモジュール側から返ってきた値をチェックしたいので、
チェックするにはスクリプト側でtimeの値を計算してやらなきゃいけない
ということはスクリプト側の計算ロジックも正しい必要があると思います
でも直感的に6月17日の3日後の日時と比較するのなら正しいかどうかが一目でわかると思いまして
そもそもmodule側でtime関数呼ぶ必要あるの?
呼び出し元でtime関数使ってるならそのepoc値渡せばいいだけじゃん。
テストも簡単だぜ?
>>128 それなら確かにズレはなくなりそうですが…
テストの為に関数に風穴開けるのはなんかスマートじゃない気がします
それからテスト側でロジック組む必要がある問題は解決して無くないでしょうか?
脊髄反射でレスしてないでもっとちゃんと読んでくれないか。
あんた言ってることがめちゃくちゃだ。
>>129 「6月17日の3日後の日時と比較する」のは「テスト側のロジック」に見えるのだが。
というか
>>128で言ってるのは
・普段は外から「timeから取得したepoc値」渡す。
・テスト時は「固定値」を渡す。
って意味だよ?
風穴とかスマートとかいう個人的な感性は知らんけど、timeの返り値を外から固定ってのがスマートとはとても思えない。
132 :
nobodyさん:2009/06/18(木) 05:49:48 ID:sDQdBVF1
>>130-131 すみません、勘違いしてました
そうですね、関数の引数を増やせばテストは簡単そうですが…
>>131 できる限り引数を減らしたいんです
モジュール側から見たときに、現在時刻を用いてゴニョゴニョするなら
timeを渡さないほうがすっきりしてると思いませんか?
テストをする場面でスマートであるよりも、実際に使われるモジュール・関数単位でスマートであるべきだと考えてます
これは今回の場面だけでないと思います
例えばDBIのラッパーモジュールを作って、
携帯からの記事投稿とPCからの投稿で異なるデフォルト値を設定したいとします(記事タイトルとか)
このとき、タイムスタンプに常に現在時刻を押すとすると、
記事に関する色んなステータスに加えて時刻までもが引数として渡されることになりますが、
それはモジュールとして完結してるのかという話です
確かにテストのために引数を増やせば楽ができますが、もしテスト側でtimeの値を操作することができるなら、
無駄を出さなくて済みますよね
テストのためだけに引数を渡せとは言って無いのだが・・・。
>記事に関する色んなステータスに加えて時刻までもが引数として渡されることになりますが、
>それはモジュールとして完結してるのかという話です
それを「完結してない」と思う理由が俺には全くわからない。
「引数以上に無駄を出さず、time関数の返り血を制御する」方法は無いと思うが、
どうもこれ以上やりとりしても信条を曲げるつもりが無い以上ずっと平行線だろう。
ま、がんばってくれ。
よくいるよねこういう人
考えすぎてかえって遠回りしちゃうタイプw
考えないヤツはそこで終わりだけどなwww
ちなみにこの問題の解決策はあるよ
関数の引数減らすのも普通の考え方じゃねぇの?
解決策あるなら答えてやれよw
俺も知りたいw
モジュールの中にテストフラグセットするメソッド作って
>>126で終了じゃダメなの?
色々引数は渡せるけど全引数はデフォルト持ってる方がスマートだと思います
>>138 明らかに無駄だとわかるもんがあるとして、
それを引数として渡すことができるのはいかがなものか
日本語でおk
質問者が学習する気無いので、これで終了。
次の質問をどうぞ!
>>136 オーバーライド
----- test.pl -----
#! /usr/bin/perl
use strict;
use warnings;
use lib './lib';
use Time::Local;
use Test::More tests => 1;
use_ok 'Util';
my $time;
{
package Util;
use subs 'time';
sub time{
# 2009/06/17 03:28:00
return $time;
}
}
# 2009/6/17 03:28:00
$time = timelocal 0, 28, 3, 17, 6 - 1, 2009;
ok Util::makeTimeString(3) eq "2009/06/20 03:28:00", "t_value: ". Util::makeTimeString(3);
# 2009/5/30 01:15:13
$time = timelocal 13, 15, 1, 30, 5 - 1, 2009;
ok Util::makeTimeString(5) eq "2009/06/04 01:15:13", "t_value: ". Util::makeTimeString(5);
----- Util.pm -----
package Util;
sub makeTimeString {
my $date_diff = shift;
my $now = time();
my @time = localtime($now + $date_diff * 60 * 60 * 24);
my $date = sprintf "%04d/%02d/%02d %02d:%02d:%02d", ($time[5] + 1900, $time[4] + 1, $time[3], $time[2], $time[1], $time[0]);
return $date;
}
1
ちなみに Test::MockTime Time::Fake といったそれ用のモジュールもあります
ごめん答え知ってて聞いてた
こういうのって、タイムゾーンどうしてます?
1.割り切って日本限定
2.DateTimeを使う
3.Unix限定と割り切ってPOSIXのtzset使う
もう出てけお前
147 :
144:2009/06/18(木) 21:29:00 ID:???
初カキコでこれとは……。
場所が悪いw
>>147 なんかすまんです
そんでタイムゾーンをどう使ってテストする場合の話ですか?
>>146 本当に聞きたかったのは他人がどういうテストしてるのかなんですよね
この答えであってるのか、もっといい方法があるんじゃないかと
>>149 答えは十分出たと思うけどね。
どの方法が「良い」かなんて自分にしか決められないしキリがない。
そういう意味ではお前さんの聞き方は卑怯だったよ。あとスレタイ良く読めw
151 :
144:2009/06/18(木) 22:19:00 ID:???
>>149 ええと、localtime使うと時差が出るじゃないですか。
テストする場所で結果が変わると思うので、
その対処方法を聞きたかったのです。
$ENV{'TZ'} = "JST-9";
>>152 Windowsの場合、上手く動かないんです。
use POSIX qw(tzset tzname strftime);
$ENV{TZ} = 'GMT+0';
tzset;
my ($std, $dst) = tzname;
print "$std $dst\n";
print strftime('%Y-%m-%d %H:%M:%S', localtime), "\n";
-- Linux(Debian)
GMT GMT
2009-06-18 13:48:27
-- WindowsXP
東京 (標準時) 東京 (標準時)
2009-06-18 22:46:20
# やっぱりgmtimeに置き換え?
>>153 それってwindowsではgmtが取得できて無いってだけで、localtimeの動作としては合ってるんじゃないのか?
>>154 Cでも書いてみたのですが、それはLinuxと同じ動作をしました。
結局、下のようなテストケースでUnix:OK, WIndows:NGなのでどうしましょうということでした。
use Test::More qw(no_plan);
use POSIX qw(tzset);
$ENV{TZ} = 'GMT+0GMT';
tzset;
my $now = localtime(1245338340);
ok($now eq 'Thu Jun 18 16:19:00 2009', $now . ' localtime test');
156 :
nobodyさん:2009/06/19(金) 14:25:45 ID:ceoCS57H
http://niconama.ddo.jp/ ダウンロード数をカウントするために、PHPアップローダーからアップロードしたファイルを収納しているディレクトリを
CGIのダウンロードカウンターのほうで読み込んで、アップローダーからファイルにアクセス→リダイレクトして
ダウンロードカウンタのURLに移動してファイルを表示、という事をしているのですが、
ダウンロードカウンタの設定で、画像にアクセスしてもブラウザで開かず、ファイルのダウンロードが開いてしまいます。
何時間もググって調べたのですが、プログラムを全くやった事がないので、結局解決しませんでした。
どうすれば、画像をブラウザで開くように出来るんでしょうか。
http://localhost/uploda/src/nico61.txt これが使ってるカウンタのスクリプトです。
詳しい方、どこを弄ればいいのか教えて頂けないでしょうか。
宜しくお願いします。
localhost のロダにあるものを見てくれと言われましても
158 :
nobodyさん:2009/06/19(金) 14:39:19 ID:ceoCS57H
159 :
nobodyさん:2009/06/19(金) 14:42:27 ID:ceoCS57H
160 :
nobodyさん:2009/06/19(金) 14:55:44 ID:ceoCS57H
あまり関係ないが、hostsファイルに
127.0.0.1 niconama.ddo.jp
と書いておけばいいぞ。
文字の比較についての質問です。
以下のように書くと、「真」が表示されます。
if ("真" eq "真" ){
print "真";
}
しかし、以下のように書くと、「真」は表示されません。
if ("真" =~ /真/ ){
print "真";
}
if ("真" =~ "真" ){
print "真";
}
if ("真" =~ /"真"/ ){
print "真";
}
=~ を使用する場合において、「真」が表示される
ようにするにはどうしたらよろしいのでしょうか。
基本的なことですが、どうしても分からないので
質問させていただきました。よろしくお願い致します。
/\Q真\E/
CP932でコードを書くのをやめるという選択肢もあります。
166 :
164:2009/06/20(土) 13:33:31 ID:???
>>165 検索サイトでいろいろなキーワードで検索していたのですが、
なかなか答えとなるものが見つかりませんでした。
回答は非常に助かりました。ありがとうございます。
168 :
nobodyさん:2009/06/22(月) 03:35:03 ID:mckf9gfO
質問させていただきます。
CGIの勉強をしていてCGIの製作を行っているのですが、レスポンスが遅い気がします。
abでベンチを書けてみたのですが、10リクエストの処理に5秒もかかっています。(そんなに重いCGIではないです。
自分のコードの書き方が悪いのか、それともマシンが遅いのか調べたいのですが、abをかけるいいサンプルのようなものは無いでしょうか。
他のマシンでどれくらいのスピードで動いているかなどのサンプルがあるものだとうれしいです。
>>168 Devel::Profiler
Devel::NYTProf
これで性能分析ができるらしい
ボトルネックあるならこれで分かるだろー
170 :
nobodyさん:2009/06/28(日) 17:18:33 ID:I7LpaOR5
日本語の単語を入力させるWebアプリ作っているんだが
Jcode.pmに文字コードを自動認識させようとするとたまに誤変換するんだが
(たとえば「えー」をucs2に変換させようとすると「?????」に化ける)
その辺の認識精度を上げるにはどうすればいいのかな?
WebページはUTF-8で構成しているけど、フォーム入力から飛んでくる
文字コードはブラウザが勝手に決めてしまう、って認識で合ってるよね?
でんでんつがう
主要ブラウザの実装では、ページの文字エンコード指定もしくは自動判別したそれに従う。
ページのそれと変えたい場合もしくは、より厳密にしたい場合のために、HTML4ではform属性にaccept-charsetが追加された。ただしIE6は未対応。
このレスはたぶん大体あってる。
>>170 ブラウザの仕様はどうであれ、どんなコードでも対応できるように作っておくのはとても大切。
hiddenで文字コード判定用の文字列をpostしておくと良い。
でも無意味な場合もある
これを実行すると#2の出力が文字化けします。
恐らく GET のパラメータの文字コードが utf-8 でないためだと考えています。
どのようにすれば解決できるでしょうか。
#!/usr/bin/perl
use CGI;
my $cgi = CGI->new();
my $str = $cgi->param("str");
print $cgi->header( -charset => 'UTF-8' );
#1
print $str;
#2
sub {map {print $_, "\n"} split(//,shift) }->($str);
入力元のページは utf8 か?
そうじゃぁなければ use Encode しれ
178 :
nobodyさん:2009/07/26(日) 00:42:20 ID:J3wl39Kv
漏れら極悪非道のageブラザーズ!
今日もネタもないのにageてやるからな!
 ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
∧_∧ ∧_∧ age
(・∀・∩)(∩・∀・) age
(つ 丿 ( ⊂) age
( ヽノ ヽ/ ) age
し(_) (_)J
すみません、質問させてください。
CGI(Perl)を使って外部のサイトからHTMLソースを取り込むにはどうしたら良いでしょう?
外部サイトのデータから統計を取って、データとして出力するようなCGIが書高と思ってます。
連レスすみません
>>179 「CGIが書高」→「CGIを書こう」です。
LWPでググルといいよ
> LWPでググルといいよ
知らないなら、「わかりません」って言えよ
185 :
179:2009/07/30(木) 01:23:24 ID:???
186 :
nobodyさん:2009/08/04(火) 17:31:46 ID:opJYW1lj
わからないのでお願いします。
文字化けする文字をこのように変えたいのですが変換されません。
どのように書けばいいのでしょうか。
$a =~ s//高/g;
よろしくお願いします。
まず置換対象文字列の文字コードと書いてるコードの文字コードを把握しろ
188 :
nobodyさん:2009/08/04(火) 18:46:13 ID:Udgymmfy
>>186 が文字化けするので高に変えたいってこと?
189 :
nobodyさん:2009/08/05(水) 08:42:09 ID:57ai1vyR
test
190 :
nobodyさん:2009/08/05(水) 10:00:37 ID:2mkcb2/U
>>187 ありがとうございます。
>>188 はい、そのようにしたいと考えております。
187さんのおっしゃる通りに、書いてるコードを確認したところEUCでしたので
sjisに変えてみたところ、うまくできました!
ここ数日、悩んでいたのですっきりしました。
187さん、188さん、ありがとうございました。
文字列の抽出についての質問です。
任意の文字で囲まれた
文字列をすべて抽出する方法がわかりません。
たとえば、abcabcabcといった文字列に対し
aとcで囲まれたすべての文字列を取得するには
どうすればいいのでしょうか?
この例だと
abc
abcabc
abcabcabc
abcabc
abc
が該当します。これらをすべて抽出したいのですが。
my $str = 'abcabcabc';
while($str =~ m/(a)/g){
my $pos = pos($str);
my $result = $1;
while($str =~ m/([^c]*c)/g){
$result .= $1;
print "$result\n";
}
pos($str) = $pos;
}
193 :
191:2009/08/06(木) 09:27:03 ID:???
返事が遅くなってすみません。
>>192さん ありがとうございました。
思っていたように動作しました。
続けての質問で申し訳ないのですが
アルファベットで構成されるランダムな文字列
CFGTARFEQZCAZVHNNNGZYAKLOPYL..(みたいな感じです)
から例えば、Aから始まり X,Y,Zを中に含まず XまたはYまたはZで終わる
文字列をすべて抽出するには
どのようにすればよいのでしょうか?
実際には単一のアルファベットの連続ではなく
ONETWOTHREEFOURFIVE..のように
単語が適当に連続しているものと想定して使用できる記述を
(ONEで始まりSIXを含まずTENで終わり のように)
提案していただけると助かります。
よろしくお願いします。
194 :
191:2009/08/06(木) 09:38:23 ID:???
すみません、上の質問に対する追加です。
単語はONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TENが想定される
のように、あらかじめ分かっていて指定することができます。
195 :
nobodyさん:2009/08/06(木) 15:43:26 ID:0zj+bmfk
てすと
んー、文字列探索のパッケージがありそうな気がするけど。てけとうに作って見た。
sub start {
my ($item, $sub) = @_;
return sub{
my ($str) = @_;
my $start = 0;
while((my $new = index($str, $item, $start)) >= 0){
$start = $new+length($item);
$sub->(\$str, $start, length($str), $item);
}
};
}
sub without {
my ($item, $sub) = @_;
return sub{
my ($str, $start, $end, $result) = @_;
my $new = index(${$str}, $item, $start);
$end = $new if ($new >= 0 && $new < $end);
$sub->($str, $start, $end, $result);
};
}
sub end {
my ($item) = @_;
return sub{
my ($str, $start, $end, $result) = @_;
while(1){
my $new = index(${$str}, $item, $start);
($new >= 0 && $new < $end) or last;
$result .= substr(${$str}, $start, $new+length($item)-$start);
$start = $new+length($item);
print "$result\n";
}
};
}
my $str = join('', map{
qw(ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE TEN)[int(rand(10))]
} (1..100));
print "$str\n\n";
start('ONE', without('SIX', end('TEN')))->($str);
198 :
191:2009/08/07(金) 00:23:46 ID:???
>>196,197さん ありがとうございます。
動作検証し、勉強させていただきます。
複数のファイルから質問のようなことをしたくて
テキストエディタでの単純な正規表現での処理だと面倒なので
やったこともないプログラミングのようなことをを試みたのですが
単純なマッチングでは、オーバラップしているところが
検索から漏れて困ってました。
199 :
196:2009/08/07(金) 01:07:13 ID:???
実際にやってることは、くっだらない事だから、あまり期待しないでね。
終わりの条件を複数にするのを忘れてたけど、
$subを配列にしてループさせると、探索条件を複数にすることもできると思う。
>>196 是非わが社に(笑)
掲示板見てると出来る人そこそこいるのにperl経験者募集かけても全然こないのは
年寄りが多いのか…若くてもそこそこの地位になってるのか…
正規表現あんまり自信ないですくらいなら許せるが
リファレンスもOOPもわかりませんって人多くて最近疲れ気味だ(泣)
>>200 待遇がショボいか求人出すところ間違えてる。
202 :
nobodyさん:2009/08/07(金) 10:28:18 ID:wZBhH276
PerlよりPHP全盛だしねぇ
203 :
nobodyさん:2009/08/08(土) 08:08:10 ID:nShQ5pki
文字の途中に他の変数の値入れるにはどうすればいいの?
$b = "str$astr";だと最初の「str」で途切れるし
$b = "str$a str";にすると空白はいっちゃうし
"str${a}str"
"str$a\str"
ありがとう!
206 :
nobodyさん:2009/08/10(月) 13:15:14 ID:LPa3QqaE
てすと
207 :
nobodyさん:2009/08/13(木) 09:14:17 ID:NeVAVZeH
cgiで受信したHTTPヘッダが丸ごと入ってる環境変数みたいなの無いの?
受け取ったデータまんま返したいんです
環境変数を使い分けるの面倒だし
>>207 あるけど、そのまま返すとXSS脆弱性持つよ。
>>203は俺だったら"str".$a."str"にするなぁ
なんとなく変数は文字列定数とは独立させたい
if文の中身はどう書けばいいのでしょうか?
$str = "euc or shift-jis or utf8";
if ( $strに"euc"と"shift-jis"という両方の文字を含んでいたら ) {
・・・
{
Encode::Guess の結果か
優先順じゃないから気をつけて
で、正規表現つかってね
>>210 実直に書けば
$str =~ /(^.*euc.*shift-jis.*$)|(^.*shift-jis.*euc.*$)/
かな
後々にも条件文が続くなら
my %hash = map{ $_ => 1} split ' or ', $str;
if($hash{'euc'} and $hash{'shift-jis'}){
}
elsif($hash{'utf8'}){
}
...
とかどうよ
>>211-212 はい、Encode::Guessの結果後の処理です。
具体的なコードありがとうございます。
214 :
nobodyさん:2009/08/15(土) 09:36:01 ID:njfakeIM
216 :
nobodyさん:2009/08/18(火) 18:06:40 ID:RO5+3AJ6
CUIで実行する時print使うときに改行つけないと画面に表示されないけど
あれなんとか出来ないの?
flush
$|=1;
219 :
nobodyさん:2009/08/18(火) 18:53:46 ID:RO5+3AJ6
ありがとう
$|とかググれないし、いい加減なんとかするべきだと思うんだ
$|でググるやつはおらんだろ・・・
222 :
nobodyさん:2009/08/21(金) 21:25:25 ID:OnG1WZEr
$s = 0;
$s =~ /(.)/;
for($i=4; $i>0; $i--) {
print "$1\n";
$i =~ /(.)/;
}
↑これ実行すると「0321」となるはずなのに「0000」になるんだけど何で?
正規表現処理した後にプリント使うと「4321」になるけど、どうしてもこのまま使いたいです
for($i=4; $i>0; $i--) {
print "$i\n";
$i =~ /(.)/;
}
224 :
nobodyさん:2009/08/21(金) 21:42:18 ID:OnG1WZEr
hspとvbがはやいんだろう
>>222 いや、どう見ても「0321」なんてならんぞ。
>>223でも「4321」だし。
何見て書いたそれ?
試してないけど0432じゃ?
>>222 多分ループごとに $1 が変数スコープ外れてる
my $num = 0;
my $put;
$num =~ /(.)/;
$put = $1;
for(my $cnt = 4; $cnt > 0; $cnt--){
print "$put\n";
$cnt =~ /(.)/;
$put = $1;
}
これでいけるけど、もっといい書き方がきっとあるはず
具体的に何したいのかを書けばもっといいアドバイスがもらえると思うよう
あと一文字の変数を使うのと use strict しないのはよしといたほうがいいよ
落とし穴ハマってうっきーってなるから
と思ったけど実行結果 0321 なのな・・・ちょっと意味分からんわ
my $i = 0;
do{
$i =~ /(.)/;
print "$1\n";
$i = ($i-1) % 4;
}while($i > 0);
結果は出るけど、質問の意図が読めないからどうなんだろ。
my $s = 0 =~ /(.)/ ;
for( my $i=4; $i>0; $i-- and print "$1\n" and $i =~ /(.)/ ) { }
いろんな書き方知りたいわけじゃなくて
$Nのスコープってどうなってんだ?
って質問なんじゃ?
#!/usr/local/bin/perl --
$a = "[123][456][789]";
while($a =~ /[(.*?)]/){
print $1"\n";
}
123、456,789と表示したいです
一回ずつづらしてマッチさせられないですか?
>>231 1回ずつじゃないけど
$str = "[123][456][789];
@contents = $str =~ /[(.*?)]/g;
print "$_\n" foreach @contents;
実験して3秒あせったw
正規表現もバグってるよ
$str = "[123][456][789]";
@contents = $str =~ /\[(.*?)\]/g;
print "$_\n" foreach @contents
>>231 my $s = "[123][456][789]";
while($s =~ /\G\[(.*?)\]/g){
print $1, "\n";
}
>>230 正規表現周りは奇妙だからなぁ。
たとえば、最後にマッチした正規表現を使う、空マッチを使うと期待通りに動く。
$1などの変数はマッチ直後に保存しとくのがベストだろうと思う。
my $s = 0;
$s =~ /(.)/;
for(my $i = 4; $i > 0; --$i){
print $1, "\n";
$i =~ //;
}
>>236 m//gで、前回マッチした直後からマッチングを行う。
my $s = "[123]456][789]";
こんなときに、処理を止める。
>>238 意味が分からん。
別に気に入らなければ、付けなきゃいいじゃん。
>>238 じゃあさ、
>>231のシェバング行の -- が無くても同じ結果になるけど、
-- に意味があると思う?
ループ内で宣言したものはその中でしか生きられない
正規表現で () 使った後に使える $n は、
正規表現使った時に my されると思った方が
いいかも知れません
しかしスコープの問題だとすると、
>>222の結果って「0000」じゃなくて「」(null)になりそうな気もするがな。
$1の初期値が「0」ってことはないだろうし。
>>241 >>240の言葉を借りれば、グローバルなレキシカル変数$1(下の(1))と、forループ内で
$i =~ /(.)/;より下で有効なレキシカル変数$1の2つが混在していると。
$s = 0;
$s =~ /(.)/; #=> my $1 = "0" ・・・(1)
for($i=4; $i>0; $i--) {
print "$1\n"; "=> この時点では1つ上のスコープのグローバルな$1、すなわち(1)を表示
$i =~ /(.)/; #=> my $1 = $i ・・・(1)のグローバルなレキシカル変数$1は、一旦ここで見えなくなる
}
>>240 では、面白い例を。結果は0432。
my $s = 0;
$s =~ /(.)/;
foreach(reverse 1..4){
print $1, "\n";
/(.)/;
}
>>243 何故…
なんか理由があってこうなってんの?
会社で引き継いだスクリプトに下記の様な記載がありました。
別に現状では何も問題が無いんですが、何の意味があるか良くわかりません。
if 文で変数が未定義だったら何をしているんでしょうか?
$stlist{$kumi}{$bangou}= [] if ! exists $stlist{$kumi}{$bangou};
use strict;
use warnings;
my %stlist = ();
my $kumi = 1;
my $bangou = 2;
$stlist{$kumi}{$bangou} = 3;
$stlist{$kumi}{$bangou} = [] if ! exists $stlist{$kumi}{$bangou};
print $stlist{$kumi}{$bangou},"\n";
undef $stlist{$kumi}{$bangou};
$stlist{$kumi}{$bangou} = [] if ! exists $stlist{$kumi}{$bangou};
print $stlist{$kumi}{$bangou},"\n";
--
>perl test_perl.pl
3
Use of uninitialized value in print at test_perl.pl line 14.
まあ
$stlist{kumi}{bango} ||= [];
で同じことできるんだけどな
>>247 $stlist{$kumi}{$bangou} //= [];
じゃなくて?
245です。ありがとうございます。
意味はモヤッと解ってきたのですが「[]」 の使い方が解らないんです。
「()」では駄目なんですか?
250 :
nobodyさん:2009/08/26(水) 18:52:28 ID:mCRAV2Yd
Cのscanf関数みたいなのってないの・
>>249 () 配列
[] 配列のリファレンス
ここで
$hoge = ();
とすると、多分スカラーコンテキストで無名配列が評価されるので0が入る
$hoge = [];
だと配列のリファレンスが入るから、何も値が入ってない状態で
$hoge->[0]
とかやってもうまく動く
多分ね
便乗ですいません。
my $hoge = [1, 2, 3, 4, 5];
my $huga = [6, 7, 8, 9];
という風に二つの配列へのリファレンスがあったとして、
この二つの配列を合わせた配列へのリファレンスを新しく作るには
my $kei = [ @{$hoge}, @{$huga} ];
以外に方法はありますか?
いろいろ試してみたんですが上手くいかなくて…。
ubuntu 9.04 で DBIx::Class::Schema::Loader をインストールしようと
してるんだけど, 一緒に要求される DBI::DB2 が入らない.
ubuntu 8.04 用の DB2 deb パッケージを入れたあと
$ sudo su
# export DB2_HOME=/opt/ibm/db2exc/V9.5
# cpan DBI::DB2
すると, include するべきヘッダが無いらしく, 大量の未宣言エラーが出る。
DB2 自体をソースからコンパイルして make install するしか無いかな?
というか DB2 は使う予定が無いから, DBI::DB2 自体をスルーしたいのだけど...
ちなみに CPAN-Testers でもインストール成功例は無いようです.
ttp://static.cpantesters.org/distro/D/DBD-DB2.html
>>254 develパッケージ入れないとダメなんじゃない?
256 :
254:2009/08/28(金) 13:30:37 ID:???
えーと最初に,
>>254 の DBI::DB2 は DBD::DB2 の間違いでした.
それでですね...
ずらずら出るエラーメッセージを見ていたら, include 出来ずにエラー出してるのは
DBIXS.h とかだったので, cpan DBI してみたらビンゴ.
無事 DBD::DB2 のインストールに成功しました.
しょうもないオチですまんかった. 付き合ってくれた
>>255 ありがとう.
257 :
nobodyさん:2009/08/31(月) 21:28:16 ID:SNcF+RG0
$s="str"
if ($r =~ /str/){exit;}
↑マッチしたら偽判定にするにはどうしたらいいの?
258 :
nobodyさん:2009/08/31(月) 21:28:57 ID:SNcF+RG0
間違えた
$s="str"
if ($s =~ /str/){exit;}
$s !~ /str/
unlessと!~でどっちがはやいか調べて早い方使う
>>257 if ($r !~ /str/){exit;}
if ( ! $r =~ /str/){exit;}
if (not $r =~ /str/){exit;}
unless($r =~ /str/){exit;}
すきなの使え。この条件ならunlessも!~もほとんど差がないと思うぞ。
テストを作っているんですが、前のページに戻れないようにするには
どうすればいいでしょうか?戻るボタンや戻るボタンの過去の履歴を
押しても、最後にいたページにリダイレクトされるようにしたいんですが、
できるでしょうか?
全てのページの偏移をリダイレクトにすればいい
つか毎回ログつくってしまうかクッキーで管理すればおk
264 :
nobodyさん:2009/09/05(土) 04:55:23 ID:UpeEOLWy
DOS画面出さずに実行する方法無いの?
cgi以外で
tcshでいいんじゃね?
ていうかwperl知らんのけ
266 :
nobodyさん:2009/09/05(土) 06:30:25 ID:UpeEOLWy
こんなの知らなかった
ありがとう
フレームワークって言っても、結局セッションでクッキー管理の罠。
>>267 ありがとうございます。さっそくググって勉強中ですが、cakeやらsymfonyやら
あるようですが、私の用途ですと、どれを使っても問題ないでしょうか?
>>263 リダイレクト関連でheaderを勉強して、キャッシュが残らないように設定して、途中で
「戻る」と、問題がテスト開始前に設定した問題数分最初から出題されるように
なったので(同時にセッションも新規セッション)、20問なら20問後戻りせずに解かせる
という最低限やりたいことは、これで対処できるようになったかと思います。
>>262で質問した内容とはまだ少し違いますが。ありがとうございます。
>>269 cakeとかPHPだろ。とりあえずCatalyst使っとけ。他にもあるがCatalystは少し枯れてるし情報も豊富。
中規模以のアプリケーションを楽しく書きたいならフレームワーク一択。
Moose 化以前の Catalyst なのか、Moose 化後の Catalyst なのか
まずはそこをはっきりさせた上で他人に勧めてくれないか。
>>271 Catalystスレあるんだからそこでやろーぜ。
foreach $value (keys %DATA{$unko}){
print $value;
}
これって駄目なの?
うーん、意味が理解できないけど動いた・・・・。
foreach $value (keys %{$DATA{$unko}}){
print $value;
}
これはハッシュだよこれはハッシュだよ
と2回言ってるようなもの
簡単にいえば無駄な書き方
>>275 1. $DATA{$unko} はハッシュの要素であり、その例の場合は値としてハッシュリファレンスを持っている。
# その点は print $DATA{$unko} してみるとわかる。
# 恐らく "HASH(0xdeadbeef)" 的なものが表示される。
2. keys() は引数としてハッシュそのものしか取らず、従ってハッシュの要素は受付けない。
3. ハッシュリファレンスをハッシュとして扱うためにはデリファレンスを行う必要がある。
4. ハッシュとして明示的にデリファレンスするには、リファレンスを "%{ }" でくくる。
perlreftut, perlref 及び perllol の各 perldoc も参照してください。
>>274 %DATA{$unko} # これはありがちな文法ミス
%DATA {$unko} # <- こうパースされる
>>276 そのりくつはおかしい
my %hash = ( data => {hoge => 'huga', foo => 'bar'});
print $hash{data}, "\n"; #=> HASH(0x9c4a880)
print %{$hash{data}}, "\n"; #=> foobarhogehuga
print keys %hash, "\n"; # => data
print keys %{$hash{data}}, "\n" #=> foohoge
ほら、明らかに違うもの指してるでしょ
280 :
nobodyさん:2009/09/10(木) 12:07:31 ID:jH+1ZMcm
DBIにて同じテーブルを二つのプロセス(プログラム)を動かしてアップデートをする時
デッドロックが発生してしまいます。
これを検知して作業を続行するにあたり、evalでexecuteを見張る以外に
何かいい方法はありますか?
プログラム側で排他ロック持てばいいんじゃないの?
そもそもデットロックしないように作らない?
283 :
sage:2009/09/10(木) 15:42:38 ID:jH+1ZMcm
>>282 ええ、その通りなんですがその方法が解らず・・・
>>281 DBI 排他ロックのキーワードで解決できそうです
ありがとうございます。
亀ですんません
>>278 なんとなくですが解りました。ありがとうございます。
perldocを読破しないと似た問題には対応出来ないですね・・・
ハッシュは複雑すぎる
CGIチャットを設置しているのですがsubmitボタン(手動更新用)を連打している形跡があり
ボタンを更新後数秒間物理的に押せないようにしたいと思い
色々調べてみましたがいい案が浮かびませんでした
何かよい案があればお力添えを戴けませんでしょうか
手動だけ対策って事ならjavascriptで一定時間隠す
>>286 即レス有難うございます 書き込みながらググってますがどうもピンときません
超初心者のレベルにも達してないということですね…吊ってきます
>>287 html disabled とほほ
送信ボタンをdisabledにして数秒スリープして元に戻す関数を送信ボタンクリックボタンにトリガーする感じ?
ただ直接URL叩かれてたら無意味
CGIのスクリプトをいじれるなら
時刻とIPアドレスのハッシュを一定時間保持しといて
マッチしたらはじくとかでもいいかと
290 :
285:2009/09/12(土) 11:10:28 ID:???
>>288さんの単語で検索して呻ってる最中です
本当にドがつくレベルなので出来るかどうかわかりませんが
もう少しがんばってみますね
291 :
285:2009/09/12(土) 12:25:36 ID:???
disabledにするところまでは出来ました
元に戻すというのが理解できず詰まってる状態です
もう少し色々試してみますね
292 :
nobodyさん:2009/09/15(火) 03:11:36 ID:m9vb+1wp
ファイルハンドルに配列みたいなのって無いの
ループ毎に別のハンドルに切り替えたいのだけれど
my @fhs = map { open my $fh, $_ or die $!; $fh } qw(file1 file2 file3 ......);
use IO::File;
my @fhs = map { IO::File->new($_, "r") } qw(file1 file2 file3 ......);
近年、近いところでは前スレでも
ファイルハンドルはベアワードではなくレキシカル変数に入れろ
と啓蒙する動きが見られるようになったけど、
そうすることによって出来ることも増えるのだなぁと今思った。
2 8 10 13 27 30 39
1 9 16 20 21 43 5
1 5 15 31 36 38 13
最近、コード打ってなくて、頭が回らんので助けてくだあい
1回目=1行 のデータがたくさんあって
この中から、各数字の組み合わせの頻度を出したいのですがループの回し方が思い浮かばず
2-9の組み合わせ○回
2-10の組み合わせ○回…というように。
上記のようなファイルが用意してあって
それを1line読み込んで、ループに回す、と考えているのですが
スマートなループを教えてください。
エスパー登場。
説明しやすいように1行に3つの数字とする。
1 2 3 #=> 2つの組み合わせ=1-2、1-3、2-3
1 3 5 #=> 2つの組み合わせ=1-3、1-5、3-5
2 3 6 #=> 2つの組み合わせ=2-3、2-6、3-6
1-2の組み合わせの登場は1回
1-3の組み合わせの登場は2回
1-5の組み合わせの登場は1回
2-3の組み合わせの登場は2回
2-6の組み合わせの登場は1回
3-5の組み合わせの登場は1回
3-6の組み合わせの登場は1回
>>297 把握した
my (@data, %hash);
@data = (
[1, 2, 3],
[1, 3, 5],
[2, 3, 6],
);
foreach my $row(@data){
foreach my $i(0..$#$row){
foreach my $j(($i + 1)..$#$row){
my $key = ($row->[$i] < $row->[$j]) ? "$row->[$i]-$row->[$j]" : "$row->[$j]-$row->[$i]";
$hash{$key}++;
}
}
}
print "$_の組み合わせの登場は$hash{$_}回\n" foreach sort keys %hash;
299 :
nobodyさん:2009/09/24(木) 23:09:26 ID:BEttX1dB
レンタル鯖においたCGIでHTTPSのページにログインしたいんだけど、可能?
その鯖にCrypt::SSLeayが入ってりゃ可能だし
入ってなけりゃSSHかなんかでユーザ領域インストールすりゃいいんじゃね
301 :
nobodyさん:2009/09/27(日) 16:08:13 ID:dRLFhFfi
WWW::Mechanizeを使って2chに書き込みたいのですが
$mech->submit_form(
form_number => 1,
fields => {
FROM => '',
mail => '',
MESSAGE => 'aaa',
}
);
でポストすると
http://jfk.2ch.net/test/read.cgi/mmo/test/bbs.cgi?guid=ON に飛ばされてしまいます
mech-dumpで見てみるとスレッドのフォームでポストすべきものは
submit=書き込む(HTML設定済み) (submit)
FROM= (text)
mail= (text)
MESSAGE= (textarea)
bbs=<板識別子(HTML設定済み)> (hidden readonly)
key=<スレッドナンバー(HTML設定済み)> (hidden readonly)
time=<時間(HTML設定済み)> (hidden readonly)
となっているので$mechでサブミットすべきものはFROM,mail,MESSAGEと
認識してるんだけどこれ間違ってますか?
UAとかクッキーを見ているかもしれない
はいはい monazilla 。
たしかクッキーにある値がセットされてないと書けなかった気がする
305 :
301:2009/09/28(月) 08:23:50 ID:ae4P5TMo
ネット上に転がってる仕様のまとめは一通り目を通してあるつもりなんですが、
クッキーが必要でないだろう初回書き込みのポスト(書き込み確認画面へ移動)
が通らないんですよね・・・
クッキーを覗けばわかる
専ブラとかもそのせいで書けなくなって、一時期話題になってるから
探せばすぐにわかると思う
307 :
301:2009/09/28(月) 09:48:59 ID:???
プログラム中のPOST先が間違っていました・・・。
またちょっと自力で奮闘してみます
お騒がせしました。
Sniffer::RTMPのtar玉どこかからダウンロードできませんか
309 :
nakacyan:2009/10/01(木) 09:38:30 ID:Q77nXvDi
書き込み先がここであっているかわかりませんが、質問させていただきます。
現在、大学の課題でミリセック単位での処理時間を計算するスクリプトを作成しているのですが、
どうロジックを組めばいいのかわかりません。
肝になるのは識別子でソートをすることとms単位で時間差分をとることだと思うのですが、
後者はtime関数等を使えば実現できるのでしょうか?
ヒントになりそうなスクリプトをいご教授いただけると助かります。
課題は以下になります。
あるPCの処理時間を出力したmeiji_test001.csv meiji_test002.csv というファイルがある。
ファイルの詳細は以下。
meiji_test001.csv
ファイル名,処理時間,区別,識別子
meiji_test001,01:30:22.392,S,SHJAKIU02387HQ87OK.dd1
meiji_test001,01:31:44.223,S,LKIE832JUH20KJKKKH.dd1
meiji_test001,01:35:56.356,S,KJNEYHQPLK95718HNJ.dd1
meiji_test001,01:36:47.313,S,OQI81KMHFDJ98NBHJI.dd1
meiji_test001,01:40:14.009,S,09KAJNMCVZH83KJEUL.dd1
meiji_test001,01:42:58.763,S,KJQPOI045KMNJKMAUU.dd1
meiji_test001,01:43:59.443,S,KI948MMNGYWUQIIIOK.dd1
310 :
nakacyan:2009/10/01(木) 09:40:29 ID:Q77nXvDi
>>309 続きです
meiji_test002.csv
ファイル名,処理時間,区別,識別子
meiji_test002,01:30:21.002,R,SHJAKIU02387HQ87OK.dd2
meiji_test002,01:31:24.003,R,LKIE832JUH20KJKKKH.dd2
meiji_test002,01:34:22.106,R,KJNEYHQPLK95718HNJ.dd2
meiji_test002,01:35:22.003,R,OQI81KMHFDJ98NBHJI.dd2
meiji_test002,01:39:06.009,R,09KAJNMCVZH83KJEUL.dd2
meiji_test002,01:41:40.103,R,KJQPOI045KMNJKMAUU.dd2
meiji_test002,01:42:34.023,R,KI948MMNGYWUQIIIOK.dd2
それぞれのファイル内で識別子をキーに処理時間を比較し、
同一のものがあれば処理時間を計測し、ログファイルに出力せよ。
同一のものが存在しない場合はなにも処理を行わない。
処理時間はミリセック単位(ms)で表示し、ログファイルには以下の形で出力すること。
※区別Rには処理時間を出力しない。
meiji_Kekka.csv
ファイル名,処理時間,区別,識別子,処理時間
meiji_test001,01:30:22.392,S,SHJAKIU02387HQ87OK.dd1 01.390
meiji_test002,01:30:21.002,R,SHJAKIU02387HQ87OK.dd2
meiji_test001,01:31:44.223,S,LKIE832JUH20KJKKKH.dd1 20.220
meiji_test002,01:31:24.003,R,LKIE832JUH20KJKKKH.dd2
meiji_test001,01:35:56.356,S,KJNEYHQPLK95718HNJ.dd1 01.34.250
meiji_test002,01:34:22.106,R,KJNEYHQPLK95718HNJ.dd2
meiji_test001,01:36:47.313,S,OQI81KMHFDJ98NBHJI.dd1 01.25.310
meiji_test002,01:35:22.003,R,OQI81KMHFDJ98NBHJI.dd2
meiji_test001,01:40:14.009,S,09KAJNMCVZH83KJEUL.dd1 01.08.000
>>311 あ、ちがうか。自分で計測するんじゃないのか。
>>309 ム板の宿題スレ逝けよ。webprogじゃねーし。
つか単純にsec*1000でmsの精度にすればいいだけの話に見えるけどな。
つsort, uniq
最近の大学ってperlなんか教えるの?
sub f{local$_=$_[0];/(\d{1,2}):(\d{1,2}):(\d{1,2})\.(\d{1,3})/?($1*3600000)+($2*60000)+($3*1000)+$4:undef}
明治大学か
>>309-310 勉強中の自分にちょうどよい題材なので作った。
>>317-319がそのコード。
my $file1 = 'meiji_test001.csv';
my $file2 = 'meiji_test002.csv';
my $output_file = 'meiji_Kekka.csv';
my %data_of;
open my $fh, $file2 or die $!;
my @labels = split /,|\n/, <$fh>;
while ( my $line = <$fh> ) {
chomp $line;
my @data = split /,/, $line;
my $id = ( split /\./, $data[3] )[0];
$data_of{$id} = \@data;
}
close $fh;
open my $out, '>', $output_file or die $!;
print {$out} join(',', (@labels, '処理時間')), "\n";
open $fh, $file1 or die $!;
<$fh>;
while ( my $line = <$fh> ) {
chomp $line;
my @data = split /,/, $line;
my $id = ( split /[.]/, $data[3] )[0];
if ( exists $data_of{$id} ) {
print {$out} join(',', @data), ',';
print {$out} interval(Start => $data_of{$id}[1], End => $data[1]), "\n";
print {$out} join(',', @{$data_of{$id}}), "\n";
}
}
close $fh;
close $out;
sub interval {
my %time_of = @_;
my (%sec_of, %interval);
my @sec_for_unit = ( { unit => 'hour', sec => 3600 }, { unit => 'minute', sec => 60 } );
while ( my ($when, $time) = each %time_of ) {
if ( $time =~ /^(\d+):(\d+):(\d+\.\d+)$/ ) {
$sec_of{$when} = $1*3600 + $2*60 + $3;
} else {
require Carp;
Carp::croak("Invalid time format : $time");
}
}
$interval{sec} = $sec_of{End} - $sec_of{Start};
for my $hash (@sec_for_unit) {
my ($unit, $sec) = ($hash->{unit}, $hash->{sec});
if ( $interval{sec} >= $sec ) {
$interval{$unit} = int $interval{sec} / $sec;
$interval{sec} -= $interval{$unit} * $sec;
}
}
my $interval_time;
$interval_time .= sprintf '%02d:', $interval{hour} if $interval{hour};
$interval_time .= sprintf '%02d:', $interval{minute} if $interval{minute};
$interval_time .= sprintf '%06.3f', $interval{sec};
return $interval_time;
}
>勉強中の自分にちょうどよい題材
だからこそ課題になってるってのになぁ・・・
最近の学生はホントゆとり過ぎる
ブラゲー(FFA)のマクロを組むことをめざしてPerl触ってるんで
実験としてCGIに無限にPOSTするのをつくったんですが、どうもうまくいかないです。ループをきると正常に作動しますけどループをいれた瞬間動かないです。コンパイルエラーはでないのに・・・。以下ソース複数で書き込みします
#!/usr/local/bin/perl -w
use strict;
use Socket;
open(IN,"hoge.txt");
my $Length;
my (@list,$line);
while($line = <IN>){
Connect();
@list = split(/\t/,$line);
$Length = length($list[1]) + 5;
print SOCKET "POST /manko.cgi HTTP/1.0\r\n";
print SOCKET "Content-Length: $Length\r\n";
print SOCKET "\r\n";
print SOCKET "unko=$list[1]\r\n";
while(<SOCKET>){
m/^\r\n$/ and last;}
while(<SOCKET>){
print $_;
}
}
sub Connect{
my($host,$port) = ("localhost","80");
my $iaddr = inet_aton($host) or die "無効なhost!";
my $sock_addr = pack_sockaddr_in($port,$iaddr);
socket(SOCKET,PF_INET,SOCK_STREAM,0) or die "ソケットを作成できなかった!";
connect(SOCKET,$sock_addr);
select(SOCKET); $|=1; select(STDOUT);
return 0;
}
どこがわるいのか指摘お願いします。
whileを($line = <IN>)を$line = <IN>;にすると動くみたいです
>>322 どうみてもF5よりもタチの悪い攻撃スクリプトなので回答は控える。
他の住民もスルー希望。
>>322 foreach (glob('C:\ ')) { unlink $_ }
325 :
nobodyさん:2009/10/02(金) 23:48:23 ID:fo52aLk6
>>300 今更なんだがそのSSHとやらを誰か詳しく教えてくれ
板違い
現状、以下のようなコードがあります。
map { eval '$' . $_ . ' = $arg{' . $_ . '}' } qw(a b c);
evalをループの中に入れるのは効率が悪いと
あちこちに書いてあったのでevalを外に出したいのですが、
以下のように記述したところ、上手く動いてくれません。
eval q|map { '$' . $_ . ' = $arg{' . $_ . '}' } qw(a b c)|;
どういう風に記述すれば動くようになるでしょうか。
よろしくお願いします。
$a = $arg{a};
$b = $arg{b};
$c = $arg{c};
>>328 こんなんとかはどう?
eval join q{}, map "\$$_ = \$arg{$_};", qw(a b c);
超初心者です。
ホームページを取得するコードを書いたのですが、日本語部分が文字化けします。
ググって、chcp 65001やbinmode STDOUT, ':encoding(cp932)';など試してみましたが、解決できませんでした。
既出の質問かも知れませんが、アドバイスいただれば幸いです。
ソース
#!/usr/local/bin/perl
use strict;
use warnings;
use LWP::Simple;
use utf8;
my $url = "
http://yahoo.co.jp/index.html";
my $response_string = get($url);
print $response_string;
[環境]
WindowsXp SP3
ActivePerl 5.8.9 Build 826
Windows メモ帳
ファイル保存形式 utf8
コンソール Windows標準コマンドプロンプト
よろしく、お願いします。
>>332 utf-8からcp932に変換したいのなら、from_toを使えばいいと思います。
my $response_string = get($url);
#-- 追加 --------
use Encode;
Encode::from_to($response_string, 'utf8' => 'cp932');
#---------------
print $response_string;
use utf8の基本は、外部から来る文字列は、Perlの内部表現にし(decodeする)、文字列を
外部に出力するときは、Perlの内部表現から所望の文字コードに変換する(encodeする)
です。
Perlの内部表現はUTF-8を使用しているため、UTF-8で入ってくる外部からの文字列は
変換が必要ないと思われがちですが、内部表現でのUTF-8ではUTF-8フラグというのを
立てて、単なるUTF-8(バイナリ列)と、内部表現でのUTF-8を区別しています。
そのため、UTF-8の文字列であろうと、内部表現にするためには、decodeする必要があります。
質問のコードをその理念に基づいて書き直すと、
use utf8;
use Encode;
binmode STDOUT, ':encoding(cp932)'; # 外部への出力(標準出力)は”内部表現”からcp932に変換
my $url = "
http://yahoo.co.jp/index.html";
my $response_string = decode('utf8', get($url)); # 外部から来た文字列は内部表現にdecode
#my $response_string = decode_utf8( get($url) ); # 外部からきた文字列がUTF-8の場合はこれでもよい
print $response_string;
>>333 332です。さっそくのご返答、ありがとうございます。
Perlの内部表現、encode、decodeについて、まだ詳しく理解していないので、これから勉強していきます。
サンプルで書いていただいたコード、見事に文字化けなしで動作しました。
2chに書き込むのは、生まれてはじめてだったのですけど、的確なアドバイスをいただいて感激しました。
335 :
nobodyさん:2009/10/06(火) 16:20:44 ID:o5fGVlDs
>>328 ベストは
>>329の回答。
どうしてもなら
map { ${ $_ } = $arg{ $_ } } qw(a b c);
そもそもデータの扱い方が悪いんだから
そこを指摘してあげなよw
>>335 シンボリックリファレンスを使ったやり方ですよね。
それはまず最初に試したのですが、動いてくれませんでした。
no strict 'refs' を使ってもダメでした。
理想は
>>329さんのやり方なのだとは思うのですが、
実際は配列の中に入っている変数が10数個ある状態ですので
どうしても冗長になってしまいます。
そこをどうにかできればと思ったのですが…。
これはうごくっしょ。
use strict;
use warnings;
my %arg = (a => 1, b => 2, c => 3);
{
no strict 'refs';
map { ${ $_ } = $arg{ $_ } } qw(a b c);
}
{
no strict 'vars';
no warnings 'once';
print "$a, $b, $c\n";
}
掟破りなコードだわな。
普通は使わないので、プログラムを練り直してください。
>>337 配列というかハッシュに入ってんだろ?
一番便利な形じゃん
そのまま使うか丸々コピーして使えば?
340 :
nobodyさん:2009/10/07(水) 14:16:38 ID:DCSJgtVa
test
341 :
nobodyさん:2009/10/07(水) 19:56:47 ID:OXEUclFZ
342 :
nobodyさん:2009/10/07(水) 22:42:55 ID:4Cj4Mzn7
>>341 開けるよ?
何をどうしたいのか、試した操作は何か書いてください。
>>338,339
ありがとうございます、動きました…が、やっぱりデータの扱いに問題ありますよね。
元のプログラムでは上のソースを使って変数格納したものが
合計数百カ所くらい使われていて、なかなか修正に踏み切れなかったのですが
この機会に手を入れてみます。重ねてありがとうございました。
344 :
nobodyさん:2009/10/08(木) 12:48:43 ID:OiR61371
>>342 中身を編集したいのですが
fedora9付属しているGNOMEテキスト・エディタで開こうとして失敗します。
>>344 euc-jpで書かれているっぽいんだけど、
文字コードの認識がうまく行かないのが悪そう
perlでeuc-jpで読んで
utf-8におき替えてから編集すれば良くね?
>>344 テキストエディタかよ。
perl関係ねーじゃねーか。
お約束で一応突っ込んどく。
347 :
nobodyさん:2009/10/08(木) 16:46:58 ID:pWiOQ0nr
>>345 どうすればperl上で編集できるのでしょうか?
無知ですみません。
>>347 こんなんでどう?
-- euc2utf.pl -------
use Encode;
$ARGV[0] =~ /(.*)\.(.*?)$/;
open my $out, ">$1_utf8.$2" or die $!;
while (<>) {
Encode::from_to($_, 'euc-jp' => 'utf8');
print {$out} $_;
}
close $out;
コマンドラインより
perl euc2utf.pl keywordlist_furigana.csv
で、keywordlist_furigana_utf8.csvというファイルができる。
geditは文字コードによって開けないなんてない
文字化けするだけ
多分落とすときに壊れたか、パーミッションの問題じゃないか
いや、開けない環境もあるよ。
文字化けすら許さないらしい。
351 :
341:2009/10/10(土) 17:39:23 ID:7InkIPwk
>>348 レスありがとうございます。
言われた通りにやったのです、やはり開けませんでした。
(プログラムはエラーなく実行できました。)
>>349-350 再度ダウンロードし、パーミッションも問題ないはずですが開けませんでした。
OSはfedora9です。
つーか聞く場所違うくね?
全くPerl関係なくね?
とりあえずviで開いてみたら?
353 :
nobodyさん:2009/10/11(日) 00:10:19 ID:X0n6wGB1
whileにelseって使える??
ブロックの中になら使える
while($hoge){
…
} else {
…
}
的な使い方を想定してるなら出来ない
というかどういう状況でこんな処理が必要になるのか想像もつかない
どうもです。
my %map = ( @cols => @list );
ってな感じでハッシュに一行代入するやり方があったはずなんですが、
やり方を忘れてしまいまして、本当にくだ質ですが、お答え頂けると幸いです。
my %map = map{ $cols[$_] => $list[$_]} 0..$#cols;
こんな感じ?
357 :
355:2009/10/11(日) 01:35:13 ID:???
>>356 違いますね。
そんなにややこしいやり方じゃなく、もっと直感的にできるんですが。
まぁ、for使えってハナシですが。
あー1行かw
my %hash = ($cols[0], $list[0]);
$hash{$cols[1]} = $list[1];
多分このどっちかのことだろ?
359 :
355:2009/10/11(日) 01:39:42 ID:???
自決しました。
スライス使うだけですた。
二行にはなりますが、以下で出来ますた。
my %map = ();
@map{@cols} = @list;
360 :
nobodyさん:2009/10/11(日) 05:54:06 ID:X0n6wGB1
正規表現でnバイト目から検索とかできませんか?
substr($str, 10)=~ /できるでしょJK/;
>>360 肯定の戻り読みを使うとか
my $ignore_bytes = 6
my $search_word = 'foo';
my $str = 'foo--foo--';
$str =~ /(?<=^.{$ignore_bytes}).*$search_word/;
>>357 可読性を考えるなら
>>356 を使ったほうがいいと思いますよ。
% で宣言してるのに @ で使うとか、間違いの元だと思うんで。
「動けばいいの!」 って言うんならそれでいいですが・・・
どんだけアホだ?
356でも
>>359でも間違える余地なんて無い。
>>359のスライス間違える奴は356でも間違える。
それだったら丁寧にfor使え(for修飾子では無く)
スライスを知らない奴、mapを知らない奴、forを知らない奴、ハッシュを知らない奴、配列を知らない奴・・・
底辺に配慮してたらキリが無いわな
そんな底辺があつまる2chw
367 :
355:2009/10/12(月) 17:22:45 ID:???
>>363 @とか%はキーワードとして、見ないもんですよ。
どちらかというと[]なのか、{}なのかで型が決まってきますです。
そもそも、生の配列やハッシュを使うとデータ構造に制限しか生みませんです。
制限こそが重要だろ
よし、今度ハッシュを焼いてみよう。
まあでも生配列は使う頻度を減らしていこうっていう方向だからねぇ
それはお前がでしょ
生配列って意味が分からないが、C++的に解釈して、
オブジェクトにして扱えってこと?
Perlだったら、List::MoreUtilsのzip/meshで十分だと思うけどなぁ。
そこまで拘りたい場面なら、がっつりRuby使うかな。
オブジェクトにしろっていうか、
データはレファレンスで表現するのを基本にするってことでしょ
それはオブジェクトを完全にモノにしてからほざけって話だよね>perl
中途半端にやるからソースがごちゃごちゃになるのに・・・
こんなところでぐだぐだしてる暇あったら職安行けば?
職安のPCでソース書いてるので17時までなんです><
生ハッシュ使うとforで回せない。
配列に生配列は格納できない。
こっちのがよっぽど制限。
>>377 ハッシュリファレンスでforを回すとはどういう風にするのですか?
そもそも生or生じゃない配列の違いがわからん
>>367 脳内定義の「生の配列」が何を指し示すのか解らんが、
普通のARRAYの事ならば自分がスライス(
>>359)で思いっ切り
使ってる。ハッシュにしても。要するに
>>363への反論になってない。
何か別物を指すならそれを説明しなきゃ、伝わる訳無い。
「生ハッシュ」ってのも何だそれ?
普通のHASHの事ならforで回せるぞ?望み通りの結果にはならんが。
perl -Mstrict -Mwarnings -le 'my %h = 1..10 ; for ( %h ){ print $_ }'
ついでに、
>>363はこの程度の初期化で「可読性」って単語を持ち出す
のは止めといた方が良い(しかも可読性を損いがちなmapに対して)。
こっちが赤面する。
381 :
355:2009/10/13(火) 23:54:32 ID:???
>>380 実際のコードではこうなってますけどね。
@{ $entity_map }{ @$col_list } = @$result_list;
生の配列/ハッシュってのは、『インタプリタが変数展開するもの』ですね。
my @arr1 = (1, 2, 3);
my @arr2 = (4, 5, 6);
my @array = ( @arr1, @arr2 );
的な間違いを仕様で定めて阻止する方が有意義な制限だとは思いませんか?
382 :
355:2009/10/14(水) 00:07:22 ID:???
> 「生ハッシュ」ってのも何だそれ?
> 普通のHASHの事ならforで回せるぞ?望み通りの結果にはならんが。
> perl -Mstrict -Mwarnings -le 'my %h = 1..10 ; for ( %h ){ print $_ }'
ハッシュ自体を回すのでなく、
for my %map ( @list ) {}
これが出来ないという意味ですね。
383 :
372:2009/10/14(水) 00:43:00 ID:???
>>381-382 なんだこれ。
> 的な間違いを仕様で定めて阻止する方が有意義な制限だとは思いませんか?
フラットにするのはPerlの仕様なんだから、Larryにでも提言しろよ。
アホらし。
>>383 そのLarryはすでに解決策を提示しているのだが
385 :
372:2009/10/14(水) 00:56:36 ID:???
生と生じゃない配列/ハッシュの違いをくれよw
ここは超初心者用なんだぜ?
たとえば
not 生 $test = { 'a' => 1, 'b' => 2};
生 %test = ( 'a' => 1, 'b' => 2);
みたいな書き方でお願いします。
>>367 [] 配列
{} ハッシュ
() これ何?
Perlのオブジェクトは所詮、blessされたリファレンス
リファレンスに入れると関数の副作用が働かない場合があるから使えるときは普通のハッシュ使えばいいと思うよ
老害かゆとりか知らんが、言葉尻を捕まえて自分の無知晒してるだけだと気づけよ。
だから本気で知らないから解説をお願いしてるのに
じゃなきゃ 超初心者用スレ に住んでません orz
392 :
380:2009/10/14(水) 02:09:57 ID:???
355氏は、次から脳内用語じゃなくきちんとperlの用語で書いてくれ。
355 perl
「生配列」 => 配列、単次元の配列、etc...
「配列」 => 多次元配列、Array of Hashes、etc...
「生ハッシュ」 => ハッシュ、etc...
「ハッシュ」 => 多次元ハッシュ、Hash of Arrays、etc...
# 355氏の意図とは違うかも知れんが。
少なくとも以下のURLで使われてる言葉の範囲内で説明してくれたら助かる。
ttp://www.kt.rim.or.jp/~kbk/perl5.005/perldsc.html % perldoc perldsc
そしたら、似た用語を持ち出されて混乱する事も少なくなるでしょうから。
>>381>>382に関しては、、、「超初心者」じゃなさそうだから書く。
アホかと。
後出しもたいがいにしろ。
手前のくだらん妄想に付き合わせんじゃねえよ、ボケ。
リファレンス使えってことだと思うが。
Perl5.005って、父さんそんな古いものを。
>>393 ただそれだけなんですか?
テストプログラム作りたいだけなのに、
仰々しく組みたくないから、今のスタイル
でいいや
リファレンス使うだけなのに、「仰々しく」とか。
こういう勉強を嫌う怠惰な姿勢が、
保守性の悪いコードを生むんだろうね
何自分の妄想に酔ってんの?
妄想も何も、
>>392のリンク先自体がリファレンスを使ってるだろうが、
そのデータをさらにラップする必要が出てきたら、
結局リファレンスにするんだから最初からやっとけっつぅ話だ。
>こういう勉強を嫌う怠惰な姿勢が、
>保守性の悪いコードを生むんだろうね
これが妄想だって言ってんだけど…。
当ってるのかも知れんがね。
自分の心の中で思ってりゃ良い事でしょ?
@{ $entity_map }{ @$col_list } = @$result_list;
これのデータ構造とかを考えた上で保守性万全だと思うなら病院に行け。
適材適所でリファレンスは使えば良いだけだ。
適材適所には同意するが、
他人が利用する可能性が少しでもあればリファレンスかな。
正直、規模によるとしか言えんし、普段から使っておいても損でもない。
日曜プログラマや趣味グラマには不要かw
KY
>>400 ちなみにお前さんならどう書くのかね。
批判するだけだら、未就学児童にでもできるが。
こういう能無しにはraw dataとかも通じないんだろうな
データ不備によるプログラムのエラーに関してですが、
データは TSV で1行あたりタブ3つで、データが4つになるわけですが、
TSV を書くときにタブを2つしか書かずにプログラムを走らせて
my ($tmpZIP, $tmpADDRESS, $tmpTEL, $tmpFAX) = split(/\t/, $line);
の様に split すると、$tmpFAX は undef になってしまうため、
$tmpFAX に対して正規表現つかったり、.= などで文字列を連結させたりすると
Use of uninitialized value というエラーが Apache ログに溜まっていきます。
これを防ぎたいのですが、データ数が足りないまま split したときに undef では無く '' を入れることは出来ないのでしょうか?
今は
my ($tmpZIP, $tmpADDRESS, $tmpTEL, $tmpFAX) = ('', '', '', '');
($tmpZIP, $tmpADDRESS, $tmpTEL, $tmpFAX) = split(/\t/, $line);
とやっています。
$line .= "\t\t\t";
>>404 残念!だったな。
俺は、4代前から、東京生まれの東京育ちの、正真正銘の日本人だ。
お前こそ、朝鮮で生まれて、朝鮮で育った、正真正銘のチョンだろうが。
>>405 こんなんでどうでしょうか?
my ($tmpZIP, $tmpADDRESS, $tmpTEL, $tmpFAX) = ( split(/\t/, $line), (q{})x4 );
あ〜、空の配列をケツに連結するって方法か
とりあえず、この方法を使わせていただきます m(_ _)m
@nullarray = split(/\//, '//////////');
(split(/\t/, $line), @nullarray);
もアリかな?
試してないけどw
Imagine that nobody harbors racial animus or prejudice. ,
>>405 もう遅いかもしれんけどこんな感じでどうよ
my ($tmpZIP, $tmpADDRESS, $tmpTEL, $tmpFAX) = map{defined $_ ? $_ : ''} (split(/\t/, $line))[0..4];
The reading from original sources evolved into the reading of glosses on an original and then more generally to lecture notes. ,
フレームワークというのものを調べているとディスパッチャーという言葉をみかけます。
ディスパッチャーとは何なんでしょうか?
>>414 主処理の分岐を行うものと考えれば良いかと。
>>415 なるほど。
とりあえず理解したことにしておきます。
Q. dispatcher とはなにか。参考書等を見ずに説明しなさい。
my $setting = {
'a' => 'AAction',
'b' => 'BAction',
};
BEGIN {
require $setting->{ $hoge };
$setting->{ $hoge }->new();
}
※$hogeにはあらかじめ規定した、処理の分岐条件が格納されている。
主な部分はこれだけで実現できる。
new以外で処理を行いたいのであれば、サブルーチン名も設定に格納すれば吉。
フレームワークを作りたいのであれば、設定をYAML等に逃がせばよいかと。
419 :
nobodyさん:2009/10/26(月) 02:45:50 ID:4VfuwmZ6
正規表現なんだけれども。
マッチさせる対象を
テスト1:10点 テスト2:20点 テスト3:25点 テスト4:20点
にした時テスト3の点数を取り出したいんだ。
テストXの値は不定の文字列なので、
m/\D+\d+\D+\d+\D+(\d+)/;
こう書いたのだけれど$1にはテスト3の点数に加えて4の点数もくっ付いてきちゃうんだ。
何かいい書き方ありませんか?
420 :
nobodyさん:2009/10/26(月) 02:47:28 ID:4VfuwmZ6
あ、あとテスト4は存在しないレコードもあるという条件です。
どうやら対象の帳票の仕方がまずかったようです。
m/\D+\d+\D+\d+\D+(\d+)/; で問題なく動きました。
>>421 それホントに動いてる?
"テスト2" の 2 を取ってきてない?
そのうちどうせ他の点も必要になるだろ?
関数化すれば便利だと思うよ
sub parseTestData($){
my($str, @pairs, %ret);
$str = $_[0];
$delimitor1 = '\s| ';
$delimitor2 = ':|:';
@pairs = split /\s| /, $str;
foreach my $pair(@pairs){
my($key, $value) = split /:|:/, $pair;
$ret{$key} = $value;
}
return \%ret;
}
my $result = parseTestData("テスト1:10点 テスト2:20点 テスト3:25点 テスト4:20点");
print $result->{"テスト3"}, "\n"; #=> 25点
# 数値だけ取り出したい場合
$result->{"テスト3"} =~ /(\d+)/;
print $1, "\n"; #=> 25
多分書き直すつもりで忘れたんだろうけど
$delimitor1, $delimitor2 が浮いてるな
ちょっと簡略化
sub parseTestData2($){
return {split(/:|:|\s/,$_[0])};
}
機能はほぼ一緒のはずだ
またまたフレームワーク関連の言葉なのですが、トランザクション(コンテキスト)オブジェクトとは
どういったものなのでしょうか?
どこで見たのかくらいは明記してくれよ
質問についてはトランザクションについて調べれば後は分かるだろ
429 :
nobodyさん:2009/11/08(日) 11:29:12 ID:OaYz9VK0
while(recv()){
↑
recv関数は受信失敗したとき未定義ち返すはずなのに
ループ抜けないのはなぜ?
エスパーさん出番です。
ていうか本当に未定義値返ってる? 単発で実行したらどうなる?
受信なら返らないで待ち状態になる場合あるからタイムアウト処理しないと
失敗時はrecvで代入された変数も未定義になってるみたいだ
どうも腑に落ちないがこれで事故解決と
while(recv(S,$r,4089,0) && $r){
なに言ってるか結局分からなかったけど良かったね。
ansは異なる一つ以上の素数の和
但し、ans<=100
を満たすansを昇順に並べるというプログラムはどう組めばいいのでしょうか
素数の算出のし方がわからんのか?
昇順の並べ方がわからんのか?
perl自体がわからんのか?
質問の仕方が悪い。それじゃどこからどう見ても宿題だ。
正しい質問の仕方は
異なる一つ以上の素数の和で成り立ち100以下という条件を満たす整数の求め方なんかお前らに分からんだろ?
悔しかったら明日までに解いてみろよ屑ども。
う〜ん唐突だな
437 :
436:2009/11/09(月) 23:14:53 ID:???
>>434 1から100までのすべての整数は
異なる素数の和になってるから
答えは
1..100
で良いんじゃないw
1を素数に含めてよいものかどうか。
>>434 組合せで強引に解いてみた。
1、4、6以外は解があるみたい。
use List::Util qw(sum);
my @primes = grep { (1 x $_) !~ /^(11+)\1+$/ } (2..100);
my %ans;
for my $r ( 1..3 ) {
my @result = combination($r, @primes);
for my $combi (@result) {
my $sum = sum @$combi;
push @{ $ans{$sum} }, $combi if $sum <= 100;
}
}
for my $sum ( sort {$a <=> $b} keys %ans ) {
my @breakdown = map join('+', @$_), @{ $ans{$sum} };
print "$sum (". join(q{, }, @breakdown) . ")\n";
}
続き
sub combination {
my ($r, @data) = @_;
my $n = @data;
my @result;
combinatorial( $n, $r, 0, [], \@data, \@result );
return @result;
}
sub combinatorial {
my ($n, $r, $pos, $combi, $data, $result) = @_;
if ( $r == 0 ) {
push @$result, [ @$combi ];
return;
}
for my $i ( $pos..$n-$r ) {
push @$combi, $data->[$i];
combinatorial( $n, $r-1, ++$pos, $combi, $data, $result );
pop @$combi;
}
}
位置が素数じゃないことを指摘されて恥ずかしかったので、
俺も書いてみた。
素数を探すアルゴリズムを書くのがめんどくさかったので
ウェブからコピペしたのは内緒だ。
(上の人のはよくわかんなかったし)
#!/usr/bin/perl
use strict;
use warnings;
use List::Util q/sum/;
my @primes = (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97);
@primes = reverse @primes;
my $ncomb = 2**(scalar @primes);
my %outhash = map{$_,0}1..100;
## you don't have to run until $ncomb
## a thousand is enough to get the answer of 1, 4, 6
for (0..1000){
my $bin = sprintf "%025b", $_;
my @comb = split("",$bin);
my @list = map{$comb[$_]*$primes[$_]}0..24;
if (sum @list <=100){$outhash{sum @list}=1};
}
for(sort {$a<=>$b}keys %outhash){print $_,"\n" unless $outhash{$_};}
ニート趣味プログラマーなんで、さらに改良してみた。
総当りで調べているので、完全な証明にもなっていると思う。
汎用性を持たせて、1つ以上の素数の和だけでなく、2つ、3つ以上とかにもできるようにした。
use List::Util qw(sum first);
# 調べる最大数値(100で質問者の題意)
my $max_num = 100;
# 和にするのに必要な素数の数(1で質問者の題意)
my $num_of_primes = 1;
my @primes = grep { (1 x $_) !~ /^(11+)\1+$/ } (2..$max_num);
my %ans;
for my $num ( $primes[0] .. $max_num ) {
my $max_index = first { $primes[$_] >= $num } 0..$#primes;
if ( not defined $max_index ) { $max_index = $#primes }
my @combi = find_combi( $num, @primes[0..$max_index] );
push @{ $ans{$num} }, @combi if @combi;
}
for my $sum ( sort {$a <=> $b} keys %ans ) {
print "$sum (". join('+', @{ $ans{$sum} }) . ")\n";
}
my @num_excluded = grep { not exists $ans{$_} } 1..$max_num;
print "\n$num_of_primesつ以上の素数の和で表\せない数値\n";
print join q{, }, @num_excluded;
続き
sub find_combi {
my ($num, @primes) = @_;
for my $r ( $num_of_primes .. @primes ) {
my @combi_list = combination($r, @primes);
for my $combi (@combi_list) {
return @$combi if $num == sum @$combi;
}
}
return;
}
sub combination と sub combinatorial の中身は、
>>441と同じ。
宛先メールアドレス(ex.
[email protected])、件名、メール本文を与えたら、smtpサーバーを介さずに、
MXレコードを引いて、宛先のメールサーバーに直接メールを送るモジュールはないでしょうか?
レンタルサーバーで使いたいので、pure perlでお願いします。
スパマーは今すぐ死ね
448 :
nobodyさん:2009/11/21(土) 23:38:15 ID:twpezRr5
fedora9に付属しているgeditのプラグインが最近使えませんが、どうすれば良いでしょうか?
プラグイン設定で追加しようとしても灰色になって選択できません。
450 :
nobodyさん:2009/11/23(月) 22:45:22 ID:g+VEp3/W
通常、サブルーチンを使うとき、途中で終了するように
「exit」を入れています。
sub a { }
exit;
sub b { }
これをライブラリとして使用する場合、別のcgiから呼び出すと、
途中で終了してしまいます。
どのように動作を区切っておけばよいのでしょうか?
>>450 まったく何を言ってるのか分かりませんが、
exit;
の行を消せば良いんじゃないでしょうか
サブルーチンを使うとき、途中で終了する目的はなんでしょうか?
そもそも、exit以降にサブルーチン定義しかなかったら、
exitが有っても無くても動作は変わらないような気がするのですが。
>>449 geditを使わずviで編集しろという事でしょうか?
>>451 初心者で済みません、基本が分かってないのだと思います。
サブルーチン一つに変えて質問します。
例えば上から下に流れていって、
コード1・・・・
& a;
コード2・・・・
sub a{ }
コード2の部分で終わりたい場合に、
exit;がなかったら最後まで実行するのではと思うのですが?
>>453 ライブラリは基本的には関数定義群
自分が何をやっているのか分からなければ、関数化できないような余計な処理をサブルーチンの外に書いてはいけない
関数は定義しただけでは実行されないため、exitはいらない
多分main.plを流用しようとしたから余計な処理が入ってるんだろうが、それなら関数のみ抽出したものを新たに作る必要あり
それから.pl形式のライブラリは時代遅れ
パッケージ(.pm)の作り方&使い方を学ぶべし
おいおい…
457 :
nobodyさん:2009/11/25(水) 00:02:19 ID:4vaBixa8
ヽ('ー`)ノ あー頭が溶けそう
>>453 sub a{}を"実行する"っていうのはどういう意味ですか?
サブルーチンが定義されると何か困ることでもあるんですか?
なんなんですか?
459 :
453:2009/11/25(水) 11:53:02 ID:???
色々と有り難うございました。
ちょっと勘違いしておりました。
あんま責めてやんなよ、ここは超初心者スレだぞ
全てはpackage mainのグローバルスコープで命令が動いてしまうperlが悪いんや
でもそのおかげでワンライナー美味しいです
ライブラリを作る前にオブジェクト指向を理解してね
穴が開くこともあるから
462 :
453:2009/11/25(水) 12:52:24 ID:???
すみません、穴が空くとはどういう場合がありますか?
一つでいいですので例をお願いします。
例か。
どんなライブラリかは知らないけど、コンストラクタを作っているなら、パッケージ内の変数に外から直接アクセスすることで予期せぬ動作を招くことがある
痛いヤツが1人いるな…
ライブラリって言っても、オブジェクト指向じゃなくて、
Exporterを使う伝統的なライブラリも、
あれはあれでけっこう良いよね。
サザエさん的な良さがある気がする。
のんびり和むっていうか。
一人を除いて、オブジェクト指向の話はしてない。
そもそもオブジェクト指向を理解してたら、あんなクソレスは付けられん
はい次の質問者さんどうぞー
470 :
468:2009/11/26(木) 15:18:47 ID:???
失礼しました。移動します
>>469 ご案内ありがとうございます
print "Content-type: text/html\n";
上記「Content-type」の頭文字は大文字じゃないとダメなんでしょうか?
HTTPの仕様で決まっているから、大文字じゃないと駄目なんじゃない?
473 :
471:2009/11/27(金) 10:26:44 ID:???
>>472大文字に決まってたんですね。ありがとうございました
C++、Python、PHPが少し書けるレベルの者なのですが、
オライリーの初めてのPerlはレベルが高いでしょうか?
お薦めの入門書があったらお願いします
>>474 というかそれが読めないと全く話にならない。
>>474 C++、Python辺りがかけるならいきなりラクダに行って
大丈夫だと思う。perldoc公開されてるから軽く読んでみ。
477 :
nobodyさん:2009/12/05(土) 00:52:22 ID:B4BYeir+
>>474 ラクダ本から「すぐ分かるオブジェクト指向Perl」へ進むのが
現状ではベストだと思う
んで「モダンPerl入門」っつー流れかな。
その間に「入門Git」とかも買ってプロジェクト管理にも
慣れておくといい。
牧さん宣伝乙。
ヒアドキュメント内にhtmlを記す場合には「"」などを\でエスケープしないといけないのでしょうか?
そのまま記してもエラーは出なかったのですが、大丈夫なのか心配に。。。
ヒアドキュメントは " をそのまま書いても OK
ただ、ヒアドキュメントはソースが汚くなりやすいので、外部の HTML を読み込んで出力させたほうがいいかなと思う。
482 :
480:2009/12/15(火) 04:07:33 ID:???
>>481 そのままで大丈夫でしたか
ありがとうございました
外部から読み込むというのは、元ファイルで使用する変数も書いたhmtlを記述したファイルを作成して、
適当に変数に代入して分割、適所に読み込んではめ込む感じで良いんでしょうか?
(配布物をいじるだけという程度ですので的外れなことを言ってそうですが
そういうことを簡単に行うために、Template-Toolkit, HTML::Template or Tenjinといった
テンプレートエンジンがいくつも開発されてる
484 :
480:2009/12/16(水) 08:47:58 ID:???
>>483 検索した所、十分に利用できるまで、私には障害が多そうなので今回は諦めます
ありがとうございました
485 :
nobodyさん:2009/12/18(金) 22:53:46 ID:kWIKrWct
すいません。超初心者です。
$hoge[0]->{'age'} = 20;
$hoge[0]->{'tall'} = 165;
$hoge[1]->{'age'} = 18;
$hoge[1]->{'tall'} = 180;
$hoge[2]->{'age'} = 13;
$hoge[2]->{'tall'} = 170;
のとき、
{'tall'}が小さい順に
@hoge の中を$hoge[0],$hoge[2],$hoge[1]と並び替えたいとき、どうすればいいでしょうか。
初心者なので、言っている意味が分からなかったら、すいません。。。orz
よろしくお願いします。
@hoge = sort { $a->{tall} <=> $b->{tall} } @hoge;
お早いご解答ありがとうございます!
助かりました。
488 :
485:2009/12/18(金) 23:43:08 ID:???
あ、↑は485です。
>>481 ディスクI/Oは時間を含めいろいろとリソースを食うので、
速度がクリティカルになる場面や頻繁にI/Oがある場面では
ヒアドキュメントの方が良い。
まあこれはHTMLのテンプレートみたいだから外部ファイルの方がいいだろうな。
1アクセス1ディスクアクセスは大した負荷じゃないし、テンプレートはファイルに
分けた方がモダン。
> ディスクI/Oは時間を含めいろいろとリソースを食うので、
> 速度がクリティカルになる場面や頻繁にI/Oがある場面では
> ヒアドキュメントの方が良い
cache すればよくね
491 :
nobodyさん:2009/12/30(水) 01:00:40 ID:MRCq7PuI
常にキャッシングしてくれてればいいけど・・・
っmemcached
ヒアドキュメントを使うのはコードの可読性にも影響するから
短けりゃコード埋め込みでもいいと思うし(ファイルにするとかえって
可読性が落ちることがある)、何百行とかやたら長いのならファイルに
入れてそれこそキャッシュしてやればいいと思う。
CGI初心者なので、見当違いな事を言っていたらごめんなさい。
CGIで、srandを使用せず(勝手に呼び出される物だけで)にrandを使用していた場合、
srandが呼び出されるのはいつになりますか?
複数ファイルに別れていて、複数のクライアントからアクセスした場合、いつ初期化が行われるかが知りたいのです。
宜しくお願いします。
perlのverは?
5.8.8です。
よろしくおねがいします。
組み込み関数だからソースを当たれ
http://www.cpan.org/src/5.0/ まぁここらへんだろうねぇ
pp.c(2717): PP(pp_rand)
embed.h(1985): #define pp_rand Perl_pp_rand
embed.h(4027): #define pp_rand() Perl_pp_rand(aTHX)
opcode.h(858): MEMBER_TO_FPTR(Perl_pp_rand),
pp_proto.h(145): PERL_PPDEF(Perl_pp_rand)
>>497 ありがとうございます。
とりあえず実際にやってみるのと併せて、頑張ってみます…
今頃ソースを見てるんだろうけど
PL_srand_calledをチェックして種を初期化するルーチンが入ってる
つまり最初にrandを呼んだ時点でsrandが呼ばれる
ではrandはいつ呼ばれるのか?
それはあんたにしか分からんよ
>>499 ありがとうございます。
ソース単位で最初に呼ばれた時に初期化されるようですね。
もう少し勉強してみようと思います。
>>500 srandは過去の遺物だから、今はrandは何も考えずに純粋に
擬似乱数発生器として使って問題ない。
つーかソースなんか読まなくても普通にperldoc -f randすりゃ
いいだけだと思うが。マニュアル読むよりソース読む方が速いとか
どんだけだよ。
マニュアルを信用するな
厳密な乱数ならともかく擬似乱数が発生してるかどうかなんてマニュアルもソースも不要だろ。
テストスクリプト数回走らせればいいだけの話。
<form action="CGIのURL" method="postかget">
<input type="text" name="○○">
<input type="submit" value="送信">
</form>
このような形で文字列を違うページに送り、そのページに表示たいのですがどうしたらいいのでしょうか?
CGIとなるファイルの中身(?)と表示させる方法がいまいちわかりません。
日本語が下手なので何がやりたいのかさっぱりわからない
値の受け取りかたも標準出力に何を吐くのかも全然わからないんだと思う。
>>504 とりあえず簡単な雛形を書いたので、それから細かい質問を受けるとしよう。
use CGI;
my $q = new CGI;
my $some_str = $q->param("○○");
print $q->header( -type => 'text/html', -charset => q{} );
print "<p>$some_str</p>";
>>505さん
すみません…
>>506さん
今まで携帯のレンタルスペースを使用していました。
(独自タグでフォームで送信した文字を受けとったりすることはできました。)
勉強する為にレンタルスペースを離れ、昨日サーバーを借りたんです。
借りたのはいいんですが独自タグに甘えていたせいなのかどうやって受け取っていいのかも全然わからない状態です。
そもそもPerlが関連しているのか?
すでにHTMLファイルがあって、その中にフォームから受け取ったパラメータを埋め込みたいと予想。
HTMLテンプレートエンジンを紹介すればいいんでないかな?
それよりPHPでしたほうが楽?
>>510 そりゃCSRFもSQLインジェクションも何も考えない単純フォームなら
PHPの方が楽だろうよ。
>>508さん
use CGI;
my $q = new CGI;
my $some_str = $q->param("○○");
print $q->header( -type => 'text/html', -charset => q{} );
print "<p>$some_str</p>";
これにformで指定した値(○○)を○○に入れるんでしょうか?
PerlはHello Worldをコマンドプロンプトでできた位で書いてもらったのもほとんど理解できていません…
>>509さん
関係していないのでしょうか?
Perlを勉強したいと思い、レンタルスペースを離れたのもあるんですが…
formで送信するにはレンタルスペースでないとCGIが必要と聞いたのでここで質問させてもらったのですが…
とりあえず今はCGIのURLの部分にあたるCGIを作ってみたいと思っています。
勉強するんだったらサーバを借りる前にXAMPPなどを自分のマシンに入れて
ローカル(手元の)マシンでやればいいのよ・・・
>>512 >formで指定した値(○○)を○○に入れるんでしょうか?
そうです。
name="○○"の、"○○"に相当する部分です。
>>513さん
XAMPP(?)というのはApache(?)というものと同じで自分のパソコンをサーバー化するみたいなやつですか?
(私はActivePerlをインストールしてあり、Apache(?)はインストールしていない状態です)
サーバーを借りた目的は携帯サイトを作りたいのとPerlの勉強をしたかったからなんです…
>>504 俺だったらTemplate::ToolkitかClearSilverを使う。
>>514さん
ありがとうございます。そこは理解できました。
他のところがどのような意味をしているのか全くわからないのですが
コピーしてメモ帳で拡張子を.cgiで保存してサーバーにアップロードしてもいいのでしょうか?
>>516さん
それは携帯にも対応できますか…?
パソコンは2カ月前に購入したので正直わからないことだらけです…
>>517さん
ありがとうございます。
>>516 レンタルサーバーでそれ使えるんですか?
>>518 アップロードしてもいいけど、今後のことも考えて、自分のパソコンにWebサーバーを構築
しておいて、そこで試してうまくいってから本サーバーにアップするようにしたほうがいいよ。
どうせなら、Mojolicious::Liteを使って欲しいな
>>520さん
ありがとうございます。
--
use CGI;
my $q = new CGI;
my $some_str = $q->param("○○");
print $q->header( -type => 'text/html', -charset => q{} );
print "<p>$some_str</p>";
--
name="○○"の"○○"を○○にいれてアップロードすれば動く(?)のでしょうか?
アップロードするのが心配です…
また送信した文字を表示するにはどのようにしたらいいのですか…?
送りたいのはURLの違うページなんですが…
>>522 それは送信した文字を表示するだけのスクリプトですので害はないです。
ただ、できれば自分のパソコンにWebサーバーを構築して試すことをお薦めします。
>>523さん
ありがとうございます。
ちょっとわからないのですがサーバーはロリポップです
use CGI;
my $q = new CGI;
my $some_str = $q->param("○○");
print $q->header( -type => 'text/html', -charset => q{} );
print "<p>$some_str</p>";
○○以外にいじる必要があるところはあるのでしょうか?
○○の部分をname="○○"と同じにしてtest.cgiで保存、アップロードしてみたところ
test.cgi.txt となってしましました…
from側もCGIのURLというところにURLをいれて文字を入れて送信しても
「※CGI もしくは SSI が正しく動作していません。」とでてしまいます…
すみません、文字打ち間違えてしまいました。
○ test.cgi.txt となってしまいました…
です
shebang も書いてないだろうし先が長そうだね。
勉強したいんだったら、何か入門用の読み物見ながらゆっくりいろいろ遊んでみたらどう?
今まで使ってた独自タグとかいうのと同じことをしたいだけなら
<?php echo htmlspecialchars($_GET['hoge']) ?> こんな感じのを埋め込むほうが楽だと思う。
>>524 そうだね。
先頭行に、これを付け加えてください。
#!/usr/bin/perl
use CGI;
my $q = new CGI;
my $some_str = $q->param("○○");
print $q->header( -type => 'text/html', -charset => q{} );
print "<p>$some_str</p>";
>>526さん
何度も何度も申し訳ないです、本当にありがとうございます。
.txtは消しました。
パーミッションというのはどこにある(?)のでしょうか…?
/usr/local/bin/perl もしくは /usr/bin/perl
これは関係ないのですか?
ロリポップならPHPが使えるからPHPにしたほうがいいかもね
>>504の質問だけで何レス伸びるかなー
みんながんばれー
PHPは別名脆弱性製造言語と呼ばれるくらい、初心者が作ると攻撃に弱いからなぁ
単純なことなら問題ないのだろうけど
今のhtmlファイルがこうです。
<html>
<head>
<body>
<form action="
http://○○.△△/test.cgi" method="post">
<input type="text" name="id">
<input type="submit" value="送信">
</form>
</body>
</head>
</html>
--
cgiファイルが
#!/usr/bin/perl 700(rwx------)
use CGI;
my $q = new CGI;
my $some_str = $q->param("id");
print $q->header( -type => 'text/html', -charset => q{} );
print "<p>$some_str</p>";
こうなっているんですが、これでいいのでしょうか…?
間違っている場所があれば教えてください。
皆さん本当にありがとうございます。
>>527さん
明日近くの本屋さんに行ってPerlの本を見てきたいと思います。
Perlを最初にやるとPHPはわかりやすいと聞いたので
Perlから勉強しようと思ったのですがPHPを最初に勉強することも考えてみます。
正直、ものすごい初期のレベル(perl以前)から始めないとダメな気がする
>>534 ここ↓は、
#!/usr/bin/perl 700(rwx------)
こう↓です。
#!/usr/bin/perl
パーミッションは通常、FTPソフトで設定します。
>>526のURLのパーミッションの設定方法を見て設定してください。
>>537さん
ありがとうございます。
おかげでformで送信したものを.cgiファイルのほうに表示することができました。
それ以前にPerlの文法を知れ
後のCatalystやMooseを超えるものを作るPerl Mongerになろうとはこのときは誰もが思わなかった
>>541 Perl6の実装が安定するのとどっちが先かな
>>542 ただの喩えだからPerl6がどうとか関係ないと思うが。
昔はこういう質問で溢れてたよなあ。フォーム作れなくて困ってるとか
久しぶりに見たわ。
XSSとかCSRFとかにも一応気をつけろよ(CSRF対策とかできなさげな気がするが)
>>543 とりあえずリファラ見ればいいんじゃない?
CSRFは防御が難しいけど
>>544 まあ、実際にはリファラ見れば大抵のCSRFは防げるわけだが、
http://〜からマッチかけると可搬性がなくなるし、かといってファイル名部分で
マッチをかけると罠サイトも同じにしてくる可能性もある。
リファラに送らないUAに対応しようとすると非直リンでCSRFの穴があく、
などであまり対策にならない。
GET->POSTもしないよりはマシだが、そもそも悪意のサイトだったりXSSされてれば簡単に穴空くしな。
こんばんは。昨日の者です。
今日、近くにある本屋をいろいろ見てまわってきました。
「10日でおぼえる Perl/CGI 入門教室 第2版」という本しかなかったのでそれを購入しました。
いろいろ読んで勉強してみたいと思います。
昨日は本当にありがとうございました。
>>546 一番買ってはいけない類の本を買ったな・・・。
普通にらくだ・りゃま本とCatalystのマニュアルでよかったのに。
別にいーんじゃね?ド初心者の入口としては。
それで一応ソース読み書きできる程度になって、
その後はネット上なりリャマなりでいろいろ学んだり実践していけば、
そのうち最初に買った本の内容にツッコミ入れながら読めるようになるだろ。
>>547さん
そうだったのですか…
なんかよくわからないところばかりです…
Apacheではなく借りたサーバーのほうでやっているせいなのか
本の通り書いても動かないんですよね…
今日は少し遠くに行って探してみます。
アマゾンの書評を見たけど、Perlの文法の説明がなく初心者用ではないって書いてあるけど。。
あーレン鯖じゃCatalystは動かないか。
俺はあまり関係ないが、早くPlack対応のレン鯖が現れるといいな。
CGIはいいかげんもういーだろ。
突っ込まれそうだから一応いっとくけど厳密にはPSGI対応な。
ド初心者にCatalystを勧める男の人って・・・
554 :
nobodyさん:2010/01/06(水) 17:26:03 ID:U4hPtr/3
〜日で覚える
みたいなシリーズは一番買ってはいけない本だと思うのだが・・・
他サイトで教えていただいたPerlのプログラム(?)なんですがわからないので
解説をしていただきたいのですがここに載せても大丈夫なのでしょうか?
教えていただいた方とは連絡がとれなくなってしまいその人に解説していただくのは不可能です。
捨てメールアドレスを作ってここに載せ連絡をくれた方に送り解説していただく、という形のほうがいいでしょうか?…
後出しじゃんけんなしで、長くならないように。
あとソースをどこかにアップして、それへのリンクを貼ればよいかと。
s{qw /:seandard/}{qw/:standard/};
>>557 昨日辺りに「10日でおぼえる Perl/CGI 入門教室 第2版」を買った記憶はない?
>>558さん
購入しました。
use CGI qw /:seandard/;っていうのが買った本には載っていなく検索してみたら
モジュール(?)みたいなことがでてきてここで戸惑っていました
他の部分は見て、調べてを繰り返していてparamがパラメータを指している(?)
などということがわかってきたって感じです
連絡が取れなくなってしまいってこのスレだろwwwwwwww
何モンだあんた
562 :
nobodyさん:2010/01/07(木) 18:03:26 ID:cG1x4224
>>560さん
>>557を教えていただいたのはこのスレではなく違うサイトでメールで個人的に教えていただきました。
>>557はまだよく理解できていません…
>>561さん
あれから動かなく(?)なってしまいました
携帯サイトで使いたいです。
また一度に複数送信したいのですが…
>>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は、オブジェクト指向形式でなく関数形式でも使うという指定です。
>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;
プログラムを終了する関数です。
解説ありがとうございます。
私自身がCGIモジュールというものを作らなければならないのでしょうか?…
サーバーにはよくわからないのでパーミッションを700であげています
外部のサイトには送れるんですが自分のサイトの中でフォームの送受信がいまだにできない状態です…
難しいですね…
自分のサイト内ってのがよくわからんのだけど、LAN内にメールサーバー立ててるの?
だとするとDNSも立てないとダメだよ?
今の目標がページAで入力した文字列「あいうえお」をページBに送り「あいうえお」と表示させたいのです。
携帯でも使えて、表示する部分は自分で選べる、複数(入力欄1に「あいうえお」、入力欄2に「かきくけこ」)にも対応させたいです。
一番簡単にたとえると、メールフォームで文字を打つ→送信前の確認ページ→送信完了
の「メールフォームで文字を打つ→送信前の確認ページ」ここです。
説明が下手で申し訳ないです。
いや、そうじゃなくて「自分のサイト」ってどこの話?
LAN内? レン鯖?
LAN内ってなんでしょうか…?
レンタルサーバーです。
>>565 CGIモジュールは先駆者が既に作っています。
標準で入っているので、どこからか持ってくる必要はないです。
use CGI;の一文で使えるようになります。
Perlの場合、必要そうなモジュールは大概、誰かが作っていて、様々なモジュールを組み合わせて
プログラミングしていくことになります。
WAF(Web Application Framework)と呼ばれている大きなモジュール群あり、これはページ遷移等
の大枠が既に作られていて、比較的簡単に大規模Webアプリを作ることができます。
571 :
nobodyさん:2010/01/08(金) 19:27:43 ID: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 から受け取ったゲストのハンドル.
読み取った情報からハンドルが一致するパスワードを選び出せるはずだったのに,
ハンドルが一致しなくてもパスワードが返って来るっぽ (`д´)うわぁ〜ん.
ど, どうして ?
$guestfile: $in{'handle'}: の方のコードも見せてもらえないとなんともいいようがないが
スコープ周りが怪しい
>>569 レン鯖でperlの勉強してるの!?
つかよく許してるなそのレン鯖屋も
574 :
nobodyさん:2010/01/08(金) 19:45:07 ID:gGxGm+Hx
>>572 す, 素早い回答ありがとうございます.
もしかして grep() がダメなら loop でぶん回すしかないかな? とアレコレ...
>$guestfile: $in{'handle'}: の方のコードも
zip 圧縮して後ほど upload します.
(叩きどころ満載かと思いますが...)
後怪しそうなのは、引数の型か
576 :
nobodyさん:2010/01/08(金) 20:06:41 ID:gGxGm+Hx
> @u=grep($in{'handle'},@u);
$in{'handle'}が真であるという条件だけで素通ししてるように見えるんですけど
578 :
nobodyさん:2010/01/08(金) 20:10:57 ID:gGxGm+Hx
>>530 母音を省略した subroutin, valiable が ほとんどなので
他人様に解読していただくのは極めて困難を極めるかと orz...
>>573さん
そうです。携帯サイトを作りながら開いたスペースで練習しています。
なのでフォームの送受信というのでしょうか、それができるようになりたいのですが…
580 :
nobodyさん:2010/01/08(金) 20:17:54 ID:gGxGm+Hx
訂正: valiable -> variable
じゃあこっちもだな
subroutine
> 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
583 :
nobodyさん:2010/01/08(金) 20:52:18 ID:gGxGm+Hx
>>581 ;(;_;);
>>582 自給自足で使うつもりだったので他人様に見せようとは夢にも考えてなかったんれす.
取り敢えずは動いているものの完成にはまだまだ遠い道が...
ところで "古文書" とは どういうことでしょうか ?
正直, 本よりも web で調べて アレコレ試行錯誤中なんですが.
>>583 古文書って書いたのは
>>583の通り。わざわざ昔の手法を覚えてしまってる。
例えば sub decode {} するより CGI.pm を使いましょう、なんだけど
参考にしてるリソースがよろしくないんだろうね。
587 :
nobodyさん:2010/01/08(金) 21:16:25 ID:gGxGm+Hx
>>584 なるほど. (σ(^_^;)の脳味噌が まさに旧時代の遺物だったりして.)
参考までに新時代のコードってのはあるんすか ?
まさか, OOP ?
perl の OOP って, おいらにはサパ〜リ.
>>571 です.
アドバイスくださった方々, ありがとうございます.
ご指摘いただいたことを参考に, 調べなおします.
また来る事になるかもしれません, そのときは よろぴく.
>>571 っす.
結局, loop でぶん回すことにしました. <- ダサいやり方だとは思いますが.
(sub decode と同様なやり方です)
そもそも grep(/〜/,@a) の使い方が理解できていないっす.
(というか JavaScript の new RegExp() みたいな使い方が perl にもあるのかどうか ???)
あと, CGI.pm は nifty では使えない模様っす.
(server 借りて本格的にやるほどのネタの持ち合わせがありません)
(制限多すぎとはいえ, 100MB のスペースを利用しない手はないと考えてます)
使えないってことあるの?
入ってないなら、CPANから持ってくるとか。
パスワードを記述したファイルが
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;
>>591 ttp://homepage.nifty.com/faq/faq_b4.htm#q5 "use/requireで外部関数(モジュール)をコールする場合は、
perlの標準モジュールを@homepageのシステムでは用意しておりませんので
使用することはできません"
"自分で用意したらどうか" と言う問題に付いては
Google でもヒットしますが実際に実験をした人はいない模様っす."
アッシがやれば それなりのネタになるかもですが そもそも .pm を使いこなせないので...
つーかこういう事は連想配列でやるだろ
>>592 >パスワードを記述したファイル:
TSV 形式で {cipher, handle,IP} を記録してます.
ついでに書きこみ回数なども記録するのも おもしろいかも ?
で, 仮にハンドルに数字を使われた場合に
IP とマッチングする可能性も考えられるので今のやり方に落ち着きました.
わざわざサンプルを書いてくださり, ありがとうございます.
strict.pm すらない環境で苦行を重ねなくてもいいと思う。
>>594 仰せの とおりです!
このケースでは たぶん これがベストのやり方かも ?
whileで回して見つかり次第returnしたほうが速くねーか?
>>598 記録するときにもチェックをして重複記録しないようにしてます.
それと, そもそも書きこむのが自分だけだったりして... (;_;)
個人サイトでのゲストの人数なんて問題にならないかと.
他のサーバでやることを勧めるが……
後、パスワードはMD5やSHA-2にして保存した方がセキュリティ上いいんじゃない?
こんにちわ、質問させてください。
今、以下の流れを処理するスクリプトを書いています。
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);
}
もう一日考えて頭がパンクしそうなので、どなたかお答えいただけないでしょうか?
私の方でもしばらくまた考えてみます。。。
何を教えて欲しいのか書けよ
>>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
push @tmp2は要らないだろ。
で質問は、結果がこうなってしまうってことだよな?
name1 =
[email protected] [name1] as [
[email protected]]
name1 =
[email protected] [name1] as [
[email protected]]
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<>
[email protected] name2<>
[email protected] [% name %] = [% mail %]
[[% name %]] as [[% mail %]]
ちくしょー整形している間に先を越された
>>604 こんな短時間で…ありがとうございます!
見たところchompしている部分と@tmp2を使わない以外は同じのようですね。
607 :
604:2010/01/11(月) 02:48:37 ID:???
いや、同じなんだよ。
答える奴が手元で実行しやすいようにと思ってさ。
for my $tmpl (@template) {
my $t = $tmpl;
$t =~・・・
と一度他のレキシカル変数に代入して、そちらを置換すれば望んだ結果は得られるんだが、
$tmplの置換で@templateの中身も書き換わってしまう理由が俺には分からなくて説明できないんだ。
誰か他の奴頼む。
perldoc perlsyn
>LIST の要素が左辺値であった場合、ループの中で VAR を変更することにより、
>対応する値を変更することができます。逆に、LIST の要素が左辺値でない場合は、
>この要素を修正しようとしても失敗します。言い換えると、foreach ループの
>帰納変数がループの対象となっているリスト中の個々のアイテムに対するエイリアスになっているからです。
609 :
601:2010/01/11(月) 03:13:29 ID:???
>>607 むつかしいですね。
ひとまず他の変数に代入してやると言う方法で、この場はしのいでみようと思います
こんな遅くまでありがとうございます!
>>608 ありがとうございます!
perldocも良く読んでおくべきでしたね。。。
ユーザー登録、認証などのサンプルコードでオススメありますか?
subroutin を呼び出すには " &sub " と言った書き方をするもんだと思ってました.
ところが sub() てな感じでも良いらしいことをこの板のスレッドで発見.
だまされたつもりで試して見ると普通に通る模様.
js と同じスタイルになるので こっちの方が良さそう.
ところで, これって perl 使いに取っての常識 ?
(Google でヒットする解説サイトの どこにも書かれてなかったけど)
もしそうだとするのなら, 他にも同様なことが あるのかしらん ?
>>612 ありがとうございます.
掲示板自作に半年 ? いや, かれこれ 5年目かも (゜w゜)
いつになったら完成するのやら.
でも, 最初の頃と比べれば...
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 -->
尚、
>>614のshtmlコードはあくまでも一部分抜粋です。
mod_include のバグが見つかったって何だろう。
620 :
614:2010/01/26(火) 22:09:36 ID:???
全部俺です。全然回答が得られずにここに流れてきたというのが実情です。
>>614,
>>620 >#include virtual
おいら, まだヒヨッコだけど,
そして, SSI はまったく調べたことがないけれど,
要はhtml ファイル (template)を読み込んで
部分的に replace するだけじゃないのかな ?
だったら おいらでも なんとか...
(だけど ここの先輩たちの回答がないのはなぜ ?)
意味がわからんから答えようがないだろ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>";
こうか?
違うか
from_to($ENV{pgtitl}, 'euc-jp', 'utf8');
625 :
614:2010/01/27(水) 05:00:54 ID:???
すみません、質問書き直します。
呼び出し時に、SSI変数か、CGIの引数で文字列を入力して、
UTF-8で出力するCGIを作ろうとしているわけですが、
print "<h1>$ENV{pgtitl}</h1>";
だと、SSI変数が読めません。
フローチャート
________________
|入力 |
|UTF-8(SSI呼び出し)引数付き |
|<!--#exec cgi="foo.cgi |
| サーバー環境" --> |
|_______________|
▼
________________
|処理 |
|引数が存在するか? |
|はい>>引数をエンorデコード |
|いいえ>>プリントしない |
|_______________|
▼
________________
|出力 |
|UTF--8で |
|引数を<h1>に入れて出力 |
|_______________|
626 :
614:2010/01/27(水) 05:30:17 ID:???
#!/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なので、変換しないとだめなようですが。
把握しました。
>>616に対してなんかリアクションしてくれないか?
全然なにがやりたいかわからんから
>>621と同じ解釈してパーサーっぽいの探してきたんだけど
あと前提条件として何があって、結果何がしたいのか言ってもらわんと誰も疑問に答えることはできんと思うが
>>625-626 SSI もどきの動作を CGI に置き換えたいのかと思いきや, 違うようだねぇ.
というか, 余計, やりたいことが見えなくなったですぜぃ.
どこでも回答を得られなかったそうだけど, 合点が行きますぜ.
固定観念を捨てて すなおにやりたいことを書くようにしないと...
漂流の旅は 延々と...
629 :
614:2010/01/27(水) 18:18:11 ID:???
>>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のアップデートが来るまで待ちたいと思います。
たくさんの回答ありがとうございました。
今度質問するときはしっかり分かるよう、慌てずに、要所を押さえてから質問します。
質問です。
以下の配列
@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',
)
というように、最初の数字が一緒なら数字以降のデータを連結したいです。
よろしくお願いします。
my %foo;
for (@hoge1) {
/\A(\d+)(.*)\z/s;
$foo{$1} = exists $foo{$1} ? "$foo{$1}$2" : "$1$2";
};
my @hoge2 = values %foo;
順番が違う
んじゃこれで
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};
うむ、大分よくなった。
次は同じ数値のやつで値が重複してれば取り除くことかな
更に値を昇順に並べる
できればだけど、初心者にできるだけわかり易いコードで書くか、難しいコードにはコメント付けることかな
635 :
630:2010/02/07(日) 18:32:40 ID:???
>>633 書式の意味はさっぱり分かりませんが、思い通りに出来ました。
ありがとうございました。
>>634 これは、とあるデータファイルなのですが、現在の仕様では書き込み時に
行頭のデータを見つけて同じなら追加できるようになっています。
また重複しないようにもなっています。
今回、過去のデータが1データ1行という仕様だったものを現在の仕様に
合わせて効率化(読み込み回数の減少)を図りたかったので知恵を
拝借させていただきました。
では、これから数十万ファイルを変換します。。。
ありがとうございました。
636 :
nobodyさん:2010/02/10(水) 04:24:28 ID:SN+dhl64
iPhoneをつかっているのですが、ケータイ相手だとメールのヘッダに差出人の名前が含まれておらず後で見返すときに不便です。
ですので、受信メールをemlで書き出して編集をしようと思っています。
今はシェルスクリプトを使って以下のように行っております。
for file in *.eml;
do
sed -e 's/From:
[email protected]/From: =?ISO-2022-JP?B?GyRCOzNFRBsoQg==?= <
[email protected]>/' $file > tmp.eml;
mv tmp.eml $file;
以下人数分繰り返し。。
done
ですが、これだと、置換が終わったファイルに関してもアクションが行われたりと非効率的なので、
置換が終わったらループを抜けてつぎのファイルに移動するなどすることは可能でしょうか。
スレ違い
638 :
636:2010/02/11(木) 20:43:34 ID:???
失礼いたしました。
639 :
614:2010/02/12(金) 07:09:14 ID: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文を使うのは技術力が追いつかず無理です。
賢者の皆さん回答お願いします。
相変わらず要点のわかり辛い文章だな。「急にfor文を使うのは無理です」とか意味わからんし。
まずfor文で書いてみろよ。添削はしてやるから。そうじゃないと身に付かない。
641 :
nobodyさん:2010/02/12(金) 09:42:53 ID:/dEp/DAw
自作掲示板改良, 苦労に苦労を重ねた末, 致命的欠陥を発見. (ありがちなことです)
気晴らしに
>>639 の翻訳に挑戦:
サパ〜リわからん!!!
判らない点:
1. "メニュー生成はパターン化してしまっているので"
・ その "パターン化メニュー生成" とは ?
2. "のように配列にまとめて"
・ "のような配列"とは ?
・ 仮に "$menu[n]" が 指し示すものだとしても その中身は "new.png" なのでは ?
3. "データ配列化で"
・ では "配列化" したデータのサンプルを...
(データ構造がきちんと決まっていないのでは ?)
(loop で ぶん回すこと以前の問題にしか思えない)
HTML::Template使えよ
あー・・・とりあえず雛形
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};
}
うお、一箇所間違えた
まぁいいか
645 :
614:2010/02/12(金) 17:12:40 ID:0arSSMW8
サーセン。全く文才がない。少しは文章を練ったつもりでいた。
>>640 ですね。やってみたんですがエラーx20over
根気がなくてなおかつ焦っているのが見え見え。
もうちょうっと根気良くやってみます
>>641 配列に入れるのは
リンク先相対URL,リンクテキスト,更新フラグ
を一列にして入れていきます。
更新フラグが立つ(1になる)条件は、LastModifiedが1日以内であることです。
それでできたデータをfor文で1行ずつ書いていくということです。
>>642 もしかしたらページのテンプレート化は全部これで解決かと思い、別ディレクトリ作って仮導入してみたところ
アップローダーのCGIがHTML書き出し型で謎の二重呼び出し、エラーを返すかと思いきやApacheが落ちてしまいました。
>>643 がんばって雛形に従って書いてみます。
>>645 apacheが落ちるってw
そりゃ間違いなくお前のコードの書き方が悪いわ
643は動かしてはみたのか?
リアル中学生だっけ。親御さんは気の毒になぁ。
649 :
614:2010/02/12(金) 18:00:22 ID: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から自分で打ってきますので添削お願いします。
ここで延々と添削してもらうのは甘えではないのか
基準がようわからん
> 更新フラグが立つ(1になる)条件は、LastModifiedが1日以内であることです。
こんな感じで要求仕様だけ細かいけど何も考えてくれないから添削にもなってないよ。
CLIで叩くもんをCGIで動かして
> 改行コードとパーミッションを確認すること5回。何故だあああああ!?
ってやかましいわ。
>>650 スレタイ的にはそこはどうでもいいと思うが、添削の元になるコードすら書かないからなコイツ。
>>649 環境に Perl6::Say 入れてる?
俺らはデバッガかっての
さっさと元コード晒せ
655 :
614:2010/02/12(金) 19:00:45 ID:0arSSMW8
>>650 とりあえず手前なんとかなっても
自分で構造を読めないスクリプトだと
仕様変更した時にサーバー障害の原因になってしまっていても気づかないので
自分で構造を読めないスクリプトの導入は控えています。
>>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
ヒントはもう出てる
$f =1 if(time <= ($mtime+86400));
>>655 >とりあえず手前なんとかなっても
>自分で構造を読めないスクリプトだと
>仕様変更した時にサーバー障害の原因になってしまっていても気づかないので
>自分で構造を読めないスクリプトの導入は控えています。
んじゃ、導入自体あきらめろ。
この程度のスクリプトを自力で書けない奴が偉そうな口を叩くな。
まぁまぁ、中学生相手なんだから落ち着いて
ちょっとガキをからかってやるかくらいの心持ちでいいんですよ
分からないから使わない、でも構わないが
スクリプトの先頭には↓を絶対入れるべき
use strict;
use warnings;
>>660 これを入れないで済むのはPerl4までだよねー
662 :
614:2010/02/12(金) 19:55:57 ID:0arSSMW8
>>658 SSIばっかりやっていてPerl移行になったので。
SSI時代にまだ自分で適度に構造が分かるスクリプトを持ってきていた程度です。
Perl打ち込みを始めてからまだ15日しかたってません。勘弁してください。
>>660 >>651 挿入しました。指摘ありがとうございます。
>>654 入ってました。
>>653 >>656 >>657 先ほどCGIをローカルにもってきてActivePerl入れました。ご指摘ありがとうございます。
ActivePerlでは最終更新時間取得までいったので今度はサーバーに置いて練りこんでいけばできそうな
兆しが見えてきました。
本当に回答ありがとうございます。
最近アップローダーが閑散としていて帯域制限忘れたのが祟ったorz
アップローダーが混み合ってきてまともにファイル変更もできなくなったのでまた明日。
664 :
614:2010/02/12(金) 20:33:45 ID:0arSSMW8
>>663 はい。すぐ把握できました。1日の秒数です。
665 :
614:2010/02/12(金) 23:25:55 ID:0arSSMW8
アクセスの嵐が去ってくれたようなので作業再開します。
ここは君の日記帳じゃないんだから
そんなことまでいちいち書かなくていいんだよ
667 :
614:2010/02/13(土) 00:01:25 ID:fcRfq/Wt
>>666 サーセン。深夜ボケして妙にハイテンションになって、注意欠陥状態です。
最後にサーバーに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日の初心者が助かりました。
本当にありがとうございました。
668 :
614:2010/02/13(土) 00:12:40 ID:fcRfq/Wt
訂正。重大な欠陥がありました。1回new=1になるとそのままになるorz
#/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;
無事動きました。
>>668 このコードがエラーを吐くのは間違いない
長井秀和生存確認!
自作掲示板, やっとこさ全ページ編集可能に. (でも bug bug...)
それにしても ここの話題が 易しくないと感じる あっしって,
ミジンコ ? ゾウリムシ ? (はぁ)
nifty で
opendir(DIR,$logs);
@u=readdir(DIR);
closedir(DIR);
とやると
$u[0]='.', $u[1]='..', $u[2]='log0.tsv', ...
"." で始まるファイルは不可視ファイルなのだとか...
他のサーバーでも同様なのかしらん ?
$u[0]='.' カレントディレクトリ
$u[1]='..' 一つ上
ファイルだけの一覧が返って来るわけじゃないよ。ドットファイルの話はまた別。
>>673 お返事ありがとうございます.
つまり, 返って来るリストに {'.', '..'} は必ず含まれると解釈して良いのでしょうか ?
言い換えるとサーバーが異なるなどの条件の変化には左右されないと...
(これらが含まれることを前提することが bug の発生源になりうるか どうかが気掛かりなのです)
UNIXやWindowsなどのファイルシステムなら必ず含まれると思っていいよ
「.」はカレント(今いる)ディレクトリへのリンクファイルで
「..」はその親ディレクトリへのリンクファイル
含まれていようがなかろうがif文使えば条件の変化に左右されない書き方ができる
>>675 回答ありがとうございます.
>if文使えば
log0.tsv, ... , logN.tsv は 10 record (10行) ごとのデータファイル.
末尾のファイルが 10 rec 埋まるまでは追加記録の対象となります.
さらに この directory には他のファイルを追加することはありません.
したがって $n=@u とやって logN.tsv の個数だけ求まれば良いのです.
ところが予想と反した結果となったので調べて見ると "未知のファイル" がぁ〜.
UNIX では必ず存在するのなら 一安心です.
だったらgrep使って手っ取り早く
$n= grep(/^log\d+\.tsv$/, readdir(DIR));
>>677 なるほど, 勉強になります !
(そう言えば以前 grep() で迷ったことが...)
(/ / が " " と同様に展開解釈することを知ったのは最近のことです)
(思い違いかもしれませんが js では ' ' と同等かと...)
お蔭様で基本的な機能は ほぼ装備できたかと...
あとは bug-fix... (password check が おかしい w )
横の上に遅レス
この場合 // は正規表現であって、 "" の展開解釈とは全く別物。
677 氏のを丁寧に書くと、
grep( $_ =~ /^log\d+\.tsv$/, readdir(DIR));
ついでに grep { ! /^\./ } readdir DIR ; は、ほぼお約束。
>>679 >"" の展開解釈とは全く別物
たとえば
$str='RegExps'; $re='RegExp';
と言う条件で
1. $x=~s/$re//;
2. $x=~s/RegExp//;
の両者は
perl では等価とみなされるけれど,
js では /$re/ 内の $re は単なる文字列と見なされる (思い違いかも ?)
と言いたかっただけで...
" " と / / とが同等な意味を持つとは思ってません.
それはさて置き, わざわざありがとうございます.
訂正: $x -> $str
Perlからプログラミングを初めてみようと思って初めてのPerlを借りてきた。
けど、いきなり専門用語ばかりで結構厳しい。
もう少し優しいところから解説してくれるPerlの参考書って無いですかね。
そりゃperl以前の勉強をしなきゃならんという事ではないか?
>>682 >いきなり専門用語ばかりで
取り合えず例を上げて見て.
他の言語の経験が全くないのなら
js などの client side script から始めた方がの方がお手軽.
(server side script に いきなり飛び付くのは無謀だと思う)
Perlはじめの一歩
読み終えたらこの本に感謝しつつすぐに初めてのPerlを読み直せばよい
686 :
614:2010/02/19(金) 20:19:59 ID:h5oXbvl5
>>669 完全コピペではなく手打ちで部分を写していたので変数宣言を忘れていました。
本体スクリプトではしっかり宣言されています。
初めまして、初心者です、教えてください。
Windowsで、ActivePerl使っています。バージョンは、5.10.1です。
モジュールをダウンロードしようとしているのですが、
PPM(?)がうまくいきません。
該当箇所をクリックしても、直接コマンドを叩いても、再インストールしても無理でした。
どうか助けてください。
どううまく行かないのか教えてもらえないことには。
689 :
687:2010/02/19(金) 23:26:32 ID:???
まz
690 :
687:2010/02/19(金) 23:28:21 ID:???
まず、該当箇所をクリックした場合、そもそも立ちあがらないです。
直接コマンドを叩いた場合は、
ppm gui failed: DBI connect(' ……みたいなエラー表示が出ます。
5.8.9インストールしてるのに5.10.1インストールしたとかそんなことじゃないの?
692 :
687:2010/02/19(金) 23:45:46 ID:???
どういうことですか?
どうしたら改善しますか?
OSから再インストール
ユーザー名にマルチバイト文字を使ってるんじゃね
名前を変えれば
695 :
nobodyさん:2010/02/21(日) 02:09:28 ID:JUU8in1a
Windows XP(Perl 5.8.8 build822)にImageMagickをインストールしたのですが、
実行あるいはバージョン確認しようとすると以下のようなエラーが出ます。
原因が分かる方いらっしゃいますでしょうか?
ちなみにインストールしたImageMagickは、ImageMagick-6.3.8-0-Q16-windows-dll.exe
インストールしたPerlMagickは、上記に付属しているPPD経由です。
[エラー内容]
C:\>perl -MImage::Magick -e 'print $Image::Magick::VERSION'
Can't load 'C:/usr/site/lib/auto/Image/Magick/Magick.dll' for module Image::Magick: load_file:再帰が深すぎます。スタックがオーバーフローしました。 at C:/usr/lib/DynaLoader.pm line 229. at -e line 0 Compilation failed in require.
BEGIN failed--compilation aborted.
C:\>perl -MImage::Magick -e "print $Image::Magick::VERSION"
こうじゃない?
build822 と ImageMagick-6.3.8-0 の対応は合ってるし何だろうね。
前スレで build822 の挙動はどうもあやしくないかという話があったし
別の build に変えてみたらどうだろ。
698 :
nobodyさん:2010/02/22(月) 07:37:17 ID:cIJ/BQEI
すいません。初心者です。
今、cgiファイルの何行目を読んでいるかというのを表示させたいのですが、
そういう関数とか方法があれば教えてもらえないでしょうか。
よろしくお願いします。
699 :
nobodyさん:2010/02/22(月) 10:05:05 ID:dMBZdRpE
sendmailで質問
ttp://search.cpan.org/dist/Mail-Sendmail/Sendmail.pmここの右にあるDownloadからとってきて test.plを試してみたんですが、
Result: 250 OK id=******-******-AS
ok 2
と表示されるにもかかわらず。メールが届きません。
$mail{From} = 'Sendmail Test <********@provider.ne.jp>';
$mail{To} = 'Sendmail Test<********@hotmail.com>';
$server = 'localhost';
中身は↑のような感じで書き換えてます。
ちなみにmailtoのアドレスを全然存在しないものにしても同じResult:250 OKが表示されます。。
どこがおかしいんでしょうか。。。
Sendmail.pmって指定したSMTPサーバ直接叩く仕様だから
素のlocalhostじゃ届かないと思う。
maillog見れ
702 :
699:2010/02/22(月) 10:59:18 ID:???
>>700 sendmailのインストールはperl -MCPAN -e shellからinstall Mail::Sendmaiでいれてます。
ていうか、SMTPサーバなしでもいけるのかと思ってました。。
プロバイダのsmtpサーバ設定したら認証エラーが帰ってきました。
たぶん、これで認証情報セットしてやればいけますよね。
>>701 /var/log/ mail.err、mail.info、mail.log、mail.warnにはびっくりしするぐらい一切なにもでてませんでした。
もしかしてperlのsendmailから出るログって他のとこだったりするんですか?
>>702 >>699 さんが書いてるように、SMTP を直接叩くって書いてるんだから、localhost のメール関連のログには一切残らないよ。
ローカルにメールのログを残したいなら、ローカルにメールサーバー立てて
そこから転送させるしか無いかと。
ん? sendmailとSendmail.pmって根本的に違うものだよ?
何の関連性もない。
たぶん何か勘違いしてるんじゃないかな?
Net::SMTP使うのが幸せの近道な気がする。
>>703 あのログファイルはsendmailが残してるわけじゃなくてSMTPサーバが吐くってことですか?
>>704 よくわからないですが、.cpan/buildのなかにあるtest.plで試してみてます。
ですが認証?でつまづいてるっぽくて
RCPT TO: error (554 5.7.1 <************@hotmail.com>: Recipient address rejected: Access denied)が消えません。
$server = 'smtpauth.eonet.ne.jp:587';
$mail{auth} = {user=>"アカウントID", password=>"パスワード", method=>"CRAM-MD5" };
をいれてやってみましたが、ずっと554です。
methodはPLAIN LOGIN CRAM-MD5も試してみましたがおなじでした。。
アカウントIDとパスワードに関しては別のメーラに設定してるものと同じ何で間違ってはいないと思います。
smtpサーバのEHLO localhostの結果は↓です。
250-ae0000-mailauth13.eo.k-opti.ad.jp
250-PIPELINING
250-SIZE 20000000
250-ETRN
250-AUTH PLAIN LOGIN CRAM-MD5
250-AUTH=PLAIN LOGIN CRAM-MD5
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
>>705 自分ではさっぱりです。。ブログツール(MT)からメールとばそうして今にいたります。
Net::SMTP一度調べてみます。
Mail::Sendmailじゃなく、sendmail使えるならそっち使え
cpanの起動の仕方が懐かし過ぎて泣いた
パール -蒸しパン -e シェル
>>683-685 遅くなって申し訳ないです。
参考になりました。とりあえずもうちょっとコンピュータの初歩的な知識を入れるところから始めます。
下記サイトの「添付ファイル付きメールを送信する」をコピペして
とりあえず動かしてみようとしたのですが、Undefined subroutineが返ってきました
ttp://www.stackasterisk.jp/tech/program/perl03_03.jsp エラーメッセージは以下です
> Undefined subroutine &main::myCreateTextFunction called at test4.pl line 9.
おそらく「$attach_data = &myCreateTextFunction;」でサブルーチンが見つからないという事だと思いますが
ソースを追っても何が原因なのかよく分かりませんでした
こちらの環境は以下の通りです
WindowsXP Home
ActivePerl v5.10.1
sendmailの代わりに以下を導入しています
ttp://homepage1.nifty.com/yito/anhttpd/faq/sendmane.html このプログラムの設定自体は正常です(コマンドラインからのテスト実行でメールは正しく受信出来ました)
ソース内のsendmailの記述(42行目あたり)も上記プログラムのパスに置き換えています
mimew.plとjcode.plはどちらもスクリプトと同じディレクトリに格納しています
何かヒントだけでも結構ですのでお願いします
>>712 sub myCreateTextFunction {} が本当にないからそのエラーが出るのは仕方ないね。
$attach_data に入れる値の用意ぐらい自分でしろということなんでしょう。
そこのサンプルは古風すぎるし Net::SMTP を使ってるサンプルで覚えるほうがいいよ。
715 :
712:2010/02/26(金) 19:28:45 ID:???
>>713.714
回答感謝です
とりあえず自分の学習用にいじくるつもりだったのですが、
Net::SMTPにも注目したいと思います
任意のフォルダがあり、そこには常時ファイルが新規作成され続けるのですが
そのファイルを、作成されるのとほぼ同時に任意のメールアドレスへ送りたいです
メールへの送信はON/OFFを任意に切り替えられるようにしたいです
ちなみに、作成される日時などは完全にランダムで、全く作られない日が数日続く事もあれば
数分おきに作られ続ける事もあります
また、作成されたファイルが上書きされたりすることはありません
一度作られたらずっとそのままです
しかし、一度作られたファイルは後から削除されたりすることもあります
そういう事はPerlでは可能でしょうか?
ご意見をお願いします
ほぼ同時は無理だろ
ファイルを作るプログラムから呼び出せば別だが
1分間隔でよければcronと併用で。
もっと短い間隔だったらTime::HiResでミリ秒単位のウェイトをかけてループで監視。
くらいかな。
同時にしたけりゃファイルシステムにフックかける必要があるね。やりかたは知らん。
719 :
716:2010/03/07(日) 00:17:02 ID:???
そもそもどんなきっかけで作成されるんだ?
それが発火するタイミングにひっかければいいんじゃないか?
ループで回してりゃいいじゃない
すんません。ビープ音を止められないんです。><
添削してやってください。
use strict;
use warnings;
open (INFILE, $ARGV[0]) or die "file open error: $!";
binmode INFILE;
while( <INFILE> ){
chomp;
print "$_\n";
}
close INFILE;
723 :
722:2010/03/07(日) 16:51:32 ID:???
すみません。binmodeでchomp使ったからですね。
テキストファイルを一行ずつ読み込むサンプルに手を加えたいのですが…
AAA
BBB
CCC
↑こんなファイルを読み込んで、以下のように出力したいのです
XXXAAA
XXXBBB
XXXCCC
単純に、whileなりforeachなりループの中のprintの部分を以下のような感じに変更するだけで良いかと思ったのですが、
print "XXX".$_;
しかし結果は以下のようになってしまいます
XXXAAA
BBB
CCC
これは何が原因でしょうか?
コードを全部見せてくれないとちょっとわかんない
>>724 $_に全行入っちゃってるだけじゃないでしょうか。
ループのところ、特にファイルハンドルから取得してるところのコード書いてみてください。
727 :
724:2010/03/08(月) 01:47:54 ID:???
>>726 分かりました
#----
open FH, "< (ファイル名)";
my @list = <FH>;
foreach(@list){
chomp;
print "XXX".$_;
}
close(FH);
#----
主要部分はこんな感じです
ループ部分を、一行読み込み→出力→次の行へ…というイメージでとらえていたのですが…
>>727 コードそのものには特に問題はありません。(closeの位置とか気にはなりますが)
読み込ませてるファイルの改行コードは何ですか?
このコードの通りだったら
XXXAAAXXXBBBXXXCCC にならんか?
なりますね。
ただ、現象としては
>>724のようなので$list[0]にしかfetchされてないようです。
731 :
724:2010/03/08(月) 02:52:04 ID:???
あれから色々試してみました
実は、
>>727の前には色々と前処理が入っていました
そこで試しに、
>>727の部分だけを抜き出して別ファイルで保存し実行した所
期待通りの動作(全ての行にXXXが追加される)をしてくれました
原因はこの前段階にありそうですので、もうしばらくこちらで調べてみます
ありがとうございました
だから全コードさらせと言ったのに
後出しじゃんけんの典型を見た気がする。
$/ = "";
すみません、教えてください。
PerlでSOAP通信でデータを相手サーバーに送った後、
その処理結果をSOAP通信でこちらのサーバー(エンドポイントURL)に投げてくれる
サービスを使おうとしているのですが、送信は下記ページで紹介されているものを
応用してできると思うのですが、どうやって処理結果を受け取るのかがまったくわかりません。
ちなみに、WSDLは公開されていて、受け取りたいmethod名、key名はわかっている状況です。
参考文献、サンプルソースなど頂ければとても助かります。
よろしくお願いいたします。
(送信サンプルにしたものです↓)
ttp://www.thinkit.co.jp/cert/article/0609/8/3/2.htm
SOAPと聞いて
オラなんだかワクワクしてきたっゾ
738 :
736:2010/03/09(火) 16:28:23 ID:???
その後、google先生になんとかサンプルソースをもらい、WinXP+ActivePerlの環境で
下記のコードをコマンドプロンプトから試してみましたが、
なにも出力されません。。エラーすら吐かれません。。SOAP::Liteはインスト済みです。
添削お願いできますでしょうか。。
--------------server.cgi
#!/usr/bin/perl
use strict;
use SOAP::Transport::HTTP;
SOAP::Transport::
HTTP::CGI ->dispatch_to('Call')
->handle;
package Call;
sub testMes($$){return join(', ', @_);}
--------------
--------------client.cgi
#!/usr/bin/perl
use strict;
use SOAP::Lite;
print SOAP::Lite
->uri("
http://localhost/Call")
->proxy("
http://localhost/server.cgi")
->testMes('TEST')
->result;
--------------
/usr/bin/perlの意味解ってるよな?
740 :
736:2010/03/09(火) 17:04:30 ID:???
>>739 はい、Perlを実行するプログラムを指定しているパスです。
ActivePerlだよね…
742 :
736:2010/03/09(火) 21:21:32 ID:???
入れなくてもいいのはわかっているのですが、おまじない的に入れてます。
server.cgi,client.cgiどちらも消してみましたが同じでした。。
そういうことじゃないと思うが
だが、どういうことなのかは言えないという不思議な状態なんだよねw
CGI実行されてないだろカスってことだろ
httpd何使ってるかわからんが、.cgiに実行権限与えてないとかじゃねーの
それとWindowsならshebangは関係ないよ
お尋ねします
スペック:OSはXPのホームエディションsp3
でActivePerl 5.8.0 Build 806 Windows MSI 11.5MB を落とせるサイトを探してます
自分で探しているのですが見つからず・・・
もうないのでしょうか・・・
>>748 ありがとうございます
またまた質問で申し訳ないです
インストールしてpc再起動後コマンドプロプトでC:\Documents and Setting\○▽■>perl-vを入力したのですが、
『perl-vは内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルと
して認識されていません。』と出ます。
何が原因として考えられるのでしょう?
>>749 perl と-vはくっつけちゃいかんだろ
半角スペース入れんと
>>750 ありがとうございます
動作確認できました
MySQLでUTF8で保存したいのですが、なかなかうまく出来ません。
ソース
$que=$db->prepare(<<"EOF");
insert into chara values(NULL,"$name",$sex,$age,$color,$icon,$rank,$tatiba,"$mail","$uri","あいうえお")
今は"あいうえお"実際はフォームからうけとった"$prof" それでselect文で表示させたら、 ?????†???? と文字化け
SQL側の設定もclient mysqldの文字セットはutf-8、GUI版のSQLクライアントから日本語を入れたらちゃんと表示されるんですが。
フォームからやっても、perlから直接"あいうえお"とやっても文字化けしてしまいます。
解決策を教えてください。
フォームの場合
add.cgi?prof=あいうえお
直接の場合は
"あいうえお"
自己解決しました
$dbh->do("SET NAMES utf8");
が必要だったみたいです。
いやそれは解決方法じゃない
最近の DBD::mysql なら mysql_enable_utf8 => 1 を指定するだけでフラグドutf8でやりとりできるわな
>>752はutf8フラグとかわかってなさそうだけど
配列の参照の事でお聞きしたい事があります。
#!/usr/bin/perl
@data=(
["array","code"],
["point","test"]
);
print "$data[0][0]\n";
print "$data[0][1]\n";
この場合array codeと出力されますが、コード1行でarray codeと出力する事は出来ないのでしょうか?
C言語みたいに$data[0]でarray codeが出力されるかと思ったらうまくいきませんでした。
どなたか教えてください。
print "$data[0][0] $data[0][1]¥n";
一行だよ
えっ、違う?
print "@{$data[0]}\n";
print @{$data[0]}, "\n";
これのこと?
761 :
760:2010/03/13(土) 17:56:01 ID:???
リロードしてなかった
回答ありがとうございます。
print "@{$data[0]}\n";
これでできたとは、文法が複雑ですね。
perlは覚える事がおおすぎる。
いや配列入れ子にしてるだけだろ
@{ $array_ref } は配列リファレンスを配列にデリファレンスすること
"@array" は配列を $" の中身(デフォルトは半角スペース)で区切られた文字列に展開すること
これがわかってりゃなんてことない話なんだけどな
リファレンスとそうでないものが存在するのが厄介なのだ
いっそ全てリファレンスだったらと思うことがある
ユーザ名がマルチバイト文字(日本語)なのが原因でPPMが起動出来ず困っています
環境はWindows7、ActivePerl最新版です
一時的にユーザ名をAdminなどに変更してみたのですがUsers直下のユーザ名フォルダは変更されませんでした
何か良い対策はありますでしょうか?
自分もそれで引っかかったときあったw
Admin でログインして、権限の強い perl っていうユーザーを作ります。
で、ppm のショートカットの設定にあると思うんだけど、指定したユーザーで
実行するようにする。
こうすれば PPM 実行できる。
ハズ
768 :
766:2010/03/18(木) 21:50:39 ID:???
>>767 ありがとうございます
まずは試してみます
769 :
766:2010/03/18(木) 22:13:32 ID:???
初歩的な事ですが、何故ライブラリではなく、モジュールが主流なのでしょうか?
何故わざわざjcode.plをjcode.pmに作り直すのか教えてください
cpanなりppmで管理できるから。
後者についてはJcode.pmの実体について調べればすぐわかる。
Encode.pm使えよ
質問が伝わってないなw
何でもモジュールにするのがperlの中でのステイタスなのだろうか。
無駄にがんばってる気がするけどしょうがない。
なんでもjarにするJava
なんでもeggにするPython
なんか問題あるのか
jarまずそう
eggおいしい
pm食えない
777 :
nobodyさん:2010/03/20(土) 22:25:30 ID:/W705D6D
>>770 「オブジェクト指向だと使いやすいから。」と考える人は作り直す
と思います。でもその反対にわざわざオブジェクト指向を導入する
必要がないと考える人もいるでしょう。だから jacode.pl が作られ
たのだと思います。
Encode.pmの恩恵を受ければわかる
jcode.plのころなんてPerlでOOの概念なんて無かっただろ
780 :
nobodyさん:2010/03/24(水) 01:03:23 ID:N7x4Tlpb
MIME::Parser 以外でメールの解析して添付ファイルを一発で保存できるモジュールってご存知ありませんか?
MIME::Parserが何でダメなん?
>>781 Perl5.8.8なのにMIME::Parserが入ってないレン鯖に手動コピーでは無理だったのと、
他のレン鯖ではJParserがうまく動かず、執着するのもなんなのでいっそのこと他にあればなぁと思いまして。
さきほどEmail::MIME::Attachment::Stripperを見つけて試していますが、タコなのでいいサンプルがないと使いこなせない^^;
>>778 被害範囲はEncode内にとどまらずperlそのものが使いにくくなった。
perlはCGIで爆発的に普及したものの、WWWに対応しようと試みて
ユニコード化し、残念ながら失敗した。
もしEncodeがなかったらPHPもRubyも必要なかったのに。
はい?
785 :
nobodyさん:2010/03/25(木) 01:06:49 ID:bcbloiJg
Encodeがあるからわかりやすいけどなぁ。
まだ問題があるにしても、入りと出で変換しましょうってポリシーはわかりやすいと思う。
786 :
nobodyさん:2010/03/26(金) 17:33:17 ID:Tt84M8Ng
テキストボックスに入力された絵文字をutf8からsjisに上手く変換すること
ができません。
use Encode qw/ from_to /;
from_to($str, "utf8", "sjis");
で変換しようとしているのですが、太陽の絵文字を使うと16進でee98be→3f
となってしまいます。f89fに変換するにはどうしたらよいのでしょうか?
よろしくお願いします。
絵文字はメーカーが勝手に割り当ててるから文字コード変換できないでしょ
変換テーブル用意するとかしないと
テーブル用意すれば?
>>785 「入りと出で変換しましょうってポリシー」
そのポリシーが本当に分かりやすいのなら Unicode は生まれなかっ
たはず。
すでにあった ISO 2022 はそういった考えで世界中の文字を同時に
扱うことを考えていたのだけれど、現実は理想通りにはならなかっ
た。オクテット列が今、何の符号化なのか状態をもつようになるの
で検索や置換がとてもやりずらくて使い物にならない。
そこでエスケープシーケンスのないコードとして Unicode が開発
されたのでござる。
でも Encode は "フラグ" を再発明してしまって、同じ失敗を繰り
返してしまった。
これはきっとバベルの呪いだと思う。
めんどくせーから全世界の文字列を 64bit で割り当てちゃえよ
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
先頭の 1bit が右から読むのか左から読むのか
2 〜 16 bit が言語コード
残りが文字コード
ほら簡単
>>789 いいから取り込んだら全部UTF8にしてフラグ建てて、出すとき好きなもんに変換しなされ。それだけだ。
自分で全部書くんなら別になんの問題もないけど、モジュールによってはフラグのあるなしで挙動が変わるのも多いし、どっちで渡すべきなのかPODに書いてなかったりするから困る。
793 :
nobodyさん:2010/03/28(日) 11:17:51 ID:Rvgpa/pp
>>792 >モジュールによってはフラグのあるなしで挙動が変わるのも多いし、どっちで渡すべきなのかPODに書いてなかったりするから困る。
あぁ、これは確かにそうだね
POD内でまずutf8とか検索したりする
『王様は裸だ』って言うのは、コメディアンの役割なんでしょうね
今時Perlのバージョンで困るのなんてWebArena使ってる奴くらいだろ
そこはすげー昔から借りてる人がそのままってだけ
新規に借りて5.6なんてのは某大手のあそこくらいだな
>>796 ネット上のPerlの解説サイトって未だに結構多かったりする。
そういうサイトで独学している人ってそれなりの数がいると思うのね。
本気だして新刊を買わずにブックオフとかで入門書の古本を購入して独学する人もいるのではないかなと。
そういう目でネット上の解説サイトを眺めると2003年くらいの情報が意外に多かったりする。言わば最新バージョンに合わせて更新をしていないわけ。
今も昔も解説書に共通しているのはPerl ScriptやCGIを自作したらサーバーの負荷が多くならないように自前のサーバを立てて練習しようよねとも書かれてる。
Windowsに限って言えばダウンロードするPerlは5.6や5.8、中には5.10もあったりする。でも書籍は古いまま。
意外にバージョンの確認を怠った結果、動かないってことがあるのでは?と思った。
>>799 他の言語でもよくある話だけど、そういうサイトを参考にするなって話だよね
情報が溢れちゃってて探しにくいってのがperlの良くないところということか
>>801 参考にしてはいけないサイトをGoogleさんに教えてあげてくださいw
マルチポストではないと思うのだけど、
"Perlを勉強しているのですが正規表現についてよくわからないので教えてください。"
でググると情報が溢れていて且つ重複しているのが目につくよね。
それokwaveと提携してるとこ(gooとmsnとexciteとimpressと...)が引っかかってるだけ
まぁ重複してるといえばそうだけど、マルチポストではないはずだよ
宣伝収入目的で異なるサイトで重複コンテンツのオンパレード。
検索エンジンの中の人も大変そう。
ところでダンプリストからキーワードAとキーワードBの区間を抽出して
元に戻すのは次のどちらがより良いんでしょう。
$_=~ s/([a-fA-F0-9]{2})/pack("C", hex($1))/ego;
$_=~ s/([a-fA-F0-9]{2})/chr(hex $1)/eg;
質問です
ファイル名にそのファイルが作成された日時(YYYYMMDDhhmmss.拡張子)が含まれているファイルがあります
ファイル名のフォーマットはそれで全て統一されています
一つディレクトリにそんなファイルが数百〜数千は存在しています
何年何月何日にいくつのファイルが作られたのかをCSVなりTSVなりで一覧化して出力したいです
例:YYYYMMDD,n(その日作られたファイルの総数)
このような処理で、何か一般的なアプローチの仕方はありますでしょうか?
キーワードだけでも何でも良いのでご教示をお願いします
ファイル名から年月日を取り出して連想配列のキーにして
$list{'2010-04-02'}++;
みたいにカウントしていけばいいのでは
質問なのですが
perlでNet::Ping;を使いping監視をしてるのですが
ping(ホスト先, タイムアウト数)でping送信させてるのですがこれにpingサイズを指定して送るにはどうすればよいのでしょうか?
パケットサイズのことなら、newするときの引数に$bytesってのがあるように見えるけど
他の言語を学ばずにPerlを学び始めたところなんですが
諸先輩方はPerlの各種変数をどのように体得したのですか?
これどうやるんだっけ→perldoc→くりかえし
これどうやるんだっけ→sex→くりかえし
俺はこんなこともできないなんて→入信→くりかえし
>>810 ふむふむ。やはりくりかえしですよね。
ところで、どのくらいの期間、
そして、何回くらい「これどうやるんだっけ→perldoc→繰り返し」を
やりつづけてなんとなくつかめてきましたか?
なんと申しますか、個人差もあるのでしょうが、自分の言葉で理解できるまで
どのくらいかかるものなのか知りたくなりました。
型のことなら概念を理解しさえすれば覚えるまでも無い
特殊変数なんて覚えるだけ時間の無駄
人間とは面白い生き物で、生まれてきてからこのかた家庭教師も含めて
他人に物事を教えたことのない奴ほど横道にそれたレスが格好いいと
思い込むようだ。
喩えれば
>>811のようにやったこともない妄想をさもやってきたかのようにな。
> 概念を理解しさえすれば
w
初めてのPerl 第二版買って来た。
これから頑張って覚えるぞ。
第五版でなく第二版?
ごめん第五版。
一緒に初めてのJavaScript第二版買っていたから混同しちゃった。
>>809 釣りなのは分かっているが...
$ は $calar(Scalar)
@ は @rray(array)
% は key/value(%)
特殊変数は実際には何個かしか使わないのですぐ覚えられる。
821 :
nobodyさん:2010/04/12(月) 02:20:48 ID:u6Su4USy
どのようにもくそも、覚えなきゃ何も出来ないからねぇw
>>820 いや、その三つ、覚え方とかいらないから
>>820 釣りではなくて真面目に入信したいのですよ。
すっごく分かりやすくて助かりました。
ありがとうございます。
>>822 氏ね〜〜〜
うわあ
>入信したいのですよ。
ここは超初心者をいじるスレ?
お前がやれよ
perlのmixiモジュールって今も動くの?
mixiかなりデザイン変わってるみたいだけど
試せば解る事をなぜいちいち聞く?
昔perl使ってたときはcpanなんてなかった
だいぶいろいろ変わってるみたいだけど、なんかいい参考書ない?
なにここのスレ 頭わいてんな
俺よりレベル低い
俺はperlレベル6だから
ここはバカすぎてかわいそうだからperlやめて
>>834 自分よりレベルの低い者を淘汰していくと、いつしか淘汰される側になっています
気をつけて!
淘汰って
獣の奏者エリンの闘蛇(トーダ)だろ?
シネ
世の中には株で数十億円を稼いでいても金の使い道を知らないのもいますしお金で友人や愛は買えませんしね。
それよりも超初心者を脱却したなら質問に答えてあげなよ。
>>831 機能とデザインは分離されているので動く...
と思う
>>841 WWW::Mixi 2007年から更新されてないみたいよ?
仕様変更されてたら使えないんじゃね?
WWW::Mixi::Scraperは最近更新されたな
WWW::Mixiも使えるんじゃね?
>>840 お金で友人や愛は買えます。
ただし金の切れ目が縁の切れ目程度のものですが。
>>844 いやいや、愛は買えないから。
買えるのは別のものだから。
残念。
>>846 おれも失ったんだよ。
つーか、失うものを持っていなかったわけだが。
>>844 友人や愛の維持にはある程度のお金はかかるものだが
普通は友人や愛をお金で買うことはできない。
もし
>>844さんが買えてるとしたら相手はゲイじゃねえの。
いい加減スレ違いだから
だれがうまいこと言えと
851 :
nobodyさん:2010/05/07(金) 22:36:42 ID:gfyxirvM
int ( rand (5 - $rei / 5) )
$reiに0が入る時の結果は0〜4
1〜5が入る時には0〜3
6〜10が入る時には0〜2
であっているでしょうか?
853 :
851:2010/05/08(土) 00:48:20 ID:???
どの箇所が間違っているのでしょうか?
$reiに0、5、10以外の数値が入って割り切れない数値の時には
3.8や3.6などの数値がINTによって小数点以下が切り捨てられるので
前記のようになるかと思ったのですが、思い違いでしょうか
5−0÷5=rand(5.0)=0〜4.99→int→0〜4
5−1÷5=rand(4.8)=0〜4.79→int→0〜4
5−2÷5=rand(4.6)=0〜4.59→int→0〜4
5−3÷5=rand(4.4)=0〜4.39→int→0〜4
5−4÷5=rand(4.2)=0〜4.19→int→0〜4
5−5÷5=rand(4.0)=0〜3.99→int→0〜3
5−6÷5=rand(3.8)=0〜3.79→int→0〜3
・・・
ようやく分かりました
知ったはずの順序を無視して脳内で妙な処理をしてました
ご丁寧にありがとうございました
>>855 問題はそれだけじゃないよ
数値が変わると返ってくる数値の期待値も変わるし
多分意図してない動作だと思うから忠告しとく
perl -e 'for(0..100000){ $tmp{int rand(5 - 4 / 5 )}++; } print "$_: $tmp{$_}\n" for sort keys %tmp'
0: 23773
1: 23960
2: 23832
3: 23657
4: 4779
忠告(笑)
彼の場合はプログラミング云々より算数の問題だっていうねw
たとえば、以下のようなアドレスにアクセスすると、
ttp://****/hoge.cgi?uho.jpeg hoge.cgiではなくuho.jpegに直接アクセスするというものを見かけますが、
これはどういう仕組みなのでしょうか?
サンプルを公開しているサイトなど教えていただければ幸いです
そのjpgを読み込んでprintしてるだけだろ
いや、なんか言ってる意味がいまいちつかめないぞ・・・
直接アクセス? uho.jp を表示しようと hoge.cgi を通してる時点で直接ではないよ?
もっと落ち着いて言葉を選んで質問を書いてみてはいかがだろうか?
もすくは単にrewriteしてるだけか
妙な質問しかこない
そうか?分かる質問だと思うけどな
ロケーションヘッダーでググれ
CGI なのに画像を表示というのであれば
mod_rewrite (サーバーの設定確認が必要)
単なるリダイレクト
jpg を読んで print
html を出力して img で表示してるだけ
どれか好きな方法で良いかと
仕組みはもう挙がってるけど hoge.cgi はダウンロードカウンタ辺りかな。
やり方なんかいくらでもあるだろ
URLに日本語は使用できない
見た目だけならhrefの値だけを%符号化してやればいい
872 :
nobodyさん:2010/05/28(金) 19:54:25 ID:BUacjjtF
ファイル入出力に関する質問なのですが、
常に最初に文字列が出力される様にするには
どうすればよいのでしょうか?
-------------
あいうえお
-------------
という内容のファイルがあるとしたら
-------------
さしすせそ
かきくけこ
あいうえお
-------------
のように、逆順で書き込むには
どうすればいいんでしょうか?
新しい内容を出力してから、以前のデータを出力
@fooの中にテキストの中身が入っていると仮定すると
print FH reverse @foo;
でいいでしょう。
875 :
nobodyさん:2010/05/28(金) 21:25:57 ID:YjM9qGIs
( 0 == int(rand($i)) )
$i の数値が0.1でも小さいほど真になる確率が上がるという認識で合っているでしょうか?
$iが0.1だとこれは常に偽を返すだろ
つまり$iが0.1だとこの条件式は常に真
877 :
nobodyさん:2010/05/28(金) 21:36:29 ID:YjM9qGIs
すみません、質問の仕方が悪かったようです
3よりも2.9や2.8、4よりも3.9や3.8である時の方が0(真)になる確率が上がるのでしょうか?という質問でした
1.0未満になる確率が相対的に上がりますからそうでしょうね
(!int(rand($i)))
普通はこう書くけどね
まあ確率は上がるんじゃないかな
my %result;
for (2.9, 2.7, 2.5, 2.3, 2.1) {
my $i = $_;
for (0..100000) { $result{$i}++ if !int(rand($i)) }
printf "%.1f: %d\n", $i, $result{$i};
}
割りとはっきり変わるね。
881 :
875:2010/05/28(金) 22:30:10 ID:???
>>874 ありがとうございました!!完璧でした!
心からお礼を言いたいです。
>>873さんもありがとうございました!
初めて5版から続初めて改訂版って問題ない?
そのあとマスタリングへ進む予定なのだけれど、初めて5版(2009)と続初めて改訂版(2006)は間に3年の差がある。
Versionの差が大丈夫なのかと気になっています
formとかinputとかから他のファイルから読み込んだり書き出したりしているのですが
その決まった行だけ呼び出して、決まった行だけ上書きするにはどうしたらいいのでしょうか?
決まった行だけ呼び出すのはできましたがそこから上書きするとその行以外が空白になってしまいます
>>884 決まった行以外も読み込んで書き出すか、DB使ってください。
1行のデータ量が固定長ならseekを使う手もありますが、正直お勧めしません。
>>883 2006年版なら問題ないです。
>>885 大丈夫なんですね。
初めて5版はperl5.10に対応したよんって書いてあったので、
その前に出された続初めて改訂版では5.10とそれ以前での変更された仕様で躓かないかと心配していました。
888 :
nobodyさん:2010/06/14(月) 14:15:33 ID:uA0hCtuD
ブラウザ(ユーザエージェント)が飛ばしてきたHTTPリクエスト情報を
Perl 5.8.8で取得するにはどうすればよいでしょうか?
use CGI;
for my $name ($CGI->param) {
print "$name = $CGI->param($name)\n";
}
多分だけど HTTP リクエスト ヘッダを取得したいんじゃないかなと思った
$ENV{USER_AGENT}
画像をうpするためのcgiがありまして
それからフォルダ内に出力された画像全てのサムネイルを
自動的に別フォルダへ生成されるようにしたいと考えています。
ImageMagickというのを使えばいい、という所までは解りましたが
どうするのがよいのでしょうか?
ttp://www.aimix.jp/cgi/accimagemagicksz.html ここのとかをみて試してみましたが
画像サイズは変わってもInternal server errorがでたりとかでちんぷんかんぷんです
GDだろ
エスパーじゃなくてごめんネ
だから、ばれたらまずい部分を伏せたエラーログをよろしく
そういやWindowsのImageMagicって他にアプリのインストールが必要だったよね?
そんなトコな気がしてきた
いちおう
サムネイル作るならResizeじゃなくてThumbnail使った方がいいよ
教えて下さい。
100行ほどのテキストデータ($textdata)で、ある文字が含まれていたら行を削除
するようにはどのように処理をすればいいでしょうか?
データ形式は以下のとおりです。
あああ 20100622 00:05 いか 001 002 003 004
いいい 20100622 00:05 たこ 001 002 003 004
ううう 20100622 00:05 かに 001 002 003 004
・・・(100行)・・・
よろしくおねがいします。
ワンライナーで出来そうだけど、愚直に。
my @lines = split("\n", $textdata);
$textdata = '';
for my $line (@lines) {
unless ($line =~ m/ある文字/) {
$textdata .= $line . "\n";
}
}
$textdata =~ s/.*ある文字.*\n//mg;
HTMLページに半角数字のみ入力できるフォームを作成して、入力された値によって処理を分けようと思い
#フォームからデータを受け取る
read(STDIN, $date, $ENV{'CONTENT_LENGTH'});
#データを分解して$valに格納
($name,$val) = split(/=/, $date);
#空白の場合はエラーページへ
if($val eq ''){
print "LOCATION: error.html\n\n";
}
#55555の場合はTOPページへ
elsif($val eq "55555"){
print "LOCATION: ../../index.html\n\n";
}
else{
print "<html>\n";
print "<head><title>入力</title></head>\n";
print "<body>\n";
print "<p>入力されたメッセージは $val です。</p>\n";
print "</body>\n";
print "</html>\n";
エラーページとTOPページへ飛ばす処理は単体では動作したのですが、if〜とすると500エラーになります
どこがおかしいか教えて下さい
宜しくお願いします
901 :
900:2010/06/29(火) 14:35:51 ID:???
すみません、自己解決しましたorz
print "Content-Type: text/html\n\n";
が抜けていただけでした・・・失礼しました
902 :
897:2010/07/01(木) 21:44:57 ID:???
>>898-899 OCN規制で書き込めませんでした。
バッチリ動作しました。
ありがとうございました。
プログラミング全くのド素人で、html若干触れるくらいの俺に導入から優しく教えてくれるサイトなどないだろうか
初めてのPerl5版、って買ったんだけど、
サブルーチンがどうとか関数がどうとかループだ配列だってそっからまったく分からんのです
>>903 その本持ってるけど、かなり判りやすかったよ。
巻末の練習問題の解答を打ち込んで試さないと理解しにくいかも。
chomp演算子の使い方がわかりません
本には、改行文字を削除します と書いてあったのですが
改行文字を削除したから何が変わるのかわかりません
こんなバカでもわかるように説明できませんか?
変数の最後の改行を消す
テキストエディタとかでよく見るエンターの記号の奴を消すってこと
例えば
my $data = "A[TAB]B[TAB]C[TAB]D[CRLF]";
っていうデータがあったとして、
my @array = split(/\t/, $data);
としたとします。
んで、
if($array[3] eq 'D'){
〜ほにゃらら〜
}
という処理をした場合、$array[3] は D[CRLF] っていうデータなので $array[3] は TRUE にはなりません。
ほら、改行があると面倒くさいでしょ?
だから chomp で改行を切り落とすってワケです。
perlをはじめようとvimをダウンロードしてTutorialというトレーニングはじめたんですが、
:q! で終了したあとの指示で
「 シェルプロンプトが出てきたら、このチュートリアルを始める為ににコマンドをタイプします。」 (vimtutorと打てと書いてあります)
と書いてああるのですが、なにも出てきません
なにがいけないのでしょう
win viata 32 版です
超ありがとう!
まだ足りない準備があったのか
912 :
最強:2010/07/12(月) 19:11:22 ID:OYobocmN
913 :
最強:2010/07/12(月) 19:16:06 ID:OYobocmN
解決した^^b
914 :
nobodyさん:2010/07/29(木) 19:44:51 ID:CAEHWe/l
人が作ったCGIをいじってるのですが、ソケット通信がうまくいきません。
use Socket;
use FileHandle;
my $id = 'test';
my $line;
my $host = "www.hogehoge.com";
my $port = "80";
my $iaddr = inet_aton("$host") or die "connection failed.";
my $sock_addr = pack_sockaddr_in($port, $iaddr);
socket(SOCKET, PF_INET, SOCK_STREAM, 0);
connect(SOCKET, $sock_addr) or die "connectError";
select SOCKET;
$|=1;
select(STDOUT);
print SOCKET "GET /hoge.php?id=$id HTTP/1.1";
print SOCKET "Host:$host";
shutdown(SOCKET, 1);
while($line = <SOCKET>){
print $line;
}
close SOCKET;
てな感じでGETしてるんだけど、何も送信されていないっぽい。
色々調べてるとHTTP/1.1のあとに本来は\r\nで改行を入れた方がいいみたいなんだけど、
入れるとなぜかBad Requestが返ってきます。\nのみにした場合も同じ。
送信できないのはまた別の原因かもしれないのですが、Perl自体不慣れなものでよくわからなくて・・・
原因の可能性がわかる方いたら、お願いします。
いまどきLWPじゃないとかww
print SOCKET 〜
行末に改行が無いだけと思うよ
途中だった
改行が無いから
print SOCKET "GET /hoge.php?id=$id HTTP/1.1Host:$host";
になっちゃってる
print SOCKET "GET /hoge.php?id=$id HTTP/1.1\r\n";
print SOCKET "Host:$host\r\n";
print SOCKET "\r\n";
最後に空行が必要<HTTP
>>914 つかまずその通信は外に出てるのか?
fwで弾かれてるとか愉快なことは無いよな?
400返ってきてるんだからdropはされてないだろ
ちゃんと198を読んだか?最後は改行2つだぞksg
use Socket;
use FileHandle;
my $id = 'test';
my $line;
my $host = "www.google.co.jp";
my $port = "80";
my $iaddr = inet_aton("$host") or die "connection failed.";
my $sock_addr = pack_sockaddr_in($port, $iaddr);
socket(SOCKET, PF_INET, SOCK_STREAM, 0);
connect(SOCKET, $sock_addr) or die "connectError";
select SOCKET;
binmode SOCKET; ← 改行コードの内部変換を考えるのが面倒なのでこれで逃げる $/ を設定してもいいかも。 それか \x0D\x0A で改行させるとかとか
$|=1;
select(STDOUT);
print SOCKET "GET / HTTP/1.1\r\n";
print SOCKET "Host:$host\r\n";
print SOCKET "\r\n";
shutdown(SOCKET, 1);
while($line = <SOCKET>){
print $line;
}
close SOCKET;
これで受信完了
923 :
PHPヲタ:2010/08/05(木) 16:57:35 ID:lfryc7FA
いwwwwwwwまwwwwwwどwwwwwwwきwwwwwwwwwww
LWPじゃないとかwwwwwwwwwふるっwwwwwwwwwwwwww
924 :
nobodyさん:2010/08/13(金) 03:38:13 ID:VdoCI/2s
とある掲示板のスクリプト中にテストで
print "$ENV{'HTTP_USER_AGENT'}¥n";
書いてみると、クライアント情報でなく長い桁の数字が
表示されます。
正しく取得できていません。他の環境変数は大丈夫だし、
試しにそれだけのperlを書いてcgi設置してみると
動作しています。
なぜなんでしょうか?
「とある掲示板のスクリプト」が何者かわからんので答えようが無いです。
初っ端で別の変数に入れてから表示してみては?
926 :
nobodyさん:2010/08/13(金) 13:40:24 ID:v7edkYYK
閲覧した端末とか、とあるスクリプトが何なのか (伏せる必要無いかと思うよ) を
書いてくれなきゃ分かりませんよん。
アクセスした端末はMac2機種,win1機種
書いたスクリプトは ここのこれです
http://cgi-design.net/prog/bbs/bbs39/index.htm #!/usr/bin/perl
そのあとに
$brows = $ENV{'HTTP_USER_AGENT'};
として、あとで表示させてみるのですが
本来
「Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; ja-JP-mac」
となるべきなのに
「18446744073709551615」と表示されます。
もちろんこの変数は使ってませんし、htm中に直接書いても同じ。
928 :
nobodyさん:2010/08/13(金) 15:22:23 ID:v7edkYYK
ダウンロードして、#! の行の後に $brows 〜 の行を書いて、
print "</center></body></html>\n";
の直前で表示させたけど、ちゃんと表示されますよ。
あと、strict でないスクリプトなので使わないほうがいいかも
サーバーのエラーログが肥大化する原因なので・・・
929 :
nobodyさん:2010/08/13(金) 15:25:00 ID:v7edkYYK
気になったのでエラーログ見てみた
1回の実行で1131件のエラー発生してる
strict してみるとエラーが多すぎるのか固まるまであるw
レガシーよのう
失礼しました。スクリプト中のOsごとのスタイルシート振り分けが
影響していたようです。
検証有り難うございました。
確かにレガシーですが、永遠の日曜Web管理人の私などには
分かりやすいのです。
ただ、tableが多いのにサブルーチンで使い回ししまくりなので、
何処で閉じてるのかもう何がなんだか分かり難いのが最大の難点です。
932 :
☆忍者Perl☆ ◆M5ZWRnXOj6 :2010/08/13(金) 17:27:14 ID:LkLBXJmk
マカーがWeb系言語をやるのは運命wwwww
寄生虫のように脳味噌を取り付かれて、一定時期になったらweb言語をやりだすという
ハリガネムシに寄生されたカマキリみたいだねwwwwwwwwwwwww
933 :
nobodyさん:2010/08/13(金) 17:29:06 ID:v7edkYYK
日本語でおk
OOPで綺麗に書きなおせば
見辛いコードは保守性もないし
>>935 素人がOOPやっても保守しやすくなるとは限らん罠
それより先にやるべきことがある
一番やるべきなのはビューの分離
937 :
nobodyさん:2010/08/19(木) 15:22:08 ID:md+Wq55Q
CPANが使えない環境でMCryptをインストールしたくて、
winでダウンロードしたMCryptをlinuxにコピー。
makeすると
mcrypt.h: No such file or directory
といわれてしまいます。
google先生に聞いてもphpの例しか出てこず、、、
どういうことなんでしょうか?
libmcryptを入れればいいんじゃないかな
939 :
937:2010/08/19(木) 16:46:41 ID:md+Wq55Q
>938
ありがとうございます。
今度はRPMパッケージのlibmcryptをインストール中にこけました。
error: Failed dependencied:
libmcrypt = 2.4.11 is needed by libmcrypt-devel-2.4.11-2.i586
調べてみます。
940 :
nobodyさん:2010/08/19(木) 17:08:32 ID:W8mNHQ1m
libmcrypt-devel-2.4.11-2.i586 が必要ってこと
こんな感じで ハッシュをソートするとします
foreach $no (sort keys %hash){ ・・・
$no の小さい順になるんで逆転したいのですが
どうしたらいいですか?
942 :
nobodyさん:2010/08/26(木) 17:24:53 ID:2u47Mbsa
reverse sort keys(%hash)
sort { $b <=> $a } keys %hash
sort { $b cmp $a } keys %hash
10abc
100abc
20abc
こうゆうデータがあるとき、先頭の数字で並べ替えたい時
どうやってソートしますか?
普通にソートすると
100abc
10abc
20abc
となりますが、希望する並べ替えは
10abc
20abc
100abc
です。
先頭の数字の配列と、文字列の配列に分断して並べ替えるのが妥当なのかな?と思ったけど、
分断した配列同士をどうやって紐付けるかで迷い、結局構造体っぽいハッシュにがっつり入れて並べ替えて対処してます。
もっとスマートに出来そうなのですが・・・
ソートに使う数字が先頭にある場合に限れば
sort { int $a <=> int $b } @array
でいけるな。真っ当にやるなら
sort { ($a =~ /^([0-9]+)/)[0] <=> ($b =~ /^([0-9]+)/)[0] } @array
とか。
あ〜、int は数字以外が来たらそこまであった数字を処理対象とするんでしたっけ?
恐ろしく簡単で、灯台もと暗しすぎて笑えてきたw
正規表現は意外とコストが高いので、int 使っていこうと思います。
thx!
947 :
945:2010/08/26(木) 20:35:40 ID:???
ごめん、試してみたらintだとuse warningsで警告出るわ。正規表現にしといてくれ。
今試せる環境に居ないので試してないけど、
sort { ($a <=> $b } grep { /^([0-9]+)/)[0] } @array
は駄目かな?
コスト気にするなら、シュワルツ変換かシャチ泳ぎが定番。
map{ $_->[0] }
sort { $a->[1] <=> $b->[1] }
map{ [ $_, ( /^(\d+)/)[0] ] }
@array ;
950 :
nobodyさん:2010/08/27(金) 19:12:21 ID:RoA/6PjL
ソートの件、有り難うございました。
ところで、先頭に数字があるBBSのログをサーバ上で
他の目的用に整形し直した際に、
>>945の
sort { int $a <=> int $b }
でソートとしてみました。
こういうの
100<>name<>mail<>sub・・・・
99<>name<>mail<>sub
98<>name<>mail<>sub
ブラウザで新ログを見ると綺麗にソートされています。
それをFTPでダウンロードしてみると崩れています。
そんな事ってあるのでしょうか?
私の勘違いでしょうか。
>>950 ブラウザで見てるってのは生ログ見てるの? 何かcgi通してるの?
後者なら不思議でもなんでもないのだが。
>>950 話は戻るんだがそういうデータならどうせパースするんだし
@data = sort { $a->[0] <=> $b->[0] } map { [split /<>/, $_] } @lines;
とかでよくないか?
953 :
nobodyさん:2010/09/09(木) 17:38:07 ID:mtEu4DDe
質問させてください。
Perl::DBIで下記のようにコーディングしています。
my $codes = '1,2,3,4,5';
my $sql = 'SELECT * FROM TEST WHERE testcode IN (?)';
my $sth = $dbh->prepare($sql);
$sth->execute( $codes );
実行すると実際に発行されるクエリーは
SELECT * FROM TEST WHERE testcode IN ("1,2,3,4,5")
のようになると思います。(VARCHAR扱いでバインドされるので)
次のように発行させたい場合はどのように記述すればいいのでしょうか?
SELECT * FROM TEST WHERE testcode IN (1,2,3,4,5)
試してないけど、こんなんじゃだめなのけ
my @codes = split /,/, '1,2,3,4,5';
my $sql = 'SELECT * FROM TEST WHERE testcode IN (' . join(',', ('?') x @codes) . ')';
my $sth = $dbh->prepare($sql);
$sth->execute(@codes);
955 :
953:2010/09/09(木) 22:32:41 ID:mtEu4DDe
>>954 遅くなりました!
無事に動作しました。ありがとうございました。
956 :
nobodyさん:2010/09/10(金) 10:36:15 ID:dfQ9DvRu
Perlで指定した日時にイベントを起こす方法を模索しているのですが、
何か定番的なやり方がありましたら教えて下さい
検索のキーワードでも何でも結構ですので
957 :
956:2010/09/10(金) 10:58:46 ID:???
現状考えているのは、while(1)でループを回しっぱなしにして
その中で常時localtime(time)を取得し、特定の日時になったら
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
if($hour == 起こしたい時 && $min == 起こしたい分 && $sec == 起こしたい秒) {
#起こしたいイベント
}
こんな感じでイベントを起こす、というやり方です
また、指定する日時はCSVファイルで複数行を別途保持しておく形になります
YYYY,MM,DD,hh,mm,ss…みたいな感じです
もし他にもっとスマートな方法があるようでしたら教えて下さい
cron
タスク
>>957 cronを使えない特別な理由があるとして、whileの中でsleep(目標日時 - 現在日時)とかすればいいんじゃね?
960 :
nobodyさん:2010/10/07(木) 20:01:34 ID:dy4xwK3O
とある雑誌でみたソースコードなんですがPerl初体験?なので困っています
perlの関数は引数にアクセスする際に$_->[0]で引数の値を取得できると
教わったんですが関数らしき処理はこのソースコードの前後に書かれておらず
困ってます。
あとforループの$tはどんな役割になるんでしょうか?
my $input_vec = { book => 29, '梅田望夫' => 27 ....};
my %sim;
for my %t(keys %input_vec) {
for(@{$index{$t}}) {
$sim{$_->[0]} += $input_vec->{$t} * $_->[1];
}
}
いや、そんな一部分だけ抜き出されても困る。
せめて何を目的とするコードなのかくらい書け。
962 :
nobodyさん:2010/10/07(木) 20:21:13 ID:dy4xwK3O
WEB+DB PressVol57のリコメンドエンジンを作るとういう記事の一部です
$input_vecにははてなブックマークのタグ数が代入されています。
実装 : ある記事を見たユーザにオススメの記事を推薦する機能
$indexははてなブックマークのタグとタグ数、記事のIDを元に
作られた転置インデックスです。
なんかわからんけどこれをやりたいの?
#!/usr/bin/perl
@array = ('a', 'b', 'c');
&func(\@array);
sub func{
foreach (@_) {
print $_->[0],": ",$_->[1],": ",$_->[2],"\n";
}
}
ttp://pgd.jp/cgiscript.html ここのメールフォームのスクリプトを試していて、
textareaに入力した改行が確認画面で反映されないのですが、
どのような改造をすればよいでしょうか。
送信されたメールではちゃんと改行されてるので、確認画面を出力するところが問題になるとは思うのですが。。。
大雑把な質問なんですが、カレンダー型スケジュールなどで
平日のみ4つの配列を順に表示させる方法またはヒントが
あれば教えてください。
休日か平日かの判定は出来ています。
下のような感じです。
配列はA→B→C→Dの4つ。
10/04(月)→平日なので配列Aを表示
10/05(火)→平日なので配列Bを表示
10/06(水)→平日なので配列Cを表示
10/07(木)→平日なので配列Dを表示
10/08(金)→平日なので配列Aを表示
10/09(土)→休日なので表示しない
10/10(日)→休日なので表示しない
10/11(祝)→休日なので表示しない
10/12(火)→平日なので配列Bを表示
10/13(水)→平日なので配列Cを表示
平日だけを要素にした配列を作って、その日が何番目の
要素かを調べて、(qw(A B C D))[$n % 4] でいいと思う。
&Jcode::convert(¥$_,'euc','utf8');
という行は¥$_をutf8からeucへ変換するということだと思うのですが、
¥$_ってどういう意味ですか?
リファレンス
参照渡し
関数の副作用
970 :
nobodyさん:2010/10/11(月) 12:56:11 ID:DYbljc5P
すみません。Perlの環境構築について質問がございます。
Win7+Apache+PerlでCGIを動かそうとしているのですが、Internal Server Error(500)が出てうまくいきません。
Apacheのerror.logをみると
[Mon Oct 11 12:41:43 2010] [error] [client 127.0.0.1] (OS 2)指定されたファイルが見つかりません。 : couldn't create child process: 720002: printenv.cgi
[Mon Oct 11 12:41:43 2010] [error] [client 127.0.0.1] (OS 2)指定されたファイルが見つかりません。 : couldn't spawn child process: C:/Program Files (x86)/Apache Software Foundation/Apache2.2/cgi-bin/printenv.cgi
と出てきます。
ググると、ソースの一行目の#!のPathの設定が正しくないとこのエラーが出るらしいのですが、
Pathは正しく設定してます・・・
#!c:/Perl64/bin/perl.exe
何か他に怪しいところとかありますでしょうか?
>>968 【質問】
&Jcode::convert(\$_,'euc','utf8');
という行は\$_をutf8からeucへ変換するということだと思うのですが、
\$_ってどういう意味ですか?
【回答】
&Jcode::convert(\$_,'euc','utf8');
という行は $_ をutf8からeucへ変換するということ
です。
$_ = \$foo;
&Jcode::convert($_,'euc','utf8');
の場合は $_ をutf8からeucへ変換するということ
で・は・な・く・て
$foo をutf8からeucへ変換するということ
でっす!!!
最近になって覚えたワンライナーが面白くて仕方ありません。
searchという文字があった場合に行末にfooを付けたいのですが、
こんなふうにやってます。↓
perl -ne "print if ( /search/ )" input.txt > output1.txt
perl -ne "print if ( s/\n/foo\n/g )" output1.txt > output2.csv
2つのワンライナーを1つにするにはどうすれば良いのですか?
よろしくお願いします。
perl -ne "/search/ and s/\n/foo\n/g and print" input.txt
>>967 レス遅くなってすいません。
質問の仕方が悪かったです。
表示する方法ではなくて、「"今日"($year/$mon/$day)は"ある日"($tyear/$tmon/$tday)から何回目の平日か?」
を簡単にわかる方法があればと。。。
timelocal での差分 - 休日数でできました。
ありがとうございました。
977 :
974:2010/10/16(土) 00:38:31 ID:???
>>975さん、ありがとうございます。
andで繋げていくのですね。
セミコロンで繋げるものとばかり思い込んでいました。
いや、意味違ぇーから…
if( $optlist_wk[$i] =~ /$switem/i ){ # 大文字&小文字の判別:無へ Y.Otake 04.08.17
既にcase-insensitiveになってる気がしますが
データベースに入れるときに大文字か小文字かに統一したデータも入れておいてそれを検索するか、
データベース検索時に正規表現を使うか