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

Perl コーディング初心者質問コーナー Part35

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/05/26 16:48ID:kkhhiYmo
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

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

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

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0756nobodyさん04/07/05 00:49ID:???
>>755
> ここを調べろ、ここは確認したのかなどのご指摘ありましたらよろしくお願いします。
>>1は読んだか?
0757nobodyさん04/07/05 00:59ID:???
>>755
Perlと何の関係が?
075875504/07/05 03:14ID:???
レスありがとうございます。
>>756さんの言うとおりもう一度1を読み返してみます。
>>757
私はてっきりperlスレで質問する内容だと思ったのですが
ご指摘いただいたので違う方向からも再度考えさせてもらいます。
ありがとうございました。
0759nobodyさん04/07/05 04:03ID:???
プロセスを常駐させるにはどんな関数やモジュールを使えばいいでしょうか?
fork関数を使えば良いですか?
0760nobodyさん04/07/05 06:29ID:???
皆さんは入力文字列をエスケープする際にどのような処理をしてますか?

自分はこんな感じです
/&/&/
/\"/"/
/\'/?/
/</</
/>/>/
/\s/ /
/\r\n/<br>/
/\r/<br>/
/\n/<br>/

他に
こんな文字も危険、この文字はこれに置換がいい的なアドバイスもOK
0761nobodyさん04/07/05 06:30ID:???
↑ 消えたので&を&にして書き直しました

/&/&amp;/
/\"/&quot;/
/\'/&#39/
/</&lt;/
/>/&gt;/
/\s/&nbsp;/
/\r\n/<br>/
/\r/<br>/
/\n/<br>/
0762nobodyさん04/07/05 06:48ID:???
Perlのコーディングの話が少ないな。
0763nobodyさん04/07/05 10:32ID:???
この板の住人の大半は
1. コーディング以前の箇所で躓いている
2. 自分の抱える問題がコーディングの問題なのかどうかを切り分けできない
3. そもそもコーディングという言葉の意味を知らない
のいずれかだから。
たぶんこのスレも「Perlを使ったCGIに関する質問ならなんでもOK」だと思われてる
0764nobodyさん04/07/05 10:59ID:???
なるほど、
スレタイ嫁
だけじゃ通じなくなってきたワケだな。
0765nobodyさん04/07/05 15:04ID:???
どーでもいいけど此処って初心者と中級者しかいないね
0766nobodyさん04/07/05 15:19ID:???
無意味なレスをつける>>765はスレタイも空気も読めない初心者
0767nobodyさん04/07/05 15:40ID:???
>>760
s/[\0-\0377]//g;
0768nobodyさん04/07/05 16:48ID:kgB0NkdW
除算の繰上げってどのようにします?


### 除算の繰上げ
$a = 10;
$b = 3;

$c = $a % $b;
$d = int($a / $b);
if($c){$d++;}


いつもこんな感じですが
なんか、もっさりしてます。
スマートにコーディングしたものですが・・・。
0769nobodyさん04/07/05 18:12ID:???
$a = 10;
$b = 3;
$d = int(($a + $b - 1) / $b);
0770nobodyさん04/07/05 23:09ID:???
>>766
空気読めないのお前じゃん。放置しろよ
0771nobodyさん04/07/05 23:29ID:???
粘着ねぇ・・・
0772nobodyさん04/07/06 00:04ID:Xk4rbtY7
perlの ImageMagickを使って画像のexif情報を削除して
ファイルサイズを小さくしたいのですが、できません。

ググってみたところ

$image->Strip();

で削除できるという記述をみたのですが、同じようにやっても
画像が表示できなくなります。

どうやればexif情報だけすっぱり消せるかご存知の方は
いらっしゃいませんでしょうか?
0773nobodyさん04/07/06 02:32ID:???
有効期限が1時間のcookieを焼きたい。
cookieのexpiresに使える形式の時間の取得って、
gmtime time
だと全て数字だから微妙に違うよね。

