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

このエントリーをはてなブックマークに追加
1nobodyさん
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
2nobodyさん:05/01/27 18:09:13 ID:???
関連スレ
△▲ WebProg 初心者の質問 Part11 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1101635909/

CGIだけど、なんか質問ある? Part 12
http://pc5.2ch.net/test/read.cgi/php/1097334246/

【Perl,CGI】参考書籍 第三版
http://pc5.2ch.net/test/read.cgi/php/1030209573/

【Perl】ファイルロック(排他処理)について語ろう
http://pc5.2ch.net/test/read.cgi/php/1024795138/

★負荷軽減対策委員会(Perl、PHP)★
http://pc5.2ch.net/test/read.cgi/php/1034645635/

Perlモジュールについて
http://pc5.2ch.net/test/read.cgi/php/997829243/

CGIに依存しないPerlの話題一般/Part2
http://pc5.2ch.net/test/read.cgi/php/1030548610/

★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc5.2ch.net/test/read.cgi/php/1077525387/

【 スクリプト改造依頼スレ 】(丸投げ) part3
http://pc5.2ch.net/test/read.cgi/php/1105046286/
3nobodyさん:05/01/27 18:09:57 ID:???
4nobodyさん:05/01/27 18:10:35 ID:???
5nobodyさん:05/01/27 18:11:41 ID:???
ム板Perlスレより

