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

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

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

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

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

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >2 以降

前スレ http://pc11.2ch.net/test/read.cgi/php/1189939783/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
05525432008/05/24(土) 14:13:48ID:CztaXqIN
>>550
>受け渡しの情報が知りたいって言ってるのに、
>受け取りのソース書いてるから、それを指摘されてるんだよ。

データを受け渡す側のソースが>>543で、受け取るソースがsession.cgiだと
認識してるのですが…。間違っているでしょうか。

もしかしたら私が勘違い?をしているのかも?

0553nobodyさん2008/05/24(土) 14:14:00ID:???
>>551
正直、目的に対して技術が足りなすぎる。イヤミじゃなくてね。
トラブル起こす前に、オライリーのCGIプログラミング読破オススメ。
0554nobodyさん2008/05/24(土) 14:18:21ID:???
>>552
>受け取るソースがsession.cgiだと認識してるのですが…。
少なくてもこのソース中でセッションIDはどこにも発行してないでしょ?
後は調べなさい。
05555542008/05/24(土) 14:19:15ID:???
ごめんミスった。

 × >受け取るソースがsession.cgiだと認識してるのですが…
 ○ >データを受け渡す側のソースが>>543で
05565432008/05/24(土) 14:19:38ID:CztaXqIN
すいません。もう少し勉強しなおしてきます。
みなさん、有難うございましたー・・・
05575432008/05/24(土) 14:23:19ID:CztaXqIN
>>554
あ、ソースの一部分しか乗せてなかったためです!

use CGI::Session qw/-ip_match/;

my $session=CGI::Session->new(undef,undef,{Directory=>'./session'});
$session->expire('+1m'); #有効期限は1分間
$session->param('name','john'); #セッション経由で引き渡す項目と値

my $cgi=CGI->new;

