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

Perl 初心者コーナー Part24

■ このスレッドは過去ログ倉庫に格納されています
0001 ◆fBgbHI04bQ 03/06/07 22:30ID:GbQKLcPE
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。

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

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


CGIだけど、なんか質問ある? Part 10
http://pc2.2ch.net/test/read.cgi/php/1048686475/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
CGIに依存しないPerlの話題一般/Part2
http://pc2.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は、【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/

過去ログやお勧めサイトは >>2-10
0069nobodyさん03/06/08 17:57ID:???
>>67
調べ方を教えてください
0070nobodyさん03/06/08 17:58ID:???
>>68
ありがとうございます。
それをどうやって組み込めばいいのでしょうか?

……って返されそうだな。
00715103/06/08 18:03ID:???
>>70
そだね。 69は偽者じゃないの?
さすがにそこまでプなやつはおらんだろ。
0072nobodyさん03/06/08 18:03ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。

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

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
0073nobodyさん03/06/08 18:03ID:???
>>70
あなたは
名前#123 をなんという変数に代入してるですかー
0074nobodyさん03/06/08 18:09ID:???
$nameです
0075nobodyさん03/06/08 18:10ID:???
>>67
自分のサイト作って次はCGIだーって思ってる奴が迷い込んで来るんだよ。
質問者は>>1読まないしね。読んだとしても1行ぐらいじゃないかな。
0076nobodyさん03/06/08 18:11ID:???
>>68
split(/#/, $name, 2);にしないと$nameが"名前#12#3"とかなっていたら$tripが"12"になってしまうけどいいの?
0077nobodyさん03/06/08 18:13ID:???
>1:自分はこう言う事がしたい。
>2:それでこんな風にやってみたが・・・
>3:それだとこんなエラーが出て上手く行かなかった。

これを強制させるのはどうだ?
例えば>>66にこれを書かせると

1:自分はこう言う事がしたい。
2chのトリップみたいのを付けたいです。

2:それでこんな風にやってみたが・・・
何もしてません。

3:それだとこんなエラーが出て上手く行かなかった。
何もしてないのでエラーはありません。


となって、自分で全く調べてないって少しは自覚できるんじゃないかな。
0078nobodyさん03/06/08 18:14ID:???
>>76
スマソ。
>>66は気づかないからヨロシ。
0079nobodyさん03/06/08 18:16ID:???
そもそもスレのレベルが下がり過ぎ。
ここは「Perl初心者」のためのスレだろう。
"努力・常識のかけらも無いアホ"の"質問にすらなっていない独り言"で埋まってしまうのはいかんだろ。
0080nobodyさん03/06/08 18:17ID:???
&jcode::tr(\$FORM{'FROM'}, '#', '#');
if($FORM{'FROM'} =~ /([^\#]*)\#(.+)/){
my $main_message = $1;
my $handle_pass = $2;
my $change_salt = substr($handle_pass, , 1) . "H";
$handle_pass = substr(crypt($handle_pass, $change_salt), -8);

if($main_message ne ""){
$FORM{'FROM'} = "$main_message </b>◆$handle_pass <b>";
}else{
$FORM{'FROM'} = "</b> ◆$handle_pass <b>";
}
}
0081nobodyさん03/06/08 18:18ID:???
>>80
がんがるなよ。
0082nobodyさん03/06/08 18:20ID:???
$nameに#aiusiauがあるとする
$sharp = index($name);
$sharp++:
$trip = substr($name,$sharp);

ではダメ?
無駄が多い?
00838203/06/08 18:22ID:???
ミスった。

$sharp = index("$name","#");
$trip = substr($name,$sharp++)
これでいいや;
0084nobodyさん03/06/08 18:25ID:???
なんで++するの?前置インクリメントならわかるけど。
00858203/06/08 18:27ID:???
>>84
ぇ?indexは1文字目を0から、substrは1文字目を1とするから足す必要あると思うんだけど、、、
てか、実際これでやってる
0086nobodyさん03/06/08 18:29ID:???
>>85
$i=0;
$j=$i++;
としたとき、$iは1になるけど$j=0になることは知っているよね?
もちろんそれでいいならいいんだけど。ただ、あとで$sharpを使わなければ意味ないなぁと思って。
0087nobodyさん03/06/08 18:33ID:???
>substrは1文字目を1とするから
0088nobodyさん03/06/08 18:40ID:???
#の次からを取り出すわけだから+1は必要だと思うけど、特に$[をいじっていなければsubstrは一文字目は0。
00898203/06/08 18:43ID:???
あぁ、そうだった。
次からとるから+1だったな
0090nobodyさん03/06/08 18:45ID:???
>>89
実際これでやってる ってホント?
0091nobodyさん03/06/08 18:50ID:???
if(($sharp = index($name,'#')>=0){
$trip = substr($name,$sharp+1);
#ここでトリップ生成
}
0092nobodyさん03/06/08 18:52ID:???
>>91
そりゃできるだろ。
if(($sharp = index($name,'#')>=0){
$trip = substr($name,$sharp++);
#ここでトリップ生成
}
では動かんよ。
0093nobodyさん03/06/08 18:53ID:???
>>92
括弧の対応があわないね(汗

if(($sharp = index($name,'#'))>=0){
$trip = substr($name,$sharp+1);
#ここでトリップ生成
}
00948203/06/08 19:02ID:???
>>90
カウンターとかで使ってるよ
0095nobodyさん03/06/08 19:06ID:???
へんなふうに書くなぁ・・・
0096nobodyさん03/06/08 19:40ID:???
>>93>>94
あ、いや、そういうことじゃない。
$trip = substr($name,$sharp+1);

$trip = substr($name,$sharp++);
だと動かんでしょ?って>>82に言いたかった。
00978203/06/08 20:39ID:???
>>96
それはわかってる。
=でつなぐと、後に++したら、足す前の値を代入するからだろ?
0098nobodyさん03/06/08 20:40ID:???
>>97
は?・・・>>83
00998203/06/08 20:43ID:???
>>98
ぃやぃや、こちらこそ「は?」
なにを指してるんだこいつは
0100nobodyさん03/06/08 20:51ID:???
>>99
え?・・・>>83は君が書いたんじゃないの?
0101ラヴ03/06/08 21:07ID:Sf/nGZf1
#/usr/local/perl
#学籍番号
#氏名
print(" a =?");
chomp( $a = <STDIN>);
print("演算子?");
chomp( $op = <STDIN> );
print(" b = ?");
chomp( $b=<STDIN> );

if($op eq '+') {
$c=$a + $b;
print (" $a + $b = $c\n");
} else {
if($op eq '-'){
$c=$a - $b;
print ("$a - $b = $c\n");
} else {
if($op eq '*'){
$c = $a * $b;
print ("$a * $b = $c\n");
} else {
if($op eq '/'){
$c = $a / $b;
print ("$a / $b = $c\n");
}
}
}
}
のフローチャートはどうやって書いたらいいのでしょう??
0102無料動画直リン03/06/08 21:10ID:+3TQ1ee9
http://homepage.mac.com/norika27/
0103nobodyさん03/06/08 21:19ID:???
>>101
本よめ。つか、いまどきなんでそんな原始時代のことをしてるのか。
01048203/06/08 21:19ID:???
>>100
書いたけど、、、

>は?・・・
ってのはどういうこと?
0105nobodyさん03/06/08 21:21ID:???
>>101
なんだその分岐文は・・・
0106nobodyさん03/06/08 21:50ID:???
>>105
分岐文って何だ? 三項演算子なら知ってるが。
0107nobodyさん03/06/08 22:02ID:???
>>101
ifelseをつかいなさい
0108nobodyさん03/06/08 22:05ID:???
どうせ本7だろ。放置放置。

>>80
> &jcode::tr(\$FORM{'FROM'}, '#', '#');

Jcode.pm に入れ替えたらエラーになた。(s/jcode/Jcode/g したあと)
でも、Parse したときに、Shift_JISに変えているんだから、
s/#/#/g; にしちゃった。
0109nobodyさん03/06/08 22:09ID:???
日本語が文字化けをするのですが
どうすればいいでしょうか?
英数なら大丈夫です。
0110nobodyさん03/06/08 22:15ID:???
( ´_ゝ`)ツーン
0111nobodyさん03/06/08 22:19ID:???
>>104
>>83は合ってるのか?
01128203/06/08 22:20ID:???
>>111
あってるよ
0113nobodyさん03/06/08 22:23ID:???
>>109
超超超特別サービスでおまいに説教を送ってやろう。
普通は叩かれるだけなのに説教を貰えるとは幸せと思え。

@まずどうやって生成した文字列なのか。
どのような過程を通り、どう言ったアプリケーションで文字列に直しているのか書くべきである。

A
>1:自分はこう言う事がしたい。
>2:それでこんな風にやってみたが・・・
>3:それだとこんなエラーが出て上手く行かなかった。
さらにこのスレのルールとして以上の事を書かねばならない。

B
これ決定的。
スレ違いだから他に行って下さい。
記述やコーティングのスレだから。
0114nobodyさん03/06/08 22:24ID:???
>>113
>普通は叩かれるだけ
普通は無視で流れてくだけだよ
0115nobodyさん03/06/08 22:25ID:???
>>89って言ってるけど全然分かってないじゃん。
>>83-86もっかい読んでみ。
01168203/06/08 22:30ID:???
>>115
わかってるから
0117nobodyさん03/06/08 22:33ID:???
>>116
じゃあ、

>>112
> >>111
> あってるよ

合ってないのになんでそういうこと言うの?
$name = "hoge#hage";
$sharp = index("$name","#");
$trip = substr($name,$sharp++) ;
print $trip,"\n";



$name = "hoge#hage";
$sharp = index("$name","#");
$trip = substr($name,++$sharp) ;
print $trip,"\n";

の結果比べてご覧。
#なんで切れ気味なの?
01188203/06/08 22:34ID:???
アヒャーン。
違うねぇ、スマン、見間違えてた
0119nobodyさん03/06/09 02:42ID:KAhSj8Gh
日時の取得なのですが、

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$month = ($mon + 1);
if ($sec < 10) { $sec = "0$sec"; }
if ($min < 10) { $min = "0$min"; }
if ($hour < 10) { $hour = "0$hour"; }
if ($mday < 10) { $mday = "0$mday"; }
if ($month < 10) { $month = "0$month"; }
$date = "$month/$mday/$year $hour\:$min\:$sec";

これで実行すると、2003年が103年となってしまいます。
2003年に正しく修正するにはどうしたらいいでしょうか?
0120_03/06/09 02:54ID:???
http://yomi.kakiko.com/hiroyuki/jaz_b01.html
0121nobodyさん03/06/09 02:58ID:???
それやらなくてもなると思うよ。
0122nobodyさん03/06/09 03:01ID:???
初心者のオレにも答えられそうな質問だ。

>>119
2003って表示させたいなら
$year += 1900;

下二桁「03」って表示させたいなら
$year = sprintf("%02d",$year%100);

を追加すればいいんでね?
0123nobodyさん03/06/09 03:09ID:???
>>119
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
の$yearは1900年からの経過年数
0124nobodyさん03/06/09 11:48ID:s9oH3tCT
すみません。
jcode.plを使っていて
WARNING: UtfToLocal: could not convert UTF-8 (0xd6a5). Ignored
というようなエラーが出た方はいらっしゃいませんか?

特にUTFは使っていないのに、必ず出てきてエラーになってしまいます。
ファイルはshift_jisで、それを読み込んでeucに変換しているのですが・・
このエラーはネットで探しても見つからないので
ご存知の方がいらっしゃいましたらよろしくお願いします。

0125nobodyさん03/06/09 12:41ID:???
utftolocalで検索するとjdbcがヒットするのだけど、そういうのを使ってない?
0126nobodyさん03/06/09 12:42ID:???
>>124
jcode.plにはUtoToLocalなどない。つまり、お前は決定的に何か間違っている。
012712403/06/09 12:54ID:s9oH3tCT
すみません。解析した結果、
DBとのコネクト時のことだったみたいです。
申し訳ありありませんでした。
jcode.plにも、そのメソッドを検索して、存在しないから
内部的なものかとおもっていました。

Posgresqlに文字コードをEUCを指定して接続する方法はあるのでしょうか?
DBIを使っています。

interbaseのibperlを使っていた頃は、Charsetでできたのですが・・
0128無料動画直リン03/06/09 13:10ID:GjkKVS2A
http://homepage.mac.com/norika27/
0129nobodyさん03/06/09 13:45ID:???
>>127
スレ違いにつき、お引き取りください。
0130nobodyさん03/06/09 14:01ID:QAgTJ6O8
いつでも激安

安心して24時間お買い物ができる!
セルビデオ店が近くにないお客様も気軽にお買い物を楽しめます。
http://www.net-de-dvd.com/
安心確実

お支払は安心の代金引換です
振り込んだのに商品が届かない等
の心配は無用!
http://www.net-de-dvd.com/
0131nobodyさん03/06/09 19:15ID:???
正規表現の最長マッチと最短マッチで同じ結果が得られることが明らかな場合、
どちらを使用した方が、処理速度・負荷の面で有利なのでしょうか?
0132nobodyさん03/06/09 19:26ID:???
正規表現は「マッチしない」時にどっちが手っ取り早く記述を抜けれるか考えるのがミソ

0133nobodyさん03/06/09 20:52ID:???
$ImageDir = "../image/photo/";
$in{id} = 8;
$in{file1name} = "hoge.jpg";
$in{file1name} = "fuga.jpg"
rename($ImageDir.$in{file1name}, $ImageDir."photo1_id".$in{id}."jpg");
rename($ImageDir.$in{file2name}, $ImageDir."photo2_id".$in{id}."jpg");
とやっても、renameされません。

パス付きファイル名をrenameに渡してもダメなのでしょうか?
だとしたら、同じことを実現するにはどうすればいいのでしょうか?
0134nobodyさん03/06/09 21:32ID:???
パス付きでもいけるはず。
・ フィアル名が正確かどうかprintで出力して確認
・ エラーがあれば、エラー内容を出力

エラー内容は$!に入ってるので、
rename $file1,$file2 or die "rename Error : $!"; で見てみればいい。
0135nobodyさん03/06/09 23:23ID:???
>>134
あ、renameでもor dieできるのですね。。。
そっか、openのときしか使ったことなかったです。さんくすです。
0136nobodyさん03/06/10 02:08ID:0JHS1DHo
1バイトとかバイト単位ではなく、1文字という文字単位で抜き取る関数はありますか?
半角カナとかの1バイト文字と、1バイト文字も含めた全ての文字列との比較させて、その結果によって処理を振り分けるスクリプトを作りたいんで。
ちょっと説明が難しいんですが、知ってる方いたら教えて下さい。
substrではダメなんです。
0137nobodyさん03/06/10 03:04ID:???
>>136
2バイトも一文字として認識してほしいって事?
そんな関数ないっぽいです。
モジュールなら、どこかにあるかも。

極論で言わせてもらえば、jperl使えって事になってくるかな。
0138nobodyさん03/06/10 03:07ID:???
それは極論なんだろうか
0139nobodyさん03/06/10 03:16ID:???
>>138
たぶん極論・・・
って言うか、俺的に極論かな・・・?

日本語文字列で問題がおきてる。

jperl使え。 終了。

これが、黄金パータンでしょ?(w
0140nobodyさん03/06/10 07:44ID:???
>>136
sjisじゃできんが(2バイト文字と1バイト文字が重複する)、eucならできる。
perlメモの「日本語を扱う」に書いてある。がいしゅつ
0141nobodyさん03/06/10 09:10ID:???
1:CGI::Sessionモジュールを使ってセッション管理をしてみたい

2:CGI::Sessionモジュールを試用してテスト中、
クライアントからセッションIDを取得できなかった場合のテストをやってみたら...

3:サーバにセッション情報を保持したファイルが残って、更新されることも消えることもなかった。

該当のセッションを使用してのアクセスがないので更新されないのはあたりまえなのですが、
もう使われることのないセッション情報を消す管理用メソッドとかないのでしょうか。
0142nobodyさん03/06/10 14:45ID:H1NA4Acv
$ORG[0] = {
"person" => "tanaka",
"adana" => "tanachan",
"adanaid" => 5,
};
$ORG[1] = {
"person" => "takada",
"adana" => "takachan",
"adanaid" => 2,
};
$ORG[2] = {
"person" => "imai",
"adana" => "imachan",
"adanaid" => 3,
};
@tmp = sort { (${ORG[$a]->{adanaid}} <=> ${ORG[$b]->{adanaid}}) } 0 .. $#ORG;
foreach (@tmp) {
print 'person='. $ORG[$_]->{person}. "\n";
print 'adana='. $ORG[$_]->{adana}. "\n";
print 'adanaid='. $ORG[$_]->{adanaid}. "\n";
}
はわかるのですが(以前こちらで教えていただいたのですが)
そうではなく、@ORGを、${ORG[?]->{adanaid}}でソートした結果を、
再び@ORGとして得るにはどうすればいいのでしょうか?
(ただし、一個一個person、adana、adanaid などとせずに。。。実際は項目が多いもので)
foreach my $key (keys %{$ORG[0]}){
\$ORG[0]->{$key}
}
↑この辺をどうにかするよな気がするのですが・・・

0143nobodyさん03/06/10 15:16ID:???
>>142
よくわかんないけど、こんな感じ?

@tmp = sort { (${ORG[$a]->{adanaid}} <=> ${ORG[$b]->{adanaid}}) } 0 .. $#ORG;
foreach (@tmp) { push(@temp,$ORG[$_]); }
foreach (@temp){
 while(($i,$j) = each(%$_)){
  print qq|$i = $j\n|;
 }
}
014414203/06/10 15:42ID:???
>>143
ありがとう、できますた!
0145nobodyさん03/06/10 18:37ID:???
解凍してコピーだけで使えるXMLパーサモジュール教えてください。
XML::Parser::Liteで読めるようになったけど書き込めない・・・。
0146通行人さん@無名タレント03/06/10 18:53ID:???
@ORG = sort { $a->{ adanaid } <=> $b->{ adanaid} } @ORG;
foreach my $man(@ORG){

#print_man
foreach my $atti(keys %{ $man }){
print $atti, ' => ' ,$man->{ $atti }, "\n";
}
print "\n";
}

0147nobodyさん03/06/10 20:01ID:???
>>139
jperl 使うぐらいなら Perl 5.8.0 使え。
0148nobodyさん03/06/10 20:13ID:???
表示部分だけ

foreach my $person (@ORG) {
 foreach my $attr (sort keys %$person) {
  print $attr, ' => ', $person->{$attr}, "\n";
 }

 print "\n";
}
0149nobodyさん03/06/10 23:10ID:???
Perlでつくったプログラムをexeファイルにして誰でも使えるようにできますか?
0150nobodyさん03/06/10 23:15ID:???
 (-_- ) ……
  (∞ )  …出来ないんじゃないか?
   | |
0151nobodyさん03/06/10 23:46ID:???
>>149
perlcc
0152nobodyさん03/06/11 01:07ID:b6wCYV2G
糞な質問で申し訳ありません。

subInputPage {
print "Content-type: text/html; charset='Shift_JIS'\n\n";
$fname = $FORM{'name'};
print <<END;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html><body>
<strong>$fname</strong>さん<br>
</body></html>
END
}

subResultPage {
print "Content-type: text/html; charset='Shift_JIS'\n\n";
print <<END;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head><title>名前入力</title></head>
<body>
<strong>$fname</strong>さん
</body></html>
END
}

↑ResultPage内の $fname が空になってしまうのですが、
InputPage内の $fname に格納したもの(これは表示される)を
ResultPageの中の $fname に受け継がれるようにするには
どうしたらいいのですか?
0153無料動画直リン03/06/11 01:10ID:xrcrQEEf
http://homepage.mac.com/norika27/
0154nobodyさん03/06/11 01:19ID:???
>>149
http://www.indigostar.com/perl2exe.htm
>>152
表示されるよ?
ちなみにsubの後にスペースが無いのは関係ないよね?
0155nobodyさん03/06/11 01:20ID:???
>>154
if (...) {
  &InputPage;
} else {
  &ResultPage;
}
ってやってんだろ。
0156nobodyさん03/06/11 01:34ID:b6wCYV2G
早速答えていただいてありがとうございます。

>>154
subは関係ないです。

>>155
全くその通りです。

if($FORM{'mode'} eq 'enter') {
InputPage();
}
elsif($FORM{'mode'} eq 'result'){
ResultPage();
}
ってやってます。
どうやったら表示されるようになりますか?
0157nobodyさん03/06/11 01:58ID:???
>>151
ActivePerlのperlccはエラーコード吐いて意味なし。
0158nobodyさん03/06/11 02:04ID:???
Cコンパイラを用意していないだけだったりして。
0159nobodyさん03/06/11 02:04ID:???
>>156
そのif分岐の前に $fname を設定しなきゃダメだよ(´・ω・`)マジデ マジデ
0160nobodyさん03/06/11 02:07ID:???
>>158
Cコンパイラを用意しないといけないんですか・・・。

どうやってやるんですか?
0161nobodyさん03/06/11 02:09ID:???
bcc
016215203/06/11 02:10ID:b6wCYV2G
>>159
たびたびすいません、ネタじゃなくてまじわからんです。

$fname = '名無し';
if($FORM{'mode'} eq 'enter') {
InputPage();
}
elsif($FORM{'mode'} eq 'result'){
ResultPage();
}

これだと$fnameに「名無し」がはいちゃうし・・
0163nobodyさん03/06/11 02:14ID:???
>>152
myやlocalをつけなければグローバルになるはずだから、そのままでも受け継がれるはずだけど・・・
サブルーティンを呼び出す順番は正しい?
0164nobodyさん03/06/11 02:15ID:???
>>162
入っちゃいけないの?(´・ω・`)
そういう風に自分で設定してるんだよ(´・ω・`)マジデ マジデ

$fname = $FORM{'name'};
if($FORM{'mode'} eq 'enter') {
 InputPage();
}
elsif($FORM{'mode'} eq 'result'){
 ResultPage();
}

これじゃだめなの?(´・ω・`)
0165nobodyさん03/06/11 02:18ID:???
if-elsifじゃそのどちらかしか呼ばれないだろ。
0166nobodyさん03/06/11 02:22ID:???
両方ともこうやっちゃえ

<strong>$FORM{'name'}</strong>さん<br>
0167nobodyさん03/06/11 02:29ID:???
ResultPage()の中で$fname=$FORM{'name'};とやればいいと思うんだけど。
InputPage()とResultPage()は一度に両方とも呼ばれることはないんでしょう?
016815203/06/11 02:42ID:b6wCYV2G
みなさんレスありがとうです。正直こんなに親切にレスしてもらえると思ってなかったので(笑
感激しております。

if($FORM{'mode'} eq 'enter') {
InputPage();
}
elsif($FORM{'mode'} eq 'result'){
ResultPage();
}
else {
EntryPage();
}
exit;

EntryPage()のフォームで読み込んだものをInputPage()で表示し、
その後、InputPage()でボタンを押すと、ResultPage()に移って表示
って感じなんです。
やっぱり表示されないです・・・
何かうまい方法ないですかねぇ
■ このスレッドは過去ログ倉庫に格納されています