cookie用に使える形式にするのに自分でルーチンを作ろうかなとか思ってるけど、
既存のモジュールで、こういうメソッドもってるやつないのかな?
0774nobodyさん04/07/06 02:52ID:???
>>773
http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI/Cookie.pod
0775nobodyさん04/07/06 04:13ID:???
>>772
http://cachu.xrea.jp/perl/
0776nobodyさん04/07/06 04:29ID:???
>>772
I believe Strip() first showed up in ImageMagick 5.5.7.
0777nobodyさん04/07/06 08:08ID:???
10/3で出た答えが整数なら真、小数点が付くなら偽を返す条件式を書きたいんですが、
PERLでは引数が整数であるか、少数点つきの数字であるかを判定してくれる関数はないのでしょうか?

0778nobodyさん04/07/06 08:45ID:???
>>777
馬鹿たれ
0779nobodyさん04/07/06 09:39ID:???
>>777
10 % 3
0780nobodyさん04/07/06 10:23ID:???
$answer = 10 / 3;
print "ぎーーーーーーーーーーーーーーーーーーーーーーーっ" if not $answer - int $answer;
0781777=77304/07/06 10:33ID:???
>>778-779ありがと。
>>774
なんかムダなソースを読みこんで重くしたくないから、自分で作ってみた。
野暮ったいソースだから、見にくいけど、色々突っ込んでくれるとありがたい。
とりあえず2時間後のGMTを計算するサブルーチン。

ifのとこは上から
処理1.何も繰り上がらず2時間だけプラス
処理2.日、曜、時刻だけ繰り上がり
処理3.処理2+月も繰り上がり
処理4.処理3+年も繰り上がり