print $cgi->header(-charset=>'UTF-8',
-cookie=>$cgi->cookie(-name=>'CGISESSID',
-value=>$session->id,
-expires => '+3M')),
#cookieにセッションidを保管
$cgi->start_html(-lang=>'ja',
-encoding=>'UTF-8',
-title=>'CGI.pm使用/cookie'),
$cgi->p('session id: '.$session->id.'<br/>',
'name: '.$session->param('name').'<br/>',


05585432008/05/24(土) 14:24:17ID:CztaXqIN
続き

print <<EOT
<form action="http://localhost/cgi-bin/session.cgi" method="post">
<p>
<label for="nm">お名前:</label>
<input type="text" name="namae" id="nm"><br>
<label for="ma">メール:</label>
<input type="text" name="email" id="ma">
</p>
<p>
<input type="submit" value="送信">
<input type="reset" value="リセット">
</p>
</form>
EOT
;
$cgi->end_html;
#end

すいません…!
0559nobodyさん2008/05/24(土) 14:27:18ID:???
めんどくさいし、合ってる保証ないけど、適当にフォローしてみる

追記 use CGI;
追記 my $cgi = new CGI;

× my $session=CGI::Session->new(undef,undef,{Directory=>'./session'});
○ my $session=CGI::Session->new(undef, $cgi, {Directory=>'./session'});
0560nobodyさん2008/05/25(日) 02:16:54ID:???
htmlのフォームデータをセッション変数に格納して利用するには

htmlのフォームデータをpost→受け取ったデータをセッション変数を格納するCGI
→それらのセッション変数にアクセス(利用する)CGI

の流れがいるのでは?




自信ないけど
0561nobodyさん2008/05/25(日) 19:58:56ID:sAYmYKjS
perlのセッション管理はphpに比べるとかなりめんどい
もちろん細かく制御するには向いてるんだが始めとっつきにくいかもなー
0562nobodyさん2008/05/26(月) 13:29:09ID:???
>>561
>>543の質問を分かりやすくPHPで説明すると、
$_REQUESTの内容を$_SESSIONで受け取るにはどうしたらいいんですか?
ということ。
0563nobodyさん2008/05/26(月) 19:00:45ID:BXwqNwjP
すみません。質問です。
Global symbol "%in" requires explicit package name at C:/ApacheGroup/〜〜.cgi line 375, <DATA> line 855.
というソフトウェアエラーが出続けてるんですが。
どうすればいいでしょう。
どなたか教えてください〜。
0564nobodyさん2008/05/26(月) 19:09:34ID:fmVA2Qe8
先生方! 質問よろしいでしょうか!

open(OUT,"+< log.txt");
eval{flock(OUT, 2);};
eval{truncate(OUT, 0);};
seek(OUT, 0, 0);
print OUT @log;
eval{flock(OUT, 8);};
close(OUT);

今はこのように通常のテキストでログの上書き保存をしているのですが、
私はgzipで圧縮して上書き保存をしたいのです!
しかしどれだけGoogle先生に訊いてもgzipでの保存方法を教えてもらえません! あの先生はケチです!
もう先生方だけが頼りなんです! 一体どうすればgzipでの保存が可能になるんでしょうか!
0565nobodyさん2008/05/26(月) 19:18:18ID:???
>>563
http://xn--lckja1b6r.jp/%47%6C%6F%62%61%6C%20%73%79%6D%62%6F%6C%20%20%72%65%71%75%69%72%65%73%20%65%78%70%6C%69%63%69%74%20%70%61%63%6B%61%67%65%20%6E%61%6D%65

>>564
http://xn--lckja1b6r.jp/%70%65%72%6C%20%67%7A%69%70
0566nobodyさん2008/05/26(月) 19:32:47ID:???
Archive perl でググればでてくるじゃないの
0567nobodyさん2008/05/26(月) 23:41:19ID:???
>>563
英語が読めないなら駱駝本を買うべきだ。
0568nobodyさん2008/05/27(火) 11:06:43ID:???
ラクダを漢字で書かれると困ります (><;)
0569nobodyさん2008/05/27(火) 19:27:42ID:???
{
$global_foo = $foo;
$global_bar = $bar;
my $foo;
my $bar;
$foo = $_[0];
$bar = $_[1];
$foo = $global_foo if $foo eq undef;
$bar = $global_bar if $bar eq undef;
}
をコンパクトにまとめたいが、バグが混入しそうでいやん。
0570nobodyさん2008/05/27(火) 19:44:24ID:???
{
my $global_foo = $foo;
my $global_bar = $bar;
$foo = shift || $global_foo;
$bar = shift || $global_bar;
}
0571nobodyさん2008/05/27(火) 19:55:45ID:???
>>569-570
$foo eq undef もたいがいだが
shift || $global_foo だと $_[0] が '0' の時に挙動変わるな。
0572nobodyさん2008/05/27(火) 20:06:24ID:???
{
my $global_foo = $foo;
my $global_bar = $bar;
$foo = defined( $_[0] ) ? $_[0] : $global_foo;
$bar = defined( $_[1] ) ? $_[1] : $global_bar;
}

こうか?
0573nobodyさん2008/05/27(火) 20:06:58ID:???
あ、三項演算子逆だ。すまん。
0574nobodyさん2008/05/27(火) 20:33:00ID:???
defined関数の存在が頭から抜けてたorz
$foo = $global_foo if $foo eq undef;
$bar = $global_foo if $bar eq undef;
ではなく
$foo = $global_foo unless defined $foo;
$bar = $global_foo unless defined $bar;
でお願いします。あと>>570-573サンクス、参考になります。
0575nobodyさん2008/05/27(火) 20:38:51ID:???
つーか、>>569だとまともに動かんよ。

初期化するためにmy使っちゃってるように見えるけど、
この場合、ブロックスコープになるから、
ブロック内の$foo, $barと、グローバル変数$foo, $barは別物になる。
0576nobodyさん2008/05/27(火) 20:54:18ID:???
myの仕様間違えて覚えてたか…
$global_foo = $foo;
$global_bar = $bar;
{
my $foo;
my $bar;
$foo = $_[0];
$bar = $_[1];
$foo = $global_foo unless defined $foo;
$bar = $global_foo unless defined $bar;
}
欲しい動作はこうかな…
0577nobodyさん2008/05/27(火) 20:56:48ID:???
いやいやいやいやw
「perl スコープ 変数」でググっみ。
0578nobodyさん2008/05/27(火) 21:53:15ID:???
全然わかってないわかってないwww
0579nobodyさん2008/05/27(火) 22:34:53ID:???
my $foo = 1;

sub func {
my $temp = $_[0];
return defined( $_[1] ) ? $_[1] : $temp;
}


ex :
$foo = func( $foo, 10 ); # $foo = 10
$foo = func( $foo ); $foo = 1
0580nobodyさん2008/05/28(水) 00:31:36ID:???
早くdefined-or演算子実装されないかな…
0581nobodyさん2008/05/28(水) 01:24:48ID:???
今日が今月の何週目か求めるにはどうしたらよいでしょうか
05825762008/05/28(水) 01:29:54ID:???
$global_foo = $foo = 1;
$global_bar = $bar = 2;
@_ = (3,4); #@_に値あり
{
my $foo;
my $bar;
$foo = $_[0];
$bar = $_[1];
$foo = $global_foo unless defined $foo;
$bar = $global_bar unless defined $bar;
print "point 1: foo=$foo bar=$bar\n";
}
print "point 2: foo=$foo bar=$bar\n";

出力結果
point 1: foo=3 bar=4
point 2: foo=1 bar=2
05835762008/05/28(水) 01:32:06ID:???
$global_foo = $foo = 1;
$global_bar = $bar = 2;
@_ = (3,4); #@_に値あり
{
my $foo;
my $bar;
$foo = $_[0];
$bar = $_[1];
$foo = $global_foo unless defined $foo;
$bar = $global_bar unless defined $bar;
print "point 1: foo=$foo bar=$bar\n";
}
print "point 2: foo=$foo bar=$bar\n";
出力結果
point 1: foo=1 bar=2
point 2: foo=1 bar=2
━━━━━━━━━━━━━━━━━━━━━━━
うん、欲しかった動作そのままだけど。
>>577-578が理解できず悩み中
0584nobodyさん2008/05/28(水) 01:34:02ID:???
ぎゃー、>>583張り間違えた

【誤】@_ = (3,4); #@_に値あり

【正】@_ = (); #@_に値無し

orz 120秒規制が若干きつい…
0585nobodyさん2008/05/28(水) 01:35:51ID:???
Date::Calc
0586nobodyさん2008/05/28(水) 01:46:51ID:???
>>576
目的が分からん。そもそも何がしたいの?
説明する気あるのか?

my $foo = 1;
my $bar = 2;

print $foo = func( $foo );
print $bar = func( $bar );
print $foo = func( $foo, 3 );
print $bar = func( $bar, 4 );
exit;

sub func {
return defined( $_[1] ) ? $_[1] : $_[0];
}
0587nobodyさん2008/05/28(水) 01:47:41ID:???
>>585
感動した ありがとう
05885762008/05/28(水) 01:58:37ID:???
>>586
サブルーチン冒頭にて、引数リスト > デフォルト値(グローバル変数の値とか)
の優先順でmy変数値を設定したいことはよくあるから、
perlなら… perlならきっとすごくスマートに書く方法があるに違いない…

という夢を見たけど、幻だったみたいですね…
変数ひとつずつシコシコとunless definedを当てることにします。
0589nobodyさん2008/05/28(水) 02:00:25ID:???
いや、日本語でおk
お前の望むようなことは確実にできると思うんだけど、
なにぶん言いたいことがよく分からんw
0590nobodyさん2008/05/28(水) 02:16:48ID:???
my $global_foo = my $foo = 1;
my $global_bar = my $bar = 2;

# @_ =( );
@_ =( 3, 4 );
{
my $foo = defined( $_[0] ) ? $_[0] : $global_foo;
my $bar = defined( $_[1] ) ? $_[1] : $global_bar;
print "point 1: foo=$foo bar=$bar\n";
}
print "point 2: foo=$foo bar=$bar\n";

結局、最初に提案されてる回答をアレンジすれば、
>>582-584をシンプルかつ可読性も保ったまま実現できるんだが。
これじゃいかんの?
0591nobodyさん2008/05/28(水) 02:25:18ID:???
>>590
そのへんが限界みたいですね…ありがとうございます。
私の欲求そのものが十分特殊だったのかな…

いま考えてる最善の形はサブルーチンを使うことです。
サブルーチンコールは負担かかりそうだからやりたくないんだけど…

sub merge_argument_and_default{
my ($argument, @default) = @_;
my @value;
while(1){
my ($a, $v) = (shift @$argument, shift @default);
my $c = ((defined $a) ? $a : $v);
last unless defined $c;
push @value, $c;
}
return @value;
}

sub foo{
my(@bar) = &merge_argument_and_default(\@_, @default_bar);
}

みなさんありがとうございました。
0592nobodyさん2008/05/28(水) 02:30:59ID:???
殺してぇ……。日記じゃねぇんだよ。
0593nobodyさん2008/05/28(水) 06:17:52ID:???
>>580
もう実装されてるよ?
http://search.cpan.org/dist/perl/pod/perl5100delta.pod#Defined-or_operator
0594nobodyさん2008/05/28(水) 06:40:31ID:???
>>576みたいに、自分のプライド保つために
当初の目的をすり替えて、自分は違うもの作ってました的な発言するやつは質問にくるなよ。

当初は「>>569をコンパクトにしたい」って言ってただけなのに、
どんな解が提示されても、
どんどん違う方向に勝手に転換して善意のレスすら流し読み。
こういう奴は、治らないから本当に放置すべきだと思うよ。
0595nobodyさん2008/05/28(水) 07:18:42ID:???
>>594
それは違うんだけど、あなたへの説得は無理かな。
ひどく機嫌を損ねてしまったのは悪いと思ってるが。

いただいたありがたいアドバイスから、例えば今回は、
「サブルーチン化でもしなければ相当コンパクトに収めるのは難しいらしい」
「そのサブルーチンはこういう形で書くのがよいのだろうか」
などと、自分の知識や興味対象は移り変わっていくことが多いです。

ただ、このスレッドにはしばらく書き込みを自粛します。さよなら。
0596nobodyさん2008/05/28(水) 10:11:34ID:???
典型的な"隠す人"だったか。
05975902008/05/28(水) 10:39:10ID:???
うわ、ちょっと離れたスキにすげぇ慇懃無礼なこと書いてやがる。
目的も明確にせず、そのへんが限界てw
そもそも次の疑問に移ったなら、その過程を説明するのが回答者への最低限の礼儀だろ。
社会出て苦労するよ。

ちなみに>>591は、俺ならこう書く。

sub merge_argument_and_default {
 my ($argument, @default) = @_;
 my %count;
 $count{$_} = $default[$_] for( 0..$#default );
 $count{$_} = ${ $argument }[$_] for( 0..$#{ $argument } );
 return map { $count{$_} } sort keys %count;
}
0598nobodyさん2008/05/28(水) 11:40:59ID:???
>595みたいなやつっているよね
言葉遣いが丁寧なだけで、いっぱしの大人だと思ってる人。
0599nobodyさん2008/05/28(水) 12:04:01ID:???
sub merge_argument_and_default { map{ defined $_[0][$_] ? $_[0][$_] : $_[$_ + 1] ;} 0 .. $#{$_[0]} ; }

>>598
ガキなの見え見えなんだよねw
ttp://www2.atpages.jp/mirror/2ch/perl/prog/read.php/1157874614/
の595を思い出した。
0600nobodyさん2008/05/28(水) 13:55:09ID:???
>>593
そいえば5.10でてるんだっけ(汗
RHELとCentOSしか使ってないからすっかり忘れてました。
0601nobodyさん2008/05/28(水) 15:44:58ID:???
5.10って絶対分かりづらいよw
5.8より昔のリリースだとしか思えない。
0602nobodyさん2008/05/28(水) 15:51:58ID:???
Ver 5.008008
Ver 5.010000
こう書けばよいのか?
0603nobodyさん2008/05/28(水) 16:09:29ID:???
5.1の方が新しいんですか?
知らなかったorz
0604nobodyさん2008/05/28(水) 16:21:25ID:???
5.10.0 > 5.9.5 > 5.8.8 >> 5.1.0
苦肉の策なんだろうな……。
0605nobodyさん2008/05/28(水) 17:55:49ID:???
perl6ってどうなったん?
0606nobodyさん2008/05/28(水) 19:03:22ID:???
>>605
parrotの新しいのが最近でた気が・・・
0607nobodyさん2008/05/28(水) 20:28:19ID:???
あるIPアドレスが変数$ipに格納してあります。
この$ipが存在するか、あるテキストファイル(ip.txt)を読んで
チェックしています。以下は例です。

$ipは"192.168.0.1"
ip.txtに192.168.0.1が記述してあります。

この場合マッチするようプログラムしてあります。

ip.txtに

192.168.0.0/24
または
192.168.0.0/255.255.255.0
と記述してあるものと
マッチさせたいのですが、
そういうサブルーチンは
ありますでしょうか?


簡単にいうと、あるIPアドレスが
サブネットマスクで指定してある
10進表記またはサイダー表記に
マッチするか判定したいのです。
ip.txtは10進表記でもサイダー表記の
どっちでも構いません。
0608nobodyさん2008/05/28(水) 20:34:04ID:???
ttp://pc11.2ch.net/test/read.cgi/tech/1086143976/491-590
の543-544及び「IP pack unpack perl」でググれ。
06096072008/05/28(水) 20:59:40ID:???
>>608
あり♪
明日、見てみるよん
06105972008/05/28(水) 21:17:34ID:???
>>599
終わった話題なんだけど、ちょっと気になった。
めんどくさかったら、スルーして。

提示してくれてるルーチンだと、

 引数1 @array1 = ();
 引数2 @array2 = ( 1,2 );

のとき、返り値が空になっちゃうよね。
配列1(引数1) > 配列2(引数2) という優先順位で、
配列3(返り値)を混ぜ合わせるというのが目的の処理だと思うんだけど、
配列1と配列2で要素数の大きい配列を、要素数だけループさせる処理にする場合、
キレイにまとめる方法ってないかなぁ?

 if( ( $#array1 <=> $#array2 ) == -1 ) {
  EXPR for( 0..$#array2 );
 } else {
  EXPR for( 0..$#array1 );
 }

みたいな、冗長な方法しか俺には思い浮かばなかった。

だから、「配列の重複値をハッシュを利用してマージ」の応用みたいなことを>>597でやってみたわけだ。
なんか美しい方法あればいいんだけどなぁ。
0611 ◆TWARamEjuA 2008/05/28(水) 21:20:10ID:???
(´-`).。oO(Net::CIDRでよさそうな。。。)
06125972008/05/28(水) 21:26:18ID:???
my @temp = ( $#array1 <=> $#array2 ) == -1 ) ? ( 0..$#array2 ) ; 0..$#array1;
こんな前処理してから、>>599のmap対象配列に、( 0..\$temp ) って感じかなぁ?

エレガントさには欠けるけど、これが可読性保つギリギリかな?
06135972008/05/28(水) 21:28:46ID:???
動作確認してないからtypoしまくり。まぁ分かるよね?(苦笑
06146072008/05/28(水) 21:31:18ID:???
>>611
私へのレスですね。
明日調べてみます
06155992008/05/28(水) 22:23:24ID:???
>>610
ああ、
@array1 = ( undef, undef ) ;
は考えてたけども、それは想定してなかったw
>>612の解で良いんじゃね? 助長を厭わないならば、
map{ 略 } 0 .. $#{$_[0]} , 0 .. $#_ - 1 ;
っつー荒技もw
自分のスクリプトじゃ絶対やんないけどね。
06165992008/05/28(水) 22:27:21ID:???
>>615
s/助長/冗長/
0617nobodyさん2008/05/29(木) 03:05:45ID:???
mapがいまいち理解し切れなくて使ってないんだが覚えとくべき?
覚えると便利そうだけど。
0618nobodyさん2008/05/29(木) 03:45:40ID:???
やってることは、forやforeachと変わらん。
違うっていえば、{}の中を、引数リストのそれぞれの要素で実行した結果をリストとして返すってとこか。
かなり便利な局面もある。覚えとくべきだとは思う。

@res = map{ $_ + 10 } (1,2,3,4,5) ;
print join("\n",@res);
---結果---
11
12
13
14
15
0619 ◆TWARamEjuA 2008/05/29(木) 07:02:31ID:???
my $Now_Date = sprintf qq|%04d/%02d/%02d %02d:%02d|, map {
$_->[0] += 1900;
$_->[1]++;
@$_;
}[(localtime)[5,4,3,2,1]];

2008/05/28 07:02
って出るかと思う。
0620nobodyさん2008/05/29(木) 08:23:18ID:???
>>617
シュワルツ変換という定番sort手法には必須だよ。
ぐぐって、foreach 文で書いてみたらありがたみが分ると思う。

>>619
お前さんの例は頻繁にとんでもなく斜め上を行くなあw
なんで一要素しかないと分りきってる無名配列を作って map の例にする?
do ならいざしらず
perl -le 'my $Now_Date = sprintf qq|%04d/%02d/%02d %02d:%02d|, do{
@_ = (localtime )[5,4,3,2,1] ;
$_[0] += 1900 ;
$_[1] ++ ;
@_ } ;
print $Now_Date ;'
それ以前に普通は↑こんな面倒な事しないだろ?
perl -MPOSIX=strftime -le '$str =strftime "%Y/%m/%d %H:%M", localtime; print $str, "\n"; '

06216072008/05/29(木) 17:51:57ID:???
Net::CIDR::cidrlookupでうまくいきそうなのですが、
IPアドレスのチェックを行いたいと思ってます。
ググると、以下の様な正規表現がありますが、
\d(バックスペース)の意味が分かりません。
どういう意味なんでしょうか?

\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
0622nobodyさん2008/05/29(木) 17:53:57ID:???
0-9
06236072008/05/29(木) 17:54:42ID:???
すみません。
\dは数字でした。
申し訳ない
06246072008/05/29(木) 18:10:05ID:???
またまたお願いします。

正規表現で/をマッチさせたいのですが、
以下であってますでしょうか?

$hoge =~ /\//
06256072008/05/29(木) 18:11:58ID:???
すんません

\/で、いけるみたいです。
お騒がせしました。
0626nobodyさん2008/05/29(木) 18:15:31ID:???
$hoge =~ m(/);

すこしは綺麗?
0627nobodyさん2008/05/29(木) 18:19:11ID:???
>>617だけどレスありがとう。
シュワルツ変換とかまだいまいち理解できないけど良さそうだね。
sortは結構使うから思い処理の部分で使うのはいいかも。
でも問題は後で読み直して何してるか理解できなくなりそうな所だな。
0628 ◆TWARamEjuA 2008/05/29(木) 20:45:58ID:???
>>620
つっこみおおきに♪
mapを覚えちゃってからどんどん斜め上に逝っちゃいました。

ひとまず車輪の再発明は大好き♪
0629nobodyさん2008/05/30(金) 02:09:30ID:???
曲芸はほどほどに
0630nobodyさん2008/05/30(金) 08:17:40ID:???
出来た物が車輪じゃない上に使えないのならただの無駄
0631nobodyさん2008/05/30(金) 10:14:07ID:???
車輪を作ろうとしたら鎖鎌が出来ちゃった感じだな
0632nobodyさん2008/05/30(金) 10:19:32ID:???
まーmapは便利だってことだ
0633nobodyさん2008/05/30(金) 11:57:18ID:???
XML::DOMを使ってXHTMLに広告を挿入するCGIを書いたのですが、use encoding "utf8";
を書くとローカルで文字化けしてしまいます。これをコメントアウトすると
XREA.COMのサーバ上でScript Errorが発生してしまいます(しかもエラーログが見られない)。

ローカルでもXREA.COM上でも動くようにしたいのですがどうすればいいでしょうか。
コードはこんな感じです。

#!/usr/bin/perl
use strict;
use XML::DOM;
use encoding "utf8";

my $xhtml_file = $ENV{'PATH_TRANSLATED'};
my $parser = new XML::DOM::Parser;
my $doc;
eval { $doc = $parser->parsefile($xhtml_file) };
if($@) {
print "Content-Type: text/plain;charset=utf-8\n\n";
print "parsing error occured: $@";
exit;
}

# 広告挿入処理

print "Content-type: application/xhtml+xml;charset=utf-8\n\n";
print $doc->toString;
$doc->dispose;

ローカルの環境はUbuntu 8.04 + Perl 5.8.8 + Apache 2.2.8、
XREA.COMはよくわかりません。
0634nobodyさん2008/05/30(金) 12:22:33ID:???
>>632
だれも「mapが不便」なんて言ってないがな
明らかにバッドノウハウなコードを曝してる奴をくさしてるだけで
0635nobodyさん2008/05/30(金) 12:23:13ID:???
すみません。自己解決しました。use encoding "utf8";をコメントアウトして
utf8::is_utf8($doc->toString) ? print encode('utf-8', $doc->toString) : print $doc->toString;
とすればいいみたいです。utf8フラグというのが関係しているみたいなので、
調べてみます。おさわがせしました。
0636nobodyさん2008/05/30(金) 12:40:26ID:???
>>635
これはマジメに調べまくった方がいい。
慣れるまでPerl5.8以降でハマる最大の原因。
0637nobodyさん2008/05/30(金) 12:50:11ID:???
BOM付けてたりして・・・
0638nobodyさん2008/06/01(日) 07:19:24ID:???
BOMBなら付いてますw
0639nobodyさん2008/06/02(月) 12:34:35ID:???
Wed, 12 Mar 2008 21:20:11 GMT
Last-Modified↑これをtimeの値に変換する方法を教えてください。
3600秒以内とかの判定に使いたいので。
0640nobodyさん2008/06/02(月) 12:49:16ID:???
>>639
timelocal
0641nobodyさん2008/06/02(月) 12:57:39ID:???
>>640
ありがとうございました!
0642nobodyさん2008/06/02(月) 13:51:21ID:???
こんな感じで出来たのですが凄く格好悪いです。
$mon = 1 if $mon eq 'Jan';とか。
スマートな例があったら参考の為に見せてください。

sub last_modified {
my $time = shift;
my($day, $mon, $year, $hour, $min, $sec);
if ($time =~ /\w+, (\d+) (\w+) (\d+) (\d+):(\d+):(\d+) GMT/) {
($day, $mon, $year, $hour, $min, $sec) = ($1, $2, $3, $4, $5, $6);
$mon = 1 if $mon eq 'Jan';
$mon = 2 if $mon eq 'Feb';
$mon = 3 if $mon eq 'Mar';
$mon = 4 if $mon eq 'Apr';
$mon = 5 if $mon eq 'May';
$mon = 6 if $mon eq 'Jun';
$mon = 7 if $mon eq 'Jul';
$mon = 8 if $mon eq 'Aug';
$mon = 9 if $mon eq 'Sep';
$mon = 10 if $mon eq 'Oct';
$mon = 11 if $mon eq 'Nov';
$mon = 12 if $mon eq 'Dec';
} else {
die "Error: $time\n";
}
$time = timelocal($sec,$min,$hour,$day,$mon-1,$year);
return $time;
}
0643nobodyさん2008/06/02(月) 14:47:28ID:???
>>642
%mons = (
Jan => 1, Feb => 2, Mar => 3, Apr = 4, # ……以下省略
);
$mon = $mons{$mon};

とかどうよ?
0644nobodyさん2008/06/02(月) 15:22:18ID:???
>>643
ありがとうございます。
連想配列は普段全く使わないので、この機会に試してみます!
0645nobodyさん2008/06/02(月) 15:44:50ID:???
>>643は、どうせ後で1引くのに、どうしてわざわざ1足すのさ?w
0646nobodyさん2008/06/02(月) 16:15:30ID:???
>>645
ほんとだ><
お前頭いいな
すみません><
0647nobodyさん2008/06/02(月) 17:46:33ID:VCfcjQkN
CPANを使わずにモジュールを使いたいのですが、なかなかうまくいきません。
HTML::Template を使いたいのですが、

ローカルにインストールしている、
C:\Perl\cpan\build\HTML-Template-2.9\Template.pm
というファイルを、以下のcgiと同ディレクトリにコピーしました。

#!/usr/local/bin/perl
use strict;
use lib qw(.);
use HTML::Template;
print "Content-type:text/html\n\n", "test";

ですが、うまくいかないようです。
use lib qw(.); の部分を、
unshift @INC, '.';
などとしても不可能でした。
ググっても上記の方法ぐらいしか出てこないんですが、何がいけないか教えていただけますでしょうか。
Perl のバージョンは 5.00503 です。
0648nobodyさん2008/06/02(月) 17:51:49ID:???
Template.pmをHTMLというディレクトリを作ってそこにいれる
0649nobodyさん2008/06/02(月) 18:08:23ID:VCfcjQkN
>>648
ありがとうございます。
助言どおりHTML ディレクトリにTemplate.pmを入れて、エラーが出たので、
Digest::MD5がどうだとかエラーが出ました。
同じ要領で、Digest ディレクトリを作り、MD5.pmを入れると、
次はXSLoader.pmが必要らしく、それもcgiと同ディレクトリに入れました。
次はDynaLoader.pmがどうとかエラーが出たので、それも同じディレクトリに入れたのですが、
今度はエラーが消えませんでした。。
最終的にCGI::Carpがはいたエラーは以下です。

[Mon Jun 2 18:01:45 2008] Template.pm:
[Mon Jun 2 18:01:45 2008] Template.pm:
[Mon Jun 2 18:01:45 2008] MD5.pm:
[Mon Jun 2 18:01:45 2008] MD5.pm:
[Mon Jun 2 18:01:45 2008] DynaLoader.pm: Can't locate loadable object for module Digest::MD5 in @INC
(@INC contains: /usr/lib/perl5/5.00503/i386-linux /usr/lib/perl5/5.00503 /usr/lib/perl5/site_perl/5.005/i386-linux /usr/lib/perl5/site_perl/5.005 .) at HTML/Template.pm line 915
[Mon Jun 2 18:01:45 2008] Template.pm:
[Mon Jun 2 18:01:45 2008] Template.pm: BEGIN failed--compilation aborted at HTML/Template.pm line 915. BEGIN failed--compilation aborted at test.cgi line 6.
0650nobodyさん2008/06/02(月) 18:17:18ID:???
CPAN にモジュールの関連性とか書いてなかったっけ?
0651nobodyさん2008/06/02(月) 18:18:22ID:???
関連性とかじゃなくて依存のこと
■ このスレッドは過去ログ倉庫に格納されています