トップページ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
0042nobodyさん03/06/08 14:27ID:???
<や>がHTMLでは何を意味するのか考えれば分かると思うけど
0043nobodyさん03/06/08 14:27ID:???
>>41
ミス &ampは&
0044nobodyさん03/06/08 14:29ID:???
あぁそっか。
htmlで<などを表示するときに>などを使うから、
タグではなくなるってことか。。。
0045nobodyさん03/06/08 14:33ID:???
>>44
いままで理解してなかったのか。場亀。
0046nobodyさん03/06/08 14:34ID:???
$_ =~ s/</</g;
$_ =~ s/>/>/g;
$_ =~ s/&/&/g;
$_ =~ s/"/"/g;

なんで、これでできない・・・・・・
ダブルクォーテーションとアンドはできるのに・・・
0047nobodyさん03/06/08 14:37ID:???
&をさきにエスケープしなければだめだろ。
前の処理で&lt;にしたものが(ry
0048nobodyさん03/06/08 14:37ID:???
実体参照ネタは相変わらずめちゃくちゃになるなぁ。
ちゃんと書けないんなら全角にでもしとけ。
0049nobodyさん03/06/08 14:38ID:???
>>38の最終行にぴったりの質問が来ました。

超・初心者な質問だから他へ・・・と思ったらここが初心者スレだった罠。
でも、もう少し頭を使ってくれよ
0050nobodyさん03/06/08 14:39ID:???
>>47
そうでした。
ありがとうございます
0051nobodyさん03/06/08 14:41ID:vz1j93aY
質問です。
WinXP HOME EDITION(←スペルちがってたらすいません)でアクティブパール5.8なんですが、
unlink(<*.txt>)でうまくいかないんですが、Winだからですか?
0052nobodyさん03/06/08 14:41ID:???
foreach( <FILE> ){

# タグを特殊記号に変換
$_ =~ s/&/&amp;/g;
$_ =~ s/</&lt;/g;
$_ =~ s/>/&gt;/g;
$_ =~ s/"/&quot;/g;
print;
}

こんなんでできました。
下3つの順番はどうでもいいですよね?
0053nobodyさん03/06/08 14:43ID:???
unlink(<*.txt>)

こう書くとワイルドカードが使えるようになるの?
0054nobodyさん03/06/08 14:43ID:???
>>51
()いらない
00555303/06/08 14:44ID:???
らくだに書いてあったか。
00565103/06/08 14:45ID:???
>>54
書いたらだめなんか?()
消しても結果は同じだった。消えない・・・。
0057nobodyさん03/06/08 14:47ID:???
>>56
unlink <*>
やってみて
てか、;忘れてるなんてないよね?
00585303/06/08 14:50ID:???
Windows2000ではできたぞ。
00595103/06/08 14:51ID:???
>>57
フォルダが読み取り専用になってた。
でも、みてみたら、どのフォルダも(PC内)読み取り専用だった・・・。
しかも、解除できない。関係ある?
0060nobodyさん03/06/08 14:54ID:???
読みとり専用でも消せるけど・・・
0061nobodyさん03/06/08 15:03ID:???
>>59
うまくいかないときは「どううまくいかないのか」を書いてくれ。
00626103/06/08 15:05ID:???
ああ、消えないのか……
スクリプトは削除対象のファイルと同じディレクトリで実行させてるよね?
00635103/06/08 15:08ID:???
>>62
ありがとう。
すごくあふぉなことやってた。↓の階層にファイルあるのに消そうとがんばってた。
消す前に、chdirで移動したら消せた。
お騒がせしてすみませんでした。
0064直リン03/06/08 15:10ID:+3TQ1ee9
http://homepage.mac.com/yuuka20/
0065nobodyさん03/06/08 15:10ID:???
0066nobodyさん03/06/08 17:40ID:???
2chのトリップみたいのを付けたいです。
名前#123
↑で123だけ抜き出す方法が知りたいです。
0067nobodyさん03/06/08 17:54ID:???
あのさ。
ここはなんで調べもしないで来る人が多いのか?

初心者だから分からない、ではなくて調べてないから分からない。
って質問ばっかりだぞ。
00685103/06/08 17:55ID:???
>>66
my($name,$trip) = split(/#/, $name);
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:サーバにセッション情報を保持したファイルが残って、更新されることも消えることもなかった。

該当のセッションを使用してのアクセスがないので更新されないのはあたりまえなのですが、
もう使われることのないセッション情報を消す管理用メソッドとかないのでしょうか。
■ このスレッドは過去ログ倉庫に格納されています