一応うるう年は4で割り切れるって部分だけは採用してる。100年とか400年とかは
どうせ生きてないから無視した。
0782777=77304/07/06 10:39ID:???
sub ti{
( my $sec , my $min , my $hour , my $mday , my $mon , my $year , my $wday , my $isdat , my $yday ) = gmtime time;
$year += 1900;
my @wday = qw/Sun Mon Tue Wen Thu Fri Sat Sun/;
my @mon = qw/Jan Feb Mar Apr May Jun Jul Aus Sep Oct Nov Dec Jan/;
my @a = qw/31 28 31 30 31 30 31 31 30 31 30 31/;
if ( !($year % 4) ) { $a[1] += 1 ; }
my @b = qw/00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60/;
my $timer;
if ( $hour < 22 ) {
          $hour += 2;
          $timer = qq|$wday[$wday], $mday-$mon[$mon]-$year $b[$hour]:$b[$min]:$b[$sec] GMT|;
} elsif ( $a[$mon] != $wday ) {
          $hour -= 22;
          $wday += 1;
          $mday += 1;
          $timer = qq|$wday[$wday], $mday-$mon[$mon]-$year $b[$hour]:$b[$min]:$b[$sec] GMT|;
} elsif ( $mon != 11 ) {
          $hour -= 22;
          $wday += 1;
          $mday -= $a[$mon];
          $mon += 1;
          $timer = qq|$wday[$wday], $mday-$mon[$mon]-$year $b[$hour]:$b[$min]:$b[$sec] GMT|;
} else {
          $hour -= 22;
          $wday += 1;
          $mday -= $a[$mon];
          $mon += 1;
          $year += 1;
          $timer = qq|$wday[$wday], $mday-$mon[$mon]-$year $b[$hour]:$b[$min]:$b[$sec] GMT|;
}return $timer;}
0783nobodyさん04/07/06 10:41ID:???
お前ら今はサイバーノーガードの時代ですよ。
cookieの有効期限はリミットの2030付近にするのがナウイですよ。
0784nobodyさん04/07/06 10:52ID:???
>>782
いちいち繰り上がり計算しなくても、gmtime(time+7200)でいいような気が...
078577704/07/06 10:53ID:???
$mday -= $a[$mon];
のところは
$mday -= $a[$mon] -1;
だった。
078677704/07/06 10:56ID:???
>>784
うおーーーーーーーーーーーーーーーーーーーーーーー!?
0787nobodyさん04/07/06 12:22ID:???
重くしたくないと言って無駄なコードを書くやつは(ry
0788nobodyさん04/07/06 13:40ID:DU8HZvls
list.txt
abc:123
aiu:456

1.
open(IN, "list.txt");
while (<IN>) { print; }
close(IN);

2.
open(IN, "list.txt");
while (<IN>) {
$tmp = <IN>;
print "$tmp<br>\n";
}
close(IN)


1.だと abc:123 aiu:456 と出力されるのに
2.だと abc:123 としか出力されないのはどうしてでしょうか、、?
0789nobodyさん04/07/06 13:51ID:???
>>788
aiu:456だけ表示されるというのならわかるんだけどなぁ。abc:123だけ表示される
のはかなり不思議だ。
0790nobodyさん04/07/06 13:51ID:???
>>788
もう一回勉強して来い
0791nobodyさん04/07/06 13:57ID:DU8HZvls
>>789
すいません、aiu:456 としか出力されない の間違いでした・・・
0792nobodyさん04/07/06 15:02ID:DU8HZvls
色々調べたのですが、何が駄目なのか良くわからないのですが、、、

open(IN, "list.txt");
while (<IN>) { 処理 }

データを1行単位で読み込み、データのある行が存在する間は while文で繰り返す
という意味ではないのでしょうか、、、?
0793nobodyさん04/07/06 15:11ID:???
while (<IN>) { # ここで list.txt の一行目が読み込まれる
$tmp = <IN>; # ここで list.txt の二行目が読み込まれる
print "$tmp<br>\n" # 当然 $tmp の中には二行目しか入っていない
0794nobodyさん04/07/06 15:37ID:DU8HZvls
そうだったのですか!!
<IN>で取得したものは$_ に代入されるのですね。
本当に助かりました。有難うございます。
0795nobodyさん04/07/06 15:44ID:???
>>794
# 何だか表現が微妙に気になる…。

1: abc:123
2: aiu:456
3: abc:123
4: aiu:456
5: abc:123

ファイルの中身をこの5行にして、実験してみるのもいいかも。
0796nobodyさん04/07/06 15:49ID:???
重ね重ね有難うございます。
早速100行くらいにして試しています。
0797nobodyさん04/07/06 18:37ID:???
$tmp .= $_;
っでねが?
0798nobodyさん04/07/06 19:05ID:???
>>797
大丈夫か?(w
0799nobodyさん04/07/07 00:38ID:???
>>798
ループ抜けてからプリント。
0800nobodyさん04/07/07 03:31ID:???
>>799
何の為だ?
0801nobodyさん04/07/07 03:43ID:Dj0xztEm
非常に初歩的な質問なのですが、
受け取った変数を自動的に
別ファイルへ渡す処理はどうやってすればいいのでしょうか?
(フォームを使えば変数を渡せるけど、
自動的には不可能ですよね?)

ヒントでもいいので教えてくだせえ
0802nobodyさん04/07/07 05:27ID:???
>>801
あとはサーバー側のファイルに記録するくらいじゃないだろうか。
phpならその「自動的」ってのに近いと思う。
0803nobodyさん04/07/07 11:11ID:???
cgiで受け取ったパラメータをハッシュで取り出したいんですが、
use CGI;
$q = CGI->new;
$hash = $q->Vars;
print $hash;
としたら
HASH(0x8158408)と表示されます。
%hash = $q->Vars;
だとeachなどを使ってもキーなどが出てきません。
色々と検索をするのですが、どうして良いものか解からなくなってきたので
どなたか良い方法を教えて下さい。

いちおう、下記のサイトは見たのですが上手く目的のことができませんでした。

簡単なCGI
http://member.nifty.ne.jp/hippo2000/perltips/Cgi.htm#FETCHING_A_LIST_OF_KEYWORDS_FROM
080480304/07/07 11:20ID:???
すみません。
自分で色々と勘違いをしていました。
自己解決しました。
0805nobodyさん04/07/07 12:12ID:lnfuZW7X
ある関数の中で require でファイルを取り込んでから
その関数を抜けたときって
require したファイルの内容は有効なんでしょうか?
0806nobodyさん04/07/07 12:37ID:???
>>805
有効。
何故試してみない?
0807nobodyさん04/07/07 15:17ID:???
>>798
頭大丈夫か?
0808nobodyさん04/07/07 16:04ID:???
>>807
797は明らかに間違ってるだろ?バカか?
0809nobodyさん04/07/07 16:32ID:???
list.txt
1: abc:123
2: aiu:456
3: abc:123
4: aiu:456
5: abc:123


open(IN, "list.txt");
while (<IN>) {
$tmp .= $_;
}
print "$tmp\n";
0810nobodyさん04/07/07 16:44ID:???
>>808
痛いからもういいよ
0811nobodyさん04/07/07 16:46ID:???
>>809

open(IN, "list.txt");
while ($tmp = <IN>) {
print "$tmp<br>\n";
}
close(IN)

暗黙の$_使うか明示的に一時変数$tmpを使うか、だけの違いだろ。

>>808
間違ってるよね
0812nobodyさん04/07/07 16:52ID:???
>>811
馴れ合うな、キモイ
お前は解答さえしてればいんだよカス
0813nobodyさん04/07/07 17:04ID:???
なんか俺の質問のせいで荒れ気味ですか!?
0814nobodyさん04/07/07 17:42ID:???
そうです
081580104/07/07 17:54ID:Dj0xztEm
まじっすか!?
この方法、他にないんでしょうか?
0816nobodyさん04/07/07 18:03ID:???
>>815
質問が意味不明だから回答が得られないんだよ
0817nobodyさん04/07/07 18:12ID:???
うん、意味不明
081880104/07/07 18:17ID:Dj0xztEm
要約すると、フォームでボタンをクリックして
変数を送る部分を、
クリックしなくても変数を送れるようにしたいんです。
意味分かりますかね?perlの超町長初心者なんで勘弁してください。
どうかよろしこです
0819nobodyさん04/07/07 18:36ID:???
>>818
perlの問題じゃないです。
要は【submit】ボタンを押さなくても、submitされるようにしたいって事?
JavaScriptとかで勝手にクエリ送るとかか?
やっぱ、perl関係ないです。
0820nobodyさん04/07/07 18:37ID:???
超町長初心者なら尚更、要約なんかしないで、
ちゃんと持ってるもの全部吐き出してください。
0821黒死犬 ◆EgxBlf8nvc 04/07/07 18:39ID:???
<form action="unko.cfm" name="send">
<input type="hidden" name="Name" value="Value">
</form>
<script language="PerlScript">
$window->document->all->forms->send->submit();
</script>

これで出来んじゃないか(テストしてない)
てか板違い
0822nobodyさん04/07/07 18:42ID:???
>>818
ユーザ側の視点だと「自動的」「クリックしなくても」で済むんだろうけど、
プログラムにとっては「ある条件が満たされたとき」じゃない?
その「ある条件」は、あなたしか知らないわけですよ。

# で、JavaScriptで何かしらのイベント拾うんだろーけど。
0823nobodyさん04/07/07 19:48ID:???
>>818
フォームフィールドへの記入が終わる前に勝手に自動的に
CGIに送信してしまうトンデモscriptでも作るのか?
0824nobodyさん04/07/07 20:13ID:???
>>810
・・・何故お前が皆に叩かれてるのか未だに分かってないのか???
下の二つを実行してみなさい。そして首吊ってください。
# 1
while (<IN>) {
$tmp = $_;
print "$tmp\n";
}
# 2
while (<IN>) {
$tmp .= $_;
print "$tmp\n";
}
0825nobodyさん04/07/07 20:39ID:???
文字列の配列を全部トリミングしたいんだけど

@d = ( " abc ", " bcd ", " cde " );
for($i=0;$i<@d;$i++){ $d[$i] =~ s/^\s*(.*)\s*$/$1/; }

これをもうちょっとスマートに書いてみたいですが
どしたらいい? for文ははずせないのかな
0826黒死犬 ◆EgxBlf8nvc 04/07/07 20:45ID:???
grep(s/^\s*(.*)\s*$/$1/, @d);
0827nobodyさん04/07/07 20:51ID:???
>>826
(゚∀゚)サンクスコ!
grepって痴漢も使っていいんだ。勉強になりました。
0828nobodyさん04/07/07 21:40ID:???
>>824
何で俺にレスしてんの?
しかもみんなって・・・
日本語理解してるか?
ついでいっとくと俺は質問者でも解答者でもない。愉快な煽り厨
0829nobodyさん04/07/07 21:40ID:???
>>824
お前大丈夫か?
どこが叩かれてるんだ?>>810は・・・
レス一つもないじゃん。
まさか勝手に前の人と同じと認定してるとか?
0830nobodyさん04/07/07 21:45ID:???
>>824
>>810氏は誰にも叩かれてないように思えるが・・・
俺のログがおかしいのかな?再取得してみるよ
0831nobodyさん04/07/07 21:46ID:???
824は
>>797=>>807=>>810と認定したんだろう。
0832nobodyさん04/07/07 21:59ID:???
Perlでセッション関数って使えないのでしょうか?
ググっても使用例が見つからなくて困っています。
0833nobodyさん04/07/07 22:09ID:???
はぁ?
もっとググれ
0834nobodyさん04/07/07 23:02ID:???
>>833
http://www.google.co.jp/search?hl=ja&ie=UTF-8&c2coff=1&q=Perl+%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%A2%E6%95%B0&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=
PHPしか出てきませんが・・・
0835nobodyさん04/07/07 23:07ID:???
>>834
ttp://www.google.co.jp/search?q=Perl+-PHP+%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3&ie=UTF-8
( ゚д゚)ポカーン
0836nobodyさん04/07/07 23:09ID:???
>>832
Perlはね、PHPみたいになんでも関数が揃ってはいないのですよ。
モジュールを使うか自分で書くのです。
0837nobodyさん04/07/08 00:41ID:???
まあ use CGI::Session かな
0838nobodyさん04/07/08 03:00ID:???
>>826
<q cite="http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlstyle.html">
戻り値をただ単に捨ててしまうような void 文脈で、grep()やmap()、
`backticks` (訳注: `ls`のようにバッククォートで括った実行文のこと)
を使うことは避けましょう。そういった関数はすべて戻り値を持って
いるのですから、それを使うべきです。戻り値に用がないのであれば、
代わりにforeach()を使ったループか system()関数を使いましょう。
</q>

>>825
s/^\s+//, s/\s+\z// for @d;
0839nobodyさん04/07/08 03:04ID:LQirb/WJ
今日始めてperl触った初心者なのですが
windowsで他のサーバのディレクトリを
ネットワークドライブに割り当て
その中のファイルに対して
-e を実行したらエラーしか返ってきません。
自分のサーバ内なら正常にファイルを検知できたのですが
ネットワークドライブはファイルの検査ができないのでしょうか?

$Path="d:/data/"
$Data="test.dat"

if(-e "$Path$Data")
0840nobodyさん04/07/08 03:04ID:o03xV6ak
読み込んだファイルの中で文字列<HOGE>と一致する(次の)行を検出したいのですが

do $line = <FILE> until (($line eq "<HOGE>") || (eof FILE));

だと$line eq "<HOGE>"がいつまでも真になりません。
$line =~ /<HOGE>/だと真になってくれますが、「含まれる行」ではなく「一致する」行を検出したいのです。
上のやり方だとなぜ出来ないのでしょうか?
0841nobodyさん04/07/08 03:34ID:???
>>840
do { chomp($line = <FILE>) } until $line eq "<HOGE>" || eof FILE;

do { $line = <FILE> } until $line eq "<HOGE>\n" || eof FILE;
0842nobodyさん04/07/08 03:38ID:???
アンカー使えばいいじゃん。
$line =~ /^<HOGE>$/
084384004/07/08 04:02ID:???
>>841-842
回答ありがとうございます。しかしそれでも解決しませんでした・・・

がその後自己解決しました。
アップロード時の文字コード変換が原因で認識しなかったようです。
# 最近HDが吹っ飛んでOSアプリすべてを再インストールしたために、FFFTPの転送設定が正しくなされてませんでした
<FILE>をアスキーモード転送でアップしたところ正しい挙動になりました。
0844nobodyさん04/07/08 08:07ID:???
>>825
だれも指摘してないが、その置換では末尾の空白は
とれないよ。先に.*の方に食われちゃうので。838は
黙ってさりげなく直しちゃってるけどな(笑)
0845nobodyさん04/07/08 09:16ID:???
>>843
それは改行コード
0846nobodyさん04/07/08 11:32ID:lii7HGr3
掲示板を作りました。
PCやドコモの携帯では普通に書き込めていましたが、auで試したら、
書き込んだ内容がURLエンコードされたまま書き込まれてしまいました。
なぜでしょうか。

書き込まれた内容 : %92x%82%ea%82%c4%83X%83%7d%83%93

デコード処理部分
sub getparam{
my($QUERY_DATA,@pairs,$pair,$key,$value,%FORM);

if($ENV{ 'REQUEST_METHOD' } eq "POST"){
read(STDIN, $QUERY_DATA, $ENV{'CONTENT_LENGTH'});
}

@pairs = split(/&/,$QUERY_DATA);

foreach $pair (@pairs){
($key,$value) = split(/=/,$pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/"/"/g;
$value =~ s/&/&/g;
$value =~ s/</</g;
$value =~ s/>/>/g;
$value =~ s/\r\n|\r|\n//g;
$value =~ s/\,/、/g;
$value =~ s/\t//g;
$FORM{$key} = $value;
}
return(%FORM);
}
0847nobodyさん04/07/08 11:38ID:???
>>846
君がURLエンコードされたものをデコードしてないから。
素直にCGIモジュール使った方がいいと思うよ。
084884704/07/08 11:39ID:???
ごめん見落としてた。吊ってくる。
0849nobodyさん04/07/08 13:09ID:???
>>846
自分のスクリプトから欠陥を見つけられないならauの方の糞さを疑ったらどうだ?
三菱から欠陥を見つけられないなら乗り手の方の糞さを疑ったらどうだ?
0850nobodyさん04/07/08 13:26ID:???
とりあえず加工する前の生の入力($QUERY_DATA)をファイルか何かに書き出して
よく眺めてみるのがいいかもね。
0851nobodyさん04/07/08 13:29ID:???
GDでグラフを描こうと思ったけど
横軸が等間隔じゃないデータは
扱いにくそうだな

ほかにグラフ描くいいライブラリないかな
0852nobodyさん04/07/08 14:03ID:???
>>851
独り言の前にCPAN
http://search.cpan.org/search?m=module&q=Graph&n=100
0853nobodyさん04/07/08 14:09ID:???
各モジュールの長所・短所とかの話であれば
http://pc5.2ch.net/test/read.cgi/php/997829243/
の方がベターと思われる
0854nobodyさん04/07/08 16:34ID:???
>>818
http://developer.apple.com/internet/webcontent/xmlhttpreq.html
これ使えばいけるかもね
0855nobodyさん04/07/08 17:51ID:fxJBz/QH
とりあえずカウントするだけのアクセスカウンタを作ろうと思ったのですが
 #!/usr/local/bin/perl -Tw
 use strict;
 
 my $data = './data.dat';
 open COUNTER, "+<", $data or die "$data:$!";
 my $count = <COUNTER>;
 $count += 1;
 seek COUNTER, 0, 0;
 print COUNTER $count, "\n";
 close COUNTER;
 #html排出
 print "$count";

 exit;
なんどやっても、おかしいと思うところやタイプミスを直しても動きません(Internal Server Error)
どこが間違っているのでしょうか?勉強後初プログラミングなもんで…
ご教授よろしくお願いしますm(_ _)m
■ このスレッドは過去ログ倉庫に格納されています