[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www5a.biglobe.ne.jp/~n_rieko/perl/

[本]
リャマ: http://www.oreilly.co.jp/BOOK/lperl3/
駱駝: http://www.oreilly.co.jp/BOOK/pperl3v1/
Effective Perl: http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: http://www.oreilly.co.jp/BOOK/pcook/

[オンラインマニュアル]
Perldoc.com: http://perldoc.com
perldoc.jp: http://perldoc.jp
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/%7ekbk/perl5.005/

[モジュール]
CPAN.com: http://search.cpan.org/
河馬屋二千年堂: http://member.nifty.ne.jp/hippo2000/

[テクニック]
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: http://homepage1.nifty.com/nomenclator/perl/
6nobodyさん:05/01/27 20:48:05 ID:???
即死回避兼ねて>>1
7未承諾広告※ ◆TWARamEjuA :05/01/27 21:14:31 ID:???
>>1
ぼみょー
8nobodyさん:05/01/28 04:42:22 ID:???
やりたい事はハッシュの配列をサブルーチンで作り
それを受け取って表示したいのですが・・・。

sub test {
 my ( $ref ) = @_;
 $ref->[1]->{'a'} = "A1";
 $ref->[1]->{'b'} = "B1";
 $ref->[2]->{'a'} = "A2";
 $ref->[2]->{'b'} = "B2";
}
↑こんなサブルーチンを作って

my ( @data, %tmp1, $tmp2 )
test( \@test );
foreach $tmp1 ( @data ) {
 foreach $tmp2 ( keys %tmp1 ) {
  print qq($tmp2=$tmp1{$tmp2},);
 }
 print qq(|,);
}
↑こういう呼び出しを書いたのですが
a=A1,b=B1,|a=A2,b=B2,|
という結果を期待したのですがなにも表示されませんでした。

これを期待どうりにするには、何処をどうすれば良いのでしょうか?
98:05/01/28 04:44:17 ID:???
誤 test( \@test );
正 test( \@data );
…です。
108:05/01/28 04:53:41 ID:???
自己解決しました。
foreach $tmp2 ( keys %$tmp1 ) {
 print qq($tmp2=$tmp1->{$tmp2},);
}
これで解決しました。
…ところで、サブルーチンの中の
$ref->[1]->{'a'} = "A1"; 等は
$ref->[1]{'a'} = "A1"; でも同じ結果なのですが
どうしてなのでしょうか?
11nobodyさん:05/01/28 11:34:29 ID:???
>>10
ブラケットとブレースの間にはさまれた矢印は
省略可能だから。

ラクダ本3版8.3.3「矢印演算子を使う」参照。

12nobodyさん:05/01/28 15:00:30 ID:???
まいったわ
13nobodyさん:05/01/28 16:48:58 ID:???
test.txtの中に
%hash = (
"a-1" => "今日はお日柄もよく・・・",
"a-2" => "今日はみなさんに大切なお話があります・・・"
);
というスクリプトを書いています。

これをメインで
open FH,"test.txt";
eval FH;
close FH;
print %hash;

としてみたのですが、何も表示されません。
test.txtを1行にして、
eval <FH>;
とすればできるんですが、1行にすると見づらくなってしまいます。

何か方法はありますか?
14nobodyさん:05/01/28 17:25:08 ID:???
>>13
doとかrequireを調べてみるといいかも。

でもそれよりファイルフォーマットを決めて
%hashにその値を読み込むルーチンにした方が
幸せになれると思う。
15nobodyさん:05/01/28 17:44:18 ID:???
>>13
eval <FH>;じゃないの?
16nobodyさん:05/01/28 17:50:35 ID:???
>>15
そういう話じゃないから。
17nobodyさん:05/01/28 19:54:19 ID:???
>>13
if (open FH,"test.txt") {
  local $/;
  eval <FH>;
  close FH;
}
print %hash;

特殊変数 $/ について調べてみ
18nobodyさん:05/01/28 20:56:02 ID:BqQoLRNT
(^-^)/
19nobodyさん:05/01/28 22:22:08 ID:???
>>13
test.txtのパーミッションはしっかりしておいてね。
万が一でも書き換えられたら目も当てられないから。
20nobodyさん:05/01/28 22:33:47 ID:???
前スレ>>991
・カンマ演算子はリストを作る。
・リストをスカラーコンテキストで評価すると最後の要素が返る。
・式の中に別の式を埋め込みたかった。
これで察してください。
2113:05/01/29 13:14:26 ID:???
>>14-19
一杯ありがとうございます!
とりあえず応急で
eval join '',<FH>;
で済ませてしまいましたが、やはり色々なやり方があるのですね。

>>14さんがいうようにperl構文をそのまま入れるならtextファイルにする意味も
微妙なところなんですが、実は結構値が長文だったりするのです;

目的は素人でもテキスト自体を追加・修正できるようするためです。
外部ファイルにして一定のわかりやすいフォーマットにするというのが前提だったのですが、
csvもどきだと長文がはいると行・列が把握しづらくなってしまいます。

できれば本当は"a-1"の中にハッシュリファレンスを入れて10項目くらいの
プロパティ的なものをもたせたいんですが、複雑化すればするほど
csvって視認性が悪くなるんですよね。

掲示板などのdatファイルってどうやってるんでしょうか?
視認性がよく、プログラムでの処理もしやすいものがいいんですが・・・

場合によってはPerl以外のプログラム言語でも使用するのでやはり現状の
Perlの構文そのまんまっていうのはいまいちですよね。

みなさんが掲示板など作るときに作るdatのフォーマットなどを参考に聞かせていただけると
助かります。
22nobodyさん:05/01/29 13:59:05 ID:???
$hoge =~ /a (\w*?) go/;

これで$1の中にマッチした文字列が入りますが、
$1って1回中身を参照したら削除されてしまうのですか?

($a) = $1 =~ /\d/;
($b) = $1 =~ /[a-zA-Z]/;

試しにこういうことをしたら後からやるほうには何も代入されないんです。
windows版activePerl5.6.1での話です。

もしも$1の中身を何度も参照したければ一旦他の変数に入れる以外に策はありませんか?
23nobodyさん:05/01/29 14:36:54 ID:fOhenI6O
>>22
中身を参照したら消えるのではなくて次のパターンマッチ成功
またはブロックの終わりまで有効なのだが、どちらにせよそれを
越えて値が必要なら変数なりなんなりにしまっておくしかないね。
24nobodyさん:05/01/29 16:22:50 ID:???
そういうことですか
レスありがとうございます
25nobodyさん:05/01/29 18:02:14 ID:4Kvcglsl
for文でインクリメントする時は
 for(1..100)
って書けるけどデクリメントする時はどう書くんだろう?
 for(100..1)
は無理だよね。
26nobodyさん:05/01/29 18:06:59 ID:???
27nobodyさん:05/01/29 18:24:05 ID:???
すみませんCのwindows.hに入っているSleep関数とperlのsleep関数の違いはなんですか?
28nobodyさん:05/01/29 19:32:37 ID:???
29nobodyさん:05/01/29 20:47:53 ID:YcAE5qw3
if($ENV{'HTTP_USER_AGENT'} =~ /$_/){
$flag = 1;
}
どうしてもこれが上手く行きません。
なぜなのでしょうか?
ご教授お願い親します。
30nobodyさん:05/01/29 20:54:06 ID:YcAE5qw3
>>29
追加。
$_に入るのは
DoCoMo/2.0 F900i(c100;TB;W22H12)
です。
31nobodyさん:05/01/29 21:18:43 ID:???
>>29
括弧が正規表現の括弧として扱われている。
クオートメタするか、eq演算子やindex関数を検討。
32nobodyさん:05/01/29 21:19:51 ID:fOhenI6O
>>30
カッコやピリオドは正規表現のメタキャラクタなので
そのまま埋め込むと別の意味になってしまう。

if($ENV{'HTTP_USER_AGENT'} =~ /\Q$_\E/){
$flag = 1;
}

とかすればいいだろう。
33nobodyさん:05/01/29 21:20:55 ID:???
よくわからんが、
$ENV{'HTTP_USER_AGENT'} と $_ をプリントして同じものか見れば?
単に$_ にセットされていないって話じゃないだろうな。
34nobodyさん:05/01/29 21:34:08 ID:YcAE5qw3
\Q$_\E
だけでは上手く行かず
my(@data) = ("$tmpDefine[0]","$tmpDefine[1]");
と配列に入れるさいに""をつけて解決しました。
ありがとうございました。
35nobodyさん:05/01/29 21:43:44 ID:fOhenI6O
>>34
後半はundefが空文字列に変換されるあたりの関係かねぇ。
36nobodyさん:05/01/29 23:31:30 ID:k1P2HVvm
test.cgiをeucで書いて、シフトjisで出力するにはどう書いたらいいのですか?
携帯で見れるようにしたいのですが文字化けしてしまいます。
jcode.plはあるのですがどう使っていいのかわかりません。
perlコーディングというかプログラム自体初めてです。
文字コードのことがよくわかりません。
わかりやすいサイトなどありましたら教えてくださ
どれではおながします
37nobodyさん:05/01/30 00:35:14 ID:???
最初からShift_JISで書け。
そしてスクリプト内で
use encoding 'Shift_JIS';
と宣言しろ。
38nobodyさん:05/01/30 01:34:47 ID:7qmv52uq
>>36
最後の2行、グダグダやね。
39nobodyさん:05/01/30 12:47:06 ID:???
>>36
CGIの中には日本語を一切書かない。
HTMLの類はすべて外部ファイルに。
これで解決。
40nobodyさん:05/01/30 13:02:28 ID:0daQX9sH
>>36
nkfでShift-JISに変換してしまっては?
test.cgiをまた編集したくなったらnkfでEUCに。
ちょっと面倒だけど。
41nobodyさん:05/01/30 13:39:39 ID:???
>29-34を読んで、気になったのでお聞きしたいのですが、
--------------------------------------------------
#@ip_listは下記のようなリストです。
@ip_list = ('333.139.141.','333.20.117.','333.255.29.');#という感じ

$addr = $ENV{'REMOTE_ADDR'};
foreach (@ip_list){
  if ($addr =~ /^$_/){
    $flag = 1;
  last;
  }
}
--------------------------------------------------
これで一応うまくいっていたので、これまで何も考えて無かったのですが、
これは「.」が正規表現のメタ文字で「任意の1文字」なためにたまたまうまくいってただけで、
  if ($addr =~ /^$_/)

  if ($addr =~ /^\Q$_\E/)
とした方がいいのでしょうか?
42nobodyさん:05/01/30 14:09:44 ID:???
>>41
アホ。
$_内にピリオド等のメタ文字が入っていてもメタ文字評価されるわけないだろ。
43nobodyさん:05/01/30 14:16:22 ID:???
>>42
おまいがアホ。されるっつーの。
44nobodyさん:05/01/30 15:12:44 ID:???
>>41
yes.
今まではたまたまうまくいってただけ。
エスケープしたほうがいいな。
45nobodyさん:05/01/30 15:21:23 ID:nMKi12Lv
マッチする相手が正しいipアドレスならば
パターンの「.」の部分が数字にマッチするよう
だとたいていはアドレスの中の「.」がパターン
の中の数字の位置に来るような気がするので
かなり必然に近い偶然とはいえるな。

しかしだから大丈夫だということを証明しようと
がんばるよりは素直にエスケープしとけ。
46nobodyさん:05/01/30 15:22:07 ID:???
>>41
これでもOK。
@ip_list = map{ quotemeta } ('333.139.141.','333.20.117.','333.255.29.');
4741:05/01/30 17:48:45 ID:???
みなさん、どうもありがとうございました。
考えてみたら、
if ($addr =~ /^333\.139\.141\./)
ひとつだけの場合だったらこうやってエスケープして書いているのに、
リストの要素ひとつひとつとの比較の場合はエスケープしてないっておかしいですよね。
ちゃんとエスケープ処理をするよう気をつけたいと思います。

>46さん
map関数調べてみました。
こういう便利な関数もあるんですね。たいへん勉強になりました。
48nobodyさん:05/01/30 18:36:05 ID:60wlVefX
質問です。

|ddddddd|momddomo|aaaaaaaaaa|
|wwwwwww|fddddddd|ssssssssss|
|eeeeeee|pppppppp|rrrrrrrrrr|

'|'を区切りとしてテーブルタグに変換させる正規表現
を作れる人いませんか?

どうか宜しくお願い射ます
49nobodyさん:05/01/30 18:59:58 ID:???
>>48
何を「どのように」変換したいのかをはっきりさせてから↓で聞いてください。

正規表現道場@2ch Part4
http://pc5.2ch.net/test/read.cgi/php/1105930285/
50未承諾広告※ ◆TWARamEjuA :05/01/30 19:09:18 ID:???
そもそも'333'で始まるIPアドレスって存在するの?
51nobodyさん:05/01/30 19:10:45 ID:???
ただの例だろ
52未承諾広告※ ◆TWARamEjuA :05/01/30 22:08:02 ID:???
ですよね(苦笑)
でも、一致しないときは全部サーチしなきゃだから、やっぱりハシュに入れちゃった方が効率よさそうですね。
53nobodyさん:05/01/31 17:52:56 ID:sSr/NKoB
Perl であるシンボリックリンクを調べて、リンク先のファイルのフルパスを
知りたいのですが、どう書けばよいのでしょう?

system で、ls -l した結果を切り貼りすれば、とりあえずできそうなのですが、
もう少し何か方法がありそうな気がしまして。
54nobodyさん:05/01/31 18:04:55 ID:???
>>43
マジかよ!?
何でそんなセキュリティホール量産体制を作っちゃうのよ?
ユーザが送ってきた文字列を正規表現に使う前にサニタイジングしないと
いけないなんて面倒じゃないか?

っていうか何のメリットがあってそんな仕様なんだ?
55nobodyさん:05/01/31 18:10:49 ID:???
perl=CGIと思い込んでる奴がまた一人
56nobodyさん:05/01/31 19:58:07 ID:???
>>53
readlink
57nobodyさん:05/01/31 20:39:27 ID:8ZuDaXBy
みなさまへ
「/ほげほげ」という文字を消したいんですよ。
$line =~ s|/ほげほげ||g;
↑で消えないんですが、どうしてって気持ちです。
「ほげほげ」だけなら↓で消えるのですが。「/」←コイツ(全角)が消えないのです。
$line =~ s|ほげほげ||g;
どうしてご存じかいませんか?


58nobodyさん:05/01/31 20:40:18 ID:8ZuDaXBy
↑日本語になってないぞ。自己っす。
59nobodyさん:05/01/31 20:44:59 ID:???
$line =~ s\Q/ほげほげ\E||g;
か?
60nobodyさん:05/01/31 20:46:01 ID:???
$line =~ s|\Q/ほげほげ\E||g;
こうだったか…orz
61nobodyさん:05/01/31 20:56:16 ID:???
>>57
別の話になるが、マッチするしないは見た通りと一致しないこともある。
暇があったらこういうのも読んでおくといい。
http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
62nobodyさん:05/01/31 20:58:15 ID:???
↑あ、なった!
ありがとう・・・・・
(>_<)
今日一日はずっとこれ考えてました。
早くココで聞けばよかった…
63nobodyさん:05/01/31 21:02:00 ID:8ZuDaXBy
全角の「/」も、それなりの仕事をしていると、今日初めて知りました。。。
今まで、全角はずっと文字あつかいでした。
64nobodyさん:05/01/31 21:23:56 ID:???
>>54
>っていうか何のメリットがあってそんな仕様なんだ?

多分、\Q と \E をタイプする程度のことに文句を言うユーザを
排除しようとしたんじゃないかな。
65nobodyさん:05/01/31 21:52:09 ID:ZqzhsiuT
>>63
SJISで書いただけじゃねーの?

「/」は815eだから正規表現のメタ
文字の「^」を含むので。

use encodengする場合除いてSJISで
スクリプト書くとはまるからやめた
方がいいと思う。
66nobodyさん:05/02/01 01:04:11 ID:???
$| = 1;
プログラムの冒頭に書いてあるこれはどういう意味でしょうか。
67nobodyさん:05/02/01 01:09:11 ID:ViOttCyf
>>66
perlvar(1)よめ
68nobodyさん:05/02/01 09:48:19 ID:???
my ($a,$b) = qw/1 2 3 4 5/;

こういう場合って345はどこへいくんですか?
テストしたら$a==1,$b==2でしたので、$bの中身が後続で上書きされ続ける
ような動作はしないことを確認しました。

メソッドからの返り血が複数で合った時に受け取り側ではリストを用意さえすれば
リストの数が合わなくても前列のみが必要な時は通用するんですね。
69nobodyさん:05/02/01 10:42:01 ID:???
>>68
捨てられるだけ。ラクダ本3版の「2.8.1リスト代入」を読むことをお勧めする。
70nobodyさん:05/02/01 12:10:16 ID:???
>>68
別に前列だけじゃなくてもいいし
71nobodyさん:05/02/01 12:36:12 ID:???
皆さんはリスト返す関数の途中の値がいらないときは

($x, undef, $y) = foo();



($x, $y) = (foo())[0,2];

のどっち使いますか?

私は拾う値が少ないときは後者、捨てる値が少ないときは前者で
ビミョーなときはなんとなく気分で使い分けなんですが。
72nobodyさん:05/02/01 12:57:50 ID:???
2 が最後の値だ、ということは第三者には分からないし、
最後が 2 番目だという保証もないので前者でしょ。

73nobodyさん:05/02/01 12:59:01 ID:???
後者しか使わんな
74nobodyさん:05/02/01 14:57:15 ID:HcuaG0Ew
Shift_JISのマルチバイト文字列を正確にURIエスケープしたいんですが
Perlメモにある

$str =~ s/(\W)/'%' . unpack('H2', $1)/eg;

このスクリプトはeucを前提にしてるようですが
Shift_JISでは間違った置換をする可能性がありますか?

基本的には大丈夫なような気がするんですが;
一応まだ間違う瞬間を見つけれてませんし・・・
不安なので宜しくお願いしますm(_ _)m
75nobodyさん:05/02/01 15:29:34 ID:???
SJISの1バイト目だけがエスケープされて2バイト目(たまたま\wと一致)はそのまま
というケースが多数出てきそう

実用上は支障なさそうだが
はたしてそれって「正確にURIエスケープ」したと言ってよいものなのか?
7674:05/02/01 15:49:54 ID:HcuaG0Ew
>>75
やはりそういうことが起きるのですかorz
Shift_JISの文字列を正確にURIエスケープするのは無理なのでしょうか?

>実用上は支障なさそうだが
・・・?
あ、もしかしてエスケープする時点でバイトの途中で区切られても大抵の
アンエスケープ処理後に何の問題も起こらないということですか?

それならうれしいのですが・・・・
77nobodyさん:05/02/01 16:20:20 ID:???
>>76
EUC前提とは書いてあるが、Shift_JISやUTF-8でも全然問題ない。気にするな。
7874:05/02/01 17:25:29 ID:HcuaG0Ew
>>77
それなら安心です。
ありがとうございましたm(_ _)m
79nobodyさん:05/02/01 18:36:33 ID:???
Shift_JIS って限定するなら、ちゃんと場合分けでやればいいんじゃねーの? とも思うが。
ひとつ前の文字が [\x81-\x9f\xe0-\xfc] の範囲なら [\x40-\x7e] も置換する、とか。
80nobodyさん:05/02/01 19:20:22 ID:???
perlを使い背景に画像を持ってきたいんですがうまくいきません。
backgroundでは駄目なんでしょうか?
81nobodyさん:05/02/01 19:22:07 ID:???
perlを使い魚沼産コシヒカリを炊いたのですが美味くありません。
evianでは駄目なんでしょうか?
82nobodyさん:05/02/01 20:59:16 ID:???
ってかマルチ
83nobodyさん:05/02/01 23:18:19 ID:???
1, 10歳の消防
2, 真性の馬鹿
3, 実はインド人だ
84nobodyさん:05/02/02 00:09:28 ID:hjWjou/0
はじめまして。perl初心者です
今gazou.cgiの直下にgazouフォルダがあり中にはn個のjpg画像があります。
これをgazou.cgiが呼ばれたら、jpg画像があるだけ(n個)htmlで出力したいのですが
どう書いたらいいのでしょうか?ちなみに10個ごとに改行を入れたいのですが、そういうことは可能なのでしょうか?

もしよろしければご教授ください。
85nobodyさん:05/02/02 01:14:46 ID:???
>>84
あるディレクトリに入っているjpgファイルの一覧ページを作りたいのなら可能。
自分でできるだけのことをやって、行き詰まってからまたおいで。
86nobodyさん:05/02/02 01:42:57 ID:???
今日からperlでCGI作るどーって意気込んだはいいけどapacheの設定が難しくて
4時間かけてやっとhello.cgiを動かした俺。

てめぇらなんかに負けるものかぁぁぁぁぁぁぁぁぁてかハラヘッタァァァ
87nobodyさん:05/02/02 01:51:38 ID:???
>>86
スレ違いなので他でほざけ
8884:05/02/02 03:00:32 ID:hjWjou/0
#!/usr/bin/perl
require './jcode.pl';
$dir = "./img/";
$title = "画像リンク";

opendir DIR, $dir;
@files = grep { !m/^(\.|\.\.|Thumbs\.db)$/g } readdir DIR;
close DIR;

if ( @files ) { &htmlheader;
exit;}

sub htmlheader {
$GAZOU = "画像";
$p= <<"HTML";
<HTML><HEAD><TITLE>$title</TITLE></HEAD><BODY>
HTML
&jcode'convert(*p,'sjis');
&jcode'convert(*GAZOU,'sjis');
print "Content-type: text/html\n\n";
print $p;
foreach $a (@files){
$a =~ s/\.jpg//g;
print "<a href=$dir$a>$GAZOU</a><br>";
}
print "</body></html>";
}
>>84ですが一応あるディレクトリに入っているn個のjpgファイルへのリンク集を作ることはできました。上の汚いソースがそれです。
ですがたとえば10個ごとに改行を入れることや、100個ごとにべつのファイルを作成といったことはできるのでしょうか?
見当がつかなくここの先輩方にご教授いただけたら幸いです。
89nobodyさん:05/02/02 03:47:54 ID:???
foreachのどこかに、毎回+1される変数用意。
後は、条件分岐でごにょごにょと指定するだけ。
90nobodyさん:05/02/02 08:38:32 ID:???
ほれ、改行だけ入れてやったぞ

#!/usr/bin/perl
$w=10;
print join"\n",'Content-Type: text/html','','<table>',map('<tr><td>'.
join('</td><td>',@$_).'</td></tr>',do{$otakara[$i/$w][$i++%$w]=
qq{<img width="80">}while<img/*.jpg>;@otakara}),'</table>';
91nobodyさん:05/02/02 09:28:59 ID:???
@arrayの最後の要素を参照したいんですが、下記の方法で大丈夫ですか?

@array[-1]

確か以前にマイナス値を与えると逆から数えると読んだのですが、今探しても
そのソースが見つからないのでお願いします。
一応動作はうまくいってますが、@array[$#array]とは違う働きをする瞬間が
存在したら怖いので賢者に聞きにきました。
92nobodyさん:05/02/02 11:16:14 ID:???
9391:05/02/02 11:25:02 ID:???
-1で検索しても該当箇所が見つかりません・・・・・・

私が思っているほど-1についての動作は単純じゃないんでしょうかorz
9484:05/02/02 11:27:46 ID:???
>>89
ありがとうございます。これからいろいろ試してみたいと思います。
>>90
わざわざコードをかいてもらって本当ありがとうございます。
これから解読しつつ試してみたいと思います。
95nobodyさん:05/02/02 11:44:33 ID:???
>>93
ちゃんと読みなよ。日本語で書いてあるんだから。
96nobodyさん:05/02/02 13:11:44 ID:???
(Arrays)
配列の添え字が負であったとき、それは配列の終端から数えられるようになりました。


@a = (1, 2, 3, 4, 5);
print "The third element of the array is $a[3] also expressed as $a[-2] \n";


# perl4 の出力: The third element of the array is 4 also expressed as
# perl5 の出力: The third element of the array is 4 also expressed as 4


つまりPerl5からは-1と$#arrayは同じ作用をするってこった。
まあ巷のPerlはほぼ5だから気にせず使えよバカ。
97nobodyさん:05/02/02 16:36:20 ID:43fDDoaT
素朴な疑問なのですがよろしいでしょうか?
foreachなどのループ文を書くときによく何回目のループかを知りたくて
my $i = 0;
foreach.....$i++;.....

のようにして$iを使用しますよね。
これはきっと昔から使われている手法だと思います。
でもちょっと面倒ですよね。

そこで思ったのですが、何故にデフォルトで何回目のループかを専用の特殊変数
に代入するような仕様にならないのでしょうか?

例えば
@+R
などを作って内側から1つ目のループが何回目かを調べる時は
$+R[0]
で、こういう感じで実装してあると結構便利だと思います。

まあ何故に仕様がこうであるかはここで言ってもしょうがないですし、
素人の脳みそでは理解できない事情があるのかもしれません。

こういう特集変数めいたものを自分で作ることは可能でしょうか?
例えばhogeモジュールをuseすれば自動的にそういう特殊変数が作成されるような。

しょうもないことですがあると便利だと思うんですよね。
98nobodyさん:05/02/02 16:45:17 ID:???
必ず使うとも限らないのにそんな実装してパフォーマンス落とすなんて・・・
99nobodyさん:05/02/02 17:06:51 ID:???
>>97
for(my $i = 0; $i < @array; $i++){
# ...
}
100nobodyさん:05/02/02 17:08:08 ID:???
>>97
whileのループならあるよ
10197:05/02/02 17:39:48 ID:43fDDoaT
>>98
パフォーマンスの問題でしたか。
そうですよね;
>>99
for以外のループ文でも使えないと・・・・・
それに汚いですよね。
>>100
どういうことですか?whileだけ特殊変数が用意されてるんですか?
ちょっと特殊変数一覧見直してみますm(_ \)m
102nobodyさん:05/02/02 17:43:18 ID:???
>>97
何が面倒なのかわからないんだが
103nobodyさん:05/02/02 18:09:14 ID:???
そういうループをするためにfor文があるんじゃないのか。
10484:05/02/02 21:19:40 ID:???
84ですが皆様のおかげで目的のものが一応出来ました。ありがとうございました。
105nobodyさん:05/02/03 01:49:12 ID:???
rename関数を使ったファイルロックを考えています
#施錠
$try=3;
while(! rename('off.loc','on.loc')){
 if(--$try <= 0){die;}
sleep(1);
}
#解錠
rename('on.loc','off.loc')

ただ、これでは施錠してから解錠する間にプロセスが逝った時施錠されたままになってしまいますが、
そこで、最後にrenameした時間を求めるにはどうすればよいのでしょうか
106nobodyさん:05/02/03 03:31:38 ID:???
107nobodyさん:05/02/03 13:38:41 ID:???
しかしたかがロックをいちいち書くのめんどくさいよな。
cpan検索するとないわけではなくて結構たくさん出て来
るんだがどれがいいんだかよくわからん。

でもhttpで何かゲットというとLWP使えって速攻で返って
くるのに、ロックだとそういうの見たことないし、実は
どれもあまりよくないというオチだろうか?


108nobodyさん:05/02/03 14:34:08 ID:???
>>107
まぁ99%はflockを使ってるだろうからな。
109nobodyさん:05/02/04 03:38:45 ID:???
そのflockが環境によっては動かなかったりするからだろ。
110nobodyさん:05/02/04 12:26:33 ID:O0itZOq3
>103
では配列を取り出し名がらやるにはどうやるんですか?
111nobodyさん:05/02/04 12:47:46 ID:???
>>110
@array = (1,2,3,4,5);

for ($i=0; $i<=$#array; $i++) {
 print $array[$i];
}
112nobodyさん:05/02/04 13:42:59 ID:???
>>109
きょうび、flockが動かないサーバーなんてあるか?

flockの仕様がやや使いづらい、というのなら分かるがな。
そういう意味ではPerlメモで紹介しているmkdirによるlockを使うことも十分あり得る。
113nobodyさん:05/02/04 18:09:07 ID:???
指定したweb上のファイルを取得して、上書き保存したいんですが
以下のように書いても動きませんでした。
何が間違ってるか教えてください。

#!/usr/local/bin/perl

require 'extlib/LWP/Simple.pm';

use LWP::Simple;
$doc = get('http://www.xxx.com/xxx/test.html');
$filename = "./data/test.html";
open( FH , ">$filename" );
print FH $doc;
close( FH );
exit( );

__END__
114nobodyさん:05/02/04 18:22:12 ID:???
>>113
何がどう動かなかったのか。
115nobodyさん:05/02/04 18:51:19 ID:???
>>113
require 'extlib/LWP/Simple.pm';

と書く芸風ははじめてみたがそれは置いといて、

$doc = get('http://www.xxx.com/xxx/test.html');
defined $doc or die "cannot get";



open( FH , ">$filename" ) or die "cannot open: $!";

ぐらいはしろよ。どこでだめになったかさっぱりわからんだろ。

116nobodyさん:05/02/04 20:43:55 ID:???
どうせまた500エラーに頼ってんだろうよ
117nobodyさん:05/02/04 20:51:29 ID:3semSWSA
質問させて下さい。
Web板の内容でしたらすいません。

print "<SELECT NAME=\"nenrei\">\n";
print "<OPTION VALUE=\"10\">10\n";
print "<OPTION VALUE=\"20\">20\n";
print "<OPTION VALUE=\"30\">30\n";
print "</SELECT>\n";

と表示させ、事前にselectedで選択させるのではなく、後から変数の値
を参照し、変数値が10だったら10を、20だったら20を、30だったら30を
選択した状態にしたいのですが、良い方法はないでしょうか?
118nobodyさん:05/02/04 20:54:33 ID:???
>>117
選択状態にするには、次のようにselected を付ける。
<option value="value" selected>
119nobodyさん:05/02/04 21:02:51 ID:???
>>118
いや、>>117は動的にselectedを付けたいと言う
120nobodyさん:05/02/04 21:03:46 ID:???
>>117
条件分岐して selected 付きprintしたりしなかったりしたりしなかったりしたりしなかったりしたりしなかったり…
すればいいんじゃないの?
121nobodyさん:05/02/04 21:05:00 ID:???
$hoge{$hensuu} = " selected";

print qq{<OPTION VALUE="10"$hoge{10}>10\n};
以下略

"をエスケープするのは個人的に好きじゃない
122nobodyさん:05/02/04 21:07:13 ID:???
for (1..10) {
    print qq|<option value="$_"|;
    print qq| selected| if $str eq $_;
    print qq|>$_</option>\n|;
}

こうかな?
123nobodyさん:05/02/04 21:09:50 ID:???
>>121
print qq{<OPTION VALUE="10"$hoge{$hensuu}>10\n};
じゃないの?
124nobodyさん:05/02/04 21:11:59 ID:???
申し訳ありませんが質問させて下さい

cgiの入力フォームで送信ボタンを押した後など
ブラウザでリロードを行うと同じ処理が繰り返し行われてしまいます

そのせいで、例えばリストの中の2番目のデータを削除していた場合
リロードの度に新しく2番目となったデータが削除されていってしまうのですが
こういった場合に、ある程度経験のある方は
どのようなやり方で解決しているのかお伺いしたいのですm(__)m
125nobodyさん:05/02/04 21:15:56 ID:2GvnZ25o
>>124
2chの書き込み後の処理をまねてみるとか。。
126nobodyさん:05/02/04 21:22:44 ID:MsfARYCJ
>>124
refreshを使いなさいという事です。
頑張って下さい。
127nobodyさん:05/02/04 21:25:30 ID:???
>>113
require 'extlib/LWP/Simple.pm';

と書く不思議コーディングはははじめてみたがそれは置いといて、

dataディレクトリがないだろ。
128nobodyさん:05/02/04 22:19:37 ID:???
>>124
1.locationやrefreshで飛ばしてブラウザにGETメソッドを記憶させる。
2.最後の投稿を記録しておいて、二重投稿(この場合削除)をチェック。
3.削除する前に確認画面を出す。
4.固有の番号指定で削除するようにする。
129124:05/02/04 22:21:56 ID:???
>125
2chの書き込み後の処理というのは、やはり入力フォームと表示部を分けるということでしょうか
確かにそれが一番いいのかもしれませんね
でもできればフォームと一体型で、根本的な解決方法がないものか気になるのでもう少しこのまま頑張ってみます
ありがとうございましたm(__)m

>126
refleshというものがあるのですね
これから検索をして勉強してみたいと思います
ありがとうございましたm(__)m
130124:05/02/04 22:25:16 ID:???
>128
おお、具体的な方法を4つも教えて頂いて本当に感謝です
1番目の方法だけまだ勉強不足で分からないので、いろいろ試してどの方法が一番いいか考えてみます
本当にありがとうございましたm(__)m
131nobodyさん:05/02/04 22:57:25 ID:???
送信ボタンを押した後に画面を偏移させないの?
そういえばどこかの掲示板の作者がサポートの質問で
で二重投稿になるのは仕様だとバカみたいなこと平気で言ってたな
132nobodyさん:05/02/05 00:13:26 ID:???
>128
1はよく使われるけど、ボタンの2度押しは防げないよね。
手軽で便利なんだけど。
133nobodyさん:05/02/05 00:21:40 ID:KAYC+D6O
入力フォームでセッションID食わせて先着1名様有効が
確実じゃないかと。
134nobodyさん:05/02/05 01:11:51 ID:???
二次元配列の中身をテーブルにして出そうと思ったんですが・・・

$tbl[0][0] = "00";
$tbl[0][1] = "01";
$tbl[1][0] = "10";
$tbl[1][1] = "11";

print "<TABLE BORDER=1>\n";
foreach $value (@tbl) {
 print " <TR>\n";
 foreach $value2 (@value) {
  print "  <TD>$value2</TD>\n";
 }
 print " </TR>\n";
}
print "</TABLE>\n";

何もでてきません
何がだめなんでしょうか?誰か教えてください・・・
135nobodyさん:05/02/05 01:21:27 ID:???
>>134
まずperl 二次元配列で調べてみ。
136nobodyさん:05/02/05 01:44:54 ID:???
>>134
二次元の読み出し方も間違っているが仮に読み出せたとして
$valueはどこで使われてるのよ?
表示させる@valueっていったい何よ?
137nobodyさん:05/02/05 02:21:14 ID:???
まぁスカラーと配列は別の領域なわけだが。
138nobodyさん:05/02/05 02:28:27 ID:???
そもそも必要があって二次元にしてるのかさえ疑わしい
139137:05/02/05 02:41:32 ID:???
>>134
サンプルコード書いたけど、いくらで買う?
140nobodyさん:05/02/05 02:44:20 ID:???
>>139
あのコードから何を出力したいかわかるとは・・・
お前、エスパーだな?
141nobodyさん:05/02/05 02:45:38 ID:???
137じゃないけど何を出力したいかはわかるでしょ。
142137:05/02/05 02:51:46 ID:???
三次元になったらどうやって出力しようか迷っていたところだ。
143nobodyさん:05/02/05 03:17:56 ID:???
すみません。ものすごい初心者なんですが
Perlの起動が上手くいきません…
XPでPerlのVerは5.8.3です

とりあえずデフォルトでインストールは終わったのですが
コマンドプロンプトを開くと即閉じてしまいます。
サイトみてもXPの説明が…
144nobodyさん:05/02/05 03:28:41 ID:???
>>143
スレ違いです。

△▲ WebProg 初心者の質問 Part11 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1101635909/
145nobodyさん:05/02/05 03:30:56 ID:???
すみません〜。そちらで聞いてみます
146137:05/02/05 03:40:32 ID:???
>>134
どうすればいいんだこのコード
147137:05/02/05 04:28:25 ID:???
>>134
9時までに返事しないとコード内の改行とタブ、不要なスペースを全部消す。
148nobodyさん:05/02/05 05:41:11 ID:???
>>134
とりあえず2個目の foreach の @value を @$value に変えて正常に出力されるのを確認したら、
http://www.google.co.jp/search?hl=ja&q=Perl+%E9%85%8D%E5%88%97%E3%81%AE%E9%85%8D%E5%88%97
で勉強してくれ。

>>147 なんつーか…
print'<table>',(map{('<tr>',map("<td>$_</td>",@$_),'</tr>')}@tbl),'</table>';
149nobodyさん:05/02/05 17:35:50 ID:???
掲示板スクリプトを作っています。

if ($name = ~/fusianasan/){
$name = ~s/fusiansan/<strong>$host<\/strong>/
}
注)$name…名前欄の文字列 $host…$ENV{'REMOTE_HOST'}

とすると、名前欄にfusianasanが入っていてもいなくても
名前欄が4294967295になってしまいます。

また、同様に
foreach (@post_check_list){
~ s/</</gi;
~ s/>/>/gi;
~ s/\r\n/<br \/>/gi;
~ s/\r/<br \/>/gi;
~ s/\n/<br \/>/gi;
~ s/"/&guot;/gi;
~ s/&/&/gi;
~ s/\0//g;
${"$post_check_list2[$i]"} = $_;
$i++;
}
注)@post_check_list = (\$name ,\$mail, \$honbun…
  $nameは名前欄、$mailはメール欄、$honbunは本文
   @post_check_list2 =('name', 'mail', 'honbun'…

とするとメール欄などが全てREF(0x814d354)となってしまいます。

文字コードはeucなのになぜなのでしょうか…知っている方ご教
授いただければ幸いです。
150nobodyさん:05/02/05 17:52:04 ID:???
>>149
× = ~
○ =~
151nobodyさん:05/02/05 17:52:11 ID:???
>>149
fusianasanのほうは他の処理に原因があるのだろう。
@post_check_listは中身がリファレンスなんだから当然の結果。
eucとかそういう話は無関係。
152nobodyさん:05/02/05 18:36:20 ID:???
format関数でテキストの位置制御を行っているんですが
日本語をwriteすると文字化けるというのは仕様でしょうか?
#以下ソース

$hoge = 'test1';
$hoge2 = 'あ';
format STDOUT =
TITLE : @<<<<<<<<<<
$hoge
TITLE2 : @<<<<<<<<<<
$hoge2
.
write (STDOUT);

#$hoge2が化けてます。
153nobodyさん:05/02/05 18:42:39 ID:???
>>149
if ($name = ~/fusianasan/){
    $name = "<strong>$host<\/strong>";
}
154nobodyさん:05/02/05 18:52:01 ID:???
>>153
アホ
155nobodyさん:05/02/05 19:50:46 ID:???
どうでもいいが、こうじゃないのか?

if ($name = ~/fusianasan/){
    $name = "<strong>$ENV{REMOTE_HOST}<\/strong>";
}
156nobodyさん:05/02/05 19:54:28 ID:???
$ENV{'REMOTE_HOST'}でホスト名が返ってくる鯖って少なくね?
つか、漏れの借りてる鯖は$ENV{'REMOTE_HOST'}禁止なんだよね。
157nobodyさん:05/02/05 19:55:01 ID:???
$name =~ s/fusianasan/<strong>$ENV{REMOTE_HOST}<\/strong>/;

でもいいな。
158nobodyさん:05/02/05 19:55:38 ID:???
>>156
禁止だとしたら、$hostってどっから取ってくるんだよ(w
159nobodyさん:05/02/05 19:55:49 ID:???
>>155
アホ
160nobodyさん:05/02/05 19:59:10 ID:???
>>158
げっとほすとばいあどれす
161未承諾広告※ ◆TWARamEjuA :05/02/05 21:13:22 ID:???
なんだか楽しそうですねぇ。。。
162149:05/02/05 21:15:54 ID:???
>>150
ありがとうございました。スペースを削除したら上手くいきました。

>>151
リファレンスにせずに、普通に
@post_check_list = ($name ,$mail, $honbun…
としたら上手くいきました。ありがとうございます。

>>155,>>157
それだと、名前欄に「ほげほげ fusianasan」などと入れたときに
ほげほげが消えてしまいます。
163nobodyさん:05/02/05 21:39:54 ID:???
>>162
勘違いしてるみたいだけど、~ は正規表現の先頭に付ける文字じゃないからね。
後半のソースは左辺値がないからたまたま期待通り動いてるだけ。
どういう意味があるのかは調べてみてください。
164nobodyさん:05/02/05 22:35:02 ID:???
>>149>>153>>155
$name = ~/fusianasan/;
これは
$name = (~($_ =~ m/fusianasan/));
と同じ意味。
165nobodyさん:05/02/05 23:56:22 ID:5Rr9/6OZ
ちょっと聞きたいんだけど、沢山出力を吐きたい時に

print << " END_OF_PRINT";
 処理
 END_OF_PRINT

って書くけど、
こんな時に処理部に例外処理が沢山あって

print << " END_OF_PRINT";
 処理A
 END_OF_PRINT
print << " END_OF_PRINT";
 処理B
 END_OF_PRINT
・・・

ってな感じで細かく使わないといけないけど普通のprint文を使うまでも無いって時はどうしてる?
なんかソースが汚く見えるんだよね。
166nobodyさん:05/02/05 23:58:48 ID:???
ヒアドキュメントの中に処理が入ってるのが
意味わかんないんだけど。
スペースも意味わかんない。
167nobodyさん:05/02/06 00:31:46 ID:???
確かに意味不明だよな。
例えとしてもそんなこと書いているようでは汚いのは当然かも。
168nobodyさん:05/02/06 00:44:01 ID:???
万華鏡でも覗きながらソース見れば、綺麗に見えるんじゃないの?
169nobodyさん:05/02/06 00:48:00 ID:???
マン毛鏡って素敵♥
170nobodyさん:05/02/06 00:52:30 ID:???
なんかムラムラしてきますた
171nobodyさん:05/02/06 01:13:35 ID:???
>>165
サブルーチンを分けるか、ファイルを分ける。
スペースは意味わかんないから __END_OF_PRINT__ とか書く。
172nobodyさん:05/02/06 01:18:35 ID:???
>>165ってなんでもヒアドキュメントで書いてるのかな。
173165:05/02/06 02:10:26 ID:???
死ぬわ。
174nobodyさん:05/02/06 05:39:04 ID:???
>>165
一度変数に入れてしまう。

my $str_a =<< " END_OF_PRINT";
 処理A
 END_OF_PRINT
my $str_b =<< " END_OF_PRINT";
 処理B
 END_OF_PRINT

print $str_a;
# 何か処理
print $str_b;
175nobodyさん:05/02/06 11:18:05 ID:???
print <<EOT1, <<EOT2;
 処理A
EOT1
 処理B
EOT2
176nobodyさん:05/02/06 12:36:07 ID:???
そもそもなぜヒアドキュメントの中に処理があるのだろうか。
@{[...]}とか使えばなんでも書けるけどさ...
177nobodyさん:05/02/06 13:01:53 ID:???
perlはそういう記述ができるんだからグダグダいってもしょうがない。
178nobodyさん:05/02/06 13:03:56 ID:???
別に、自分が納得するように書けばいいだろ。

綺麗とかそういう基準なんて、誰かが勝手に言い出した物で、
別に基準なんかじゃないんだからさ。

自分が後から見て理解できるように書けばいい。
179nobodyさん:05/02/06 13:17:10 ID:???
自分の基準だって経年変化する。
180nobodyさん:05/02/06 13:32:38 ID:???
Windows環境でPerl5+Apache1.3.xでサーバ動作させています。
複数ファイルのCRC16チェックを行い、その結果を表示するCGIを作ったのですが
1ファイル毎に結果が送られなくて、10個ほど毎にブラウザに返してきます。
これを1個づつこまめにレスポンスを送るにはどうすれば良いのでしょうか?
Unixの場合は $|=1 等で手段が有るようですが、Windows環境では無理でしょうか?
181nobodyさん:05/02/06 14:53:09 ID:???
>>180
スレ違い

△▲ WebProg 初心者の質問 Part11 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1101635909/
182180:05/02/06 14:55:56 ID:???
そうでしたか、向こうに再度カキコしてきました
183nobodyさん:05/02/06 16:44:56 ID:fwG0kktY
シロートな質問ですいません。
テキストエリアに表示させる時、改行文字は何になるのですか?

<TEXTAREA COLS=65 ROWS=5 NAME=\"ets\">$ets</TEXTAREA>
と記述し、$etsのデータの改行したいところに\nとか\rとか\r\r\nとか
入れてみたのですが、そのまま表示されます。
184nobodyさん:05/02/06 16:46:35 ID:???
>>183
スレ違い

△▲ WebProg 初心者の質問 Part11 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1101635909/
185nobodyさん:05/02/06 17:25:47 ID:???
え?
186nobodyさん:05/02/06 17:28:45 ID:???
いやそれは半分は合ってるんじゃw
$ets = '〜\n'; みたいにシングルクオーテーションだと \n 、
$ets = "〜\n"; みたいにダブルクオーテーションで書けば 改行 で入ると思う。
187nobodyさん:05/02/06 17:43:51 ID:???
遅かった・・・orz
188nobodyさん:05/02/06 17:49:02 ID:???
誘導荒しの登場か…。

>>187=>>186
ドンマイ。
189nobodyさん:05/02/06 17:51:47 ID:???
つーか、初心者スレなんだから、問題の切り分けも含めて質問なんじゃないの?
普通に質問に答えてあげればいいと思うが。
190nobodyさん:05/02/06 18:27:41 ID:???
>>189
同意。

誘導するなら、その根拠を質問者に示してあげられるといいと思う。
191nobodyさん:05/02/06 18:27:46 ID:fwG0kktY
>>186-189
ありがとうございます。
まだうまく行きませんが、WebProg 初心者の質問 Part11の方で
継続して質問しています。
192nobodyさん:05/02/06 18:29:04 ID:???
>>189
お前がどう思っているかは関係ない。
193nobodyさん:05/02/06 19:08:28 ID:???
>>192
お前がどう思っているかも関係ない。
194nobodyさん:05/02/06 19:29:14 ID:???
覚え立ての誘導をやってみたかんたんだよ。

自治初心者スレとか必要だな(w
195nobodyさん:05/02/06 23:57:25 ID:???
やってみたかんたんを流行らせたい。
196nobodyさん:05/02/07 10:09:59 ID:Xo+VK5jq
メールアドレスを入力してもらってそこに特定の文字列を送るというCGIを作成してます。
メールアドレスをそのまま入力してもらうと正規表現がたいへんなので、
@はこちらで用意して左辺と右辺を別々に書いてもらうことにしました。

入力スペース @ 入力スペース

こんな感じです。そして不正なアドレスだと感知したらメールを送るのをやめます。
右辺は英数字とピリオド以外が混入していたら中止。
左辺は何が混入していたら中止にすればいいのでしょうか?

確かメールアドレスに含んでよい記号ってかなりありますよね;
@を除いてそれら以外が混入してれば中止とすれば安全なのでしょうか?
197nobodyさん:05/02/07 10:28:38 ID:???
素朴な疑問です。
よくXSS対策などと言いますが、リファラーを取ってマッチングしない場合は
別の処理をするみたいな事をすればXSSなんて起こりませんよね?

もちろん結局はしないと変なスクリプト掲示板に埋められたり、注文客が
思いっきりスクリプト攻撃したりということがありますが、それってXSSでは
ないですよね。

つまりXSS対策って実はリファラーだけ取れば回避できるんですよね?
それともXSSっていうのの意味には前段落で挙げたようなことも含まれているんでしょうか?
198sage:05/02/07 10:41:49 ID:+1BETA+W
>>196
既存のスクリプトを使用した方が早くないか?
>確かメールアドレスに含んでよい記号ってかなりありますよね
普通はアルファベットと数字、アンダーバーやハイフン程度だろ

>>197
しかしそう簡単にはリファラーを渡さないのがノートン先生ですよ
199196:05/02/07 10:55:01 ID:Xo+VK5jq
>>198
ドメイン側は
$domain =~ /[^\w\.]/;
としていてこれにマッチするなら不正と考えます。
ユーザ名側は確か通常URIに含められる文字列なら全て含めることができたような記憶があるんですよね;

print MAIL "to: ".$user.'@'.$domain."\n";

みたいにするんですが、UNIXには詳しくないのでどういう文字列を渡すと危険なのかが
把握できていません・・・

$user =~ /[^\w\-]/;
これだと実際には正常なアドレスなのに送れないケースが出てくると思うんですよね。
やはり既存のフォームメールスクリプトを探すのが早いですかね?
さっきPerlメモ読みましたが、ユーザ名側で何をエスケープするべきかは書いてなくて
ややこしいコードだけがありました。

ユーザ名側に含めることができる記号一覧があるRFC文書を探してますが、
英語に悪戦苦闘ですorz
200nobodyさん:05/02/07 10:55:14 ID:???
>>196
正規表現以外でやろうとする方が大変。
ちなみに携帯のメールアドレスとか規格に則してなかったような。

>>197
リファラは偽装できる。
201197:05/02/07 11:15:16 ID:???
そういうことか・・・・・・
やっぱ俺って天ちゃんなのね
202nobodyさん:05/02/07 11:15:29 ID:???
>>196
>>198
メールアドレスのローカルパートって他の世界のメールシステムとの
やりとりもありうるので適切にエスケープすればほぼなんでもありの
仕様になっています。rfc2821の4.1.2にBNFがあるのでLocal-partって
とこを見ればいいですが、「"」でくくってQuoted-stringにすれば\を
前に置くことでCR,LF以外の任意の文字を書くことが出来ます。

くくらない場合は、英数字または「!#$%&'*+-/=?^_`{|}~」からなる1文字
以上の文字列、またはそれをを「.」をはさんで複数つなげたものが許され
ます。ただし、一部のケータイなどで連続した「.」を含んだり末尾が「.」
で終わる仕様に違反したアドレスを許しているので、あまり厳しくチェック
すると文句がでるかもしれません。

これを気にしなくてよければEmail::Validそのままでいいんだけどね。


203nobodyさん:05/02/07 11:16:20 ID:???
2chが使ってる公開串リストによる規制が簡単に組み込めるみたいなので
http://bbq.uso800.net/code.html
にあるBBQによる方法で導入してみました
動作確認したいのですが公開串って何処で公開されてるんでしょうか
204nobodyさん:05/02/07 12:26:41 ID:???
>>196
perlに関係ないじゃん。
rfcでアドレスに使える文字を調べないさいよ。

>>203
板違いだね。
初級ネット板かセキュリティ板へ。
205nobodyさん:05/02/07 13:02:28 ID:???
>>201
天然ちゃん?
206nobodyさん:05/02/07 13:24:25 ID:???
>>203こそ誘導すべきなのに、誘導厨は、いつも見当外れだな。
207nobodyさん:05/02/07 13:29:03 ID:???
誘導されてるけど?
208nobodyさん:05/02/07 15:47:18 ID:???
ファイルを開いて書き込み中に他のプロセスがファイルを開けて囲うとすると
壊れますよね。
いわゆる排他処理って言うと思うんですが、今まで一度もやったことがありません。

Perlの経験はネットショップをmysqlとの連携で構築したりその他ちまちましたものばかりです。
基本的にファイルではなくDB連動ばかりだったので勝手に排他処理をしてもらってたせいで。

どこかPerlでやる排他処理について詳しいサイトありますか?
一応windowsでもUNIXでも共通の方法を探してます。
209nobodyさん:05/02/07 16:15:16 ID:???
>>208
排他処理は難しい
多分このスレの半分はできないだろう
それくらい難しいし面倒だ
210nobodyさん:05/02/07 19:09:05 ID:???
>>207
今回は違う人が誘導したんでしょ。
誘導厨フォーマットじゃないし。



>>000
スレ違い

△▲ WebProg 初心者の質問 Part11 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1101635909/
211未承諾広告※ ◆TWARamEjuA :05/02/07 19:20:38 ID:???
>>203
【BBQ 3本目】公開串登録所 【ピンポイント規制】
http://qb5.2ch.net/test/read.cgi/sec2chd/1105274729/l50

ここを眺めればいくらでも(w
212nobodyさん:05/02/07 20:05:31 ID:???
>>210
おまい何でそんなに必死なん?
213nobodyさん:05/02/07 21:02:12 ID:???
誘導厨の方が、明らかに必死だ罠
214nobodyさん:05/02/07 21:42:44 ID:???
いいや、反応してるほうが相当に必死に見える。
215nobodyさん:05/02/07 21:54:28 ID:???
nfkやmob_PaqlだったらFLOCK最強!
216nobodyさん:05/02/07 21:57:08 ID:???
>>215
お前のエンゲージリングはプルタブ
217nobodyさん:05/02/07 23:02:26 ID:???
だから誘導してみたかったんだけだろ
218nobodyさん:05/02/07 23:05:47 ID:???
# main.cgi
#!/usr/bin/perl
require './require.pl';
&hogehoge;
# hogehoge2を呼び出さずに終了
exit;
-------------------------
# require.pl
sub hogehoge{
(中略)
}

sub hogehoge2 {
(中略)
}
--------------------------

この場合に呼び出していない、require.plのhogehoge2はコンパ
イルされるのでしょうか。
それとも、呼び出さなければコンパイルされないのでしょうか。
教えていただければ幸いです。
219nobodyさん:05/02/07 23:18:56 ID:???
220nobodyさん:05/02/07 23:34:49 ID:???
>>218
コンパイルされるはず。

それをなんとかしたければAutoLoaderについて調べてみるといい。

221nobodyさん:05/02/07 23:39:55 ID:Cfgr4b2r
>>196
Email::Valid
Email::Valid::Loose
Docomoの変なのもおっけ
到達可能かもみます
222nobodyさん:05/02/07 23:43:35 ID:???
>>220
コンパイルされますか…

# main.cgi
#!/usr/bin/perl
$_ = 1;
if ($_ == 1){ require './require1.pl }
elsif ($_ == 0){require './require2.pl'}
&hogehoge;
# require2.plを呼び出さずに終了。hogehoge2を
# コンパイルしない分負荷が減る
exit;
----------------------
# require1.pl
sub hogehoge {
(中略)
}
----------------------
# require2.pl
sub hogehoge2 {
(中略)
}
-----------------------
みたいな感じで別ファイルにして対処しようと
思います。ありがとうございました。
223nobodyさん:05/02/08 02:09:22 ID:???
そんなんで負荷が減るとでも?
224nobodyさん:05/02/08 02:15:40 ID:???
つまんないことに熱心になるやつっているもんだな。
225nobodyさん:05/02/08 02:54:05 ID:???
ああ、誘導とか?
226nobodyさん:05/02/08 03:39:12 ID:???
いや、その誘導に拘っていつまでもグダグダ言ってるやつのこと。
227nobodyさん:05/02/08 03:43:09 ID:???
誘導を注意してる奴って複数居るけど、誘導厨って一人だよね?
なんでこんなに即レスなの?
228nobodyさん:05/02/08 03:51:50 ID:???
暇なんじゃない?
229nobodyさん:05/02/08 13:26:19 ID:???
誘導を注意してる奴のほうが一人だろ。
いつも誘導に反応する奴なんてまったくいないのに。
何人もいるように見せかけているが、近い時間に書いてるし。

いずれにしても注意してるヒマがあったら、ここでも誘導先でも
答えてやればいいのに。
230nobodyさん:05/02/08 15:05:46 ID:???
>>224-229
暇だなお前ら。

>>231
質問ドゾ。
231nobodyさん:05/02/08 16:47:26 ID:???
>>230
ご趣味はなんですか?
232nobodyさん:05/02/08 16:58:30 ID:???
ショップとか掲示板とか何ページあろうが1個のCGIで済ませるときって
みなさんはページ移動をどうやってますか?

私は今まで
if ( $form{page} eq "hoge") {#hogeページの処理

}elsif( $form{page} eq "hage" ){#hageページの処理
}

こうしてました。で、ふと思ったのですが、もしかしてページごとにサブルーチンに
しておいて、$form{p}の値を見てどのルーチンを呼ぶかを分岐させた方が
わかりやすいかもって。

みなさんはどうやってますか?
233nobodyさん:05/02/08 17:00:00 ID:???
>>232
ページごとに小さかったらサブルーチン、大きかったらファイルに分けちゃう。
234nobodyさん:05/02/08 18:38:16 ID:???
>>229
誘導厨には誰も賛同しないからレスが着いてないだけだろ
235nobodyさん:05/02/08 18:48:30 ID:???
お!注意厨が現れたね。
同じぐらいに時間に登場とはわかりやすい。
236nobodyさん:05/02/08 19:24:33 ID:???
なんか、道ばたでタバコ吸ってるの注意されたけど、
お前に何の権利があるんだよとか、いちいち注意してんじゃねーよとか
意味不明な反抗をする高校生みたいになってきてるな。
237nobodyさん:05/02/08 19:25:19 ID:???
あと、こんな時間に見回りなんてヒマだなとか、お前の息子だってやってんだろ?とか言うな。
238nobodyさん:05/02/08 21:06:40 ID:???
>>232
4つぐらいならifで分岐させるけど、
それより多くなったらテーブル使うかな。
239nobodyさん:05/02/08 21:45:37 ID:???
画像掲示板でHTMLを書き出すタイプのスクリプトを組みました。
そこで画像サイズを取得し、<img width="***" height="***" src="***">のように書き出そうと
Image::Size を使用しようとしましたがサーバーにはインストールされておらず、 Size.pm を設置する事にしました。

ローカルでは README.win32 に書かれたとおりの編集をし
perl/site/lib/Image/Size.pm に置く事で動きました。

サーバーに設置する事も想定し、スクリプトのあるフォルダに
lib/Image/Size.pm と設置し、スクリプトに use lib "lib"; の記述で動くことも確認しました。

そして、サーバーに同様の構造で「未編集」の Size.pm を設置しましたが動きませんでした。
# 正確にいうと ($width, $height) = imgsize("$file_name"); で止まるようです。
しかし、 README.win32 に書かれた編集を施した Size.pm では無事に動きました。

実際にした編集というのは use AutoLoader 'AUTOLOAD'; と __END__ の2行を消しただけです。

何故、 Win 用の編集で動くようになったのでしょうか?
動くようになったこと自体はいいのですが、サーバー側に迷惑をかけてる可能性はありますでしょうか?
240質問:05/02/08 22:09:04 ID:???
tsv形式のデータをcgiで呼び出してリスト表示(html) 内容は担当者名や企業名、案件の内容等
 ↓
表示したリストからpptファイルへリンク

これって出来ますか
241nobodyさん:05/02/08 22:12:18 ID:???
>>239が生きていること自体が世間に迷惑をかけている。
242nobodyさん:05/02/08 22:16:03 ID:???
>239
君が初心者なのはわかった。
でも君がやろうとしてる事はちょっとだけ初心者の域を抜けかけてる。
初心者が下手にやると危険。
中級者になってから挑んでください。
243239:05/02/08 22:44:01 ID:???
レスありがとうございます。
危険な事だという事はわかりましたので、素直に Image::Size を
サーバー管理者にインストールして貰うようにメールしてみます。

あと、私の犯した過ちは Win 用のファイルをあげた点で間違いないでしょうか?
244nobodyさん:05/02/08 23:20:35 ID:???
つーか主要な画像(JPEG, PNG, GIF)のサイズくらいなら、
自分のスクリプト内に、サイズ求めるソース組みこだらいい。
検索したら何かあるでしょ。
245239:05/02/08 23:36:14 ID:???
>>244
そうですね。私にはまだモジュールは早すぎたようです。
勉強して出直してきます。

レスありがとうございました。
246nobodyさん:05/02/09 00:34:32 ID:???
>>239
いいや。今のまま使い続けても、何も心配する必要は無い。
Image::Size は様々な形式の画像ファイルのサイズを得る機能を有しているが、
ある特定の形式(例えばgif)のみのサイズを得たい場合
には、その形式に必要な機能のみを、メモリに展開すれば済む。
そこで、実際に指定された画像形式に応じて必要な機能のみを
実行時にメモリに展開するのがAUTOLOADだ。

> 実際にした編集というのは use AutoLoader 'AUTOLOAD'; と __END__ の2行を消しただけです。
それをやると、Image::Size が対応しているあらゆる画像形式の
機能が全てメモリに展開されることになる。だから、メモリ容量が
多少無駄になるが、特に支障があるというわけではない。
247nobodyさん:05/02/09 00:52:14 ID:cKLRZBQZ
民明書房刊「イメージとメモリ〜鈴木支障と世界の中田〜」より
248nobodyさん:05/02/09 07:37:58 ID:???
8文字以上の文字列の暗号化を行いたいのですが
cryptは8文字目以降は無視するようなので
crypt以外で8文字以上の文字列を暗号化する良い方法を教えてください
249nobodyさん:05/02/09 07:42:47 ID:???
>>248
8文字ごとに切ってcryptする
250nobodyさん:05/02/09 08:23:26 ID:???
>>248
MD5で暗号化する
251nobodyさん:05/02/09 10:13:54 ID:???
ず〜っとハマってるんですが・・・
CGI.pmを使用して、クライアントからファイルのアップロードをさせたいのですが・・・
コードはこちらです。

#!/usr/bin/perl

use strict "vars";
use strict "subs";
use CGI;

print "Content-typt: text/html; charset=euc-jp\n\n";

our $fh;
our %columns{upload_file} = $query->param(’upload_file’);

&hozon();

sub hozon() {
 my $query = new CGI;
 $fh = $query->upload(’upload_file’);
 print ”$fh<BR>”;
 while(<$fh>) {
  print "$_<BR>"
 }


というコードだと、ブラウザにwhileの中の$_の内容を出力できないのです。
print ”$fh<BR>”;はきちんとファイルパス名が出力されます
ここでour $fhと宣言しますが、これを削除し、
my $fh = $query->upload(’upload_file’);
とローカルとして宣言するとブラウザに出力される事になります。
何が原因なんでしょうか?
252nobodyさん:05/02/09 10:50:26 ID:???
>>251
空白や記号が全角になってるのを半角に直してperlに食わせてみたが
そもそも構文エラーでるじゃん。実際におかしいものと違うコードを
見せられてもなぁ。

253251:05/02/09 11:20:40 ID:???
>>252
まじっすか?

ごめんね。
ちょっとチェックしますね。
254251:05/02/09 11:27:13 ID:???
すいませんでした。
書き込むときってみやすいように全角使ったんですけど、
こういうのって直接コード書いたほうがいいんですかね?

#!usr/bin/perl

use strict "vars";
use strict "subs";
use CGI;

print "Content-typt: text/html; charset=euc-jp\n\n";

our $fh;
our %columns;


&hozon();

sub hozon() {
my $query = new CGI;
$columns{upload_file} = $query->param('upload_file');
$fh = $query->upload('upload_file');
print "$fh<BR>";
while(<$fh>) {
print "$_<BR>";
}
}
255nobodyさん:05/02/09 11:54:12 ID:???
複数行をコメントアウトするにはどう書いたらいいんでしょうか?
Cでいったら/* */見たいなやつです。
256nobodyさん:05/02/09 12:00:37 ID:???
>>255
ググればすぐ出てきます。
257nobodyさん:05/02/09 14:01:11 ID:???
>>254
Content-typtという打ち間違いがある状態でまともに動いて
いるとは思えないのだが、そのコードでちゃんとおかしな現象が
再現してるのを確認してるかい? おかしい現象が起きてるものを
そのまま出してもらわないと付き合いきれんよ。

ちなみにそのtypoを直して実行してみたところ、そのコードで
普通にファイルの中身も出力された。

258251:05/02/09 14:43:07 ID:???
ごめん。
実際に動かしているコード
#!/usr/bin/perl

use strict "vars";
use strict "subs";
use CGI;

print "Content-type: text/html; charset=euc-jp\n\n";

our $fh;
our %columns;

&hozon();

sub hozon() {
my $query = new CGI;
$columns{upload_file} = $query->param('upload_file');
$fh = $query->upload('upload_file');
print "$fh<BR>";
while(<$fh>) {
print "$_<BR>";
}
}
やっぱりこれで、ブラウザに表示されないですね。
$fhにはC:\Documents and Settings\hogehoge\デスクトップ\新規テキスト ドキュメント.txtと出力されます。
$fh = $query->upload('upload_file');  を my $fh = $query->upload('upload_file');  にして
our $fh; を #our $fh;
にするとすべてブラウザに出力されますね。

リファレンスとか絡んでるんだろうか?
259nobodyさん:05/02/09 16:03:09 ID:XVTcbf3E
ファイルにcsvもどきみたいな感じで
時間,名前,コメント
時間,名前,コメント
時間,名前,コメント
というようなデータの列挙が1000件以上あります。
これを元に色々な処理をしたいので、ハッシュに入れようと思ったけど、キーがないので入れられません;
1000件以上になるのでabcd...なども無理です。

そこで「a行数」のキーを与えようかとも思ったのですが、論理的なキーではないのでイマイチ気が乗りません。
何か良い方法はないでしょうか?普通はこういうときってどうするのでしょうか?

やはり「a行数」というキーを持たせるしかありませんか?
260nobodyさん:05/02/09 16:05:36 ID:???
キーが無いならハッシュでなく配列に入れれば良いような気がするけど
特にハッシュにしなきゃいけない理由って何かあるの?
261nobodyさん:05/02/09 16:07:48 ID:???
キーは数字からはじまってもいいんだよ。
262nobodyさん:05/02/09 16:11:56 ID:???
>>258
手元で試した限りではそのままで出ますね。

263259:05/02/09 16:15:15 ID:XVTcbf3E
>>260
そうか・・・・・
>>261
それは知りませんでした;

しかし>>260さんが言うようにa行数のようにしたい時点で配列を使えばいい状況
ということですねm(_ _)m
配列の中にリファレンスでいれておきます。解決です。ありがとうございました!
264nobodyさん:05/02/09 16:16:02 ID:???
>>259
配列に入れちゃダメなの?

open(FHIN,'csvfile') or die "can not open csvfile\n";
$i = 0;
while(<FHIN>) {
($time[$i],$name[$i],$coment[$i]) = split(/,/,$_);
}

とかで、いろいろ出来ると思うけど。

逆の他の人に聞きたいのは
while(<FHIN>) {
@datas[$i] = split(/,/,$_);
}
とかで
@datas0にデータ入れて
じゅんじゅんに
@datas1とかに入れるのってどうやってやんの?
265nobodyさん:05/02/09 16:16:49 ID:???
>>264
インクリメント忘れた
266251:05/02/09 16:27:57 ID:???
俺の環境じゃダメだわ、もう逝くわ

みんな、ありがとう。

いい夢みろよ!!
267nobodyさん:05/02/09 16:51:03 ID:???
>>264
#!/usr/bin/perl -w
my @data;
chomp, push @data, [ split /,/ ] while <DATA>;
print $data[1][2]; # h
__DATA__
a,b,c,d,e
f,g,h,i,j
k,l,m,n,o

http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldsc.html
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perllol.html
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlref.html
268nobodyさん:05/02/09 17:27:25 ID:???
>>264
pushだろ

って書こうとしたら267に先越された
269nobodyさん:05/02/09 17:31:30 ID:???
>>267
chomp, push @data, [ split /,/ ] while <DATA>;

はいくらなんでも詰めすぎじゃないかと。

普通に書くなら

while (<DATA>) {
chomp;

push @data, [ split /,/ ];
}

ぐらいじゃないかなー。
270nobodyさん:05/02/09 17:54:45 ID:???
>>269
そうかくと分かりやすいね。
271nobodyさん:05/02/09 18:59:46 ID:???
人それぞれじゃない?
私は
chomp, push @data, [ split /,/ ] while <DATA>;
の方が直感的に頭に入ってくるな
272nobodyさん:05/02/09 19:02:07 ID:???
育ってきた環境かね?
俺ってオライリーのperl本で勉強したから
>>269がわかりやすいなぁ
273nobodyさん:05/02/09 20:09:21 ID:???
上我流
下主流
274nobodyさん:05/02/09 21:09:26 ID:???
だな。
275nobodyさん:05/02/09 22:00:05 ID:???
オライモンのperl CGIってのあると思うけど、
あれ面白い?っていゆーか実践的な内容?
276nobodyさん:05/02/09 22:19:03 ID:oNgMiBuj
リダイレクトで'Location:http://hogehoge/'と出力させるとGETメソッドでしか
データを送ることができないと思うのですが、POSTで送る方法などはありますか?
277nobodyさん:05/02/09 23:07:01 ID:???
278nobodyさん:05/02/10 02:07:22 ID:???
@hoge=<IN>;
とするとき、改行\nを消す方法があれば教えてください
279nobodyさん:05/02/10 02:36:02 ID:???
@hoge=<IN>;
chomp @hoge;
280nobodyさん:05/02/10 03:26:26 ID:???
use strict;

$::info{'no_dir'} = [ q[test], q[test2] ];
BEGIN {
  #▼なんかディレクトリからファイルを返す関数
sub file_list (&$;$) {

  my ($code, $dir_name, $mode) = ($_[0], $_[1], $_[2]);

  my $pass;
    {
      $pass = $dir_name . q[./], last if(qq[\l$mode] eq q[p] or !$mode);
      $pass = "", last if(qq[\l$mode] eq q[f]);
    return();  #モードが変なのは処理しない。
    }
  opendir DIR, $dir_name or return ();
     my @file_list = grep{ $_ = $pass . $_; &$code; } (readdir DIR);
  closedir DIR;
  foreach my $file (@file_list){$file =~ s[/\./][/]g;}

  return(@file_list);

  }
281nobodyさん:05/02/10 03:27:00 ID:???
#▼対象ディレクトリ全取得
{
search($::info{'pass'});    #対象ディレクトリ全検索

sub search {
  foreach my $dir (@_){
    my @list;
      @list = file_list {  #ディレクトリ全取得
        -d                      #範囲をディレクトリに絞って…
      and !(m/[\/\.]+$/)                #自己参照ディレクトリの類は排除して…
      and my $now_dir = $_            #ちょっとキモい処理をして…
      and !( grep { $now_dir =~ m[/$_$]; } @{$::info{'no_dir'}} )  #除外指定ディレクトリは無視。ところがこれがエラー
      } $dir;
      @list = map {$_ . '/'} @list;    #なんかUNIXではこれやらないとダメっぽい。(winではいらない)

    push @::dir_list, @list;      #ディレクトリ追加
    search(@list) if(@list);      #ディレクトリがまだあったら再帰
    }
  }
}

282nobodyさん:05/02/10 03:27:47 ID:???
and my $now_dir = $_ #ちょっとキモい処理をして…
and !( grep { $now_dir =~ m[/$_$]; } @{$::info{'no_dir'}} ) #除外指定ディレクトリは無視。ところがこれがエラー

↑ここんことが変になるんですけど、どーしたらいいんかね?
283282:05/02/10 03:32:30 ID:???
あ、上げるの忘れてた。
あと、>>280の最後んとこでBEGINブロック閉じるの忘れたのは突っ込まないで。
284nobodyさん:05/02/10 05:12:42 ID:FuWRzUOO
スレ違いだったすいません。
新しいサイトでフォームを使いたいのですがうまくいきません。
書き込み用のform.html(仮名)とform_mail.cgiは古いサイトでは
フォームの送信後メールがちゃんと届いたのですが、
新しいサイトでは何故か機能しません。
cgiのパールへのパスとドメイン所属のメールアドレス、
form.html内のform_mail.cgiへのパスは正しく書き換えている
(つもり)のに。。。ディレクトリーも同じように設定してます。
フォーム送信にhtmlとcgiファイル以外でしなければいけない事、
必要なファイルってありますか? 
ひとつ疑問に思ったのは古いサイトではcgiのパーミッションを入力して
再接続すると前回に入れた数字(755)が残るのに、
新しいサイトでは入力後に再接続してもその数字は残っていません。
あとフォームを機能させるためにhtaccessって必要ですか???? 
分かる人どうか宜しくお願いします!!
285284:05/02/10 05:14:53 ID:FuWRzUOO
284ですが、CGI質問スレ発見 あちらで聞きまスルー。
286nobodyさん:05/02/10 09:55:26 ID:GQajLbsS
if (条件a){
$a = 1;
}elsif(条件b){
$a = 2;
}else{
$a = 0;
}

これを1行ないし2行で収めることはできませんか?
?演算子を使えばできるかと思ったのですが、3つは無理みたいで;
知恵をお貸し下さいm(_ _)m
287nobodyさん:05/02/10 10:09:46 ID:???
>>286
$a = 条件a? 1: 条件b? 2: 0;

で普通にいけると思うけどなんか変になるのかね?
条件の部分は場合によってはカッコいるかも。
288286:05/02/10 10:25:55 ID:GQajLbsS
>>287
!?
そういうのもありなんですねm(_ _)m
289286:05/02/10 11:06:28 ID:GQajLbsS
追加質問ですみませんが、以前から気になっていたことがありまして;

XSS対策にメタ文字エスケープをするときってCGI関係ではよくありますよね。
基本的には埋め込む直前にケースバイケースのエスケープをするのですが、
みなさんはどうやってますか?

元の文字列を加工したものを『他の新しい変数に入れて』ますか?それとも
『元の変数に上書き』してますか?
後者だと元データがなくなるので何かと不都合の原因になりますよね。
しかし新しい変数を用意すると、色々なところで色々なエスケープが必要になるので
だんだん頭がこんがらがります;簡潔性を欠くといいますか・・・
290nobodyさん:05/02/10 11:42:53 ID:???
>>289
俺は普通に上書きしてる
>元データがなくなるので何かと不都合の原因になりますよね
これの意味がわからん。必要なときは元に戻せばいいじゃないか。不可逆変換やってるわけじゃないんだから。
291nobodyさん:05/02/10 11:45:26 ID:???
>>289
私は最終出力時にエスケープ派であります。といっても
最近はほとんどテンプレートライブラリ使うので、テンプレート
側でエスケープ形式を指定するだけのことがほとんどですが。
292286:05/02/10 13:35:23 ID:GQajLbsS
>>290-291
ありがとうございます。

やはりみなさんそれぞれなのですね。
見易さ・わかりやすさの点でやはり変数を用意したほうがいいのかなと思ってます。
%form
%form_html
%form_sql
現在こういう感じです。
293nobodyさん:05/02/10 13:58:59 ID:???
>>292
SQLはプレースホルダ使うのでデータをエスケープすることは
ないなぁ。
294nobodyさん:05/02/10 15:15:16 ID:???
mysqlのテーブルにデータを挿入時にユニークキーとして任意の数字列を使っています。(挿入時に重複でインクリメント)
インクリメントのせいで、一度入れないとユニークキーが何かわからないのですが
挿入した直後にそのユニークキーを表示させたいのですが、どうすればいいでしょうか?

ユニークキー以外は重複している可能性が十分にあるデータ群なので、途方にくれています

そのプロセスが今挿入したデータに挿入時に自動的につけられたユニークキーが
何だったのかを調べるにはどうすればいいでしょうか?
295nobodyさん:05/02/10 15:21:20 ID:???
>>294
無理だろ。
だって極端な話にすれば、ユニークキー以外が全部同じ内容のものなら
自分のユニークが何なのかを調べる方法なんてない。
296nobodyさん:05/02/10 15:27:41 ID:???
DBI使ってるならインクリメントしたかどうかを調べられたんじゃなかったか?
最近使ってないから忘れたw
297nobodyさん:05/02/10 15:36:08 ID:???
面倒な方法だが、プロセスIDと挿入時の時間もとっておけば
それを元に取り出せるけどな。
まぁそのためだけに二つもフィールドを増やすのはあまり気分がよくないわな。
298294:05/02/10 15:57:58 ID:???
>>295
そうなのですかorz
実際にどういうデータが入ったかを確認するすべはないんですね…
>>296
本当ですか!?DBI使ってます。調べてみます。
>>297
そのためだけに増えるのはちょっとしんどいですよねorz

自分が挿入したレコードに付けられたユニークキーを調べることができないって…
つまり自分が何を入れたのかを確実に調べる方法が用意されてないってことですよね;
299nobodyさん:05/02/10 16:19:29 ID:???
>>298
俺いまPostgreでユニークキーをインサートするためにやっているのが、
普通に順序のテーブルからnextvalでとってきて、
INSERTするときにnextvalからとってきてのをvalueで指定してるけど、
その考え方はだめ?
300nobodyさん:05/02/10 16:53:46 ID:???
>>294
autoincrementじゃいかんの
301294:05/02/10 17:06:32 ID:???
>>300
いえ、ユニークキーがautoincrementになってるので、実際に挿入するまでは
どういうユニークキーになるのかわからないんです。
それで挿入した本人に自分が今入れたユニークキーを知らせることができずに困ってるのです。

>>299
nextvalって使ったことないです。ちょっと勉強してきます。
302nobodyさん:05/02/10 19:29:44 ID:???
>>301
auto_incrementならば、select last_insert_id()で取り出せるし。
http://dev.mysql.com/doc/mysql/ja/miscellaneous-functions.html
> LAST_INSERT_ID([expr])
> AUTO_INCREMENT カラムに挿入された値のうち、最後に自動生成された値を返す。
> mysql> SELECT LAST_INSERT_ID();
> -> 195

>>294の説明では、自前でユニークキーを作成しているみたいに読めるが。
SQLの問題だね。
303nobodyさん:05/02/10 19:37:17 ID:???
>>282
use vars qw(%info @dir_list);

$info{no_dir} = { map{$_ => 1} qw(test test2) };

...

{
search($info{path}); #対象ディレクトリ全検索

sub search
{
my @dirs = @_;

foreach my $dir (@dirs){
my @list = map{$_. '/'} file_list { #ディレクトリ全取得
-d #範囲をディレクトリに絞って…
and !(m/[\/\.]+$/) #自己参照ディレクトリの類は排除して…
and !$info{no_dir}->{(m|/([^/]+)$|)[0]} #除外指定ディレクトリは無視。
} $dir;

push(@dir_list, @list); #ディレクトリ追加
search(@list) if(@list); #ディレクトリがまだあったら再帰
}
}
}
ちょっと書き換えちゃったけど、適当に戻しておいて。
304nobodyさん:05/02/10 19:40:55 ID:???
変数【$bbb】の後ろに【.txt】と書きたいのですが、どう区別したらいいのでしょうか?

my $aaa = "$bbb.txt";
305nobodyさん:05/02/10 19:49:39 ID:???
>>304
区別って$bbbと".txt"の境界をはっきりPerlに伝えたいってこと?
とりあえず、"."は変数の一部とは見なされないから、そのままでもOKだけど、
もっと安全に書きたいというのなら、

my $aaa = $bbb . ".txt";
my $aaa = "${bbb}.txt";
306304:05/02/10 19:59:43 ID:???
>>305  サンクス

でもできない...  他にない?
307nobodyさん:05/02/10 20:24:57 ID:???
>>306
なぜ出来ないの?
308282:05/02/10 20:46:53 ID:???
>>303
やべー。恥ずかしい。pathとpassを間違いまくってた。_| ̄|○
そっか、ハッシュを使うんですね。ハッシュ。
しかも所々細かいアドバイスありがとう。
って事で今からテストしてきます。

309304:05/02/10 21:41:23 ID:???
変数に複数行のHTMLを格納したいのですが、できますか?
310nobodyさん:05/02/10 21:46:11 ID:???
$sazae = "<p>でら<br />\nべっぴん</p>";
311nobodyさん:05/02/10 21:50:00 ID:???
>>504 

$sazae = "

<table width=675 border=0 cellspacing=0 cellpadding=0 height=5>
<tr>
<td><img src="http://img.yahoo.co.jp/images/clear.gif" alt="" width=1></td>
</tr>
</table>

";
312nobodyさん:05/02/10 22:23:33 ID:???
>>304
$masuo = <<"EOM";
<p>
でら<br>
べっぴん
</p>
EOM
313nobodyさん:05/02/10 22:24:27 ID:???
>>311
エスケープ汁。バーヤ。
314nobodyさん:05/02/11 01:43:21 ID:???
Win2000環境にてAN HTTPD+Perlで2chの板一覧を取得したいと考えています。
しかし、「www6.ocn.ne.jp」からは取得できますが、「www.ff.iij4u.or.jp」からは「Access Denied」となります。
当然ブラウザからならアクセス可能。User-Agent等を変えてもうまくいかず・・ご助言宜しくお願いします。

#!/usr/local/bin/perl -w
use Socket;

#$address = "http://www.ff.iij4u.or.jp/~ch2/bbsmenu.html";
#$host = "www.ff.iij4u.or.jp";

$address = "http://www6.ocn.ne.jp/~mirv/2chmenu.html";
$host = "www6.ocn.ne.jp";

$myagent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)";
$rhost = "hoge.com";
$port = getservbyname('http','tcp');
$iaddr = inet_aton($host) or die "aton-err\n";
socket (SOCKET,PF_INET,SOCK_STREAM,getprotobyname('tcp'));
connect(SOCKET,sockaddr_in($port,$iaddr));
binmode(SOCKET);select(SOCKET); $| = 1; select(stdout);
print SOCKET "GET $address HTTP/1.0\r\n";
print SOCKET "Host: $host\r\n";
print SOCKET "User-Agent: $myagent\r\n";
print SOCKET "Accept: */*\r\n";
print SOCKET "Accept-Charset: *\r\n";
print SOCKET "Accept-Language: jp\r\n";
print SOCKET "Referer: http://$host/\r\n";
print SOCKET "Remote-Host: $rhost\r\n";
print SOCKET "\r\n";
while (chop($buf=<SOCKET>)) {print "$buf\n";}
close(SOCKET);
exit;
315nobodyさん:05/02/11 02:07:19 ID:???
LWP使(ry
316nobodyさん:05/02/11 02:29:31 ID:???
#!/usr/local/bin/perl -w
use Socket;

$address = "http://www.ff.iij4u.or.jp/~ch2/bbsmenu.html";
$host = "www.ff.iij4u.or.jp";



$myagent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)";
$rhost = "hoge.com";
$port = getservbyname('http','tcp');
$iaddr = inet_aton($host) or die "aton-err\n";
socket (SOCKET,PF_INET,SOCK_STREAM,getprotobyname('tcp'));
connect(SOCKET,sockaddr_in($port,$iaddr));
binmode(SOCKET);select(SOCKET); $| = 1; select(stdout);
print SOCKET "GET /~ch2/bbsmenu.html HTTP/1.0\r\n"; #ここがおかしい
print SOCKET "Host: $host\r\n";
print SOCKET "User-Agent: $myagent\r\n";
print SOCKET "Accept: */*\r\n";
print SOCKET "Accept-Charset: *\r\n";
print SOCKET "Accept-Language: jp\r\n";
print SOCKET "Referer: http://$host/\r\n";
print SOCKET "Remote-Host: $rhost\r\n";
print SOCKET "\r\n";
while (chop($buf=<SOCKET>)) {print "$buf\n";}
close(SOCKET);
exit;
317316:05/02/11 02:35:22 ID:???
あぁ 途中で書き込んでしまった。

$address =~ m|^http://([-_\.a-zA-Z0-9]+)/?(.*)$|;
$host = $1;
$path = $2;

と付け加えて、

print SOCKET "GET /$path HTTP/1.0\r\n";

と変更すると汎用性があっていいかも。
318294:05/02/11 08:42:07 ID:4xNa2hhv
>>302
ありがとうございます。
ユニークキーは一応Perl側で作成してますが、万が一の重複の可能性を考えて
インサート時にauto_incrementになってます。
なのでユニークキーについては役割は半々ですね。

LAST_INSERT_ID()ではアクセスが集中した時にミスりますよね?
プロセスAが入れる→プロセスBが入れる→プロセスAからのLAST_INSDERT_ID()を処理
=プロセスBが入れたものがプロセスAに渡されてしまうorz
319294:05/02/11 10:01:49 ID:4xNa2hhv
すみませんサイト読んでたらそういうことは起こらないと書いてありましたm(_ _)m
今回のCGIではPerlで半分ユニークキーを作成してますので、auto_incrementする可能性は
ほとんどないので、last_insert_id()がauto_incrementしてない時には初期値の0まま
(もしくは前回値ですが今回はinsert1回しかないので)という仕様を利用して、

my $your_id = $last_insert_id == 0 ? $perl_creat_id : $last_insert_id;

のようにして確実に自分が入れたデータの取り出しが可能になりました。
お世話になりましたm(_ _)m
320nobodyさん:05/02/11 10:31:52 ID:???
よかったね
321nobodyさん:05/02/11 11:11:35 ID:???
activeperl5.6
テスト環境は(local)→winXP
サーバ→Linux

@array = qw/a b c d e f g/;
@arrayの中に7個あります。インデックスは0-6になります。

これをランダムに表示させたいんですが単にrand関数を使っただけでは均等には
なりませんよね?(rand関数自体どこまで完全確率に近づけられているのかはわかりませんが、
それはおいといてください。)

print $array[(rand 6)];
これだと圧倒的に最後の$array[6]だけ選択率が落ちます。
0-5は小数点も付きますが、6だけ付かないのでまあ当然なのですが。

かといってrand 7にして7が選ばれたらマイナス-1するというのではまだ不公平ですよね。
rand 7にして7が選択されたらマイナスもrandで決定するというのも結局
そのときもマイナス7が選ばれる可能性が・・・・次に続けます
322321:05/02/11 11:15:15 ID:???
$number = rand 7;
$number = $number == 7 ? $number - rand 7 : $number;
print $array[$number];

前回言いかけましたがこうしても結局今度は$array[0]が選ばれる可能性がちょっと増える
ので不公平ですよね。

公平に0-6を抽選することはできないのでしょうか?
323nobodyさん:05/02/11 11:40:10 ID:eHptbqsS
>>322

言ってることがよくわかりませんが

http://www.rescue.ne.jp/CGI-BBS/cgi/perl/20020909010545.shtml

このへん読んでみれば?


というかrand関数を使えば均等になるし、ちゃんとrand呼び出す前に
srand関数で初期化してますか?

324314:05/02/11 11:54:58 ID:???
>315-316さま
教えていただいた方法で無事取得できました。
ありがとうございました。
325321:05/02/11 11:56:27 ID:???
>>323
Perl5.1以降は自動的にsrandされてるみたいです。

もしかしてrand 8;
って0-8をランダムに選ぶのではなく0-7(小数点つき)を選ぶんですかね?
確かにprint rand 8;として
>8
となった経験はありませんが、ただ確率が極端に8だけ落ちるからだと思ってました・・・
私の勘違いだったのでしょうか?
326nobodyさん:05/02/11 11:57:37 ID:???
rand(8)は、0以上8未満を返す。
327321:05/02/11 12:23:35 ID:???
>>326
すみませんでしたorz
328nobodyさん:05/02/11 14:06:49 ID:???
print gmtime(time+32400)[5]+1900;

これで今年が何年なのかを表示させようと思ったらエラーがでました。
near ")["
となってたのですがこの形式はダメなのでしょうか?
gmtime(time+32400)自体はリストなので大丈夫だと思ったのですが。
329nobodyさん:05/02/11 14:14:41 ID:???
かっこつけろよ
330nobodyさん:05/02/11 14:14:45 ID:QAwMbYUp
(time+32400)
↑これをリスト扱いしてるでしょ。どう見ても。
331nobodyさん:05/02/11 14:24:46 ID:???
W3C形式の日時を YYYY年 MM月 DD日 hh時 mm分 に変換したいです。

参考
Perlメモ/W3C形式の日時の解析
http://digit.que.ne.jp/work/index.cgi?Perl%A5%E1%A5%E2%2FW3C%B7%C1%BC%B0%A4%CE%C6%FC%BB%FE%A4%CE%B2%F2%C0%CF

2005-02-10T14:54:18+09:00 を変換する場合、どう書けばいいのでしょうか?
332nobodyさん:05/02/11 14:32:58 ID:???

open FH,"+>>test.txt";
seek FH,0,0;
print FH "ファイルの先頭";
close FH;

これを実行したら何故かファイルの末尾にかかれました。
seekが効いてないのでしょうか?
333nobodyさん:05/02/11 14:33:32 ID:???
>>327
init(rand(7));
でいいんじゃね?
334328:05/02/11 14:34:37 ID:???
print (gmtime(time+32400))[5]+1900;
でも同じエラーがでます。
335nobodyさん:05/02/11 14:42:49 ID:???
>>332
+>>
ではseekは使えない。ポインタの移動自体が不可能。
もし先頭に追加したければ一度中身を配列に読み込んでから
unshiftで先頭に入れて上書きするしかない。

>>334
当たり前。かっこなんかつけてどうこうなる状況ではない。
@{[gmtime(time+32400)]}[5]
とすればいい。
336nobodyさん:05/02/11 15:19:23 ID:???
>>334
print((gmtime(time+32400))[5]+1900);
337nobodyさん:05/02/11 15:37:08 ID:???
>>332
">>"はO_APPENDがつくのでwriteがかならずその時点でのファイルの
末尾からになる。

ファイルをもしなければ作成して読み書き両用で開きたいんじゃないかと
思うが「>」使うのでちょうどいいのはたぶんない。openでシステムコール
のオプションを明示的に指定できるのでそれを使うのがいいと思われる。
338nobodyさん:05/02/11 15:45:03 ID:???
>>334
print+(gmtime(time+32400))[5]+1900;
339nobodyさん:05/02/11 17:00:15 ID:CPrSGSxU
perl初めてなんですけど、

print(
"引数",
"引数",
);
↑こーゆーのってコーディングスタイルとしてどーなんですか?
エラーはでないみたいなんですけど。
340nobodyさん:05/02/11 17:07:21 ID:4xNa2hhv
if (){
my $test;
〜処理〜
undef $test;
}

ブロックの終端で人間が見たときにこのブロックでどういうローカル変数を使っているかを
わかりやすくするためにわざわざundefしてます。

私のテキストエディタでは関数名は太字になりますので、もの凄く見やすいです。
それでそのブロックないで作った(いじった)グローバル変数もまとめて列挙したいんですが、
# $global
とかしてもコメント用の色にはなりますが、太字にはならず見づらいです。

そこで何か変数に対して何もしない関数があればいいなと思ったのですが、何かいいのはありませんか?
scalar $global;
みたいな感じです。

undefにしろ完全に処理効率を落とすものでしかないのでなるべくその影響が
小さいものがいいです。undef以下の処理時間の関数だと最高です!
341nobodyさん:05/02/11 17:15:59 ID:???
>>339
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlstyle.html
あとは君が書いたスクリプトを誰が保守するのか考えた上でご自由に。

>>340
エディタの為のコードを書くな。コードに合わせてエディタを設定しろ。
342340:05/02/11 17:26:02 ID:4xNa2hhv
>>341
エディタの設定ではできないのです。
343nobodyさん:05/02/11 18:20:17 ID:???
>>339
リストの最後にカンマが付いているのを懸念しているのか?
結論から言えばアリ。ハッシュでも良く使うね。
{
foo => 1,
bar => 2,
}
後で項目追加したりするときに、ミスが出なくていい。
344343:05/02/11 18:33:32 ID:???
345nobodyさん:05/02/11 21:22:27 ID:???
>>331
use HTTP::Date qw(parse_date);

my @date = parse_date("2005-02-10T14:54:18+09:00");
my $date_str = sprintf('%04d年 %02d月 %02d日 %02d時 %02d分 %02d秒', @date);
346339:05/02/11 21:26:56 ID:CPrSGSxU
CGIで使う時にprintが乱立するのが見苦しいから
こっちのほうがいいな、と。
Cのprintfだと引数1つしかだめなんでちょっと
おどろいたついでに確認してみたんですが・・
アリということなのでがんがんつかいますw
347339:05/02/11 21:31:01 ID:CPrSGSxU
あ、あと
print と print() だとなんか前者の方がよくみるんですが
print()の方でもいいんですよね?
関数に()がないのがなんか気持ち悪くて・・
348339:05/02/11 21:37:39 ID:CPrSGSxU
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlstyle.html
↑に書いてありましたね、連投スマソ
349nobodyさん:05/02/11 23:14:45 ID:???
>>345 できた。 サンクス
350nobodyさん:05/02/12 00:13:28 ID:???
>>340
あまりいい趣味とは思えないが、どうしてもやりたければ

use Filter::cpp;
#define NOOP(x)

とか?
351nobodyさん:05/02/12 00:15:44 ID:???
>>347
俺は関数に限らず極力()を付けない。
基本的に見易さと理解しやすさが第一だから。
もちろんぱっと見たときにどういう優先順位かわからなくなりそうな時はつけるけどね。

>CGIで使う時にprintが乱立するのが見苦しいから
それとこれは君がしょぼいだけと言わざるを得ない。
出力内容はユーザによって変えないといけないことが多いCGIではprintを始める
以前にほとんどのデータを用意しておく。

そして何行にもなるならヒアドキュメントを使ってスッキリさせる。

まぁプログラミングなんて誰でもできるものだけど、
読みやすく効率のいいものが作れるかが馬鹿と賢者の分かれ目かな。

ってえらそうにごめんねm(_ _)m
とりあえず処理効率よりも読みやすさを薦めるよ。
352nobodyさん:05/02/12 01:31:57 ID:???
一般的に、多くの場合関数には()をつけ、
演算子には()をつけないほうが読みやすいとされるそうです。
俺もそう思いますが、printは演算子です。
353347:05/02/12 01:34:34 ID:DEctNxAs
>>351
なるほど〜、うまいことやる方法がきちんとあるのですね。
なんせCGIは初めてで正直まだ何もわかっていないんです。
でも351さんがおっしゃっていることは自分も同意で、普段書く時
は気をつけています、綺麗なコーディング。

とにかくがんばります。
354347:05/02/12 01:40:35 ID:DEctNxAs
>>352
え、、、PerlやPHPだとprintは演算子なんですかぁ、ちとびっくり。
てっきり関数かと思ってました。
だから()がいらないんですね、なるほどなるほど。
355nobodyさん:05/02/12 03:35:24 ID:W11W0gdq
>>346
そもそもCGIでprint文なんていくつも書かないだろ。
出力用のルーチンに投げてprintは1つでお終い。そこで変数展開してやればいい。
356nobodyさん:05/02/12 10:55:57 ID:???
()の省略をprintとprintfでしかやってなかった俺は馬鹿者ですか、そうですか。('A`)
357nobodyさん:05/02/12 12:43:51 ID:???
>>354
正確に言うと少し違う。Perlの組み込み関数はある意味で全て演算子であるといえる。

>>356
それでいいよ。その方が分かりやすい。
358s:05/02/12 16:09:49 ID:???
文字「&」をpostで送りたいんですが、受け渡し後&を区切りとしているので
うまく読み取ってくれません。どうやればいいのでしょうか?
359nobodyさん:05/02/12 16:22:44 ID:???
>>358
エンコード
360nobodyさん:05/02/12 17:35:59 ID:???
>組み込み関数はある意味で全て演算子であるといえる
こら。好き勝手書くんじゃない。
361nobodyさん:05/02/12 19:42:57 ID:???
>>360
関数は名前付単項演算子かリスト演算子になるのです。
perlfunc(1)の最初の方にそう書いてあるよ。

362nobodyさん:05/02/12 20:57:06 ID:???
>>358
%26
363nobodyさん:05/02/12 23:09:29 ID:???
サブルーチンではプロトタイプ宣言するべきですか?
364nobodyさん:05/02/13 00:57:42 ID:???
>>363
プロトタイプ宣言を行うとどうなるかわかれば必要の有無もわかるはず
365nobodyさん:05/02/13 04:12:34 ID:???
関数は名前付単項演算子かリスト演算子になるのです。

print ←リスト演算子
scalar ←名前つき単行演算子
rand ←引数が一つの関数
sort ←関数

演算子はコンパイラが変換形式と答えを知っている。
関数はインタプリタにて処理が実行される。
366nobodyさん:05/02/13 05:23:09 ID:???
2文字ごとに%を入れたいんだけど、どうすればいいのか教えて欲しいです。

82CA82E982DB

%82%CA%82%E9%82%DB
にしたいのです。

使われる文字はa-zA-Z0-9の半角英数です。
ちなみに漏れが考えたのは、2文字ごとにsplitで分割して配列に入れ、joinでくっつけて頭に%をくっつけるって方法だけど、これでいいっすか?
367nobodyさん:05/02/13 05:30:51 ID:???
>>366
それでいいよ

s/([a-zA-Z0-9]{2})/%\1/g

これでもいいし
368nobodyさん:05/02/13 05:33:24 ID:???
>>367
即レスthx!
> s/([a-zA-Z0-9]{2})/%\1/g
採用させていただきました。
369nobodyさん:05/02/13 08:31:42 ID:???
>>368
× \1
○ $1
370nobodyさん:05/02/13 12:40:44 ID:NsfysfMz
perl modulesのhttpプロトコルを実装したモジュールの使い方を紹介したページは無いでしょうか。

googleでperl http webなどとしてもURLのスキーマがヒットするので要領を得ないのです。

371nobodyさん:05/02/13 14:54:56 ID:???
>>370
httpプロトコルを実装したモジュールなどいくらでもあるから
どういうものを探してるのかわからんが、LWPなどよく使うものなら
↓に少々載っている。
http://homepage3.nifty.com/hippo2000/perltips/index.htm
372nobodyさん:05/02/13 16:48:05 ID:???
>>371
ありがとうございました。実装できました。
373nobodyさん:05/02/13 16:50:52 ID:Lwv6BlB8
if文で
$a == 1 かつ $b == 2
みたいに条件にaかつbみたいな複数条件を付けるにはどう書いたらいいんでしょうか?

教えてエロイ人
374nobodyさん:05/02/13 16:52:28 ID:???
>>373
andか&&。
両者で演算子の優先順位が違うので要確認。
下名は何でもかんでも括弧でくくるのでその辺曖昧です。
375nobodyさん:05/02/13 16:53:57 ID:Lwv6BlB8
>>374
即レスサンスコ
376nobodyさん:05/02/13 20:33:35 ID:???
配列変数の中の物を消したいのですが、一行で済ませる方法ないですか?
@xx=();とやってもだめでした。

for($i=0;$i<=$#xx;$i++){
$xx[$i]="";
}
↑こうすればできましたが、やっぱり一行で何とかなりませんか?
377nobodyさん:05/02/13 21:00:28 ID:???
@array = ();
でできるけど。
378nobodyさん:05/02/13 21:03:58 ID:???
>>376
できなかった時のテストコード書いてみなさい。
379nobodyさん:05/02/13 21:08:31 ID:???
>>376
@xx=()でだめということは、要素数を保ったままで全要素を
空文字列にしたいという問題なのかな?

もしそうなら、

map $_ = '', @xx;

$_ = '' for @xx;

for (@x) { $_='' }

あたりからお好きな奴を。下のほうに行くにしたがって
微妙に遅くなるけどそれほど差はない。map使う奴はvoid
コンテキストじゃないと遅くなるので注意。

空文字列じゃなくてundefでよければ、
@xx = ();
したあとに
$#xx = 要素数-1;
で要素数あわせる方が速いけど。



380376:05/02/13 21:35:58 ID:???
なぜか、今回やるとできました。ありがとうございます&お騒がせしました。
381nobodyさん:05/02/13 21:45:50 ID:MAmE7PYm
入力されたメールアドレスが変じゃないかどうか調べるのはこんなのでいいですか?

!~ /[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,6}$/

なんかもうちょっといいのあったら教えてください
382nobodyさん:05/02/13 22:24:52 ID:???
>>381
メールのアドレスはまじめにやるとかなりメンドウななので、
Email::Valid(または日本の携帯のRFCに違反したアドレスにも
対応したければEmail::Valid::Loose)を使うのが楽だよ、
というかすこしまえにこのスレで話題になってたぞ。せめて
現行のログぐらい読め。

ttp://search.cpan.org/~maurice/Email-Valid-0.15/
ttp://search.cpan.org/~miyagawa/Email-Valid-Loose-0.04/
383nobodyさん:05/02/14 02:06:35 ID:???
$mail =~ /[\w\-\.]+\@([\w\-\.]+)/;
$host = $1;
if ( !$host || !gethostbyname($host) ) {
print "不正なメールアドレスです";
}

俺はこうしてる。
384nobodyさん:05/02/14 07:52:59 ID:mZmBq9e/
         ナ ゝ   ナ ゝ /    十_"    ー;=‐         |! |!
          cト    cト /^、_ノ  | 、.__ つ  (.__    ̄ ̄ ̄ ̄   ・ ・

            ,. -─- 、._               ,. -─v─- 、._     _
            ,. ‐'´      `‐、        __, ‐'´           ヽ, ‐''´~   `´ ̄`‐、
       /           ヽ、_/)ノ   ≦         ヽ‐'´            `‐、
      /     / ̄~`'''‐- 、.._   ノ   ≦         ≦               ヽ
      i.    /          ̄l 7    1  イ/l/|ヘ ヽヘ ≦   , ,ヘ 、           i
      ,!ヘ. / ‐- 、._   u    |/      l |/ ! ! | ヾ ヾ ヽ_、l イ/l/|/ヽlヘト、      │
.      |〃、!ミ:   -─ゝ、    __ .l         レ二ヽ、 、__∠´_ |/ | ! |  | ヾ ヾヘト、    l
      !_ヒ;    L(.:)_ `ー'"〈:)_,` /       riヽ_(:)_i  '_(:)_/ ! ‐;-、   、__,._-─‐ヽ. ,.-'、
      /`゙i u       ´    ヽ  !        !{   ,!   `   ( } ' (:)〉  ´(.:)`i    |//ニ !
    _/:::::::!             ,,..ゝ!       ゙!   ヽ '      .゙!  7     ̄    | トy'/
_,,. -‐ヘ::::::::::::::ヽ、    r'´~`''‐、  /        !、  ‐=ニ⊃    /!  `ヽ"    u    ;-‐i´
 !    \::::::::::::::ヽ   `ー─ ' /             ヽ  ‐-   / ヽ  ` ̄二)      /ヽト、
 i、     \:::::::::::::::..、  ~" /             ヽ.___,./  //ヽ、 ー
385nobodyさん:05/02/14 09:45:44 ID:IE9wtcnB
CSV形式のファイルってどう読み込めばいいでしょうか?
カンマ区切りでダブルクォートで括られてると中のメタ文字は評価しないってやつです。
386nobodyさん:05/02/14 10:26:10 ID:???
http://www.rfs.jp/sitebuilder/perl/02/08.html

ここを見ながらファイル操作をためしてます。
しかし
open FH,"+>file";
こうした時に何故かファイルの既存データが読み取れません。
+<を使うと普通に読み取れますが、このサイトは間違った事を書いてるのでしょうか?
+>は読み取りも可能だと一覧表には書いてあるんですが・・・・
387nobodyさん:05/02/14 10:37:57 ID:???
>>385
Text:;CSV_XS

388nobodyさん:05/02/14 10:48:19 ID:???
>>386
'+>'はファイルを開くときにまずいったん空にするのでそうなる。
そのあと新たに書き込んだ内容は読み出せるので読み取り可能と
いうのはそういう意味でいっていて間違いではない。

open(2)のflagsパラメタでいうと

'+>'はO_RDWR|O_CREAT|O_TRUNC
'+<'はO_RDWR


389nobodyさん:05/02/14 10:56:31 ID:???
>>387
分ると思うが:;は::の打ち間違いです。シフトキーの押しが足りなかったようでスマヌ(汗)
390386:05/02/14 11:07:15 ID:???
>>388
そういうことでしたか!ありがとうござます。

ActivePerl5.6.1
Apache1.3
WindowsXP
この環境で今しがたflockのテスト行いました。flock初めてです;
open FH,"+<test.txt";
if (flock FH,2) {print "ok";}
seek FH,0,0;
print FH "あいうえお";
close FH;

>ok

okと出たのでflockがwinXPで使えるんだと思ってよいのでしょうか?
そうでしたら今から契約サーバでもこれを試して排他処理を選択しようかなと
思ってるんですが。
391386:05/02/14 11:37:39 ID:???
すみませんそれとflockなのですが
+<の時もflockはモードを2にしておいていいんでしょうか?

読み込み時にモード2でやるとロックがかからない時があるようですが、
+<これはどうなのでしょうか?
392nobodyさん:05/02/14 11:42:51 ID:???
>>390
flockは9x系では使えないけどNT系は使えるということになってたと
思った。未実装だと致命的エラーになるはずだし。
393nobodyさん:05/02/14 11:57:52 ID:???
>>391
perlのflockがlockfやfcntlを用いたエミュレーションで実現されている場合は、
書き込みで開いてないとLOCK_EX使えないことがあるようだ。XpのActivePerlが
どうなのかは知らない。どちらにせよ'+<'は書き込み付だから問題ないと思う。

Note that the emulation built with lockf(3) doesn't provide
shared locks, and it requires that FILEHANDLE be open with
write intent. These are the semantics that lockf(3) imple-
ments. Most if not all systems implement lockf(3) in terms of
fcntl(2) locking, though, so the differing semantics shouldn't
bite too many people.

Note that the fcntl(2) emulation of flock(3) requires that
FILEHANDLE be open with read intent to use LOCK_SH and requires
that it be open with write intent to use LOCK_EX.

あと「モード2」とかって見づらいので、use Fcntl qw(:flock);して「LOCK_ほげ」
という名前の定数を使った方がいいと思う。
394386:05/02/14 12:21:05 ID:???
>>392>>393
+系は書き込みで大丈夫なんですね^^
ありがとうございましたm(_ _)m
395385:05/02/14 12:25:37 ID:IE9wtcnB
>>387
どうもです
396nobodyさん:05/02/14 13:58:03 ID:IE9wtcnB
Email::Valid
Email::Valid::Loose
この二つを使いたいのですがwin版perl5.6にはプリインストールされてないようです。
そこでppmを使用してEmail::Validだけインストールしてみました。
しかしどうやらMail::Addressともう一つ何かが必要なようでMail::Addressの法を
ppmでインストールを試みてみたらどうやらPPDがないので無理なようですorz

実は今までppm以外のインストールをしたことがありません。
しかしこの度メールフォームを作成したいので、XSS対策?代わりにメルアドチェックを
Email::Validに任せたいのです。
多分鯖にもインストールされてないモジュールだと思うので、winXP環境の
ものをそのままLinux鯖のユーザスペースに移して使おうと思ってます。
397nobodyさん:05/02/14 14:00:26 ID:IE9wtcnB
やはりMail::Addressともう一つ必要になるものは自分でコンパイルするしかないのでしょうか?
しかしその場合はLinux上にコピーしたところで使用するのは不可能ですよね?

Email::Valid
Email::Valid::Loose
使用してる皆様アドバイスお願いします。
398nobodyさん:05/02/14 14:13:07 ID:???
>>397
Email::Valid::Looseはperlだけで書かれているっぽいので、
コピーすればいけるんじゃないかな。

ちゃんとディレクトリを掘ったりuse lib追加したりは必要
だろうけど。

しかしLinuxなら普通の手順でインスコできそうなもんだが
貸し鯖かなんかですかね。
399396 :05/02/14 14:24:17 ID:IE9wtcnB
>>398
Email::Valid::Looseは
Email::Validのサブクラスですよね?

Email::Valid自体もpureperlなんでしょうか?
実は私は中身を見てもそれがpureperlなのかどうか判断できない馬鹿者なんですorz

実際の実行はLinuxのレンサバですが、テスト環境がwinXPなのです。
以前にpureperlのモジュールをLinuxレンサバのユーザスペースに移して
使用したことはあるので、今回もpureperlならできると思いますが、
結局Mail::addressとNet::DNSモジュールあるいはnslookupが必要なので
むりぽですorz

行き詰ってるのでとりあえずソースを自分でコンパイルしてインストールする
方法を勉強してみます。
400nobodyさん:05/02/14 14:36:52 ID:???
>>399
開発手元に持ったほうがいいよ。
俺はデスクトップ環境にはLAN上にRH9置いてる。
持って歩くノートにはWinXPをホストにしてcolinux+debianを使ってる。
perlモジュールはCPAN使ってインストしてる。
実機はレンサバだけどSSHできるのでCPANで ~/lib/perl5 とかにインストして use lib〜使ってる。

環境作るの少々めんどいけど、都度Win環境でごたごたするよりはまし。
マシンなければ colinux+debian(デストリは何でもいいけど)で、これ最強。
401nobodyさん:05/02/14 14:40:17 ID:???
>>396
あまり知識がないなら簡単なチェックで我慢したら?
@.-_
確かこれ以外の記号を使ってるメールアドレスってないよ。
だからこれと英数字以外を含んでるなら「メルアドが不正!」みたいな
メッセージを出してメールフォーム画面に戻せばとりあえず問題ないけどね。

まともなメールフォームなら
"<>スペース
あたりも許容するべきだけど、まあないならないでいんじゃないかな?
402nobodyさん:05/02/14 14:49:16 ID:???
>>399
Net::DNSまたはnslookupが必要になるのはmxcheckを有効にしたときで、
無効にしとけばいらないはず。
403396:05/02/14 14:52:18 ID:IE9wtcnB
>>400
colinux+debian
聞いたことない名前ですが調べてみますm(_ _)m
>環境作るの少々めんどいけど、都度Win環境でごたごたするよりはまし。
そうですよねorz

>>401
そうなのですか!?
メールフォームといっても相手していするアドレスに固定文章を送りつけるだけなので
メールフォームとは呼ばないのかもしれません^^;
>@.-_
でもrfc882か何かではサイトURLなどと同じ記号が許されてましたよね。
で、それが結構な数になりますが私も401さんが挙げてくれた記号以外を
使ったメールアドレスを見たことがありません。

でもちょっと不安です;
どなたか @.-_  この4種類以外の記号が使われてるメールアドレスを
見たことがある方はいますでしょうか?
404nobodyさん:05/02/14 15:11:05 ID:???
405nobodyさん:05/02/14 15:23:42 ID:???
>>403
別の世界のメールシステム(多いのはLotus)に中継される場合なんかで

hoge/fuga/[email protected]

みたいのはよく見ますね。hoge/fuga/gagaは適当に分解されて
向こうの世界のユーザ名やドメイン名みたいなものになるらしい。

あと+=?あたりは普通に名前の一部として使ってるのをたまにみるかな。
404が紹介した顔文字アドレスはさすがにまだ見たことないです(笑)
406396:05/02/14 15:27:00 ID:IE9wtcnB
>>404
おお!これはありがとうございます!
つまり自前サーバ立ててる人以外は大丈夫ということですね。
自前サーバ立ててる人はきっと私より知識が豊富なので説明もしやすそうですし。

さっき他のサイトを色々見てたらみなさんけっこうrfc準拠アドレスでも
@_.-以外を含んでる拒否するんですね。
とりあえず現状はこれでよしとして、なるべく早くEmail::validにイコウシマス!
407nobodyさん:05/02/14 16:25:33 ID:???
初歩的ですみませんが、&test(1,3,{a => 1 , b => 2});
みたいな無名ハッシュリファレンスを引数にしますが、これってメソド側でどうやって
受け取るんでしたっけ?
sub test{
$a = shift;
$b = shift;
ここでどうやればいいのか忘れてしまいました。誰か知ってますか?
408nobodyさん:05/02/14 18:51:18 ID:M2nRDwE8
SSIのファイルサイズを返すものでfsizeというものがあるのですが
バイト単位で返すようにすると1,000という風にカンマ区切りが入ってしまうのです。
具体的には<!--#include virtual="filesize.cgi?file=パス"-->として自動的にページに
?fileクエリで指定したファイルのサイズを区切りなしのバイト単位で出力したいのです。

<!--#include virtual="filesize.cgi?file=/test/test.jpg"-->バイト
1000バイト

どなたかどのように書けばよいのか分かりませんか?
409nobodyさん:05/02/14 19:01:43 ID:sFNZsuc6
410nobodyさん:05/02/14 19:20:41 ID:???
>>407
普通にスカラーで受け取ってデリファレンスすれば?
411nobodyさん:05/02/14 20:27:00 ID:???
>>408
好きなのどうぞ

test1({a => 1 , b => 2});
test2({a => 1 , b => 2});
test3({a => 1 , b => 2});
test4({a => 1 , b => 2});

sub test1{
my %z = %{shift()};
print map{"$_ => $z{$_}\n"}keys %z;
}

sub test2{
my %z = %{+shift};
print map{"$_ => $z{$_}\n"}keys %z;
}

sub test3{
my $z = shift;
my %z = %$z;
print map{"$_ => $z{$_}\n"}keys %z;
}

sub test4{
my $z = shift;
print map{"$_ => $z->{$_}\n"}keys %$z;
}
412nobodyさん:05/02/14 20:28:06 ID:???
>>411>>407のレス
413nobodyさん:05/02/14 21:34:32 ID:azOG+8a2
MCPANについての質問です。 (PC等のプログラムスレにも投稿してしまいました、すみません)

MCPANでImage::Magickモジュールを入れようとしましたが、エラーになってしまいました。
そこで、ついforce installをしてしまいました。その結果か、入っていないにもかかわらず、
MCPANではImage::Magick is up to dateと表示されてしまうようになりました。

現状どおり、Image::Magickが入っていないと表示されるようにするには、どのようにしたら
良いのでしょうか。よろしくお願いします。
414nobodyさん:05/02/15 00:00:01 ID:???
>>413
uninstallしろよ。
できなきゃOSから再インストールしろ。
自己責任でforce installなんかやったんだろ。
ついでにスレ違いだ。

Perlモジュールについて
http://pc5.2ch.net/test/read.cgi/php/997829243/
415nobodyさん:05/02/15 08:40:45 ID:6J2om7eC
$hoge内の
数字アルファベット以外のすべての文字に
\をつけるにはどうすればいいんでしょうか
$hoge=~s/([^0-9a-zA-Z])/(?:\\)\1/g;
とかやってもうまくいきません
416nobodyさん:05/02/15 08:44:19 ID:???
>>415
$hoge=~s/([^0-9a-zA-Z])/\\$1/g;
417nobodyさん:05/02/15 09:38:39 ID:???
ハッシュ変数ってリファレンスにしないとルーチンに渡せないのですか?
&hoge(%hash);
こうすればリスト形式で渡りますよね?

sub hoge{
my %hash = (@_);

こうすればハッシュが壊れることはないでしょうか?とりあえずテストは成功しましたが、
私の知らないおかしなことが起こる瞬間があると怖いです。
418nobodyさん:05/02/15 09:55:53 ID:???
>>417
my %hash = ...の代入で新しく確保した%hashにコピーされるから
元の方が壊れることはない。
419417:05/02/15 09:56:56 ID:???
それとこのような方法がダメですと代替方法って何かありますか?
リファレンスにするとルーチンで作らせたハッシュは全てリファレンスになり
出力整形時に
->
が大量に出てくるので嫌なのです;
420nobodyさん:05/02/15 10:25:40 ID:???
やじるしで書かない。
421417:05/02/15 10:34:23 ID:???
>>420
そういうことなのですか?^^;

例えばルーチンが複数のハッシュリファレンスオブジェクトを返してくるとします。
その時に受け取り側でデリファレンスしながら受け取ることっでできませんか?
1個なら
my %hash = %{[&method]};
でいいですが返り血がだと、あ、
my %hash = %{[(&method)[0]]};
my %hash2 = %{[(&method)[1]]};
とすればいいのかな?


422nobodyさん:05/02/15 10:58:14 ID:???
$c = $a;
$a = $b;
$b = $c;

$aと$bを入れ替える関数ってなかったでしたっけ?
423nobodyさん:05/02/15 11:42:03 ID:???
グローバルな%aとローカルな%aがあった場合にはどちらが優先的に解釈されるのですか?
又、どちらかを意識的に呼び出すにはどうすればいいでしょうか?
424kobayashi ◆M6R0eWkIpk :05/02/15 12:04:06 ID:???
>>422
($a,$b)=($b,$a);
こういう書き方もできますよ。
425kobayashi ◆M6R0eWkIpk :05/02/15 12:07:04 ID:???
>>422
($a,$b)=($b,$a);
こういう書き方もできますよ。
426nobodyさん:05/02/15 12:08:39 ID:kdpe8a8e
>>424-425
おー!せんきゅー、ぶらざー
427nobodyさん:05/02/15 12:16:30 ID:???
sub test{
my %hash = %{[shift]} ;
}
shiftにはハッシュロファレンスが入ってますが、デリファレンスできないのでしょうか?
428nobodyさん:05/02/15 12:21:04 ID:5Ng5Me3b
PHPのrequire_onceみたいな機能はありませんか?
時々コンパイルできなくなってしまうのですが
429nobodyさん:05/02/15 12:21:57 ID:???
430427:05/02/15 12:54:20 ID:???
>>429
ありがとうござました。%{(shift)}でやったら何故かできました^^
431nobodyさん:05/02/15 13:27:42 ID:???
>>430
それはなぜかではない。%{[shift]}がだめなのは
shiftでとりだした値(たぶんハッシュのリファレンス)
ひとつからなる無名配列を作ってそのリファレンスを
%{}でハッシュとしてデリファレンスするという無理
なことをしているから。

[]とか%{}の意味わかってないんじゃ...
432nobodyさん:05/02/15 13:35:26 ID:???
>>428
時々って事は変な薬をやりすぎ
433nobodyさん:05/02/15 14:19:09 ID:???
>>423
試せば直ぐにわかることだが、レキシカル変数が優先される。
グローバル変数を参照するにはパッケージ名で修飾すればいいが、
グローバル変数とレキシカル変数に同じ名前をつけるのは奨励できない。

>>428
PerlのrequireはPHPのrequire_onceに相当する。
434nobodyさん:05/02/15 14:48:48 ID:dZXRK/qg
[Tue Feb 15 14:41:06 2005] [error] [client 127.0.0.1]
DBI::db=HASH(0x1a51d38)->disconnect invalidates 1 active
statement handle (either destroy statement handles or call
finish on them before disconnecting) at
ファイル名 line 231.\n

こういうエラーがでました。
apacheのエラーログです。
どうやら$dbh->disconnect辺りが問題点らしいですがどういうことなのでしょうか?
一応mysqlにDBIで接続してinsert構文の発行などはできています。
画面上もエラーがでません。

しかし何故かログにはエラーとして残るようです。
どなたかわかる方いませんか?
435434:05/02/15 14:50:57 ID:dZXRK/qg
失礼しました。
$sth->finishがなかったせいでした。
しかしmysqlには不要なはずなんですがね;
disconnectも本来不要だから使うならfinishもしっかり使えとかいう感じですかね。

とりあえずすみません解決です。
436428:05/02/15 15:09:22 ID:5Ng5Me3b
>>433
有難うございました
437nobodyさん:05/02/15 19:48:45 ID:sBhWNNlk
1: GDで製作した画像を中間ファイルを使わずにImage::Magickへ引き渡したい。
2: my $image = new GD::Image(640, 480);
  $image->Scale(width=>320,height=>240);
  と
  my $image = new GD::Image(640, 480);
  my $image2 = Image::Magick->new;
  $image2->Read($iamge);
3: 500 Internal Server Error

GDで画像を製作し、Image::Magickで縮小などの加工を行いたいと思っています。
(GDで縮小するとアンチエイリアズがかからず汚くなるのと、その他の加工も行いたいので、Image::Magickを使っています)

現在は、GDで製作した画像を中間ファイルに出力した後、Image::Magickで中間ファイルを読み込んでいるのですが、
中間ファイルを使わずに、GDからImage::Magickへ直接画像データを渡すことはできないのでしょうか?
438nobodyさん:05/02/15 19:51:25 ID:FRNIfDdj
質問ですが
オフラインでperlで作成したcgiを作成した場合で、cgiにパラメータを引き継がせたい場合
どのように起動すればいいのでしょうか?

./exsampl.cgi?a=abc
439nobodyさん:05/02/15 19:55:38 ID:???
>>438
詳しく
440nobodyさん:05/02/15 19:57:05 ID:???
>>438
--exsampl.cgi
#!/usr/local/bin/perl
print "$ARGV[0]\n";

$ ./exsampl.cgi aho?

441T女の竹田:05/02/15 21:07:10 ID:???
>>438
このへんのことかな?
http://www.att.or.jp/perl/cgi-debug-env/deb-tech.html
QUERY_STRINGがQUERY_STRINGSになってるのは罠なので気をつけて。

WindowsならSET文ね。
SET "QUERY_STRING=item=hoge&item2=moge"
って感じ。
442T女の竹田:05/02/15 21:11:17 ID:???
あぁ…マルチポストだった
443nobodyさん:05/02/15 22:05:37 ID:???
T女の竹田って、鶴見女子のエリ?
444nobodyさん:05/02/15 22:26:13 ID:ilxRQfx7
Perlというよりプログラミングの手法についてですが、質問です。

ある関数内で必要な引数の数が、関数内の処理によって異なる場合、次のような方法はアリですか?

&hoge("2ch");
&hoge(["yahoo", "損", "氏ね"]);

sub hoge {
 my($kind) = shift;

 if($kind eq "2ch"){
  print qq(オマエモナー);

 }elsif($$kind[0] eq "yahoo"){
  print qq(とりあえず$$kind[1]$$kind[2]);
 }
}

きれいに書くにはどう言う方法を取ったら良いのでしょうか。
445nobodyさん:05/02/15 22:34:23 ID:???
関数を二つに分けたら?
446444:05/02/15 22:44:57 ID:???
>>445
その後の処理が殆ど同じなのですが、やはりそれしかないですかね・・・うーん
447nobodyさん:05/02/15 22:49:03 ID:???
引数の数によって、処理が変わるって事ではないの?
448nobodyさん:05/02/15 22:57:13 ID:???
>>444
引数が複数の時には無名配列にしてる意味はなに?
引数の数で処理を分けるなら、

scalar @_ の数を見ればいいんじゃないの?
449447:05/02/15 23:00:54 ID:???
&hoge("2ch");
&hoge("yahoo", "損", "氏ね");

sub hoge($;@){
 unless( $_[1] ){
  print "オマエモナー\n";
 }else{
  print "@_\n";
 }
}

じゃ、ダメかい?
450T女の竹田:05/02/15 23:13:38 ID:???
>>444
どのくらい共通でどのくらい共通じゃないか、
もうちょっとわかりやすい例にならない?
>>444では共通の処理がないからピンと来ないよ。
451444:05/02/15 23:43:31 ID:???
一箇所だけ例外処理があって、その例外処理の部分で複数の引数が必要になるんですが、、、
共通の処理の方がかなり多いです。
うーんどんな例を出せば良いんだろう
452nobodyさん:05/02/15 23:48:36 ID:???
>>450
ありゃ、あんた中国語板にいなかったっけ?
453nobodyさん:05/02/16 00:30:45 ID:???
画像ファイルをアップロードする為に
enctype="multipart/form-data"としているのですが
一緒に文章を受信しようと
cgi-lib.plのReadParseで読んだデータを表示してみると
Content-Disposition: form-data; name="comment"
となっていて、フォームに入力した文字がありません
どうすれば一緒に受信できるのでしょうか?
454nobodyさん:05/02/16 01:29:29 ID:???
>>421
正直、リファレンスで参照しろよと言いたいけど
どうしてもいやなら、こんなサブルーチンを作るといい!

sub deref{
for my $hash( @{ $_[1] } ){
%{ $hash } = %{ shift @{ $_[0] } };
}
};

testサブルーチンの戻値がハッシュのリファレンスのリストだとするとこうかける。

deref( [ test() ] => [ \%y1, \%y2, \%y3 ] );

または

deref( [ test() ] => [ \( %y1, %y2, %y3 ) ] );
455nobodyさん:05/02/16 11:54:53 ID:MwHh4jT0
現在のページがSSLかどうかを判断することは不可能ですか?
現在のページがSSLかどうかが入ってる環境変数はないのでしょうか?
456nobodyさん:05/02/16 12:59:07 ID:???
>>455 $ENV{'HTTPS'}
457nobodyさん:05/02/16 14:03:39 ID:???
2つファイルがあって、中身はメールアドレス
そいつを、一行ずつ比較して同じなら削るPerl、、、

すまん、本職絵描きなんで誰か教えてくれ。
458nobodyさん:05/02/16 14:21:03 ID:???
my @array = qw/1 2 3/;
この配列の要素それぞれに2を足した数字を表示させたいです。

print map{return $_ + 2}@array;
としてみましたが、何も返されてませんでした;
どうにか変数などには入れず、@arrayの元々の値も変えずにできないでしょうか?
459nobodyさん:05/02/16 14:21:20 ID:???
>>457
違う行にある場合は削らないの?
同じ行毎の比較のみ?
で、削るのは2つのファイル両方から削るの?
それとも二つのファイルから重複しないアドレスリストを求めたいわけ?
もちっと詳しく
460nobodyさん:05/02/16 14:21:50 ID:???
>>457
if ($a eq $b) { undef $b }
461nobodyさん:05/02/16 14:22:58 ID:???
>457
マルチポストうざい。

http://pc5.2ch.net/test/read.cgi/hp/1106947416/177n
462nobodyさん:05/02/16 14:26:26 ID:???
>>458
my @array = qw/1 2 3/;
print map{$_ + 2}@array;
print "\n";
print @array;

--result
345
123
463458:05/02/16 14:26:45 ID:???
returnがいらないだけでした
464461:05/02/16 14:35:48 ID:???
T-T
465458:05/02/16 14:37:22 ID:???
>>462
すいません;

これって
$hoge =~ s{}{}e;
これの右ブロックの中で使うにはどうすればいいですか?
$hoge =~ s{^([^\n]*)}{$1.
(join '',map〜).
"終端"
}e;

こんな感じで一応できましたがわざわざjoinしないといけないのがちょっと;
しかし強制的にスカラー評価されるところではこの方法以外にないのでしょうか?
466458:05/02/16 14:43:22 ID:???
すみませんできましあ。
467nobodyさん:05/02/16 14:54:21 ID:???
>>457
その程度ならcomm(1)使え。

468nobodyさん:05/02/16 14:58:35 ID:???
>467
マルチ野郎はスルーしる
469nobodyさん:05/02/16 20:09:14 ID:???
ディレクトリs1の下にa1とa2を作り
a1にあるXXX.plファイルをa2にあるPPP.cgiから
参照しようとしています。

PPP.cgiの中で
require "../a1/XXX.pl";

とするのは良いのでしょうか?

Copalだとエラーが出てしまいます。
470nobodyさん:05/02/16 20:12:47 ID:???
質問です。

$str =~ s/${value}/hoge/g;

をやるときに、$value の値に正規表現の制御文字(^$.[]…等)が
入っていると置換時にエラーとなってしまいます。

$value 内の文字をそのまま扱いたい場合はどのようにすればよいのでしょうか?
置換前に、$value の中の制御文字を全てエスケープするのかなと思いましたが、
他に簡単な方法があればご教授下さい。
471nobodyさん:05/02/16 20:44:55 ID:???
>>469
よいでしょう。

>>470
$str =~ s/\Q$value\E/hoge/g;
472nobodyさん:05/02/16 21:02:41 ID:???
>>471
ありがとうございます。
すみません、一つ忘れてました。。

$str =~ s/%__${value}\.begin__%(.+?)%__${value}\.end__%/hoge/g;
のような用途を予定しています。

\Q〜\E 内が全てエスケープされてしまうので、
本来使いたい正規表現が無効になってしまいますね…。

やはり変数個々に対してエスケープでしょうか。
473472:05/02/16 21:24:45 ID:???
自己レスです。

$str =~ s/%__${value}\.begin__%(.+?)%__${value}\.end__%/hoge/g;



$str =~ s/\Q%__${value}.begin__%\E(.+?)\Q%__${value}.end__%\E/hoge/g;

にすることで解決できたようです。(ホントに大丈夫かな…)
ありがとうございました。
474nobodyさん:05/02/16 22:15:30 ID:???
事前に $pattern =quotemeta $value; しちゃダメ?
475469:05/02/16 22:41:10 ID:???
>>472
ありがとうございます。
端末の設定をもう一度見直して見ます。
476nobodyさん:05/02/17 00:24:07 ID:???
正規表現でよくでてくる =~ はどういう意味ですか?
477nobodyさん:05/02/17 00:58:33 ID:???
パターン結合演算子がなぜ = と ~ の2文字の組み合わせなのかを知りたいのか?
478nobodyさん:05/02/17 06:25:30 ID:???
>>476
左項に対して右項でパターンマッチを行う演算子。
479nobodyさん:05/02/17 09:24:23 ID:???
$hoge = "hoge1,hoge1,hoge1,\n";
@array = split(/,/,$hoge);
$array[1] = "hoge2";
$hoge = join(",",@array);

カンマで区切られた$hogeの指定個所を変更したいのですが、
今は上記のように、分割→変更→結合と3行に渡って行っています。
これをもっと効率の良い方法でやる事はできますでしょうか?
480nobodyさん:05/02/17 10:40:36 ID:ICaDRbeT
改行をprintで出力するにはどうすればいいですか?
print "hoge\nhoge";
とやると、
hoge\nhoge
とそのまま表示されてしまうんですが、なにか間違いがあるんでしょうか。
481nobodyさん:05/02/17 10:48:59 ID:???
>>480
エスケープする
print "hoge\n\hoge";
482nobodyさん:05/02/17 11:31:00 ID:???
>>480
ネタだろ?
483nobodyさん:05/02/17 12:28:14 ID:???
>>480
print "hoge<br>hoge";
484nobodyさん:05/02/17 12:29:02 ID:???
print "hoge<br></br>hoge";
485nobodyさん:05/02/17 13:43:38 ID:???
>>479
この処理だけ100万回やるので全体の処理時間がここで決まるとかじゃなければ
あまり気にしてもしょうがないと思うが、

use Benchmark;

timethese(undef, {
SPLIT_JOIN => sub {
my $hoge = "hoge1,hoge1,hoge1,\n";
my @array = split(/,/,$hoge);
$array[1] = "hoge2";
$hoge = join(",",@array);
},
SUBSTITUTE => sub {
my $hoge = "hoge1,hoge1,hoge1,\n";
$hoge =~ s/,[^,]*/,hoge2/;
},
INDEX_SUBSTR => sub {
my $hoge = "hoge1,hoge1,hoge1,\n";
my $pos1 = index($hoge, ',')+1;
my $pos2 = index($hoge, ',', $pos1);
substr($hoge, $pos1, $pos2-$pos1) = 'hoge2';
},
});

Benchmark: running INDEX_SUBSTR, SPLIT_JOIN, SUBSTITUTE for at least 3 CPU seconds...
INDEX_SUBSTR: 3 wallclock secs ( 3.14 usr + 0.00 sys = 3.14 CPU) @ 222680.89/s (n=699218)
SPLIT_JOIN: 4 wallclock secs ( 3.12 usr + 0.00 sys = 3.12 CPU) @ 108552.56/s (n=338684)
SUBSTITUTE: 3 wallclock secs ( 3.19 usr + 0.00 sys = 3.19 CPU) @ 188749.53/s (n=602111)

486nobodyさん:05/02/17 14:31:44 ID:???
>>485
ベンチマークまでありがとうです。
hoge2が計算式だったり、要素数が多かったりする事も考慮すると、
見易さの面(個々によると思いますが)でも、今まで通りでOKみたいですね。

(空想の関数/,/,$hoge)[99] = $age + $sage;
みたいな感じで$hogeをカンマで区切った場合、
要素100番目の位置にダイレクトに代入できる技が無いものかと思いまして。
487nobodyさん:05/02/17 16:18:01 ID:lgJIuLRQ
my %a = (a=>1,b=>2,c=>3);
print $a{a,b,c};

こういう感じでハッシュも配列みたいにいっぺんに呼べるカナと思いましたが、
エラーでした;
@a{a,b,c}や%a{a,b,c}もやりましたがダメでした。

ハッシュって
print $a{a},$a{b},$a{c};
のようにいちいち一つずつでしかできないのでしょうか?
488nobodyさん:05/02/17 16:33:32 ID:???
スライスとか

@a{'a', 'b', 'c'}
489nobodyさん:05/02/17 16:36:41 ID:???
@{[%hash]}
使い道ないかもしんないけどこういうのも
490487:05/02/17 16:43:51 ID:lgJIuLRQ
>>488-489
クォートでしたか。
@a{qw/a b c/};
こんな感じですね^^
491nobodyさん:05/02/17 16:56:59 ID:???
>>487
strict subsしているときは、サブルーチンとして
宣言されていない裸のワードの存在が許されるのは
「{}」の間に単独で存在するときと、「=>」の左側
だけ。

Bareword "a" not allowed while "strict subs" in use at ほげほげ

って感じのエラー出てたはずだからちゃんとよめよ...

エラーメッセージの意味わかんない人は、ラクダ本の
診断メッセージって章にアルファベット順に意味と並
べて書いてあるので調べる癖をつけましょう。
492nobodyさん:05/02/17 18:15:10 ID:???
Windows2000
Apache 2.0.52
perl ActivePerl 5.8.6.811

クライアントの要求のヘッダを取得したいのですが出来るものでしょうか?
WEB サーバーからのヘッダは取得は出来たのですが、今やりたい内容ではないですし …

ご教授よろしくお願いします。
493nobodyさん:05/02/17 20:37:53 ID:???
>>492
前に HTTP_ をつけて環境変数 %ENV にはいるよ
494nobodyさん:05/02/18 01:51:05 ID:???
>>486
そうであればこんな正規表現があるけど

$hoge = "hoge1,hoge1,hoge1,\n";
$hoge =~ s/((?:[^,]*,){1})[^,]*/$1hoge2/;

これで前から2番目の「hoge1」が「hoge2」に置き換わる。
{1} の部分を
{0} とすれば先頭の「hoge1」が「hoge2」に置き換わるし
{2} とすれば前から3番目の「hoge1」が「hoge2」に置き換わる。
{3} とすれば最後のカンマの後ろに「hoge2」が追加(改行が置き換わる)されるし
4以上の数字を指定すと置換えは行われない。

カンマの数が増えれば置き換え対象の指定位置も増える。
495nobodyさん:05/02/18 01:54:39 ID:???
>>494の続き

(空想の関数/,/,$hoge)[99] = $age + $sage;

みたいにしたければ

$hoge =~ s/((?:[^,]*,){99})[^,]*/$1.($age + $sage)/e;

ってやればよい。
496キヨ:05/02/18 04:51:35 ID:wywZhzNy
回答者の皆さまはじめまして。
@:やりたい事
データがカンマ区切り","されていない形式で、
データをソートして表示したい

4 平野 298 3
3 辻 286 5
2 秋山 325 26
1 清原 304 38

A:やってみた事
各項目別にソートしたいのですが、

@mem = sort { (split(/\,/,$a))[0] <=> (split(/\,/,$b))[0] } @mem;
foreach $mem (@mem) {
($no,$name,$avr,$hr) = split(/\t/, $line);
(各処理)
}
現在、$noに関してソートして表示できています。
上記の[0]の部分を[2]に変更すると、$avr項目に関してソートできると思ったのですが
うまくいきません。
データの拡張子は.logですが、excelで開くと綺麗に並んで表示されます。
","で区切られていないと上記の処理は出来ませんか?
それとも、","の区切りは関係なく、別の問題なのでしょうか?
497nobodyさん:05/02/18 05:26:56 ID:qmmO8oMV
Perlでフリーソフトを作ってます。
モジュールに頼らずに入力されたパスフレーズをSHA1かけてファイルに保存しようと思ってます。
再配布可能でSHA1ハッシュ値を計算するサブルーチンをwebで検索したところ
ttp://www.mirrors.wiretapped.net/security/cryptography/algorithms/rc4/arcfour.pl
こちらでsha1サブルーチンがあったので、ちょっとここのサブルーチンを拝借して
$string = "ax";
print sha1($string);
という風にテストしてみたところSHA1ハッシュ値とは全然違う文字列が出力されました。
どのようにすればちゃんとしたSHA1ハッシュ値が得らるのでしょうか?
498nobodyさん:05/02/18 05:36:15 ID:???
>>496
「データがカンマ区切り","されていない形式で」っていっているんだから
sort の中の split で","分割しちゃだめでしょ。
499キヨ@496:05/02/18 06:50:20 ID:wywZhzNy
>>498
有り難うございます!
splitの\,を\tに変えたら作動しました!!
5〜6時間近く悩んでいたのに…。
本当にありがとう御座いました!!
500486:05/02/18 08:42:07 ID:4JcRNkuB
>>494-495
親切な人ありがとー
一行でやるには関数では無くて、正規表現でやる事になるのですね。
勉強になりました。
501nobodyさん:05/02/18 09:39:28 ID:???
DBI周辺質問
SELECT * FROM TEST_TABLE;
これで全レコードのゼンフィールドを取得したとして。
@arrayの中に全レコードのhogeフィールドだけをデリファレンスして入れたい。
hogeフィールドは0番目だと仮定。

fetchall_arrayrefで返されるのが配列リファレンス。更に中に配列リファレンスなので

my @array = @{@{$sth->fetchall_arrayref}[0..$#{$sth->fetchall_arrayref}]}[0];

とかでいけるかと思いきやダメでしたorz
誰かわかる方いますか?
502nobodyさん:05/02/18 09:48:08 ID:???
ろくに読まないでレス。

my $rows = $sth->fetchall_arrayref;
my @array = map { $_->[0] } @$rows;
503501:05/02/18 10:21:48 ID:???
>>502
ありがとうございます。
変数作るの機雷なんで
my @array = map { $_->[0] } @{$sth->fetchall_arrayref};
としておきました。

もう一つお願いします。
sprintfで
$str = sprintf %d+100.%d-20.%d,@list;

こういう風に配列の中身にそれぞれ別の数字を足したり、文字列を付加したりしながらの
整形って不可能ですか?上記ではエラーでしたが;

やりたいことは
$str = $list[0]+100.$list[1]-20.$list[2];
です
504nobodyさん:05/02/18 10:39:33 ID:???
truncate関数ってflockと同じくらいプラットフォームによって使えるかが左右される関数ってほんと?
505504:05/02/18 10:47:26 ID:dVwgIF/D
上げ忘れた。
truncate関数がダメならそれ以外で
open FH,"+<test.txt";
flock FH,2;
この状態のファイルの中身を一旦0にすることはできますか?

ファイルを上書きモ−ドで開くのは不可能です。このファイルを開いてる間に
処理内容が重複しては困ることをしてるので。
506504:05/02/18 11:31:10 ID:dVwgIF/D
あれ・・・誰もいないのかな・・・
507nobodyさん:05/02/18 11:45:10 ID:???
>>504
そんな話聞いたことが無いけど釣りですか
508504:05/02/18 12:14:53 ID:dVwgIF/D
509nobodyさん:05/02/18 12:16:49 ID:???
--- original.pl ---
require './lib/lib1.pl';

--- lib1.pl ---
require './lib/lib2.pl';
open( FILE, "< file.txt" );

というファイル/ソースの時に、
original.pl を実行すると、
どこの file.txt, lib2.pl を読むのでしょうか?

この辺の位置関係を解説してるサイトがあれば
すみませんが教えてもらえると助かります。
510nobodyさん:05/02/18 12:24:30 ID:???
俺Perl書けないけど試せば答えられそうだな
511nobodyさん:05/02/18 12:26:03 ID:???
>>510
お前なんでここにいんの?
512nobodyさん:05/02/18 12:44:04 ID:???
>>503
$str = sprintf '%d%d%d', sub{ $_[0]+100, $_[1]-20, $_[2] }->(@list);

#応用
$str = sprintf '%d/%02d/%02d %02d:%02d:%02d', sub{$_[5]+1900,$_[4]+1,@_[3,2,1,0]}->(localtime);
513507:05/02/18 13:27:25 ID:???
>>508
いやflockが使えないOSは聞いたことがあるがtruncateが使えないOSは聞いたことが無いってこと。
514503:05/02/18 13:29:28 ID:???
>>512
おお!
凄いですねそれ。どうなってるんですか?
無名関数のリファレンスを作ってるみたいですが、どうして->(リスト)が
引数として渡されるんでしょう?
515nobodyさん:05/02/18 13:54:42 ID:???
print @hairetu[0..6];
これの降順ってのは無理?
print @hairetu[6..0];
for(0..2)の仕組みと同じっぽいから無理だと思うけど、ここならもしかして知ってる人がいるかもと期待してきてみた。
516nobodyさん:05/02/18 13:59:39 ID:???
>>511
m9(^Д^)プギャーーーッ
517nobodyさん:05/02/18 14:00:30 ID:???
reverse
518nobodyさん:05/02/18 14:19:43 ID:???
>>514
$code = sub{ $_[0]+100, $_[1]-20, $_[2] };
@list2 = $code->(@list);
$str = sprintf '%d%d%d', @list2;

これを一行にまとめているっていうのは理解できるよね。

参照演算子 "->" は、左辺値が関数リファレンスであれば
右辺に "()" を記述して関数を間接実行できる。
同様に左辺値が配列リファレンスであれば
右辺に "[]" を記述して配列要素を間接参照できるし
左辺値がハッシュリファレンスであれば
右辺に "{}" を記述してハッシュ要素を間接参照できる。

これは左辺値の評価結果が関数リファレンスでありさえすれば
"->()" でいつでも間接実行が行えるということ。

"sub{}" は無名関数リファレンスの値を持っているわけだから
無名関数を定義したと同時に実行させただけということになる。

もちろん関数を実行させているわけだから
"()" 内に指定したリストが引数として渡る。
519nobodyさん:05/02/18 14:33:12 ID:???
>>515
>>517が示しているリスト関数を使う。

print @hairetu[reverse 0..6];
520503:05/02/18 14:36:44 ID:???
>>518
そういうことでしたか。わかりやすい説明ありがとうございました!
@{[]}や${\()}なんかと同じ位価値のある色々使えそうなテクですね^^
521nobodyさん:05/02/18 14:39:12 ID:???
>>517>>519
長い名前だね。[6,5,4,3,2,1,0]も[reverse 0..6]も変わらないorz
とにかくレスサンクス
522nobodyさん:05/02/18 15:01:18 ID:???
>>520
> @{[]}や${\()}なんかと同じ位価値
そんなのが好きならこんなのもあるよ

${\do{}}

文字列のなかにブロック処理を記述できる。

$x = 1;

$str = qq(これは!${\do{
if($x){
"真";
}else{
"偽";
}
}}です\n);

print $str;
523nobodyさん:05/02/18 15:03:28 ID:???
ベンチマークっていうのを取ってみたいんですが、そのモジュールの使い方を
日本語で説明シテルサイトありませんか?
524nobodyさん:05/02/18 15:05:54 ID:???
>>523
モジュールメイデケンサクシテミナサイ
525523:05/02/18 15:16:10 ID:???
http://www.pure.ne.jp/~learner/program/Perl_tips.html#benchmark

ここに比較はかいてありましたが、何秒かかったかのやり方はどこあないでしょうか?
526523:05/02/18 15:33:48 ID:???
http://hio.jp/tips/perl/perldoc-5.8.0/lib/Benchmark.html#SYNOPSIS

英語読めませんが
timestr()
timethese()
timeit()
timethis()
ってBencmarkの関数ですか?どうしてパッケージ名なしで呼べるのでしょうか?

それと
my $code = sub {
my $a = "あいうえおあかかうskslkdjfんgsjfgsjfdbgsdfはfはfd";
$a =~ s/(\x45)/$1\x46/g;
};
timethis(100,$code);
としたら
timethis 100: 0 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 CPU) (warning: too few iterations for a reliable count)
こんなんでました。警告文は多分「しんらいできるカウントのためにあまりに少ない繰り返しなのでとてもできない。」
的な感じだと思いますが、秒数はこれで求めれるので主か?

単に処理が短いからbヴェンチもくそもあるかと文句をいわれてるのでsyか?>
527nobodyさん:05/02/18 15:41:40 ID:???
>>526
うん
528nobodyさん:05/02/18 16:50:42 ID:???
>>526
>どうしてパッケージ名なしで呼べるのでしょうか?

モジュールがuseされた時にデフォルトのパッケージ関数が
呼び出し側にエクスポートされるようにモジュール側で記述されているから
呼び出し側でモジュールをuseするとパッケージ関数がインポートされて
パッケージ名を明示しなくても関数が使用できるようになる。

下のは正式なエクスポート方法ではないけど、エクスポートの真似事ができる。
実行するとtestサブルーチンが定義されてないとのエラーメッセージがでるが
コメントマークを外すとTESTパッケージのtest関数が実行できる。

package TEST;

#$main::{test} = \&test;

sub test{
print @_;
}

package main;

test(1,2,3);
529nobodyさん:05/02/18 16:53:37 ID:???
>>528はちょっち失敗、これでどうかな

package TEST;

$main::{test} = \&test ;

sub test{
print @_;
}

package main;

test(1,2,3);
530nobodyさん:05/02/18 20:21:21 ID:???
>>509
http://www.harukaze.net/~mishima/perl/man/perlvar.1.html
> @INC 配列 @INC には、do EXPR、require、use によって評価す
> る Perl スクリプトを探す場所のリストが納められていま
> す。 初期状態では、コマンドラインスイッチ -I の引数
> とデフォルトの Perl ライブラリディレクトリ (おそらく
> "/usr/local/lib/perl5") とカレントディレクトリを表わ
> す "." を順につなげたものです。
531nobodyさん:05/02/18 20:38:12 ID:???
> file.txt
こっちはカレントディレクトリ。
CGIの場合、UNIX環境であれば動作しているスクリプトと同じディレクトリ。
ただし、mod_perlの場合は違うから注意が必要。

http://www.ietf.org/rfc/rfc3875.txt
7.2. UNIX
For UNIX compatible operating systems, the following are defined:

> The current working directory
> The current working directory for the script SHOULD be set to the
> directory containing the script.
532503:05/02/18 23:08:18 ID:???
>>522
そのテクもありがたく頂きますm(_ _)m
533nobodyさん:05/02/19 12:26:16 ID:???
使える小技集めたサイトあったらいいな。

個人的には...split /&/......こういうデフォルトで$_を引数にとる関数が好き。
何でpushはとらないんかね。shifth取るくせに。
534nobodyさん:05/02/19 13:41:26 ID:???
>>533
shiftが暗黙に対象とするのは@_だろ。
pushは第二引数が配列でもいいからじゃねえか?
535nobodyさん:05/02/19 15:55:05 ID:???
>>533
そっか。
ところで$_,@_の中身がセットされるときと削除される時のことを
詳しく説明してるサイトをどっかで見た気がするけど忘れてしまった。
誰か知らない?日本語のサイトなんだけど。
536nobodyさん:05/02/19 19:19:29 ID:???
>>535
$_ は、map,grep を使ったときに、または、foreachで$_ が参照変数になったとき暗黙のlocal対象になるよ。
foreachで$_ 意外の参照変数を明示したらlocal対象にはならないけどね。

@_ は、サブルーチン内で暗黙のlocal対象になるよ。
だから、呼出されたサブルーチン内から呼出し元の@_の値を得ることはできない。
しかし、サブルーチン内でブロックがないまま、@_ にlocalを明示すると
呼出されたサブルーチン内のlocal前の@_ の値が、呼出し側の@_ に移るよ!
537nobodyさん:05/02/19 19:20:29 ID:???
@_ = 0..9;
print "@_\n"; test1(); print "@_\n"; test2(); print "@_\n"; test3(); print "@_\n";

sub test1{
@_ = 10..19;
}

sub test2{
@_ = 20..29;
{
local @_;
}
}

sub test3{
@_ = 30..39;
local @_;
}

実行結果出力
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
30 31 32 33 34 35 36 37 38 39
538nobodyさん:05/02/19 22:54:09 ID:???
maildropが入っているサーバで.mailfilterにto "|/home/username/example.pl"と書いて、メールをexample.plに渡しています。
$ENV{'LINES'}にメールの行数、$ENV{'SIZE'}にメールのバイト数が格納されているのは確認しましたが、メール本文がどこにあるかわかりません。

メール本文がどこに格納されているのかご存知の方がいましたら、教えていただけないでしょうか?
539nobodyさん:05/02/20 08:10:37 ID:???
use strict; の状況下でグローバル変数を使用したい場合は、
use vars を使用しますが、これでは require した外部ライブラリでも使用できてしまいます。
引数として渡した変数以外は外部ライブラリに参照させないことはできますでしょうか。
よろしくお願いします。
540nobodyさん:05/02/20 09:05:42 ID:???
package
541nobodyさん:05/02/20 13:26:09 ID:???
そのファイル内でグロバール的に使いたいだけなら、use vars使わずに
サブルーチン外で普通に my しとけばいいと思うけど。
542nobodyさん:05/02/20 15:17:15 ID:O52bAFUw
配列からランダムに1つ要素を抜き出すためにはどうすればいいですか?

@foo = qw(テスト Perl 適当);

$bar = $foo[int rand $#foo+1];

これより簡単になりますか?
543nobodyさん:05/02/20 15:52:41 ID:???
$bar = $foo[int rand @foo];
544nobodyさん:05/02/20 16:28:38 ID:???
$bar = $foo[<>];
545nobodyさん:05/02/20 16:55:45 ID:???
>>542
$bar = $foo[ rand @foo ];
546nobodyさん:05/02/20 17:53:43 ID:FLHTnHy4
(http://hoge/1.jpg,http://hoge/2.jpg,http://hoge/100.jpg,http://hoge/200.jpg)
というふうに配列をソートしたいのですが、
普通にソートすると、
(http://hoge/100.jpg,http://hoge/1.jpg,http://hoge/200.jpg,http://hoge/2.jpg)
というふうになってしまいます。
よい方法はありませんか?
547nobodyさん:05/02/20 18:11:11 ID:???
>>546
numetric sort
548nobodyさん:05/02/20 18:24:41 ID:FLHTnHy4
>>547
ぐぐってみましたがよくわかりません
モジュールですか?
549nobodyさん:05/02/20 18:26:01 ID:???
ファイルハンドルをpackageやオブジェクトのメンバにする事は
できないのでしょうか?
550nobodyさん:05/02/20 18:39:48 ID:???
>>546
sort{
my($an) = ( $a=~/(\d+)\.jpg\z/ );
my($bn) = ( $b=~/(\d+)\.jpg\z/ );
$an <=> $bn
}@array;
とか。
551539:05/02/20 18:45:55 ID:???
>>540-1
遅くなりましたがありがとうございました。
552nobodyさん:05/02/20 18:49:20 ID:???
>>551
かちゅが死ぬる
553nobodyさん:05/02/20 19:05:02 ID:???
そんなしょぼいブラウザは窓から(ry
554nobodyさん:05/02/20 19:06:12 ID:???
>>546
@url = map{ $_->[0] }
sort{ $a->[1] <=> $b->[1] }
map{ m/(\d+)\.jpg$/; [$_, $1] } @url;
とか。

>>549
use FileHandle;
my $fh = FileHandle->new("hoe.txt") or die $!;

my $fh;
open($fh, "hoe.txt") or die $!;
# これは古いPerlと互換がないかも。

これで変数に入れられるから、オブジェクトでも扱える。
(クラスメンバなら、ファイルハンドルのままでも構わないのでは。)
555549:05/02/20 19:45:08 ID:???
ありがとうございました
556nobodyさん:05/02/20 20:14:16 ID:O52bAFUw
forなどで連続値を指定したいときは
for(1..100){}
などとできますが、
飛び飛びの連続値を指定する場合はどうすればいいんでしょう?

for(1.20,30..100){}
とかじゃ無理だし、なにか上手いやり方はありますか?
557nobodyさん:05/02/20 21:01:53 ID:???
>556
1と20の間に . が2個あれば行くぞ。
558nobodyさん:05/02/20 21:04:25 ID:O52bAFUw
>>557
うわ、ほんとだ。

自分の場合は間に1つだけの要素を挟んだりするんですが、そのばあいは

for(1..3, 5..5, 7..9){}

こんな感じですかね。
559nobodyさん:05/02/20 21:06:11 ID:???
for(1..3, 5, 7..9){}
560nobodyさん:05/02/20 21:08:32 ID:O52bAFUw
あーそう書くのかぁ。ありがとうございます。
561nobodyさん:05/02/20 22:23:17 ID:???
** fork について質問です。**

if ($pid= fork){
# ここは親プロセス
}elsif (defined $pid){
# ここは子プロセス
}elsif ($! =~ /No more process/){
# A
}else {
}

上記のようなソースをたまに見かけます(らくだ本など)が、A部分には
子プロセスが作れなかったのに何がくるのでしょうか?
わたしが思うに、子プロセス生成に失敗したので結果的に親プロセス部分
しか処理されないような感じがするのですが・・・。
562nobodyさん:05/02/20 22:31:53 ID:???
>>561
エラー(そこを実行するプロセスは親と言うか流産しちゃった人)。

man fork
563nobodyさん:05/02/20 22:51:31 ID:BvAf0Y1w
perlの変数をflashに渡す方法を教えてください。(テキスト以外で)

$hoge(perl)の数値(文字列)をそのまま hoge(flash)に。

よろしくお願いしますm(__)m
564nobodyさん:05/02/20 23:12:34 ID:BvAf0Y1w
解決しました。ありがとうございました〜
565nobodyさん:05/02/20 23:18:02 ID:???
>>564
結果書けボケ。
566nobodyさん:05/02/21 01:37:00 ID:???
ぼく、ボケてないもん。
567nobodyさん:05/02/21 02:33:04 ID:ZzrL/Ht5
質問させて下さい。
print等で、

1. print 'あ '.(ドット)"$hoge\n";

2. print 'あ ',(カンマ)"$hoge\n";

ドットを使うのと、カンマを使うのとでの違いはありますか?
568nobodyさん:05/02/21 04:57:26 ID:???
見た目は違いなし
569nobodyさん:05/02/21 10:51:03 ID:???
データベースからDBIを使用して全レコードの全フィールドを取り出したいです。
SQL文はわかってるのですが、どう受け取ればいいのか;

my $value = $sth->fetchall_arrayref;
これだと一応受け取れますが、フィールド名のハッシュになってないので扱いにくいです。
しかしハッシュ系は
my $value = $sth->fetchrow_hashref;
しか見つけられなかったのですが、無理なのでしょうか。
このやり方は1レコードだけなのですが・・・
570nobodyさん:05/02/21 11:09:40 ID:???
my $hash = {a => "あいうえお" , b=> "かきくけこ"};

これの文字コードをjcode.plを使って変える時って
foreach (keys %$hash) { jcode::convert(\$hash->{$_},"sjis")}

で一応できましたが、なんか変な感じ。
そもそもリファレンスさえ渡したら向こうで中身を書き換えてくれるんですよね。
なので渡す時にデリファレンスしてからリファレンスを作るのって変。

ハッシュリファレンスの中身をjcode.plに効率よく渡す方法ってあるんでしょうか?
571nobodyさん:05/02/21 11:38:37 ID:???
>>570
「ハッシュ全体へのリファレンス」と「ハッシュの個々のエントリへのリファレンス」は
全く無関係な別物だから、仕方ないだろう。そういうものだ。
572nobodyさん:05/02/21 11:43:32 ID:???
mapでできるんじゃないの?
map内で配列に手を加えればいいけどね。

いい例なのがこれ。
map {jcode::convert(\$_,"euc")} @$arrayref
あ、これも同じデリファレンス→リファレンスだなw
573nobodyさん:05/02/21 14:03:46 ID:???
てか最初のハッシュがリファレンスである必要がなければこう書けばいいと思うが。

my %hash = (a => "あいうえお" , b=> "かきくけこ");

foreach (keys %hash) {jcode::convert(\$hash{$_},"sjis")}
574nobodyさん:05/02/21 14:20:27 ID:???
>>573
大前提をひっくり返してしまっては何を言っても意味はないと思うが・・・
575nobodyさん:05/02/21 14:43:19 ID:???
>>574
あ、いや、>>570がjcode::convertにハッシュリファレンスを渡すためにわざわざ
最初の段階でリファレンスにして無意味だなと思っているみたいだったんで
だったらハッシュをわざわざリファレンスにしなくていいんじゃないと思っただけ。
576nobodyさん:05/02/21 14:44:54 ID:???
>jcode::convertにハッシュリファレンス
「jcode::convertにハッシュ要素のスカラーリファレンス」と読み替えてくれ。
577nobodyさん:05/02/21 15:16:50 ID:???
$value = qq{oaoa_aaaa_test};
この$valueの中身を書き換えずに_を-に変えて出力するにはどうすればいい?

print ....
まったくわからないorz
578577:05/02/21 15:28:46 ID:???

print "content-type:text/html;charset=euc-jp;\n";
print "\n";
my $value = qq|aiu_oiy|;
print qq|${sub{$_[0] =~ s/\_/\-/g; print $_[0]}->($value)}あいうえお|;
print "<br>";
print "aiu",$value;

これやったら何故か「あいうえお」すら表示されない・・・
しかし置換後の文字列の出力はしっかりできている。
一体どういうことなんだろう。無名ルーチンに異次元につれてかれてSTDINへの出力を
したくてもSTDINがどこにあるか分からないとか?
579577:05/02/21 15:31:51 ID:???
print "content-type:text/html;charset=euc-jp;\n";
print "\n";
my $value = qq|aiu_oiy|;
print qq|@{[sub{my $a = shift; $a =~ s/\_/\-/g; $a}->($value)]}あいうえお|;
print "<br>";
print $value;

これでできたけどなんかなぁ。
まあいいけど>>578はなんでその後が表示されないんだろ?
580nobodyさん:05/02/21 17:41:26 ID:???
$in{'ngword'} →馬鹿\n死ね\nあほ

$in{'ngword'} =~ s/\n/\'\,\'/g;
print BS <<"EOM";
# NGワード
\@ngword= ('$in{'ngword'}');
EOM

として、
ファイルハンドルBSに
@ngword = ('馬鹿','死ね,'あほ');
と書きたいのですが、
・"鹿"と"'"の間
・"ね"と","の間
にメモ張で見ると文字化けしているような
文字("■"を小さくしたようなもの)、Perl編
集用で使っているエディタだと改行が入っ
てしまいます。

なぜなのかわかりません。。。
581nobodyさん:05/02/21 19:51:45 ID:???
>>567
, は、リスト評価。 . は、文字列を結合してからスカラー評価。
, と . では、演算子の優先順位が違うので、計算式が入る場合は注意。

>>577
print join( '-', split( '_', $value ) );
とか
print "$1-$2-$3" if $value =~/([^_]+)_([^_]+)_([^_]+)/;
とか
582nobodyさん:05/02/21 19:55:47 ID:???
>>578
use strict; すれば?
sub の中の$valueは、undefだよ。
583nobodyさん:05/02/21 20:08:42 ID:???
>>577
my $value = 'oaoa_aaaa_test';

(my $tmp = $value) =~ tr/_/-/;
print "$value => $tmp\n";

sub _toh { (my $str = shift) =~ tr/_/-/; $str }
print "$value => ${\_toh($value)}\n";

print join '-', split '_', $value;

print "$value => ${\ (sub { (my $str = shift) =~ tr/_/-/; $str })->($value) }\n";

local $" = '';
print "$value => @{[ map { tr/_/-/; $_ } split //, $value ]}\n";
584nobodyさん:05/02/21 20:11:04 ID:???
>>578
デリファレンスする前にリファレンス取らないと、シンボリックリファレンスになる。
585nobodyさん:05/02/21 20:12:54 ID:???
586nobodyさん:05/02/21 20:37:31 ID:???
>>576-578
@_ は関数内で暗黙のlocalだけど、@_の各要素である$_[0],$_[1],...等は、
呼出し元の引数の別名だから、上書きすると、呼び出し元で引き数として渡した
対応する変数の中身が書き変るよ。

好きなのどうぞ

print qq|${\sub{$_[0]->[0] =~ s/_/-/g;$_[0]->[0]}->([$value])}あいうえお|;

print qq|${\map{$_->[0] =~ s/_/-/g;$_->[0]}[$value]}あいうえお|;

print qq|${\do{(local $_=$value) =~ s/_/-/g;$_}}あいうえお|;
587nobodyさん:05/02/21 21:46:42 ID:LbE3SevL
サブルーチンがハッシュのリファレンスを2つ返してきます。
それをデリファレンスしながら受け取りたいんですが不可能ですか?

my (%a,%b) = map{%{$_}}&hoge;

こんなことを考えてみたけど、よく考えたら全くダメだった;
588nobodyさん:05/02/21 21:49:32 ID:???
Can't find string terminator "^@" anywhere before EOF at C:\Program Files\Apache
Group\Apache\htdocs\test.cgi line 353.

こんなエラー内容なんだけど、誰かわかる?
^@こんな文字列検索しても出てこないんだよね。ライン付近を見ても異常が見当たらない。
589nobodyさん:05/02/21 21:51:30 ID:???
;が抜けてるとか
590nobodyさん:05/02/21 21:56:01 ID:Mewlqio0
^@ は、文字コード0だろ?
591587:05/02/21 22:15:40 ID:LbE3SevL
do{sub{%a = %{shift()}; %b = %{shift()}}->(&hoge)};

これで一応できました^^
592nobodyさん:05/02/21 22:50:15 ID:???
>>585
ありがとうございました。できました。
593nobodyさん:05/02/21 23:42:47 ID:???
>>591
ほんとはこういう必殺技があるんだけど型グロブが理解できなければ使わないほうがいい。

(*a,*b) = hoge();
594nobodyさん:05/02/22 11:45:02 ID:???
変数の計算について質問

いきなり
my %a;
for (1..10){
$a{a} += 2;
}

とかやっても失敗しなかったのですが、偶然ですか?
my %a = (a => 0);
とはじめにしておいたほうが当然無難でしょうけど、なんか面倒なんですよね。

面倒でもやっておかないと失敗することはあるんでしょうか?
595nobodyさん:05/02/22 12:06:49 ID:xOztdvV5
八代空きじゃなくて、
よし行く象を最後にすべきだろう
596nobodyさん:05/02/22 12:07:19 ID:???
↑ああああああああああああ、激しくmiss m(_ _)m
597nobodyさん:05/02/22 13:16:01 ID:???
>>594
未定義値を論理評価すると偽として解釈される。
未定義値を数値評価すると0として解釈される。
未定義値を文字列評価するとヌル文字列として解釈される。
未定義値の配列やハッシュは空要素として解釈される。
配列やハッシュの存在しない要素を参照すると値は未定義値である。
my指定した変数は、明示的に初期化しなければ未定義値で初期化されることが保証されている。

これを理解していれば>>594の場合で明示的に初期化する必要はない。
598nobodyさん:05/02/22 14:13:34 ID:cioenldL

my %hash = ( a => 1 , b => {c => 1} );
&test({ b => {%{$hash{b}}} });
sub test{
my %hash = %{$_[0]->{b}};
$hash{c}++;
print $hash{c},"<br>";
}
print $hash{b}->{c};

これリファレンスの仕組みを理解するのに書いたんですが、
グローバルな$hash{b}にはハッシュリファレンスが入ってます。
それをルーチンに渡す時にそのまま渡すとルーチンないの作業によっては
グローバルな変数の中身に影響がでますよね。
そのため今までは
&test({
b=>{%{$hash{b}}}
});
としていました。しかしb=>\%{$hash{b}}でやっても何故かルーチンないでの作業が
グローバル側に影響を及ぼすことはありませんでした。

どうしてなのでしょうか?
jcodeなどに代表されるように通常は\これで作ったリファレンスを渡すと渡し側のものを
直接いじるのと同じ行為になると思ってたのですが・・・

ハッシュの場合は違うのか、それともデリファレンスしたものだから違うのかな?
599nobodyさん:05/02/22 15:56:51 ID:???
>>598
my %hash = %{$_[0]->{b}};

で新しく作った%hashにコピーされてるから、

$hash{c}++;

はコピーされた方が変わるだけ。

元のプログラム全体については何をしたいのか意図がよくわからんので、
エスパー回答者にお任せします。
600598:05/02/22 17:37:34 ID:cioenldL
>>599
そういえばそうですね;
ではやはり\を使って渡すのは危ないということですね。

元のプログラムはたんなるリファレンスのテストです。
601nobodyさん:05/02/22 17:44:16 ID:???
ポートチェックのスクリプトを書いたのですか上手く動作しません
おかしなところがあったら教えてください
メイン
#!/usr/bin/perl
@port = (80,1080,3128,8000,8080,8888); # チェックするポート番号

PrinthtmlHeader(); #htmlのヘッダーと<BODY>まで出力する関数

foreach(@port){
$result=IsOpenPort($_);
print $result;
}

PrinthtmlFooter(); #htmlフッタ出力

exit;
602nobodyさん:05/02/22 17:45:28 ID:iWUZ4gT8
#---------ポートが開いていれば1を返す関数
sub IsOpenPort
{
my ($port) = @_;
my ($inad,$scad);

eval{
$SIG{'ALRM'} = "hAlarm"; # ハンドラ設定
alarm(5); # timeout5秒に

use Socket;
socket(SOCK,PF_INET,SOCK_STREAM,0) || die("Socket Error\n");
$inad = inet_aton($ENV{'REMOTE_ADDR'}) || die("Iaddr Error\n");
$scad = pack_sockaddr_in($port, $inad);
connect(SOCK, $scad) || die("Connect Error\n");
select(SOCK);
$|=1;
select(STDOUT);
die("OUT!!!\n");
close(SOCK);
alarm(0);
};

if ($@ =~ /OUT/){ return 1; }
else{ return 0; }
}

#---------アラームシグナルハンドラ
sub hAlarm
{
die("Alarm...\n");
}
603601:05/02/22 17:48:44 ID:???
このスクリプトをレンタル鯖にアップロードしてたとえば
usen-219x123x129x154.ap-us.usen.ad.jp:3128
この串でアクセスしてみると
001000
と出力されれば正常なのですが
100000と出力されます
proxy.or3.marketscore.com:8000
この串でも100000と出力されます
604nobodyさん:05/02/22 18:16:06 ID:???
>>601
まず結果を1と0に丸めるのをやめて、だめな時はどこで
ひっかかってるかをきちんと調べるところからはじめる
べきだな。あとシステムコール類がエラーしたときは
ちゃんと$!を表示すること。

具体的にどこでどういう状況になってるかを特定してから
出直してください。

605nobodyさん:05/02/22 19:28:41 ID:???
>>598
# 呼び出し元をわざと中間変数を使って分解してみよう!

my %hash_c = ( c => 1 );
my %hash = ( a => 1, b => \%hash_c );

my %hash_b = %{$hash{b}}; # %hash_b = %hash_c; (1)
my %hash_arg = ( b => \%hash_b );
&test( \%hash_arg );

# つぎにsub test()を中間変数を使って分解してみよう!

sub test{
my $arg = $_[0]; # $arg = \%hash_arg;
my %hash = %{ $arg->{b} }; # %hash = %{ $hash_arg{b} }; --> %hash = %hash_b; (2)

$hash{c}++;
print $hash{c},"<br>";
}

# サブルーチンに引数を渡す前(1)も、渡した後(2)もコピーになってるでしょ。
# 呼出し元の%hashのリファレンスは、なにも渡ってないってことね。
606nobodyさん:05/02/22 23:11:35 ID:???
ポルトガル語ある文章の中から、ある単語が含まれる文を抜き出す、といスクリプトを作りたいのですが、
/\b$hoge\b/
とやると、
$hoge = a の時だと
a~no や hu~a 等を含む文も引っかかってしまい、
$hoge = trouvero~ の場合
逆にどの文も引っかかってくれなかったりしてしまいます。

\bの仕様上、仕方ないのかもしれませんが、何か巧い方法はないでしょうか?
607nobodyさん:05/02/22 23:19:59 ID:???
\bを使わない
608nobodyさん:05/02/22 23:40:27 ID:???
>>606
ほい。

/^$hoge[^a-zA-Z\d~]|[^a-zA-Z\d~]$hoge[^a-zA-Z\d~]|[^a-zA-Z\d~]$hoge$|^$hoge$/

ただ、このやりかたはバックトラックが発生するからこっちがいいかもしれん

/^$hoge[^a-zA-Z\d~]/ || /[^a-zA-Z\d~]$hoge[^a-zA-Z\d~]/ || /[^a-zA-Z\d~]$hoge$/ || /^$hoge$/
609nobodyさん:05/02/22 23:47:16 ID:???
>>>606
ポルトガル語に使う文字を定義して、?<!と?!を使うとか。

my $portuguese = "[a-z~]";
print "sim" if ($str =~ /(?<!$portuguese)$hoge(?!$portuguese)/i);
610nobodyさん:05/02/22 23:54:15 ID:???
/(?:^|[^a-zA-Z\d~])$hoge(?![a-zA-Z\d~])/
でよさげ。
611nobodyさん:05/02/23 00:48:31 ID:???
>607-610
ありがとうございました。
なんとか形にすることができました。

初めてperlに触れてみましたが、正規表現とかややこしいですね。
精進します。
612nobodyさん:05/02/23 10:07:36 ID:???
2つの配列を両方同時に1つずつ取り出して処理したいのですが、Perlではそういうのは
できないのでしょうか?

print map "$_[0] + $_[1] = ",
@a
@b
こういうときにやりたいのですがl
613nobodyさん:05/02/23 10:37:22 ID:???
print qq|
@{[sub{my $str = shift; $str =~ s/\r\n|\r|\n/<br>/g; $str }->($form{test})]}
|;

こういうことがしたいのですがエラーになりました。
原因は|です。qq[]などでやれば問題ないのですが、そうはしたくありません。
大元を変えると他にも影響がでそうなので;

qq||のなかの正規表現でor演算子的に|を使うにはどうすればいいでしょうか?
614nobodyさん:05/02/23 10:39:45 ID:???
よくわからんけど。

二つでいいならハッシュにしたり。

それ以上の複数なら
for(my $count = 0; $count < ?? ; $count++){
$a[$count], $b[$count], $c[$count];
}
とか?

mapは無理だけど、自分でそんな関数は作れる。

sub (&\@\@){
my $code = shift;
my $a = shift; #ん?大丈夫かこれ??
my $b = shift;
@a = @$a;
@b = @$b;
for(なんたらかんたら;略;略){ #使用の詳細が不明なので略
  略;
}
}

みたいなイメージで。
615nobodyさん:05/02/23 10:44:07 ID:???
>>614 なんか粗悪な記述でごめそ。

>>613
>大元を変えると他にも影響がでそうなので;
いみふ(ry
perlは処理の優先的にまず、区切り文字を探します。
616nobodyさん:05/02/23 12:39:44 ID:???
>>613
不可能
無理
だめ
ばか
あほ
617nobodyさん:05/02/23 13:04:52 ID:???
DBIを使ってmysqlからクエリを取り出す部分で問題が発生。
$sth = $dbh->prepare(q|select * from test_table where hoge=1|);
$sth->execute;
こういうSQL文を発行して

%hash = %{$sth->fetchrow_hashref};
これでそのレコードの全コラムを取得しようと思ったのです。

しかしwhereで引っかかるのがないときに、
%hash = %{$sth->fetchrow_hashref};
これがエラーの原因になります。

DBIはmysqlから「Empty set」を返された時にはfetchrow_hashrefに何も入れないのでしょうか?
それとEmpty setが返されたのかを知るすべはありますか?
618nobodyさん:05/02/23 13:49:08 ID:???
>>613
ほれ!

print qq|
@{[sub{my $str = shift; eval qq[\$str =~ s/\\r\\n\|\\r\|\\n/<br>/g]; $str }->($form{test})]}
|;
619nobodyさん:05/02/23 13:53:36 ID:???
>>612
ほれ!

@hoge = sub{map{$_[0]->(map{shift@$_}@_[1..$#_])}0..$#{(sort{@$b<=>@$a}@_[1..$#_])[0]}}->( sub{$_[0]+$_[1]+$_[2]}, [@x], [@y], [@z] );
620nobodyさん:05/02/23 13:58:20 ID:???
>>618
お前はシングルクォートを知らんのか!
621nobodyさん:05/02/23 13:59:53 ID:???
>>619
汚いソースを書くな!
622nobodyさん:05/02/23 14:01:11 ID:???
>>618>>619は、できないことはないけど、可読性が失われるという見本。
よくつかう処理はサブルーチンを用意すること。

変数展開の技巧や無名サブルーチンやリスト関数の技巧などは、理解できない内は使わない。
素直に書いた方が簡単な場合もある。
ただ、知ってて使う分には止めない。
623nobodyさん:05/02/23 14:04:13 ID:???
>>621,620
おっとすまん、俺>>622=618=619なんだけど、皮肉で書いただけだから。
624nobodyさん:05/02/23 14:56:16 ID:???
>>614を具現化

sub amap(&@){
my $code = shift;
my @array_ref_list = @_;

@array_ref_list = sort{@$b <=> @$a} @array_ref_list;
my $max_num = @{$array_ref_list[0]};

my @result_list;
for(my $i=0; $i<$max_num; $i++){

my @arg_list;
foreach my $a_ref(@array_ref_list){
push @arg_list, $a_ref->[$i];
}

my $result = $code->( @arg_list );
push @result_list, $result;
}

return @result_list;
}

@x = map{$_*1}1..10;
@y = map{$_*10}1..9;
@z = map{$_*100}1..5;

@hoge1 = amap{ $_[0]+$_[1]+$_[2] } \@x, \@y, \@z;
@hoge2 = amap{ 2*($_[0]-$_[1]) } \@z, \@y;
@hoge3 = amap{ $_[1].$_[0].$_[1] } ['a'..'z'], [reverse 'A'..'Z'];
625617:05/02/23 15:04:23 ID:???
できました。
excuteの返りを変数に代入して、その帰りが0ならって感じでした。
626nobodyさん:05/02/23 15:58:49 ID:???
>>613
マジレスするとこうやね。

print qq|
@{[sub{my $str = shift; $str =~ s/\r\n\|\r\|\n/<br>/g; $str }->($form{test})]}
|;

ダブルクォート内のブロック処理は、ブロック内がコンパイルされる前に終端文字のエスケープだけ解除されるから
ブロック内の処理に終端文字が出てくるときは、'\' で普通にエスケープすればよい。

だからこんなこともできる。

print qq|
@{[sub{my $str = shift; $str =~ s/\r\n\|\r\|\n/<br>/g; qq\|<!--$str-->\| }->($form{test})]}
|;

もちろん読みにくいから終端文字を変えるなり、ヒアドキュメントを使うなりするのがいい。
627nobodyさん:05/02/23 16:00:36 ID:???
sendmailが入ってないサーバでは絶対メール送信できないんですか?
何とかしてメール送りたいんですが・・・
628nobodyさん:05/02/23 16:09:38 ID:???
>>627
Perl なら Net::SMTP モジュールを入れることで sendmail が無くてもメール送れる。
モジュールが使えない場合でも、
自分で SMTP 喋るようなスクリプトを Socket 使って書けば、メール送れる。

ただしサーバの出のポートが閉じてる場合は何やっても無駄だがな。
629627:05/02/23 16:19:45 ID:???
>>628
マジですか!?ちょっと調べてみます
サーバのポートが開いてるかどうかってのはどうやったら分かるんですか?
630nobodyさん:05/02/23 18:32:31 ID:8RQQ1GXE
フォームメールCGIを作ってみたいんですが、エスケープしなければいけない文字や
その辺りの知識が足りません。

それで、とりあえず誰かが作ったエスケープが既にしっかりできてるCGIを見て
勉強しようと思います。

ちゃんとエスケープができてるものって探しようもないので、そこらへんを理解してる方で、
これなら勉強にもってこいってcgIを教えてくださいm(_ _)m
631nobodyさん:05/02/23 18:39:39 ID:???
632nobodyさん:05/02/23 19:00:23 ID:???
>>629
そのポート番号がどーなってるのか管理者に聞けばいいじゃん?
633未承諾広告※ ◆TWARamEjuA :05/02/23 20:27:19 ID:???
printf qq|<p><em>%s = %s</em>%s[%s]</p>\n|,
 eval {
  my @ret_value;
  :
  :
  return @ret_value;
 };

こういう書き方はよくするけれども、、、
634nobodyさん:05/02/23 21:10:15 ID:???
sock(HOGE, &AF_INET, &SOCK_STREAM, $protocol);
これなんですけど、&をつける場合とつけない場合の
違いが分かりません。でも、結局&をつけた場合とつけない場合
をprintで調べたら同じ値なのにどうして、&をつけるタイプの人と
つけないタイプの人がいるのか分かりません。
何か&に特別な意味はあるんでしょうか?
635nobodyさん:05/02/23 21:29:59 ID:???
>>612
print map{ "$a[$_]+$b[$_]=" } (0..$#a);

>>634
内部的に
sub AF_INET(){ 2 };
こんな感じで定義されていると思ってちゃぶ台。
だから、
print AF_INET();
print &AF_INET;
でもOK。
636nobodyさん:05/02/23 22:02:14 ID:???
>635
どうも、返答ありがとうございました。
AF_INETって定数じゃなくてサブルーチンだったんですか。
なるほど。よく分かりました。
637630:05/02/24 10:32:12 ID:Q/hMlpe6
>>631
???
どういう意味ですか?

私はHTMLレベルのエスケープなんて聞いてませんよ。
それともフォームメールに必要なエスケープがHTMLレベルだとでも思ってるのでしょうか。
638nobodyさん:05/02/24 10:59:43 ID:???
今までずっとプログラム内で必要なテキストや設定をtxtファイルにcsvもどき
や特殊な書式で書いてました。

しかしそれだと私しか理解できず、他人に使わせるのにいちいち書式のマニュアルを作成しないと
いけませんので、こんど全てをメジャーなものに変えようと思います。

一番いいのはexcelのcsv形式かなと思うのですが、どうですか?
ほとんどexcelを触ったことないので、いわゆるHTMLのthにあたるものができるのか
わからないのでまだ微妙ですが。

アドバイスお願いします。
639nobodyさん :05/02/24 11:03:35 ID:???
>>637
テメぇが聞きたいことなんか知ったこっちゃ無いし、聞き直してもえらそうだから教えてやんね。
640nobodyさん:05/02/24 11:04:06 ID:???
まあ今から新しく作るなら XML かなと思う
Tomcat の設定ファイルみたいな感じで
641nobodyさん:05/02/24 11:05:15 ID:???
>>637
「スレ違いだから自分でググって調べなさい」という皮肉だね、たぶん。
Perlのコーディングに直接にはなんの関係もない話をレスしないでねって暗に言っていると察っするが吉。
642630:05/02/24 11:40:08 ID:Q/hMlpe6
つまりフォームメールもまともに作れない回答者しかここにはいないってことか
さすがにここまで見当違いなレスをされるとあきれるね。

>>639
用がないならレスはしないでいいよ。暇だからって八つ当たりはやめとけ。

>>641
そうなんですかね。多分>>631は問題が何か理解できなかっただけでしょ。
HTMLレベルで考えてるとしか思えないね。
643638:05/02/24 11:43:40 ID:???
text::csv_xsを使ってみたんですが、素朴な疑問が;

何故かShift_JISのファイルをそのままパースできてるみたいですが、
これってEUCでもいいんですよね?

一応csvファイル事態はShift_JISですが、読み込んだときにEUCに変換して扱いたいんです。
パースして$csv->fieldsでとる前に変換はしておいたほうが回数も少なくて済みますし。

書き込み時には又、Shift_JISにしますけど。
644631:05/02/24 11:45:55 ID:???
あれだけでそんな判断するとはw
   \  __  /
   _ (m) _ピコーン
      |ミ|
     ('A`)    体技:スルー!
     ノヽノヽ
       くく
645638:05/02/24 11:50:40 ID:???
use Text::CSV_XS;
my $csv = new Text::CSV_XS({ binary => 1 });
open FH,"test.csv";
my @array;
while (<FH>){
jcode::convert(\$_,"euc");
$csv->parse($_);
push @array,$csv->fields;
}
close FH;

こういう$_これをjcodeに渡して変換してもらうのってありですか?
一応動くのですが、行儀悪い行為になるんでしょうか?
なんか<FH>を直接書き換えているみたいで怖いんですが;
646nobodyさん:05/02/24 11:55:08 ID:???
>>645
とりあえずchompしとけ。
647nobodyさん:05/02/24 12:29:11 ID:???
>>630
正直「エスケープ」というのがいまいちよくわからない。
open(PIPE," | sendmail $address") するときに $address の中に shell のメタ文字が
という対 shell サニタイズの話なのか?

俺がメールフォーム作るなら、そういう問題を考えなくて良いように Net::SMTP を使う。
もちろん、宛先アドレスが valid かどうかというのは検証するし、
Subject とかのマルチバイト文字は MIME エンコードするけど、
それって「エスケープ」の話じゃないよな。
648nobodyさん:05/02/24 12:33:23 ID:???
...2005/02/23(水) 23:06 [Perl] タイトル
関東と北陸、近畿に春一番
...2005/02/22(火) 21:07 [Windows] 無題
あいうえお
かきくけこ
...2005/02/21(月) 23:15 [Perl] 勉強
ああああ
ええええ

上のようなテキストから、
指定した文字列が含まれる(行頭が...の)タイトル行と、
その本文(内容)を抽出して出力するスクリプトを作りました。
動作しているのですが、
このようなwhile (<>) {の中にさらにwhile (<>) のある使い方が
書籍などを見ても見つからず分からないのですが、誤った使い方ですか?
もし間違いなら、どのような処理にすれば良いのか教えて下さい。
649648:05/02/24 12:33:59 ID:LxzKNGW5
$sample = "Perl";
while(<>){
 if(/^\.\.\..*\[$sample\]/){ # もし行頭に...がある場合
   $title=$_;
   print "$title";    # タイトル行の出力

   while(<>){
     if(!/^\..*/){    # もし行頭に.が無い場合
       $body=$_;
       print "$body"; # 本文の出力
     }
     if(/^\..*/){    # もし行頭に.がある場合
       last;
     }
   }
 }
}
650630:05/02/24 13:15:43 ID:Q/hMlpe6
>>647
open MAIL,"| /usr/sbin/sendmail -t";
print MAIL 'To: '.$form{to}."\n";
print MAIL 'From: '.$form{from}."\n";
print MAIL 'Subject: '.$form{subject}."\n\n";
print MAIL $form{body};
close MAIL;

こういうときに@form{qw/to from body/}に含まれてる危険な文字をエスケープするって
意味ですが、そもそも始めはフォームメールにXSS対策的なエスケープが必要だとは
思っていませんでした。

メールのヘッダである@form{qw/from to/}の値には改行を許してはいけない程度でしか
考えていませんでした。

その後、人にフォームメールを作るならエスケープのために相当な知識が必要だといわれました。
なのでそうなんだぁと思って、今回まずはまともなフォームメールを教えてもらって、
それを見ながらどういう文字に気をつければいいかを勉強しようかなと。

ネット上でsendmail エスケープで見てもイマイチ関係のありそうなのが出てこないんですよね。
sendmail系で出てくるのはメールアドレスの正規表現やソレヨウノモジュール。
ついでにsubject用のエンコード方法あたりがほとんどですね。

>open(PIPE," | sendmail $address") するときに $address の中に shell のメタ文字が
>という対 shell サニタイズの話なのか?
そうだと思います。そんな感じで言われました。ただUNIX系の話ですか?と聞いてから
返事がないのでよくわかりません。
651630:05/02/24 13:18:55 ID:Q/hMlpe6
742 :nobodyさん :05/02/10 16:15:16 ID:???
CGIでエスケープすべき文字についてお尋ねします。
sendmailでメールを送るときに本文やToをユーザが入力した内容に
する場合はどういう文字をエスケープすればいいでしょうか?

743 :nobodyさん :05/02/10 16:59:49 ID:???
>>742 おぼえること大杉

744 :742:05/02/10 18:59:35 ID:???
>>743 Toにクエリを埋め込む時もメールのヘッダーが終わった後の本文でも 同じエスケープではないですよね?
とりあえず現状ではToの方は\だけエスケープしてます。 本文のほうは何もしてないままです。
UNIXのコマンド文になるようなのを気をつけなければならないのでしょうか?

745 :nobodyさん :05/02/10 22:07:44 ID:???
>>744
もしお前が釣りなら、俺を感動させたことを誇っていい。お前には才能がある。
もし本気でメール出すCGIを作るつもりなら、かなり道は険しいぞ。

746 :nobodyさん :05/02/10 23:14:42 ID:???
>>744
つ[ ttp://www.ipa.go.jp/security/awareness/vendor/programming/ ]
とりあえずここでもどうぞ これ読んだ上でsendmailに特化した話
652nobodyさん:05/02/24 13:19:33 ID:???
>>649
タイトルに$sampleを含むデータが連続してると、偶数番目のデータが表示されない。
二重ループでもできるが、単ループでフラグ使った方が簡単かと。

my $target;
while (<>) {
 /^\.{3}/ and $target = /\Q[$sample]/;  # 行頭が...なら対象データか判断
 print if $target;  # 対象データなら出力
}
653649:05/02/24 13:58:07 ID:???
>>652
レスありがとうございます。
仰るとおり連続してると偶数番目が表示されませんね。
気が付きませんでした。
フラグを使うとここまで短くなるとは。。。

もっと勉強してきます。
ありがとうございました。
654638:05/02/24 14:12:15 ID:???
今はファイルの中身を読んで変数に入れるのをサブルーチンにしています。
しかし今後を考えて外部のライブラリファイルにまとめたいと思います。

そこで一つ問題点。
UNIX環境でCGIを動かすと、ライブラリ内でcsvファイルパスを相対パスで設定しても
カレントディレクトからの相対パスになってしまいますよね。

これでは色々なファイルから読めません。
環境が違えばこの前提も変わるかもしれません。
なので読み込む側から読み込むファイルへのパスを引数として持たせようかと考えました。

しかしよく考えると、それっておかしいですよね;
ライブラリがどのファイルを読むかを呼び出し側で設定しないといけないと、
なんかオブジェクト志向チックではないというか;
まあモジュールにしなければいいみたいな勢いですが。

ああ。よくわからん、もういいや。
655nobodyさん:05/02/24 15:34:07 ID:???
>>654
モジュールの中でファイルを絶対パスで指定しておき、デフォルトではそれを使う
デフォルト以外のパスを使う場合は、呼び出し側からコンストラクタの引数で指定する
というのがよくあるやりかただと思う
656nobodyさん:05/02/24 17:33:07 ID:???
qw/a 1 2/;
この0番目をキーとしてそれ以降をそれぞれ違うハッシュの値としたいです。

my %hash;
sub{
@hash{qw/hoge hage/}->{$_[0]} = @_[1,2];
}->(qw/a 1 2/);

こんな感じで%hashの中にhogeとhageを作り、hogeとhageはそれぞれハッシュのリファレンスで、
それに大して値を一発で渡したかったのですが、エラーでした。

$hash{hoge}->{$_[0]} = $_[1];
$hash{hage}->{$_[0]} = $_[2];

ブサイクですがこういう方法しかないのでしょうか?
657nobodyさん:05/02/24 17:44:00 ID:???
よくわからんけどこーゆーんがやりたいの?

$hash{'hoge'}->{$_[0]} = [ @_[1 .. @#_], ];
658656:05/02/24 17:52:16 ID:???
>>657
$hash{hoge}->{$_[0]} = $_[1];
$hash{hage}->{$_[0]} = $_[2];

これを一行で済ませたいんです。本当はhogeは10種類くらいあるのです。
なのでいちいち10行も使うと汚くなるので・・・
659nobodyさん:05/02/24 18:11:55 ID:???
>>658
my $k = shift;
foreach (qw(hoge hage)) {
$hash{$_}->{$k} = shift;
}

でいちおうできると思うが、なんとなくデータ構造
見直したほうがいいんじゃないかという気もする。
660656:05/02/24 18:19:24 ID:???
>>659
ブロックですか・・・・
661nobodyさん:05/02/24 18:43:18 ID:???
ブロックがいやなら:

my $k = shift;
$hash{$_}->{$k} = shift foreach (qw(hoge hage));


662nobodyさん:05/02/24 18:47:04 ID:???
656に近い形で書くなら、
sub{
$hash{$_}->{$_[0]} = splice(@_,1,1) for qw/hoge hage/
}->(qw/a 1 2/);

でも、
>いちいち10行も使うと汚くなるので・・・
何ヶ所かで使うんだったら、659を関数化して使った方がいいと思うぞ。
663656:05/02/24 20:13:43 ID:???
>>661-662
やはり
@hash{qw/hoge hage/}->{$_[0]} = @_[1,2];
こういうのは無理なんですね。

色々あげてもらって悪いのですが、ぱっと見の読みやすさで
$hash{hoge}->{$_[0]} = $_[1];
$hash{hage}->{$_[0]} = $_[2];
こうしておきます。

これをするのは外部サブルーチンにすることで良しとしておきます。
すみませんですm(_ _)m
664nobodyさん:05/02/24 22:09:00 ID:???
print qq|
@{[
map {"$i : $_<br>"} @array
]}
|;

こういう出力中にやるmapの中で$iに何回目のループかを持たせるにはどうすればいい?
my $i;
まずこれができないんだよね。
さらにmap {"$i : $_<br>"; $i++} @array
とすると$i++の渡されちゃう。なんか方法ないかな?
665未承諾広告※ ◆TWARamEjuA :05/02/24 22:29:23 ID:???
map { sprintf "%d : %s<br>", $i++, $_ } @array;
とか。
666nobodyさん:05/02/24 22:50:07 ID:???
>>665
myはどうする?
667nobodyさん:05/02/24 22:50:38 ID:???
>>666
localにする。
668nobodyさん:05/02/24 22:59:23 ID:???
print qq{
@{[
map( "$_ : $array[$_]<br>", 0..$#array )
]}
};
じゃ、ダメなん?
669nobodyさん:05/02/24 23:08:22 ID:???
1、特定のホストからアクセスを禁止したい
2、無知なので何もできず。。。
3、頭のエラーがでてできなかったw
670nobodyさん:05/02/24 23:30:51 ID:???
>>667
どういうちがいがあるの?
671nobodyさん:05/02/24 23:49:43 ID:???
>669
まずは頭のエラーを治してきて。
それはどうしようもねーや。
672nobodyさん:05/02/25 00:04:58 ID:???
ハッシュの中にリファレンスも含んでる時ってどうやって安全にメソッドに渡すの?
&routin({%hash});
こうすると%hash自体は安全に見えるけど、もしもこの中身が
my %hash = (a=>1 , b=>[qw/1 2 3 4 5 6/] , c=>\("あいうえお"));

こんなのだったらbとcは渡された先でいじられた時にメイン側の$hash{b}にも
影響出るよね。
673nobodyさん:05/02/25 00:11:41 ID:???
>>668
keys 使ったハッシュの場合とかじゃない?
674nobodyさん:05/02/25 00:17:31 ID:???
>>672
参照を持つ言語は皆同じことで悩むね。
675nobodyさん:05/02/25 00:22:39 ID:???
うむ、どうしようもないな

リファレンスの中身を再帰的に嘗めてってツリー全体を複製する手もあるのかもしれんが
ファイルハンドラやソケットを持ってると原理的にお手上げだし
676nobodyさん:05/02/25 00:25:59 ID:???
さわんな禿げ!がベター。
677nobodyさん:05/02/25 01:05:47 ID:???
改行コードの置換をしたくて
$value =~ s/\r\n|\r/\n/g;
としたのですが、これでは間違いようで馬鹿にされました。
$value =~ s/\x0A\x0D|\x0A/\0D/g;
JISの改行コードというサイトをみたらこれで合ってると思うのですが、大丈夫ですか?

それと改行コードはどうして\nでマッチを期待してはいけないのでしょうか?

678672:05/02/25 01:08:15 ID:???
>>674-676
おぅ、みんなそこらへんは適当にごまかしてるわけね^^;
まぁしょうがないかな。壊されては困るものは面倒でも一旦完全に紐解くよ。
ソケット云々はまだ知らないのでそこらへんはまたいずれ悩むかなw
679nobodyさん:05/02/25 01:14:10 ID:???
680nobodyさん:05/02/25 02:37:30 ID:???
>>672
弄られたくないものは渡さない。
681nobodyさん:05/02/25 02:41:38 ID:SjmmN0vW
print "Content-type: text/html\n\n";
print "ほげほげ";
と、一度printしたものを出力させたくないのですが、
出力バッファの削除というのはどのようにすればいいのですか?
682nobodyさん:05/02/25 02:53:34 ID:???
>>681
> 出力バッファの削除というのはどのようにすればいいのですか?
無理。

> 一度printしたものを出力させたくないのですが、
一度だけ出力するように設計する。
変数を使って、出力したかどうかを記憶させるなど。
683nobodyさん:05/02/25 02:57:02 ID:???
>>682
ありがとうございます。
人の書いたソースにモノ組み込む必要がでてきてそれで…
元ソース書き換えて対処します。
684nobodyさん:05/02/25 04:04:19 ID:???
>>672
readonlyなんとかとかいうモジュールで一時的に書き換え禁止にする。
$a = { b => { c = 1} }; $a->{b}{c} = 0とかもエラー吐いてくれる。
遅くなるけど
685677:05/02/25 13:07:55 ID:???
>>679
そこも見ました。
\x0A\x0D

\x0D\x0A
はどちらが正しいのですか?両方見るんですが。両方あるのでしゅう?
686nobodyさん:05/02/25 14:22:51 ID:???
今日はじめてCGI::Cookieを使ってcookieを焼いていました。
今まではexpiresも自分でルーチン作ってやってましたが、ちょっと使ってみようかと思って。

そこで気付いたのですが、CGI::Cookieを使ってやると
new CGI::Cookie (-value => "文字列")
-valueの中の文字列は
$value =~ s/(\W)/'%' . unpack "H2",$1/eg;
これとかでエスケープを自動的にしてしまうのでしょうか?

アスタリスクが%2Aに変換されて困りました。
あンエスケープすれば言いといわれればそれまででsが。
687630:05/02/25 14:34:51 ID:???
>>650-651
セキリュティ対策バッチリのフォームメール制作経験がある方はいないでしょうか?
688647:05/02/25 15:17:01 ID:???
>>687
いやだから sendmail じゃなく Net::SMTP でなら作れるってば

sendmail の -t オプションの詳細仕様ってよく知らないのだが、
ちょっと考えただけでも以下のような疑問が浮かんでくる。

1. RFC822で許されている範疇の特殊文字でセキュリティ的な問題が生じるのか?

2. 生じるとしてそれをエスケープで回避できるのものなのか?

3. 回避できるとして、そのときに使うエスケープの方法は?
バックスラッシュをつける? URLエンコード? MIMEエンコード?

で、3まで考えると、エスケープするということ自体がかなり馬鹿馬鹿しいように
思えてきて仕方が無いんだが。
689630:05/02/25 15:31:07 ID:???
>>688
Net::SMTPですか。
ものすごい難しいそう・・・
sendmailでの話を知ってる方はいないのでしょうか?
690nobodyさん:05/02/25 15:34:52 ID:???
>>689
Socketを使うよりずいぶん楽だぞ
691nobodyさん:05/02/25 15:36:42 ID:???
変数の中に入ってる特定の文字列がありまして。
それがある回数以上でるようならそれ以後のその文字列部分は削除する正規表現
を書きたいです。

スイッチを持たせるのが一番?
my $swith = 0;
$value =~ s{(あいうえお)}{1}g;
あぁスイッチの保有方法忘れてるおrz

692nobodyさん:05/02/25 15:42:53 ID:???
my $s = '1gaga2gaga3gaga4gaga5gaga6gaga7gaga8gaga';
my $p = 'gaga';

my $count = 0;
$s =~ s/(\Q$p\E)/++$count>=3?'':$1/ge;
693691:05/02/25 16:22:22 ID:???
>>692
どうもです。
694nobodyさん:05/02/25 16:26:07 ID:???
>>689
とりあえず、ヘッダに含まれるのの改行だけはきっときゃいいんじゃないの
それしとかないとMTみたいなことになるし
695nobodyさん:05/02/25 17:16:26 ID:???
744 :742:05/02/10 18:59:35 ID:???
>>743 Toにクエリを埋め込む時もメールのヘッダーが終わった後の本文でも 同じエスケープではないですよね?
とりあえず現状ではToの方は\だけエスケープしてます。 本文のほうは何もしてないままです。
UNIXのコマンド文になるようなのを気をつけなければならないのでしょうか?

745 :nobodyさん :05/02/10 22:07:44 ID:???
>>744
もしお前が釣りなら、俺を感動させたことを誇っていい。お前には才能がある。
もし本気でメール出すCGIを作るつもりなら、かなり道は険しいぞ。


こいつに聞くのが一番いいんじゃないか?
まあ俺はsendmailでエスケープ云々なんて今まで聞いたことがない。
っていうかそういうサイトを一度も見たことがない。
単純にだまされてるだけだろ。
696nobodyさん:05/02/25 19:16:12 ID:???
>>685
Windows/DOSは\x0d\x0a
\x0a\x0dなんて環境は知らないなぁ。

ttp://www5.airnet.ne.jp/thepond/html/job/return.htm
ちょいとグーグルで見つけたサイトだけど、読んでおくといいよ。
697nobodyさん:05/02/25 20:16:25 ID:???
>>686
value()を呼び出せばいいのでは?

ちょっと強引ですが
my %cookie = CGI::Cookie->fetch();
foreach(values %cookie){
$_ = $_->value();
}
とか

# CGI.pmから使うと、上の処理も不要になったりします。
# って、何か外してそうですね。
698nobodyさん:05/02/25 20:45:31 ID:HRqs4JtA
現在利用しているサーバーで、
> sendmailやSocket関数およびSocketモジュールはセキュリティ上、使用できません。
と書かれているのですが、ネットワーク関連はあきらめるしかないですか?
699nobodyさん:05/02/25 20:55:25 ID:???
@category = ('flower','car','house','your','sky');

↑上のようにカテゴリを設定しています。このカテゴリは並べ替えや変更、増減が頻繁にあります。
album.cgiでは上のカテゴリ別ページに飛ぶリンクを一覧表示させています。
そのリンク先であるカテゴリ別ページは?category=houseという形になっています。
カテゴリ別ページに、前後へのリンクを付けたいのです。
houseを開いた時はcarとyour、skyを開いた時はyourとflowerというように。
後ろが無い場合に一番前に帰ることは出来なくても構いません。
現在はカテゴリを変更する度にいちいち書き換えているのですが…。
自動的にリンク出来れば嬉しいのです。よろしければヒント等戴けませんか?
700nobodyさん:05/02/25 21:12:20 ID:???
>>698
Perl コーディングとは関係無いレベルで無理だろう

>>699
カテゴリ別ページで「自分が何番目のカテゴリとして呼ばれたか」を調べて
配列的に+1とか-1とかしてリンクを生成すれば良いのでは
701nobodyさん:05/02/25 21:12:56 ID:???
>>699
CGIの質問ですか?スレ違いだけどちょっぴり
受け取ったカテゴリ名と@categoriの中身を比較すれば

あとは誘導先で聞いてね

△▲ WebProg 初心者の質問 Part11 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1101635909/
CGIとかPerlとか超初心者なんだけど、
http://pc5.2ch.net/test/read.cgi/php/995618200/
CGIだけど、なんか質問ある? Part 12
http://pc5.2ch.net/test/read.cgi/php/1097334246/
702698:05/02/25 21:24:54 ID:???
>>700
やっぱりですか・・・どうもありがとうございました。
703nobodyさん:05/02/25 21:57:54 ID:???
>700
>701
スレ違いだったのですね、すみませんでした。
スレ違いだったのにヒント下さってありがとうございます。
おかげさまで思い付いたことがありますので、スマートな処理ではないのだと思いますが、試してみます。
それでも駄目でしたら誘導して戴けたスレッドの方で質問してみますね。

スレ汚しすみませんでした。ありがとうございました。
704nobodyさん:05/02/26 06:43:27 ID:???
>>699
完全にリンクをつなげるには、現在位置$posから
my $prev = ($pos-1)%@category;
my $next = ($pos+1)%@category;
というように剰余を使うと簡単にできますよ。
705nobodyさん:05/02/26 13:28:48 ID:???
my $value = 'a=1&b=2&c=0';

$valueの中は常にこのフォーマットにしておきたいので、
$valueの中身が違うフォーマットだったら中身を削除するというスクリプトを書きたい。

フォーマットが異常かどうかの条件式を日本語でいうと。
1.区切りは&
2.サブ区切りは=
3.キーや値は[a-zA-Z\-]のみ許容

これをPerlで書くとどうなりますか?
$value =~ /^[a-zA-Z]*=[a-zA-Z](?:&[a-zA-Z]*=[a-zA-Z])*$/;

これでどうでしょう。穴があったら教えて下さい。それともっといい方法があるならお願いします。
706705:05/02/26 13:36:10 ID:???
あ、iオプシションを使うと
$value =~ /^[a-zA-Z]*=[a-zA-Z](?:&[a-zA-Z]*=[a-zA-Z])*$/;
これが
$value =~ /^[a-z]*=[a-z](?:&[a-z]*=[a-z])*$/i;
こうできるのかな?
そんなわけない???
707nobodyさん:05/02/26 14:08:08 ID:???
基本的な部分ですが、Perlでは文字列を数字として評価した場合に0以外が返されることはあるのでしょうか?
%formの中から値が数字で1以上でないものは削除したいんです。

%form = map { $form{$_} > 0 ? ($_,$form{$key}):() } keys %form;

これで文字列ははじけますか?
708nobodyさん:05/02/26 14:23:47 ID:???
条件式AがあってそのAは%hashのキーをいくつか返してきます。
foreach (grep /\-/,keys %hash){
delete $hash{$_};
}

でも条件Aが返してくるリストの数が3以上のときだけ、それ以降を全てdeleteしたいのです。
my $i =0;
foreach (grep /\-/,keys %hash){
delete $hash{$_} if $i > 1;
$i++;
}

これでできます。しかし$iとか作るのダサイので嫌です。
mapやgrepで$iを作らずにリストの?個以降には特別な処理をするということはできませんか?
709nobodyさん:05/02/26 15:08:00 ID:???
>>707
ソレダメ。
文字列も数値で10とか出せる。

例)
qq{10あいうえお}

だから面倒でも
$form{$_} =~ /^[\d]*$/ and $form{$_} > 0
とかするべきだね。
710nobodyさん:05/02/26 15:32:07 ID:???
[\d]ってやる必要あったっけ?
711nobodyさん:05/02/26 16:05:09 ID:???
>>708
やろうと思えば

delete @hash{sub{@_[2..$#_]}->(grep /\-/, keys %hash)};

とかできるけど、見やすいかどうかは知らん。
712nobodyさん:05/02/26 16:10:36 ID:???
>>711
やっぱこのスレの人頭いいわ・・・
delete 八種スライス
がありなのすら知らなかった。
713nobodyさん:05/02/26 16:42:07 ID:G5yzeqwR
Text::CSV_XSを使ってCSVファイルの作成をしているのですが、
とあるソフトではExcelの形式と違って改行はCRLFのみ、各項目は全てダブルクォートで
括ってないといけません。

どうすればいいでしょうか?改行問題は別にいいですが、どんな時も項目をダブルクォートの中に
入れるのはわかりません。宜しくお願いします。
714nobodyさん:05/02/26 17:00:42 ID:???
>>713
always_quote。マニュアルよく読め。
715nobodyさん:05/02/26 17:20:53 ID:???
正規表現のメタキャラを自分で決めることはできますか?
716nobodyさん:05/02/26 20:04:03 ID:???
すごい初歩的なことなんだと思うのですがわかりません・・。

if ($NEDAN == "0"){$nedan_a = "非売品";}
elsif ($NEDAN == "rea"){$nedan_a = "レア";}
elsif ($NEDAN == "pre"){$nedan_a = "プレゼント";}
else {$nedan_a = $NEDAN."円";}

と書いてあり、$NEDANには「数字」か「0」「rea」「pre」がはいるのですが
「数字」の場合は最後のelse表記できちんと出るんですが
(100円とか200円というふうに)
「0」「rea」「pre」の場合、最後の「プレゼント」で表示されます。。
この部分だけでなにか悪いところがあるのでしょうか?
717nobodyさん:05/02/26 20:07:48 ID:???
取り敢えず、そのアルゴリズム(?)はあんま良くないと思うよ。
実力にもよるけど全体的な見なおしを。

それをそのまま使うなら、
文字列を比べる時は「eq」を使ってぬ。
718nobodyさん:05/02/26 20:20:13 ID:???
数値比較(==)では数に見えない文字列は0とみなされるので、
「非売品」になるならわかるが「プレゼント」になるのは
かなり不思議だ...
719nobodyさん:05/02/26 21:09:36 ID:???
>>705
条件の\-は、どこへ? 値は数字では?

> my $value = 'a=1&b=2&c=0';
を見る限りの勝手な解釈では

 /(?:(?:^|\&)[a-zA-Z\-]\=\d)+$/;

ちなみに[a-zA-Z\-]に数字と '_' も含むなら \w が使える [a-zA-Z0-9_\-]→[\w\-]


720nobodyさん:05/02/26 21:42:50 ID:???
フォーマットで出力する物を変数に代入出来ないのでしょうか?
どなたかご教授して頂けると嬉しいです(_ _)
自分で探したのですが、ファイルハンドルにしか出力する例しかみつからなくて。。
721nobodyさん:05/02/26 21:58:25 ID:???
>>720
perlform(1)に書いてあるよ。swriteってサブルーチンの
例があるのでこれを使うのが楽じゃないかと。
722nobodyさん:05/02/27 02:37:46 ID:G/Og0QBF
perlでクッキーの書き込みを行ったところうまくいかず、
クッキーの内容がブラウザに表示されてしまいました。
以下のプログラムは間違っているのでしょうか?

$cookie = "123";
$cookie =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;

print "Set-Cookie: test=$cookie; expires=Thu, 1-Jan-2030 00:00:00 GMT\n\n";
723nobodyさん:05/02/27 02:52:08 ID:???
たぶん >>722 に書いた部分以外のところが間違っているのだと思う
724nobodyさん:05/02/27 03:03:25 ID:bNUaI+sL
>>722
あなたはきっとこうやってるのでしょう。

print "Content-type: text/html\n\n";
うにゃうにゃ
うにゃうにゃ
うにゃうにゃ
722のロジック

違うかい?
725nobodyさん:05/02/27 03:11:14 ID:???
Perlについての質問箱 15箱目
http://pc5.2ch.net/test/read.cgi/tech/1105953092/623
726nobodyさん:05/02/27 07:05:37 ID:???
>>722
ヘッダに各。
727nobodyさん:05/02/27 12:50:54 ID:Ff0cBb5o
どこで聞いてよいかわからなかったのでこちらで。
mod_perlからPerl::RunにてPerlスクリプトを動かそうとしているのですが
ライブラリの参照先がApacheにおける標準のもの(?/apache/lib/perlとか)になってしまいます。
相対アドレスで任意に指定してやりたいのですが、可能でしょうか。
可能ならどうすればよいのでしょう?
728nobodyさん:05/02/27 13:41:22 ID:???
use lib qw(/path/to/libdir);
729nobodyさん:05/02/27 13:45:48 ID:???
>>728
ありがとうございます。試してみます。
730nobodyさん:05/02/27 14:08:37 ID:G/Og0QBF
>>723
>>724
>>726

ありがとうございます。ヘッダに書いたらうまく動きました。
731nobodyさん:05/02/27 14:46:46 ID:???
>>730
ム板のマルチにはちゃんと報告しとけよ。
732nobodyさん:05/02/28 11:38:59 ID:???
テキスト$textの中にurlっぽいのを見つけたら
<a href="$url">$host</a>にすべて置換する
ただし$hostに'.jp'があれば$hostの部分は'日本'とする

ってのを作りたいのですが、
"ただし"以降がうまくできません。
どう書いたらよいでしょうか?
733nobodyさん:05/02/28 11:41:22 ID:???
予め $host = '日本' if($host =~ /\.jp/) しとけばいいって話じゃないのか
734nobodyさん:05/02/28 11:45:17 ID:???
$urlは元のままでほしいんです。
<a href="http://google.co.jp/">日本</a>
ってなかんじです。
735nobodyさん:05/02/28 12:01:41 ID:???
よくわからんが、$url はそのままにしといて、$host だけ書き換えればいいように思う
736nobodyさん:05/02/28 12:14:24 ID:???
説明悪くてすいません。
$text='googleはhttp://www.google.com/ですが
google日本はhttp://www.google.co.jp/です。他にも(略)';
だとしたら、

$textが
googleは<a href="http://www.google.com/">www.google.com</a>ですが、
google日本は<a href="http://www.google.co.jp/">日本</a>です。他にも(略)
ってなってほしいんです。
$hostってのはurlにマッチしたうちのhostの部分って意味です。
737nobodyさん:05/02/28 13:08:20 ID:???
>>736
$text=
'googleはhttp://www.google.com/ですが
google日本はhttp://www.google.co.jp/です。他にも(略)'; 
$text =~ 
    s%
        http://([\w\d./]+)
    %
        my $tmp = $1;
        (($1=~/\.jp\/?$/) ?
            qq'<a href="http://$tmp">日本</a>' : 
            qq'<a href="http://$tmp">http://$tmp</a>')
    %xeg;
print $text;
738nobodyさん:05/02/28 13:57:59 ID:???
テキストを<a>タグ化して、
そのあとに"日本"化すればよいんでは?

「urlっぽいのを見つけたら」なんて軽く書いてあるけど、結構面倒だよ。
<a>タグ化する正規表現だけでも。?、&、#、%とか含まれてたりするからね。
739nobodyさん:05/02/28 16:02:53 ID:???
>>736
$text=~s((http://(?:[:@\w.-]+?(\.jp)(?::\d{1,5})?|[:@\w.-]+)[\w./~?=&;#+-]*))("<a href=$1>".($2?'日本':$1).'</a>')eig;
740nobodyさん:05/02/28 16:32:26 ID:???
みんなわかってて答えてるんだと思うけど
一個の正規表現でやろうとしないほうが良いんじゃね
741nobodyさん:05/02/28 18:25:42 ID:???
すごい初歩的な話ですが、
print "hoge";
my $value ="hage";

ダブルクォートってみなさん何を使ってますか?
私は今までqq||;っていうのが多かったですが、qq||これは入れ子できませんよね。
qq[]やqq{}ならどうやら入れ子がいくらでも可能だということに今日気付きました。

print qq[@{[ map qq[$_],qw/a b c/ ]}];
こういうことがqq[],qq{}ならできるんですね。

結構このスレを覗いてるとqq||っていう人が多いようです。
どうしてなのでしょうか?qq[]これで入れ子を作るのは偶然大丈夫なだけとか???
742nobodyさん:05/02/28 19:53:04 ID:???
偶然ではなく、そういう仕様。
743nobodyさん:05/02/28 19:57:05 ID:???
>>741
俺の場合は2ch掲示板スクリプトとかSJISで書いてるからSJISの全角文字に含まれないのを使ってる。
print qq()が多いかなぁ。その中にカッコつかいたかったらエスケープしないでprint qq!!にしてるよ。

まあ、なんでもいいんだけど。
744nobodyさん:05/02/28 19:57:46 ID:???
>>736
$text =~ s|(http://([-a-z0-9.]+)[-_.!~*'()a-z0-9;/?:\@&=+\$,%#]*)|
"<a href=\"$1\">". (substr($2, -3) eq '.jp' ? '日本' : $2). "</a>"|ige;

>>741
私はperlopに出てくる汎用書式そのままにqq{}使ってます。

http://www.harukaze.net/~mishima/perl/man/perlop.1.html
> 選んだ区切文
> 字が括弧の類でない場合には、前後の文字として同一のものを使い
> ますが、4 つの括弧 ((), <>, [], {}) の場合にはネストできます。

ただ、括弧はきちんとネストしないとだめなので、Shift_JISで'日本'なんてリテラルがあると、
本の2バイト目が\x7b({)なので使えなかったりします。
745741:05/02/28 20:56:25 ID:???
>>742-744
SJISでの問題情報ありがとうございます。
やはりqq[]がベストですね。
746nobodyさん:05/02/28 21:23:11 ID:???
>>745
SJISは2バイト目が、'[', ']' もあるから、そういう意味ではベストじゃないよ。
>>744の4つの中でSJISで使われないのは '(', ')' と '<', '>' だけだから。
747nobodyさん:05/02/28 21:35:23 ID:???
>>745
Shift_JISの'ー'の2バイト目が\x5b([)なので、危険度は高いかと。
748741:05/02/28 22:40:39 ID:???
>>746-747
!?
でも()や<>はきついんですよね。
print qq<<html>>;
こういう感じになってHTMLの閉じ忘れがそのままPerlのエラーになりますよね。
prnt qq(${\(100*200)});
こっちは何でも大丈夫になるんですよね。
>>743さんの
>print qq()が多いかなぁ。その中にカッコつかいたかったらエスケープしないでprint qq!!にしてるよ。
という一言がもの凄く気になるんですが、ネストokですし・・・何をさしてるのでしょうか?
もしかして(これの片方だけをテキストとして埋め込む時などの事を言ってるのかな。
それだったらqq{}qq[]qq<>共通の問題ですよね。

qq{},qq[]これの問題点は基本的にSJISでコーディングするときだけで、EUCで普通に組む時は
変数内にSJIS文字が格納されていても問題ないから大丈夫なんですよね?

749nobodyさん:05/02/28 23:51:38 ID:???
>>748
print qq[[];
これは括弧が合ってないからエラーになる。

そしてShift_JISで
print qq[コンピューター];
と書くと同じエラーになる。
原因は'ー'の2バイト目が\x5b([)だから。
…という話です。

同様に
print qq|酢|;
もアウトです。

use encoding "shiftjis";で回避はできますが、
(),<>,!や"といった\x20-\x3fの範囲の記号は
漢字コードとして使われないので、この問題は起きません。
またリテラルでなければ、問題ありません。
EUC-JPでは全く問題ありません。
750nobodyさん:05/03/01 00:42:29 ID:???
>>749
open FH,">test.text" || &error("ダメだこりゃ");
こうやったんだけど何故かエラー処理が機能しない。
open (FH,">test.text") || &error("ダメだこりゃ");
こうやったら機能した。何でこんな不都合な優先順位なんだろうか・・・
関数をいちいち括弧で括るのは面倒だし、汚い。

my $dbh = DBI->connect() || &error("まずいよそれ");
これの場合は完全に機能しない。コネクトに失敗しても&errorが呼ばれない。
何とか呼ばれるようにしたいけど、この場合は無理なの?
751nobodyさん:05/03/01 00:46:44 ID:???
or を使えよ。
752nobodyさん:05/03/01 00:49:31 ID:???
connect に失敗するとその時点でエラー終了するから、当然 || 以降なんて呼ばれるわけがない
eval でトラップ汁
753nobodyさん:05/03/01 00:56:50 ID:???
>>752
しない。
754nobodyさん:05/03/01 01:01:36 ID:???
>>750
>>>749
>優先順位なんだろうか・・・
だよ
>関数をいちいち括弧で括るのは面倒だし、汚い。
or だよ
>この場合は無理なの?
俺に聞いてるの?
755nobodyさん:05/03/01 02:10:40 ID:???
もしかして俺に聞いてるんだろうか
756nobodyさん:05/03/01 03:14:15 ID:???
いや俺。
757nobodyさん:05/03/01 03:42:42 ID:???
>>755
split '*',$value;
こうするとエラーになります。理由は*が正規表現のメタ文字だからです。
しかしシングルクォートなのに展開されるのはこまります。

split '\*',$value;
split /\*/,$value;

こういうことはしたくありません。何とかできませんか?
758nobodyさん:05/03/01 04:18:59 ID:???
>>757
逝ってる意味がわかりません!
759nobodyさん:05/03/01 04:28:19 ID:???
>>757
split quotemeta '*', $value;
760nobodyさん:05/03/01 04:47:02 ID:???
>>758
長いんですが・・・・
エスケープしたくないのは一文字分うっとおしいからです。
quotemetaだともっと長くなってしまいますよねorz

でもこんな夜中に親切にありがとうござまいしたm(_ _)m
761nobodyさん:05/03/01 05:34:57 ID:???
>>760
自分専用のライブラリでも作ったら?

sub sp($$){
my $reg_str = shift;
my $in_str = shift;

split quotemeta $reg_str, $in_str;
}


とか作っておけばそれ以後は

sp '*', $value;

とかできるじゃん。



762nobodyさん:05/03/01 07:48:10 ID:???
>>757
> split '[*]',$value;
763nobodyさん:05/03/01 09:51:40 ID:???
>>760
一文字分長いからって・・・('A`)
764nobodyさん:05/03/01 12:18:28 ID:VBiT7+i4
hoge.cgiにアクセスしたらリダイレクトでhoge2.cgiにLocationで飛ばしたいのですが、
その時にPOSTメソッドでfoo=barなどの情報も送りたいと思っています。

ヘッダー情報はどのように出力させたらよいでしょうか?
765nobodyさん:05/03/01 12:20:59 ID:???
>>764
POSTじゃ無理だから普通はGETでURLに埋め込む
どうしてもPOSTにこだわるなら.htaccessでmod_rewrite使う
766nobodyさん:05/03/01 12:38:51 ID:VBiT7+i4
>>765
THX!
無理なんですか。
ありがとうございました。
767nobodyさん:05/03/01 13:37:54 ID:???
defined $ENV{'REMOTE_ADDR'} && $ENV{'REMOTE_ADDR'} ne '127.0.0.1'
これを条件文にして真なら
open MAIL,"| /usr/sbin/sendmail -t";
もしも偽なら
open MAIL,">mailtest.txt";
これを実行してその後は同じことをしたいのです。
print MAIL "To:\n";
print MAIL 'From: ',"\n";
print MAIL '";
print MAIL $mail;
close MAIL;

どうすればいいでしょうか?ifはダサイので嫌いです。
?演算子でいきなりやれますか?
768nobodyさん:05/03/01 13:39:45 ID:???
勘違いします。

そうではなくて"| /usr/sbin/sendmail -t"これと">mailtest.txt";これの
どちらかを変数に入るようにして
open MAIL,$type;
などとしても動作するのですか?
769nobodyさん:05/03/01 13:48:56 ID:???
素直にif-else使え
ダサいとか思ってるのはお前だけだから
あと日本語の勉強頼む
770767:05/03/01 14:08:26 ID:???
>>769
どういう意味でしょうか?
ダサイと思ってるのが自分だけだとしてそれが一体何の関係があるのですか?
右倣えしてれば満足できちゃう方ですか?
771nobodyさん:05/03/01 15:09:18 ID:???
>>767
open MAIL, defined $ENV{'REMOTE_ADDR'} && $ENV{'REMOTE_ADDR'} ne '127.0.0.1'
 ? "| /usr/sbin/sendmail -t" : ">mailtest.txt";
ということ?
772nobodyさん:05/03/01 16:02:49 ID:???
一文字分長いとかif分ダサいとか笑える
773nobodyさん:05/03/01 16:26:39 ID:???
答えたくない質問はスルーでお願い。
いちいち言わせないでね。
774767:05/03/01 16:55:23 ID:???
>>771
もういいです。もっと綺麗に済ませました。ごめんなさい。
>>772
画面の前で一人で笑うんだね君は。
>>773
基本的に今回は私が八つ当たりをしただけなのでごめんなさい。
775nobodyさん:05/03/01 16:57:23 ID:???
ベンチ取ると微妙にif-elseよりも三項演算子のほうが速い罠。
776nobodyさん:05/03/01 17:01:59 ID:???
if(1){
  print <<"EOM";
そのとき
妹は
EOM
}
だとインデント無視しなければいけないのでいつも
if(1){
  print "そのとき\n";
  print "妹は\n";
}
と記述していますがこれだと面倒+速度遅くなってしまいます。
美しくかつ簡単で記述する方法はないでしょうか?
777nobodyさん:05/03/01 17:05:51 ID:???
>>774
どうやったの?
778nobodyさん:05/03/01 17:16:19 ID:???
>>776
ヒアドキュメントをネストすればいけるんじゃないか?
昔に誰かが言ってた。過去ログ読むか賢い人を待ちなさい。
779nobodyさん:05/03/01 18:08:05 ID:AybE+O5L
出力について質問です。
print分は全て以下のような形式で書いています。

print $handle qq("テスト");

これで、$handle="FH";とするか$handle="STDOUT";とするかでファイルに落としたり
画面にそのまま出力したり振り分けているのですが、
同一処理を画面に出しながらファイルに保存するにはどうしたらいいのでしょうか?
780nobodyさん:05/03/01 18:16:06 ID:???
>>779
普通は出力なんて1回。だから出力内容をファイルにも入れたいなら

print $source;
open FH,">test.txt";
flock FH,2;
print FH $source;
close FH;

でおわる。

まずは出力はルーチンに投げておしまいというわかりやすいプログラミングを心がけてはいかが?
781nobodyさん:05/03/01 18:18:58 ID:???
>>708,767
上のガキはスルーで。
782nobodyさん:05/03/01 18:22:57 ID:???
tee にパイプで送るとか > 画面とファイルの両方に出力
783nobodyさん:05/03/01 18:28:20 ID:???
>>779
IO::Tee - Multiplex output to multiple output handles
http://search.cpan.org/~kenshan/IO-Tee-0.64/
784nobodyさん:05/03/01 18:38:52 ID:???
>>776
Perlクックブックにレシピ1.11「ヒアドキュメントをインデントする」てのがある。
オレのもってるのは一つ前の版だが最新版でもどっかにあるだろう。

要約すると、「インデントつけといて自分で削れ」ってことみたいだな。
単に行頭の空白を全部削るやつとか、行頭の共通文字列を削る奴とか
いくつかの例がある。

785nobodyさん:05/03/01 19:35:54 ID:???
>>776
つまりこういうことやね!

if(1){
  print do{(local$_=<<"  EOM")=~s/^  //mg;$_};
  そのとき
  妹は
  EOM
}
786743:05/03/01 19:47:30 ID:???
>>748
SJIS使ってて全角文字だったら文字の相性によってエラーが起きるの。
カッコつかうなら ( ) と < > 以外はこの問題が発生する可能性がある。
< > はタグで使うことが多くて見にくくなるから、普段は ( ) を使うんだけど、
その中にカッコを使いたいなら \) とかやらないで、 print qq!)! ってやってる、って意味。
! もこんな問題はおきません。
787nobodyさん:05/03/01 20:11:50 ID:???
>>776
if(1){
    print fix(<<"    EOM");
        そのとき
        妹は
    EOM
}

sub fix
{
    (my $str = shift) =~ s/^\s+//gm;
    return $str;
}

Perlクックブック1.11
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#Why_don_t_my_E_lt_E_lt_HERE_docu

二行程度なら、私はこうするかな。

if(1){
    print "そのとき\n",
        "妹は\n";
}
788nobodyさん:05/03/01 20:29:30 ID:3fkZkmcb
>>776
if(1){
print &fix;
}

sub fix {
return <<"EOF";
そのとき
妹は
EOM
}
789nobodyさん:05/03/01 20:35:33 ID:p/vg3iSU
my @messages = qw(
  その時
  私は
);
print join("\n", @messages);

空白があるとダメだけど。
790nobodyさん:05/03/01 21:37:00 ID:???
>>776
#思いきってこんなんどう?

(my$script=<<'EOM')=~s/(?:^|\?>\n?)(.*?)(?:<\?|$)/;print'$1';/sg;eval$script;
そのとき
妹は
EOM

#こんなこともできるよ!

(my$script=<<'EOM')=~s/(?:^|\?>\n?)(.*?)(?:<\?|$)/;print'$1';/sg;eval$script;
<?

for(1..10){

?>
[<? print $_ ?>]<br>
<?

}

?>
EOM

#PHPとかJSPとかASPが嫌いだったら推めないけど
791nobodyさん:05/03/02 11:01:25 ID:???
>776
美しくもないしかなりの力技で処理的にも問題ありだと思うけど、
とにかくインデントしてソースの見た目をどうにかしたいってなら

if (1) {
$string = <<" EOF";
その時
妹は
EOF
$string =~ s/\t//g;
print $string;
}

↑インデントはTABでやってる場合ね
書き込みにTAB使えないから上のはスペースでインデントしてるけど
792nobodyさん:05/03/02 11:01:57 ID:fmkJJ4kU
ファイルの読み込み&書き込みについて
読み込むファイルの中身
--------
1
data
--------
やりたいこと=最初の数字を抜き出して、数字を足して、データを上書き
つまりこんな感じに
--------
2
data
data
--------
書いてみたもの(失敗)
--------
open (IN, "$outputFILE");
@tes = <IN>;
close (IN);

$tes = $tes[0];
$tes++;
$tes[0] = $tes;

open (OUT, ">$outputFILE");
print @tes;
close (OUT);

open (OUT, ">>$outputFILE");
print OUT "data\n";
close (OUT);
--------
アドバイスおねがいします!!!
793792:05/03/02 11:17:07 ID:???
>>792
$outputFILE = "data.txt";
です
794nobodyさん:05/03/02 11:29:16 ID:???
print @tes;

print OUT @tes;
795792 :05/03/02 11:59:36 ID:???
>>794
うわあー
ありがとうございます!
はずかしぃ
796nobodyさん:05/03/02 14:24:28 ID:???
まずはじめにヒアドキュメントなんてつかうなよ・。
797nobodyさん:05/03/02 17:03:02 ID:???
>>796意味がわかりません
798nobodyさん:05/03/02 17:06:17 ID:???
>>797
ショボ
799nobodyさん:05/03/02 17:19:36 ID:???
だって初心者だもん
800nobodyさん:05/03/02 17:28:30 ID:jdtsRVWh
すみません、Perl初心者です。
外部ドメインにあるXMLを読み込んできて、そのまま吐き出す方法は
ございますでしょうか?
どなたかご教授お願いいたします。
801nobodyさん:05/03/02 17:31:34 ID:???
質問〜
スクリプトのトークンがほしいんだけど、
どうすりゃええのですか?

こーゆー時って、全部自分で作るの?
なんかモジュールないのかな?
記述渡したらリストになって返って来るヤツとか。
802800:05/03/02 18:26:02 ID:jdtsRVWh
解決いたしました。お騒がせいたしました。
803nobodyさん:05/03/02 18:30:33 ID:???
このスレ見ながら勉強してたんですが、
これ>>648,649,652 はどうして
マッチした行頭...の下の本文の行も出力されるのですか?
804803:05/03/02 18:31:55 ID:???
これというのは、>>652のプログラムです。
805leaf.child:05/03/02 18:38:44 ID:???
このように"Content-Type: text/plain; charset=iso-2022-jp\n\n"で日本語の文字化けを防ごうとしています。
メールは問題なく送れるのですが、"Content-Type: text/plain; charset=iso-2022-jp”
部分が本文に表示されてしまいます。

open(MAIL,"| $sendmail -t") || die ("Fail to send E-mail: $!");
print MAIL "To: $headerTo\n";
print MAIL "From: $headerFrom\n";
print MAIL "Subject: $headerSubject\n";
print MAIL "Content-Type: text/plain; charset=iso-2022-jp\n\n";
print MAIL $body;
close(MAIL);

誰かわかる人いませんかぁ??
806nobodyさん:05/03/02 19:22:26 ID:???
>>805
いちばんありがちなのは、$headerSubjectの最後に改行が含まれている、
だが。

こういう問題が出たときは、パイプじゃなくてファイルに書き出すように
して出力をよく眺めるとかするのが正攻法だな。



807nobodyさん:05/03/02 19:51:55 ID:???
>>803-804
|| && or and
これらの演算子は短絡演算子って言って、演算子の左辺の結果が満たされた場合右辺は実行されないんよ。
つまり、行頭が ... で始まる行は、左辺の結果が真になるから右辺が実行されて $sample が含まれているかチェックされる。
含まれていたら、$target がセットされて、含まれていなければ $target がリセットされる。
行頭が、 ... で始まっていない行は、左辺の結果が偽になるから、右辺が実行されない。
だから、 $target の内容は、 ... で始まる行の結果に依存されて出力されるというわけ。
808nobodyさん:05/03/02 21:11:22 ID:???
>>807
アホかこいつ?
809leaf.child:05/03/03 02:20:05 ID:QkSLneVb
>>806
ありがとうございました。
Subjectの改行を直したところ
問題点は表示されなくなりました
810nobodyさん:05/03/03 07:35:14 ID:???
>>807さんの説明で間に合っていると思うけど、少し補足。

$targetの役割は、プリントするかどうかの状態を記憶することで、一般的にフラグと呼ばれている。
これが真であるうちは、プリントされる。
これが変更されるのは/^\.{3}/にマッチしたときのみなので、
次に...で始まる行までプリントされる仕組み。
811803:05/03/03 10:10:52 ID:???
>>807,810
遅くなりましたが、
詳しい説明本当にありがとうございましたm(__)m
たいへん勉強になりました。
812nobodyさん:05/03/03 10:25:21 ID:???
誰も
and &&
には突っ込まないんだな
813nobodyさん:05/03/03 10:56:31 ID:???
え、なんで
814nobodyさん:05/03/03 11:14:57 ID:???
>演算子の左辺の結果が満たされた場合右辺は実行されない
ここでしょう。
815nobodyさん:05/03/03 12:18:45 ID:???
'||', 'or' の左辺が真を満たしたら右辺は実行されないし
'&&', 'and' の左辺が偽を満たしたら右辺は実行されないけどそれが変なの?
816nobodyさん:05/03/03 12:24:48 ID:???
>真を満たしたら
>偽を満たしたら
そんなアクロバットな説明しなくていいですからwwwww
817nobodyさん:05/03/03 12:28:35 ID:???
ごめん、なにがおかしいか正直わからん、教えて。
818nobodyさん:05/03/03 12:38:12 ID:???
普通、「(条件を)満たす」というのは、真になることを言うからでしょう。
819nobodyさん:05/03/03 12:44:30 ID:???
あ〜日本語の使い方がおかしいっていう話しね。
ありがとう、了解!
820nobodyさん:05/03/03 12:50:57 ID:???
でも昔のバージョンだと shortcut されなかった罠。
821820:05/03/03 12:51:29 ID:???
あ、すまん、 PHP スレと間違えた。
822nobodyさん:05/03/03 13:01:21 ID:???
環境euc
my $value =qq(あいうえお);
$valueの中に入ってるひらがなを半角カタカナにjcode.plを使用して変えたい。

jcode::tr(\$value,"あ-ん","ア-ン");
こうするとおかしなことになりますがどうしてですか?
jcode::tr(\$value,"あ-ん","ア-ン");
jcode::z2h_euc(\$value);
これだと今のところ大丈夫です。

やはり直接半角に変換は不可能ですか?しかし・・・内部的な処理は同じではないのか・
823nobodyさん:05/03/03 13:10:44 ID:???
>>819
こいつアホ?
824nobodyさん:05/03/03 13:15:23 ID:???
>>822
全角ひらがなと半角カタカナのコードの並び順が違うから。
全角ひらがなと半角カタカナは同じ。

まず文字コードとキャラクタセットについて勉強しましょう。
825nobodyさん:05/03/03 13:16:06 ID:???
>>824 修正です。
>全角ひらがなと半角カタカナのコードの並び順が違うから。
>全角ひらがなと*全角*カタカナは同じ。
826nobodyさん:05/03/03 17:25:13 ID:???
初心者丸出しの質問です
ファイルハンドルから1行ずつ読み取るときに
while (<IN>) {
chomp }
while ( chomp( $hoge=<IN>) ) { 〜 }
827nobodyさん:05/03/03 17:28:42 ID:???
送信しちゃったorz
FHから1行ずつ読み込んでchompするときは
while (<IN>) {
 chomp
}
とか
while ( chomp( $hoge=<IN>) ) {
 〜
}
な感じでやってるんですが
デフォルト変数$_の時
こんな感じに1度で済ますことは出来ないのですか?
while ( chomp <IN> ) {
 〜
}
828nobodyさん:05/03/03 17:42:29 ID:F2b+bV+t
@_ = <IN>;
chomp @_;
$_ = join ('',@_);
829nobodyさん:05/03/03 17:46:08 ID:???
>>827
二番目のやつ、最後の行に改行が付いてない場合にマズイ気がする。
830nobodyさん:05/03/03 18:01:27 ID:???
日本語が含まれてる文字列(EUC)でsubstr的な事するにはどう書いたらいいんでしょうか?
831827:05/03/03 18:32:46 ID:???
レスありがとうございます

>>828は一度に@_に入れてるんですよね?
使い所によっては便利ですね。勉強になります。

>>829
改行が無い場合は何もしないんじゃなくて0を返してたんですね
改行が無い場合は何もしないと間違って憶えてました

828さん、829さんありがとうございました
832nobodyさん:05/03/03 20:42:46 ID:F2b+bV+t
>一度に@_に入れてるんですよね?

 Oui.
 もし、chompの後に$_で一つずつ処理をするのならば

@_ = <IN>;
chomp @_;
while ($_ = shift @_)
{

}

という事もできます。
833nobodyさん:05/03/03 20:47:32 ID:???
>>827
空行で while ループが終わってしまってマズイ気がする。
834833:05/03/03 20:48:20 ID:???
スマソ。アンカー間違えた。 >>827 じゃなくて >>832 へのレスね。
835832:05/03/03 21:11:20 ID:F2b+bV+t
>>833

あ、本当だ。スマソ
836nobodyさん:05/03/03 22:01:20 ID:???
もう for(<IN>){ chomp; ~~;}でいい。
837nobodyさん:05/03/03 22:58:04 ID:???
>>827
sub my_chomp($);

while(my_chomp <DATA>){
...
}
exit;

sub my_chomp($)
{
$_ = shift;

chomp;
return(defined $_);
}
838829=833:05/03/03 23:52:40 ID:???
俺も定石を外したコーディングをして痛い目に遭ったことが何度もあったので、
結局、定石通り (>>827 の最初のやつ) にするのがベストだと思うようになった。
839nobodyさん:05/03/03 23:59:42 ID:Q1wNh1ei
1行のテキストボックスからの入力で、データに改行が入っていたんですけど
なぜでしょうか?(改行押すと送信になる)
データが壊れてしまうので、改行が入らないようにしたいのですが
どうすればいいでしょうか?よろしくおねがいします。
840nobodyさん:05/03/04 00:22:07 ID:???
$hoge = s/\n//g;
ん?
841nobodyさん:05/03/04 01:13:12 ID:???
>>839
なぜ改行が入ったかは確かに謎だが、たぶん Perl コーディングに関係ない原因だとは思う。
コーディングで解決するなら >>840 みたいにするんだろうなあ。

>>840
それって入力が元々 $_ に入ってるんであって、決して ~ が抜けてるわけじゃないよな?
842nobodyさん:05/03/04 01:17:56 ID:???
入力が$_に入っていたとしても$hogeには置換した回数が入るだけ
$_自体が書き換えられる
843nobodyさん:05/03/04 01:24:24 ID:???
>>839
何故入るのかは分からないが、それによって壊れるようなプログラムを書くのは良くない。
取得したデータから改行を取り除くほうが安全だぞ。
844839:05/03/04 04:55:51 ID:???
>>840-841
ありがとうございました。
842の意味がよくわからなかったのでとりあえず
$hoge =~ s/\n//g; を入れてみました。
自分でバグが再現できないので、有効なのかはわかりませんが。。

>>843
うーんまだよく方法がわかりませんでした。CGIで
data<>data<>message message message<>data<>
data<>data<>message message message<>data<>
このように保存してるデータで、一つだけ
data<>data<>message message message<>data<>
data<>data<>message message
message<>data<>
こうなったため、表示が壊れるという感じでした。
初めて自分で1から書いたので・・・
845839:05/03/04 05:00:17 ID:???
立て続けにすいません
>>841
>たぶん Perl コーディングに関係ない原因だとは思う。

どういう原因が考えられますでしょうか???
846nobodyさん:05/03/04 09:14:20 ID:???
JAPUたんいる?
847nobodyさん:05/03/04 10:13:02 ID:???
改行コードが送信されてきたと決めつける必要はないわけで。
・・・意図的に送りつけるのは簡単だが。
ファイルへ書き込むまでにいろいろ処理してるでしょ?
処理途中で改行が紛れ込んでしまうことだってある。コーディングミスで。

再現性を確立しないと追いかけるのは難しいなり。
848nobodyさん:05/03/04 12:05:01 ID:???
>>839
君はXSSってのを少し勉強したほうがいいよ。
相手が送ってくるものは全てウイルスと思え。
その上でウイルスが送られてきても大丈夫なように作らないと、君のサイトが
ウイルスの配布元になったりするかもしれない。

まあウイルスってのはおおげさだけどね。
849nobodyさん:05/03/04 12:35:30 ID:???
iniファイルの投稿を受けつけて、再配布しようと思っています。

iniファイルのままサーバに置いておくと、
ブラウザで見たときに「ファイルの保存」ダイアログが開かずに、
iniファイルの中身が見えてしまいます。
「右クリックして保存しろ」などの注意文を書く、という手もありますが、
せっかく投稿ということで掲示板的CGIも作っているのでCGIを通すことで
ダイアログを開かせることにしました。

CGIはContent-Typeにtextと入れると広告が入るとかでちょっと苦労しましたが、
なんとかダイアログを出させて、正しい中身を送信できるようになりました。
しかし、ここで微妙な問題が残りました。
ダイアログを開いた時のデフォルトのファイル名が、「〜〜.cgi」になってしまうのです。
なんとかして.iniにできないかと調べているのですが、
御存じの方がいらっしゃいましたらお願いします。

# ファイル名が指定できなかったらCGIを通すのはやめて注意文方式にするつもり。
850nobodyさん:05/03/04 13:08:09 ID:???
>>849
日本語が変なので却下
851nobodyさん:05/03/04 13:11:12 ID:???
print "Content-type: octed/stream\n";
print "Content-Disposition: attach; filename=$file_name\n\n";
とか
852nobodyさん:05/03/04 13:34:06 ID:???
perlで画像などのバイナリーファイルのディレクトリ移動をやりたいです。
windowsXPなどで画像・動画ファイルを選択して切り取りして上の階層に貼り付けるみたいな感じです。

普通に
open FH,"$filename";
my @file = <FH>;
こういう感じでバイナリーファイルも問題なくコピーできるんでしょうか?

それとも何かオススメのモジュールがありますか?
853852:05/03/04 13:41:24 ID:???
試したら壊れましたorz
どうすればいいんですか?
854nobodyさん:05/03/04 13:42:11 ID:???
>>851 うまくいきました。ありがとうございます。
>>852 rename でだいたいうまくいく。うまくいかない場合はFile::Copyモジュールのmoveメソッド、だってさ。
855852:05/03/04 14:07:07 ID:???
>>854
renameでできました。カレントの中にあるディレクトリ名だけを配列に入れたいんですが、
なにか言い方法はないでしょうか?
globでできるのかなと色々試してますが、ディレクトリだと判断できません。
856852:05/03/04 14:16:19 ID:???
もしかしてglobで取ったファイル名を全てopendirにかけてそれができるか否かでしか
判断できないのかな。。。。
857nobodyさん:05/03/04 14:16:27 ID:???
1つずつ見て、ファイルテスト演算子 -d で調べていくしかないんじゃない?
ちなみにディレクトリ内全部見る場合 readdir のほうが glob "*" より効率的らしい。
858nobodyさん:05/03/04 14:37:52 ID:???
すいません質問です
$str =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
これでエンコード(?)したやつを元に戻すのはどうやればできるんでしょうか?
とりあえず反転して
$str =~ s/pack("C",hex($1))/%([0-9a-fA-F][0-9a-fA-F])/eg;
とやってみたんですがダメでした(当然かな・・・)
859852:05/03/04 14:39:42 ID:???
#!/usr/bin/perl
#京
# ディレクトリ名だけ取得
my @dirs;
foreach (glob "*"){
if ( opendir DIR,"$_") { push @dirs,$_; closedir DIR; }
}
my @files;
foreach (@dirs){
my $dir = $_;

foreach (glob"$dir/*"){
my ($file) = m{^[^/]*/(.*?)$};
rename $_,$file;
}
}
open FH,">test.txt";
foreach (@files){
print FH $_,"\n";
}
close FH;
print "content-type:text/html;charset=euc-jp;\n\n";

色々試してる間になんとなくでこれを実行したらデスクトップにあったファイル・フォルダが全て
壊れたのかどこかに移動されてしまいましたorz
今かなりあせってます。
これはtest.plという名前でデスクトップ直下の画像ファイルを収納しているフォルダに
いれてましたので、その外側に影響を与えるはずはないからと安心してたのですが・・・・

本気でやばいので助けて下さい。元に戻す方法はないでしょうか。
860nobodyさん:05/03/04 14:47:20 ID:???
>>858
やりたいのはURLエンコードか?
ttp://ash.or.jp/perl/tips_perl01.htm
861852:05/03/04 14:52:31 ID:???
原因が半分わかりました。間違えてwindows+Rで開くコマンドプロンプトから
perl -c をやるつもりでそれをなしでtest.plを実行させてしまったので、
そのときのカレントディレクトリである
C:\Document and Settings\a
でこれを行ってしまったようですorz

最悪です。こういうことの修復はもう手動でしか出来ませんよね?
それでしたらパソコン初心者板に行って聞いてこようと思うのですが・・・
862852:05/03/04 14:57:54 ID:???
とりあえずPC初心者板で言ってきます。
もしも1発で回復する方法などありましたら・・ってそれじゃマルチになっちゃうか。

とにかくすみません。行って来ます。
863nobodyさん:05/03/04 15:19:46 ID:???
>>862
つ システムの復元
ただしファイルが消えるかもしれないという諸刃の剣だ
864nobodyさん:05/03/04 15:24:38 ID:???
>>845
プログラムに誤りがなければアクセスログを見て書込んだブラウザを追い掛けてみるといい。
ネスケ4以前とか一行テキストボックスにコピペで改行コードを含めたりできる。
他にもスクリプト経由で改行を含めたデータを送りつけられたりできるし
フォームページをパソコンにダウンロードしてフォームを改竄して送りつけることもできる。
テキストエリア意外のデータでも改行コードのエスケープ処理をするのは良い方法だ。

Perlコーディングとは関係ない話なのでこれまで。
865852:05/03/04 17:06:39 ID:???
回復できました。実行された場所がよかったみたいで重大な問題には発展しないですみ間s知多。

とりあえずフォルダ命をしっかり指定したこれからはやります。
866852:05/03/04 17:14:04 ID:???
globの使い方を改善すれば安全にできるんですね。
しかしこれの式ってOS依存なんですよね?
windowsXPですが、

C:\Documents and Settings\a
こういうディレクトリをglobに渡したいのですが、
glob "/Documents and Settings/a";
これではダメなようでどうやら半角スペースがダメみたいです。
半角スペースのマッチはどうするんですか?

それとこれはテストはwinXPですが実際にはlinuxなのです。
やはり互換性がありませんか?
";
867nobodyさん:05/03/04 18:57:04 ID:Xe71hSRx
DBMファイルで質問です。

dbmopenを使うと、サーバはどのDBMを使っているのでしょう?
サーバ次第だと思いますが、何か設定箇所か法則性があれば
教えてください。

また、DBM次第で拡張子(db, pag, dir)がいくつかありますが、
このDBMは必ずこの拡張子という決まりはあるのでしょうか?

別サーバへのDBMファイル移行で詰まっています…
868nobodyさん:05/03/04 19:00:20 ID:???
質問ですが、
print <<EOM;

print <<EOF;
の違いって何ですか?
869nobodyさん:05/03/04 19:12:09 ID:???
>>868
同じ。
870nobodyさん:05/03/04 19:44:25 ID:???
>>868
ちなみに「EOMまで出力」って意味ね。
871nobodyさん:05/03/04 20:38:45 ID:???
Perl的にはEUC-JPで書いたほうがいいはずなのに、
巷に配布されてるスクリプトにShift_JISが多いのは何故ですか。
Shift_JISで書くことで何か旨みがあるのですか?
872nobodyさん:05/03/04 20:47:03 ID:???
はまって楽しむのが通。
873nobodyさん:05/03/04 20:55:48 ID:???
Shift_JIS でトリッキーな技を披露するのが痛。
874nobodyさん:05/03/04 21:14:36 ID:???
print qq(申込み);
875nobodyさん:05/03/04 21:51:45 ID:???
>>871
「設定するためにメモ帳で開いたのですが、漢字が化けてどこを設定するのか分かりません!」
なんて質問を避けるため。
876nobodyさん:05/03/04 22:26:35 ID:???
テキストエリアでの改行ができません。
$a =~ s/<br>/\n/g;
これをどう変えればいいですいか?
877nobodyさん:05/03/04 22:40:30 ID:???
>>872-875
Windowsの「メモ帳」がShift_JISにしか対応してないことと、
テキストエディタ上で設定する必要があることに起因しているようですね。
ありがとうございます。
878nobodyさん:05/03/04 23:28:05 ID:???
879nobodyさん:05/03/05 00:07:20 ID:???
>>876
言葉足りなすぎ
880nobodyさん:05/03/05 00:22:28 ID:???
>>866
globの半角スペースは、OS依存でなくglobの仕様

glob '/usr/*/*/* /bin/* /etc/*/*';

という記述もできるようになっている。
半角スペースをファイル名の一部とみなしてほしい場合は
半角スペースの直前にバックスラッシュ(円マーク)を記述して
エスケープすればよい。
881nobodyさん:05/03/05 02:58:35 ID:hbhM7+40
882nobodyさん:05/03/05 09:42:12 ID:???
なぜPerlのスクリプトを書いてる人はUTF-8に移行しないのでしょうか?
エロい人おしえてください
883852:05/03/05 11:08:25 ID:???
>>880
エスケープは何度も試したんですが・・・・

どうやらシングルクォートでやらないといけないようですね。
"/Documents\ and\ Settings/a/*"
これではダメで
'/Documents\ and\ Settings/a/*'
これだといけました。そうなってくるとperlとしては半角をエスケープしてないことに
なるんだけどな・・・よくわからん。
884nobodyさん:05/03/05 12:29:29 ID:???
>>882
君のエロさが足りないからさ。
885nobodyさん:05/03/05 12:34:00 ID:???
>>883
ダブルクォートだと glob に渡る前にエスケープが解釈されちゃうだろ。

sub hd { join ' ', map uc unpack('H2', $_), split //, $_[0] }
print hd("/Doc\ and\ Set/a/*"), "\n";
print hd("/Doc\\ and\\ Set/a/*"), "\n";
print hd('/Doc\ and\ Set/a/*'), "\n";
886nobodyさん:05/03/05 14:24:31 ID:???
>>882
jcode.plがUnicode非対応。
自力でやるにも文字コードの判別、変換が困難。

Perl5.8以降限定や、Jcode.pm必須にするか、
文字コードのチェックを行わなければ大丈夫だろうけど、
そこまでしてUTF-8にこだわる理由が見出せない。

でも、XHTMLが主流になれば、移行していくと思うよ。
887nobodyさん:05/03/05 14:38:07 ID:???
俺が自分で作って自分で使うスクリプトはDBまで含めて UTF-8 なんだが
配布するスクリプトはまあいろいろ難しいだろうな
888nobodyさん:05/03/05 15:02:07 ID:???
正規表現の置換がうまく行かないです

$tmp = 'http://foo/bar/1234.jpg';
$pat = '(.*)\.jpg';
$rep = '\1.png';
$tmp =~ s/$pat/$rep/;
print "$tmp\n";

これだと、「\1.png」としか表示されません。

置換の所を、
$tmp =~ s/$pat/\1.png/;
にすれば期待通りの結果がでますが、どうすればいいのでしょうか。
パターンも置換文字列も変数を使用したいです。
889nobodyさん:05/03/05 15:02:38 ID:???
Win95 や WinMe が完全に廃れれば、メモ帳で UTF-8 開けるから移行が進む?
890nobodyさん:05/03/05 15:26:50 ID:???
ちょっと感動。
メモ帳で UTF-8が開けるの初めて知ったよ(Win2000)

でもデフォはSJISだから95とかMeが廃れても無理っぽい。
891nobodyさん:05/03/05 15:36:58 ID:???
それでも >>875 みたいな質問がでることはなくなるからいいのでは?
スクリプト開発者はさすがにメモ帳デフォのままでコーディングしないっしょ?
892nobodyさん:05/03/05 16:06:25 ID:???
>>888
$tmp = 'http://foo/bar/1234.jpg';
$pat = '(.*)\.jpg';
$rep = '$1.".png"';
$tmp =~ s/$pat/$rep/ee;
print "$tmp\n";
893888:05/03/05 16:36:29 ID:???
>>892
サンスク
894nobodyさん:05/03/05 17:11:23 ID:???
>>887
自分しか使えないスクリプトほどくだらないもんはない。
誰でも使えるものを作れるかどうかが、馬鹿とアホの分かれ道なわけで。

そもそもヘタレが多すぎだな。
環境によって書き換えてもらわないといけないなんてアホくさい。
普通は設定ファイルは別途にしておいて、その設定ファイルをいじるための
インターフェースも作っておく。

プログラムなんてのは他人に書き換えてもらう事を前提にするようなもんじゃない。
想定をこちらで決めてしまわなければどうしようもない。
895nobodyさん:05/03/05 17:15:36 ID:???
みんなHTML::templeteってつかってますか?
重いとか聞いたのでまだ使ったことありません。

それにテンプレートを作るってことは変数が乱立せざるを得ないし、
構文を埋め込みok状態で使うならテンプレートファイルを別に作る意味も不明。

とか思ってるんですが、使用されてる方の意見を利かせて下さい。
今は基本的にHTMLはプログラム内にあります。まあ出力内容を作成する
ルーチンなので外部に置いてもなんら問題はありませんが。
逆に差がないなら分ける意味もないですうしね。
896nobodyさん:05/03/05 18:58:05 ID:???
>>895
仕事で作る奴はちょろちょろ変更あるのでテンプレートで分けるように
なった。しょうもない文章の修正とかでいちいち本体いじるのうっとう
しいと思ってたのでなかなかよろしい。

で、慣れるとプログラムがすっきりするので、個人で作るような
のもテンプレ使ってたりします。

テンプレライブラリは重いといえば重いんだけど、1ページの表示が
遅いってほどじゃないので、気にすることないと思う。
897nobodyさん:05/03/05 19:06:00 ID:???
Unicodeは使いたいんだけど日本語の既存の文字コードとの対応が
メチャクチャなので使う気になれないんだよな。

きちんと変換表が統一される夢のような時代は絶対来ないけど
たぶんそのうちunicodeの変換表の有力な奴相互に判定/変換する
ようなライブラリができるだろうからそれ待ち(笑)

898nobodyさん:05/03/05 19:27:37 ID:???
メモ帳じゃBOMなし選択できないじゃん。
そもそも文字コードなんて商売上の理由なんだろうから歩みよりはないだろうし。
俺はこれからもSJIS使っていくぞ。
899nobodyさん:05/03/05 19:29:22 ID:???
>>895
俺の場合だと hash や array にぶちこんで渡すので変数が乱立するってことは無い
DBI の fetchrow_hashref で取ってきた hash をそのまま Template に渡してはいおしまい、みたいな感じで
お蔭でプログラムの見通しが断然良くなった
正直 Template 使わない CGI はもう書きたくない

普通は重いんだろうとは思うが、俺んとこは mod_perl 環境なので、
パース済 Template のキャッシュも効いて、全然重さを感じない
900nobodyさん:05/03/05 20:03:51 ID:???
つ[Template-Toolkit on mod_perl]
901nobodyさん:05/03/05 20:55:09 ID:???
HTML::Templateの最大の弱点は名前空間が分けられない事だな。
例えば、ある顧客のデータと、管理者のデータを一度に表示したい時、
{
client_name => 'hoge', client_address => 'foo',
admin_name => 'hage', admin_address => 'bar',
}
とかで渡してやらんとだめだ。
{
client => { name=> 'hoge', address='foo' },
admin => { name => 'hage', address='foo' },
}
とかじゃだめってことね。
この点Template-Toolkitは偉すぎる。
902nobodyさん:05/03/06 09:56:09 ID:???
共用サーバーを利用している貧乏人なもんで、
ちょっとでもスクリプト軽くしたい一心から、
HTML::Templateは問題外と思っている。
HTML::Templateを、数万回/day呼ぶとやっぱ重いかな?
903nobodyさん:05/03/06 13:22:41 ID:???
>>902
最適化はprofileの結果を見て効率良くやれ。
904nobodyさん:05/03/06 13:35:38 ID:???
重いっちゃあ重いけど、CGI.pm や DBI と比べれば大差ないよ > HTML::Template / Template Toolkit
905895:05/03/06 13:41:02 ID:???
>>899
私的にはhashやarrayの中に入れることも乱立だと思ってます。
プログラムの見通しは現状でずいぶんいいんですよね。
開始100行部分辺りがプログラムの流れで細かい処理はルーチンを下のほうに作って
あって、そいつらはグローバルをいじることはできなくしてあるし。
間違っても全体の流れてきな処理と個々の処理を同列視しないように作ってます。
こういうやり方にしてから拡張もいくらでもできるようになったし。

でも皆さんなかなか評判がいいようなのでちょっと遊びスクリプトを作る時には
使ってみようかな。ありがとうございました。
906nobodyさん:05/03/06 14:50:24 ID:???
>>901
すごく同意 なので私は
$ref->{aaa}->{bbb}を$hash{'aaa-bbb'}に変換する関数を作って使ってます。
$change->{form_data} = \%form_data;
とかが出来るようになって幸せ
907nobodyさん:05/03/06 15:25:36 ID:???
>>906
っていうかグローバル変数を危険な形で渡すなよ。(グロバルに限らず)
Templete使う前にアルゴリズムを見直せ。
908nobodyさん:05/03/06 16:13:12 ID:???
>>905
ただの構造化で満足している人がTemplateを使えるとは思いませんが。
そもそもビューを切り離すことにメリットを感じない程度の小規模スクリプトしか
書いてないんでしょうから。
909nobodyさん:05/03/06 16:18:15 ID:???
>>908
まあ使ってみて目覚めるということもあるから、生温かく見守ってあげようや
漏れも頭ではMVCとか知ってたけど、実際にモノを作ってみるまで恩恵がわからんかった
910nobodyさん:05/03/06 17:13:17 ID:???
まるでTempleteが高度なものみたく聞こえてくるな…
まあこのスレのレベルではしょうがないか。
911nobodyさん:05/03/06 17:48:51 ID:???
よっぽど自身のレベルに対してコンプレックスがあるんだな・・・。
Templateを単純なコード埋め込み可能テキストくらいにしか使えてないんだろうな。
かわいそうに。
912nobodyさん:05/03/07 02:01:45 ID:???
HTML::Templateはファイル置くだけで使えるけど
Templateは置くだけじゃ使えないよね?

しかたなくHTML::Template派。
913nobodyさん:05/03/07 02:03:59 ID:dh8KtD97
コンソールに出力する文字の色を変えるようなモジュールってある?
914nobodyさん:05/03/07 02:12:46 ID:???
vimで開く
syntax onを忘れずに
915nobodyさん:05/03/07 02:13:04 ID:???
>>913
Term::ANSIColor かな?
916nobodyさん:05/03/07 02:30:23 ID:???
>>915

板違いで書き込んでいたのに気付かず失礼しました。
それなのに回答をしてくれてありがとう。
今から調べてみます。
917nobodyさん:05/03/07 04:10:46 ID:???
>>907
確かにSTDINの内容を渡しちゃうのはキモいけど
my $cgi = new CGI();
my $template = HTML::Template->new(scalarref => \$html, associate => $cgi);
とかよく使われてる手法じゃない?
918nobodyさん:05/03/07 07:31:42 ID:???
>>917
サニタイズしなくて大丈夫なの?
919nobodyさん:05/03/07 08:07:45 ID:???
my $template = HTML::Template->new();
$template->param(%form_data);
としてクライアントにテンプレートの変更権限が無い場合
%form_dataが例え汚染されていたとしても
重大な影響は与えないと思う。

とはいえ
hoge.cgi?mail=危険なタグ
とかされた場合、ブラウザクラッシュとかもありえるから
サニタイズは必要ですね
920nobodyさん:05/03/07 09:27:19 ID:???
>>918
一応、出力時にエスケープできるオプションもある。

>>919
http://www.google.co.jp/search?q=XSS
921nobodyさん:05/03/07 13:11:21 ID:???
>>911
頭が悪いって不幸だね。
922nobodyさん:05/03/07 17:36:53 ID:???
>>921
顔が真っ赤ですよ?
923nobodyさん:05/03/07 18:44:45 ID:???
Template-ToolkitでMVCを実践しようとなると
perlソース側ではprint文、HTMLタグは一切記述せず(httpヘッダくらいはいいかな)
テンプレート側だけで対応する事になるのでしょうか。
速度や保守性を考えるとどのぐらいの割合がいいのかなと思いまして。
924nobodyさん:05/03/07 19:55:37 ID:???
ケースバイケースでしょう。
基本的に表示のための加工処理はテンプレートに集中させるべきだと思いますが。
ヘッダは本体スクリプトで。
925nobodyさん:05/03/07 20:36:15 ID:C7YlD7f8
配布されているPerlで書かれたCGIを見ると、
$remolog = './remolog.cgi';
のように./をつけているのを多く見ます。
./に何か御利益があるんですか?
926nobodyさん:05/03/07 23:25:57 ID:iIlEY0AB
質問させて下さい。

【やりたい事】
methodが post と get と 何もなし で分岐させたい。

【やってる事】
if( $ENV{'REQUEST_METHOD'} eq "GET" ){
  hogehoge
}elseif( $ENV{'REQUEST_METHOD'} eq "POST" ){
  hagehage
}else{
  punipuni
}

【困った事】
エラーになります。分岐を2つ(GET と else、 POST と else)
にするとなぜかエラーになりません。
原因はなんなのでしょうか?よろしくお願いします。
927nobodyさん:05/03/07 23:29:05 ID:???
>>926
elsif
928926:05/03/07 23:32:09 ID:???
速答ありがとうございました。
解決しました。ありがとうございました。
929nobodyさん:05/03/08 00:18:06 ID:???
たまに
else if
とか
for(i = 0
とかやっちゃう
930926:05/03/08 00:40:31 ID:l83v9ZYF
別件も質問させていただきます。

open で 一つ上のディレクトリにあるファイルに書き込みを行いたいと思ってます。

ですが… open DATA "> ../hogehoge.txt";
としてもうまくいかないんです。なにがおかしいのでしょうか?
931nobodyさん:05/03/08 00:45:59 ID:???
>>930
引数を二つに分けて渡してあげて下さい。
932926:05/03/08 00:54:09 ID:l83v9ZYF
>>931
open (DATA, "> ../hogehoge.txt");
これでうまくいかなかったのですが…

これに続く文は
print DATA "hagehage1\n";
print DATA "hagehage2\n";

close(DATA);
わかんないっす。
933nobodyさん:05/03/08 01:09:10 ID:???
>>932
上のディレクトリのパーミッションは?書き込み権限ある?
934nobodyさん:05/03/08 01:10:31 ID:???
SuEXECかCGIWarpがonになってるとか
935nobodyさん:05/03/08 01:12:22 ID:???
>>932
とりあえず

open (DATA, "> ../hogehoge.txt") or die $!;

とかしてエラーになるかどうか、エラーならどんなメッセージか
を確認することを薦める。というかopenにエラートラップするのは
基本だ。


936926:05/03/08 01:30:33 ID:???
>>933
windowsのローカルのApache2ではパーミッションとかわかんないです。
プロバイダのはフォルダには書き込み権限設定してませんが、ファイルは666にしてます。

>>934
意味がわからないです。もうちょっと自分で調べます。

>>935
やってみます。

皆様、ありがとうございます。
937926:05/03/08 01:33:05 ID:l83v9ZYF
エラーメッセージはローカルで
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
でした。たぶん前と変わりません。。。
938926:05/03/08 01:35:23 ID:???
プロバイダはwakwakを使ってますが、
「CGI の内部エラーが発生しました。」と日本語表示されました。
こんな事していいのかな。。。
939926:05/03/08 01:42:39 ID:???
失礼しました。
原因は他にありそうです。m(_ _)m
940926:05/03/08 01:59:17 ID:l83v9ZYF
原因わかりませんが、エラーの当該箇所わかりました。
print DATA "<a href=\"http://";
print DATA "127.0.0.1";
print DATA "/\">今は入れないよ</a>\n";

こういうのを書いていたのですが、1行にするとエラーが回避されて正常動作するようになりました。
理由わからないです。
ダブルクォーテーション関係ありますか?
941nobodyさん:05/03/08 03:08:26 ID:???
>>926
ようわからんけど、コマンドプロンプトじゃなくブラウザで動作確認してるみたいだから、
#- - - - - - - - - - - - - - - - - -
#!/usr/bin/perl
# use strict;

open (DATA , "> ../hogehoge.txt") || &error($!);
print DATA "<a href=\"http://"; # この辺は任意
print DATA "127.0.0.1";
print DATA "/\">今は入れないよ</a>\n";
close(DATA);

&error('OK!');

sub error {
$, = "\n";
print "Content-type: text/html\n\n";
print '<title>Error</title>', '<pre>', @_, '</pre>';
exit;
}
#- - - - - - - - - - - - - - - - - -
というファイルでも作って確認してみたら?
(「DATA」の部分を「SAVE」とかに変えたらできたりしないかね? 普通は関係ないけど)
942nobodyさん:05/03/08 03:13:58 ID:???
ダブルクオーテーション止めて、シングルクオーテーションにしたら?
943nobodyさん:05/03/08 03:17:45 ID:???
あと文字コード Shift_JIS で書いてるなら、EUC-JP か UTF-8 にするとか。
944nobodyさん:05/03/08 07:35:02 ID:???
ローカルのApacheならエラーログを見れば一発なのに。
945nobodyさん:05/03/08 08:00:51 ID:???
CGI::Carpモジュールが使えるなら、

use CGI::Carp qw(fatalsToBrowser);

しとけ。dieしたときのメッセージがブラウザにも出るようになる。
946nobodyさん:05/03/08 15:24:44 ID:???
おまいら、
# no parentheses
  $foo = new Foo $arg1, $arg2;
# parentheses
  $foo = new Foo ($arg1, $arg2);
# arrow
  $foo = Foo->new($arg1, $arg2);
のどの書きかたしてる?
parenthesesみたいにカッコつけると、
やっぱサブルーチンに見えて紛らわしいものなのかねー。
あー、
  $foo = new Foo +($arg1, $arg2);
もあり? うーん。
947926:05/03/08 15:42:14 ID:???
Apacheのエラーログは
Premature end of script headers
でした。
948nobodyさん:05/03/08 18:43:01 ID:???
>>946
2番目。C++で慣れてたので。ただそれだけ。
別にカッコ付けてもサブルーチンには見えないと思います。
949nobodyさん:05/03/08 20:32:35 ID:/HU/2hpG
>>946
何となく3番目。
950nobodyさん:05/03/08 21:01:58 ID:???
タグの外側だけ対象に置換するには
s/((?:\G|>)[^<]*?)foo/$1bar/g;
と書けますが、
・1回だけでいい(gオプションをつけない)
・最初にタグ以外の文字があるテキスト(そこにもマッチさせたい)
とした場合、どのように書いたらいいでしょうか。
なるべく速いほうがいいのですが。
951nobodyさん:05/03/08 21:27:00 ID:???
他のモジュール見てると3番目を良く見るので3番目にしてる。
952nobodyさん:05/03/08 21:34:43 ID:???
>>946
3番目
漏れは矢印あったほうが直感的に理解しやすい
953nobodyさん:05/03/08 22:07:09 ID:???
簡単なディレクトリ表示プログラムなんですが
use File::Find;
$dir = "C:\\WINDOWS\\Favorites";
find(\&print_file,$dir);

sub print_file{
print "$File::Find::name\n";
}

C:\WINDOWS\Favorites/test.html
みたいに表示されてしまうんですが、
C:WINDOWS\Favorites\test.html
みたいに表示したいんですけど
どうしたらいいんでしょうか?
954nobodyさん:05/03/08 22:19:35 ID:???
s//g
955nobodyさん:05/03/08 23:02:12 ID:???
('A`)
956nobodyさん:05/03/08 23:12:33 ID:???
"('A`)" =~ m('A`)m
957nobodyさん:05/03/09 01:48:46 ID:???
>>953
File::Spec->canonpath($File::Find::name)
958nobodyさん:05/03/09 03:18:19 ID:???
タグ除去で
$aaa =~ s/<.*>//i;
にしてたのですが、
<TD>あああ</TD>
こういう1行に2つ以上タグがあるところは除去されてしまうようです
ちゃんと<TD>あああ</TD>⇒あああにするにはどうすればいいですか?
959nobodyさん:05/03/09 03:22:40 ID:???
>>958
non-greedy マッチで
960nobodyさん:05/03/09 03:29:36 ID:???
>>959
ありがとうございます、できました
しかしレスはやいっすね・・・
961nobodyさん:05/03/09 03:39:03 ID:???
>960
ちなみにどうやったか書いてって〜
962nobodyさん:05/03/09 06:39:54 ID:???
>>947
ヘッダを出力する前にプロセスが終了してる。
理由としては
1. HTTPヘッダを出力していない。
2. ヘッダを出力する前にエラーが起きている。
のどちらか。
1.は出力するように修正する。
2.はエラーログにperlのエラーが出力されているので、それを見て修正。

Apacheの場合、改行二回するだけでも、
デフォルトのcontent-typeを吐いてくれる。
(httpd.confをいじってなければtext/plain)
963nobodyさん:05/03/09 15:42:37 ID:TPYzASqD
PHPでいう、
<?
require ("./test/index.html");
?>
これをperlで再現したいのですが、
是非方法を教えて頂けませんでしょうかorz
964nobodyさん:05/03/09 15:51:43 ID:???
>>963
require "パス";
965nobodyさん:05/03/09 15:53:29 ID:???
>>958
アホ
$value =~ s{<[^>]*>}{}g;
966nobodyさん:05/03/09 15:53:39 ID:???
>>963
PHPくだスレでのレスは放置かYO。
それに、
「PHPではrequireはコレコレこういう機能がありますが、
Perlでそれを実現するにはどうしたらいいですか?」
って感じの質問の仕方が真っ当だと思うが。

967nobodyさん:05/03/09 16:00:05 ID:TPYzASqD
>>966
すいませんでしたorz


あと、Perlでreqireを使ってphpを呼び出すことは可能でしょうか・・・?

require "./test/index.php";
print index("$index");

これはphpでrequireを使ってindex.phpを呼び出したときの成功ソースです
perlでは失敗しましたorz

ちなみにindex.phpの構造はこんなかんじです
<?
function index($index) {
return "hello!";
}
?>
968nobodyさん:05/03/09 16:03:53 ID:???
次の質問どぞー
969nobodyさん:05/03/09 16:12:05 ID:???
>>967
おめえはPerlの解説サイト見るって事はできねえのか?
requireがどういう処理をするか調べて自分で考えろよ。
970nobodyさん:05/03/09 16:13:09 ID:???
>>967
できるわけねえだろ糞ボケ
971nobodyさん:05/03/09 16:15:25 ID:???
>>967
お前にはPerlは無理だ
PHPならできるかもしれないが
972nobodyさん:05/03/09 16:38:24 ID:???
出来るに決まってんだろボケナス
973nobodyさん:05/03/09 16:42:30 ID:bpuh5/Rp
現在、下のようになっています

open new, '>new.txt';

@data = split /\t/;

if($data[0] eq 'kawagoe'){
print new "$_";
}


これですと、データを全て新ファイルに記憶してしまいますが、
data[2](タブ区切り三つ目のデータ)だけを省いて記録するには
どのように書き換えたらよいでしょうか?
974nobodyさん:05/03/09 17:05:05 ID:???
975nobodyさん:05/03/09 17:25:19 ID:ox3iJUQY
現在、perlでけっこうな数のスクリプトがあり、これにphpで発行した
セッションを組み込もうと思っています。
phpで発行したセッションはperlからは利用できないのでしょうか?
976nobodyさん:05/03/09 17:46:10 ID:???
>>975
しつけえなこいつ

セッションファイルを共有すればいいだけだろ。
そんなこともわからんのか。
977nobodyさん:05/03/09 17:59:25 ID:???
セッションの意味をわかってないんだろうよ。
こういう馬鹿はほっとくに限る。

次の質問どうぞ↓
978nobodyさん:05/03/09 17:59:25 ID:???
979960:05/03/09 18:59:20 ID:???
>>961
$aaa =~ s/<.*>//i;

$aaa =~ s/<.*?>//i;
たったこれだけでした
980nobodyさん:05/03/09 19:07:34 ID:???
>>972
split せんでも、それくらいなら
s/^([^\t]*\t[^\t]*)\t[^\t]*/$1/;
とかでどうかな。

データが長い上何回も繰り返すんだったら、
index と substr でも組み合わせたらいいかと。

[2]だけじゃなく、何個も消すのだったら、@data を splice して join すればいいよ。
981980:05/03/09 19:08:48 ID:???
あー >>973 だわ、ごめん。
そろそろ1000いくね。
982nobodyさん:05/03/09 19:09:56 ID:???
カンマ区切りのファイルから検索します。

@csv = <CSV>
foreach (@csv){
 処理
}

この処理で
・splitで分解してeq
・正規表現でマッチ

どちらが早いですか?
983nobodyさん:05/03/09 19:39:04 ID:???
index
984nobodyさん:05/03/09 19:59:06 ID:???
>>982
そういうのは試した方が早くね?
データによってどれが早いか変わるようなケースも有り得るわけだし。
985nobodyさん:05/03/09 20:03:24 ID:???
>>979
だからそれじゃあタグの途中で改行してる場合に困るだろ
986nobodyさん:05/03/09 20:06:10 ID:???
>>982
Perlで処理効率云々を言ってもなぁ
それもCGIレベルの話でどちらが云々いうなら、画像サイズなんかを極限まで
落としたほうがよほど効果的だよ。
987nobodyさん:05/03/09 20:48:49 ID:???
>>973
print new @data[0..1, 3..$#data];
988nobodyさん:05/03/09 21:05:13 ID:???
いろんな箇所でつかいたい文があったので

$live = '<a href=\"*************\">現行スレ</a><br>':

〜〜〜

print "$live";

このようにしたのですがエラーがでます
なにか間違えたりたりないとこがあったらご指摘お願いいたします
989nobodyさん:05/03/09 21:07:40 ID:???
>>979
<tag attr=">">
このタグはちゃんと除去できるかな?
990nobodyさん:05/03/09 21:08:38 ID:???
コロン
991nobodyさん:05/03/09 21:10:23 ID:???
>>988
文の最後はセミコロン。
992nobodyさん:05/03/09 21:12:18 ID:???
>>988
予断ですが。
シングルクォーテーションの中でダブルクォーテーションはエスケープする必要ないし、
変数1つを出力するのに、ダブルクォーテーションでくくる必要もないです。
993nobodyさん:05/03/09 21:15:04 ID:???
>>989
そんなのは<tag attr=>>を除去できるかと言っているのと同義。

$aaa =~ s/<[^>]+?>//is;

でFA?
994nobodyさん:05/03/09 21:21:31 ID:???
>>993
アホはだまってなさい。
995nobodyさん:05/03/09 21:22:52 ID:???
っていうか、パターンにアルファベットがあるわけでもないのにiオプションですか。
996nobodyさん:05/03/09 21:29:52 ID:???
そんなことはもうどうでもいいから次スレ。
997nobodyさん:05/03/09 21:33:23 ID:???
軽やかに997ゲット
998nobodyさん:05/03/09 21:35:47 ID:???
>>995
さらに言えばsもいらんけどな
999nobodyさん:05/03/09 21:38:34 ID:???
$aaa =~ s/<.*?>//g;
$aaaにはタグを除去したいHTMLテキスト全体が入っているものとする。
また、HTMLテキストのコメント内および引用符でくくられた属性内には
>を含まないものとする。
1000nobodyさん:05/03/09 21:45:08 ID:uon8ZypZ
せん!
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。