Perlコーディング初心者質問スレ Part 40
レス数が1000を超えています。これ以上書き込みはできません。
0001nobodyさん
05/01/27 18:08:42ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0002nobodyさん
05/01/27 18:09:13ID:???△▲ 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/
0003nobodyさん
05/01/27 18:09:57ID:???Part1 http://tako.2ch.net/test/read.cgi?bbs=perl&key=957208980 参照不能
DAT: http://tako.2ch.net/perl/dat/957208980.dat
Part2 http://tako.2ch.net/test/read.cgi?bbs=perl&key=971817087 参照不能
DAT: http://tako.2ch.net/perl/dat/971817087.dat
Part3 http://tako.2ch.net/test/read.cgi?bbs=perl&key=979894521 参照不能
DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part4 http://tako.2ch.net/test/read.cgi?bbs=perl&key=984430156 参照不能
DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part5 http://pc.2ch.net/php/kako/988/988728069.html
Part6 http://pc.2ch.net/php/kako/996/996075607.html
Part7 http://pc.2ch.net/php/kako/1000/10002/1000267444.html
Part8 http://pc.2ch.net/php/kako/1003/10039/1003900311.html
Part9 http://pc.2ch.net/php/kako/1009/10095/1009549309.html
Part10 http://pc.2ch.net/php/kako/1014/10145/1014556702.html
Part11 http://pc.2ch.net/php/kako/1017/10172/1017201229.html
Part12 http://pc.2ch.net/php/kako/1019/10199/1019917048.html
Part13 http://pc.2ch.net/php/kako/1022/10227/1022731565.html
Part14 http://pc.2ch.net/php/kako/1026/10269/1026977659.html
Part15 http://pc.2ch.net/php/kako/1028/10288/1028816385.html
Part16 http://pc.2ch.net/php/kako/1032/10320/1032070299.html
part17 http://pc.2ch.net/php/kako/1034/10345/1034583844.html
part18 http://pc.2ch.net/php/kako/1037/10377/1037797479.html
part19 http://pc.2ch.net/php/kako/1042/10422/1042260745.html
part20 http://pc2.2ch.net/php/kako/1044/10447/1044717887.html (タイトルに19と誤記)
0004nobodyさん
05/01/27 18:10:35ID:???part21 http://pc2.2ch.net/php/kako/1047/10479/1047980851.html
part22 http://pc2.2ch.net/php/kako/1050/10503/1050369328.html
part23 http://pc2.2ch.net/php/kako/1053/10530/1053051519.html
part24 http://pc2.2ch.net/php/kako/1054/10549/1054992610.html
part25 http://pc2.2ch.net/php/kako/1056/10567/1056730690.html
part26 http://pc5.2ch.net/php/kako/1059/10590/1059043704.html
part27 http://pc5.2ch.net/php/kako/1060/10608/1060808783.html
part28 http://pc5.2ch.net/php/kako/1063/10635/1063562491.html
part29 http://pc5.2ch.net/php/kako/1066/10662/1066286828.html
part30 http://pc5.2ch.net/test/read.cgi/php/1069846177/
part31 http://pc5.2ch.net/test/read.cgi/php/1072896288/
part32 http://pc5.2ch.net/test/read.cgi/php/1075545279/ (タイトルに31と誤記)
part33 http://pc5.2ch.net/test/read.cgi/php/1078076768/
part34 http://pc5.2ch.net/test/read.cgi/php/1081148490/
part35 http://pc5.2ch.net/test/read.cgi/php/1085557731/
part36 http://pc5.2ch.net/test/read.cgi/php/1089779036/
part37 http://pc5.2ch.net/test/read.cgi/php/1093106507/
part38 http://pc5.2ch.net/test/read.cgi/php/1097158988/
part39 http://pc5.2ch.net/test/read.cgi/php/1101522903/ (前スレ)
0005nobodyさん
05/01/27 18:11:41ID:???[プログラミング自体の経験が無い奴はまずココを読め]
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/
0008nobodyさん
05/01/28 04:42:22ID:???それを受け取って表示したいのですが・・・。
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,|
という結果を期待したのですがなにも表示されませんでした。
これを期待どうりにするには、何処をどうすれば良いのでしょうか?
00098
05/01/28 04:44:17ID:???正 test( \@data );
…です。
00108
05/01/28 04:53:41ID:???foreach $tmp2 ( keys %$tmp1 ) {
print qq($tmp2=$tmp1->{$tmp2},);
}
これで解決しました。
…ところで、サブルーチンの中の
$ref->[1]->{'a'} = "A1"; 等は
$ref->[1]{'a'} = "A1"; でも同じ結果なのですが
どうしてなのでしょうか?
0012nobodyさん
05/01/28 15:00:30ID:???0013nobodyさん
05/01/28 16:48:58ID:???%hash = (
"a-1" => "今日はお日柄もよく・・・",
"a-2" => "今日はみなさんに大切なお話があります・・・"
);
というスクリプトを書いています。
これをメインで
open FH,"test.txt";
eval FH;
close FH;
print %hash;
としてみたのですが、何も表示されません。
test.txtを1行にして、
eval <FH>;
とすればできるんですが、1行にすると見づらくなってしまいます。
何か方法はありますか?
0014nobodyさん
05/01/28 17:25:08ID:???doとかrequireを調べてみるといいかも。
でもそれよりファイルフォーマットを決めて
%hashにその値を読み込むルーチンにした方が
幸せになれると思う。
0017nobodyさん
05/01/28 19:54:19ID:???if (open FH,"test.txt") {
local $/;
eval <FH>;
close FH;
}
print %hash;
特殊変数 $/ について調べてみ
0018nobodyさん
05/01/28 20:56:02ID:BqQoLRNT0020nobodyさん
05/01/28 22:33:47ID:???・カンマ演算子はリストを作る。
・リストをスカラーコンテキストで評価すると最後の要素が返る。
・式の中に別の式を埋め込みたかった。
これで察してください。
002113
05/01/29 13:14:26ID:???一杯ありがとうございます!
とりあえず応急で
eval join '',<FH>;
で済ませてしまいましたが、やはり色々なやり方があるのですね。
>>14さんがいうようにperl構文をそのまま入れるならtextファイルにする意味も
微妙なところなんですが、実は結構値が長文だったりするのです;
目的は素人でもテキスト自体を追加・修正できるようするためです。
外部ファイルにして一定のわかりやすいフォーマットにするというのが前提だったのですが、
csvもどきだと長文がはいると行・列が把握しづらくなってしまいます。
できれば本当は"a-1"の中にハッシュリファレンスを入れて10項目くらいの
プロパティ的なものをもたせたいんですが、複雑化すればするほど
csvって視認性が悪くなるんですよね。
掲示板などのdatファイルってどうやってるんでしょうか?
視認性がよく、プログラムでの処理もしやすいものがいいんですが・・・
場合によってはPerl以外のプログラム言語でも使用するのでやはり現状の
Perlの構文そのまんまっていうのはいまいちですよね。
みなさんが掲示板など作るときに作るdatのフォーマットなどを参考に聞かせていただけると
助かります。
0022nobodyさん
05/01/29 13:59:05ID:???これで$1の中にマッチした文字列が入りますが、
$1って1回中身を参照したら削除されてしまうのですか?
($a) = $1 =~ /\d/;
($b) = $1 =~ /[a-zA-Z]/;
試しにこういうことをしたら後からやるほうには何も代入されないんです。
windows版activePerl5.6.1での話です。
もしも$1の中身を何度も参照したければ一旦他の変数に入れる以外に策はありませんか?
0023nobodyさん
05/01/29 14:36:54ID:fOhenI6O中身を参照したら消えるのではなくて次のパターンマッチ成功
またはブロックの終わりまで有効なのだが、どちらにせよそれを
越えて値が必要なら変数なりなんなりにしまっておくしかないね。
0024nobodyさん
05/01/29 16:22:50ID:???レスありがとうございます
0025nobodyさん
05/01/29 18:02:14ID:4Kvcglslfor(1..100)
って書けるけどデクリメントする時はどう書くんだろう?
for(100..1)
は無理だよね。
0026nobodyさん
05/01/29 18:06:59ID:???http://perldoc.com/perl5.8.4/pod/func/reverse.html
for (reverse 1..100) { ... }
0027nobodyさん
05/01/29 18:24:05ID:???0028nobodyさん
05/01/29 19:32:37ID:???http://perldoc.com/perl5.8.4/pod/func/sleep.html
http://www.microsoft.com/japan/msdn/library/ja/jpdllpro/html/_win32_sleep.asp
0029nobodyさん
05/01/29 20:47:53ID:YcAE5qw3$flag = 1;
}
どうしてもこれが上手く行きません。
なぜなのでしょうか?
ご教授お願い親します。
0030nobodyさん
05/01/29 20:54:06ID:YcAE5qw3追加。
$_に入るのは
DoCoMo/2.0 F900i(c100;TB;W22H12)
です。
0032nobodyさん
05/01/29 21:19:51ID:fOhenI6Oカッコやピリオドは正規表現のメタキャラクタなので
そのまま埋め込むと別の意味になってしまう。
if($ENV{'HTTP_USER_AGENT'} =~ /\Q$_\E/){
$flag = 1;
}
とかすればいいだろう。
0033nobodyさん
05/01/29 21:20:55ID:???$ENV{'HTTP_USER_AGENT'} と $_ をプリントして同じものか見れば?
単に$_ にセットされていないって話じゃないだろうな。
0034nobodyさん
05/01/29 21:34:08ID:YcAE5qw3だけでは上手く行かず
my(@data) = ("$tmpDefine[0]","$tmpDefine[1]");
と配列に入れるさいに""をつけて解決しました。
ありがとうございました。
0035nobodyさん
05/01/29 21:43:44ID:fOhenI6O後半はundefが空文字列に変換されるあたりの関係かねぇ。
0036nobodyさん
05/01/29 23:31:30ID:k1P2HVvm携帯で見れるようにしたいのですが文字化けしてしまいます。
jcode.plはあるのですがどう使っていいのかわかりません。
perlコーディングというかプログラム自体初めてです。
文字コードのことがよくわかりません。
わかりやすいサイトなどありましたら教えてくださ
どれではおながします
0037nobodyさん
05/01/30 00:35:14ID:???そしてスクリプト内で
use encoding 'Shift_JIS';
と宣言しろ。
0038nobodyさん
05/01/30 01:34:47ID:7qmv52uq最後の2行、グダグダやね。
0040nobodyさん
05/01/30 13:02:28ID:0daQX9sHnkfでShift-JISに変換してしまっては?
test.cgiをまた編集したくなったらnkfでEUCに。
ちょっと面倒だけど。
0041nobodyさん
05/01/30 13:39:39ID:???--------------------------------------------------
#@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/)
とした方がいいのでしょうか?
0045nobodyさん
05/01/30 15:21:23ID:nMKi12Lvパターンの「.」の部分が数字にマッチするよう
だとたいていはアドレスの中の「.」がパターン
の中の数字の位置に来るような気がするので
かなり必然に近い偶然とはいえるな。
しかしだから大丈夫だということを証明しようと
がんばるよりは素直にエスケープしとけ。
0046nobodyさん
05/01/30 15:22:07ID:???これでもOK。
@ip_list = map{ quotemeta } ('333.139.141.','333.20.117.','333.255.29.');
004741
05/01/30 17:48:45ID:???考えてみたら、
if ($addr =~ /^333\.139\.141\./)
ひとつだけの場合だったらこうやってエスケープして書いているのに、
リストの要素ひとつひとつとの比較の場合はエスケープしてないっておかしいですよね。
ちゃんとエスケープ処理をするよう気をつけたいと思います。
>46さん
map関数調べてみました。
こういう便利な関数もあるんですね。たいへん勉強になりました。
0048nobodyさん
05/01/30 18:36:05ID:60wlVefX|ddddddd|momddomo|aaaaaaaaaa|
|wwwwwww|fddddddd|ssssssssss|
|eeeeeee|pppppppp|rrrrrrrrrr|
'|'を区切りとしてテーブルタグに変換させる正規表現
を作れる人いませんか?
どうか宜しくお願い射ます
0049nobodyさん
05/01/30 18:59:58ID:???何を「どのように」変換したいのかをはっきりさせてから↓で聞いてください。
正規表現道場@2ch Part4
http://pc5.2ch.net/test/read.cgi/php/1105930285/
0050未承諾広告※ ◆TWARamEjuA
05/01/30 19:09:18ID:???0051nobodyさん
05/01/30 19:10:45ID:???0052未承諾広告※ ◆TWARamEjuA
05/01/30 22:08:02ID:???でも、一致しないときは全部サーチしなきゃだから、やっぱりハシュに入れちゃった方が効率よさそうですね。
0053nobodyさん
05/01/31 17:52:56ID:sSr/NKoB知りたいのですが、どう書けばよいのでしょう?
system で、ls -l した結果を切り貼りすれば、とりあえずできそうなのですが、
もう少し何か方法がありそうな気がしまして。
0054nobodyさん
05/01/31 18:04:55ID:???マジかよ!?
何でそんなセキュリティホール量産体制を作っちゃうのよ?
ユーザが送ってきた文字列を正規表現に使う前にサニタイジングしないと
いけないなんて面倒じゃないか?
っていうか何のメリットがあってそんな仕様なんだ?
0055nobodyさん
05/01/31 18:10:49ID:???0057nobodyさん
05/01/31 20:39:27ID:8ZuDaXBy「/ほげほげ」という文字を消したいんですよ。
$line =~ s|/ほげほげ||g;
↑で消えないんですが、どうしてって気持ちです。
「ほげほげ」だけなら↓で消えるのですが。「/」←コイツ(全角)が消えないのです。
$line =~ s|ほげほげ||g;
どうしてご存じかいませんか?
0058nobodyさん
05/01/31 20:40:18ID:8ZuDaXBy0059nobodyさん
05/01/31 20:44:59ID:???か?
0060nobodyさん
05/01/31 20:46:01ID:???こうだったか…orz
0061nobodyさん
05/01/31 20:56:16ID:???別の話になるが、マッチするしないは見た通りと一致しないこともある。
暇があったらこういうのも読んでおくといい。
http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
0062nobodyさん
05/01/31 20:58:15ID:???ありがとう・・・・・
(>_<)
今日一日はずっとこれ考えてました。
早くココで聞けばよかった…
0063nobodyさん
05/01/31 21:02:00ID:8ZuDaXBy今まで、全角はずっと文字あつかいでした。
0064nobodyさん
05/01/31 21:23:56ID:???>っていうか何のメリットがあってそんな仕様なんだ?
多分、\Q と \E をタイプする程度のことに文句を言うユーザを
排除しようとしたんじゃないかな。
0065nobodyさん
05/01/31 21:52:09ID:ZqzhsiuTSJISで書いただけじゃねーの?
「/」は815eだから正規表現のメタ
文字の「^」を含むので。
use encodengする場合除いてSJISで
スクリプト書くとはまるからやめた
方がいいと思う。
0066nobodyさん
05/02/01 01:04:11ID:???プログラムの冒頭に書いてあるこれはどういう意味でしょうか。
0067nobodyさん
05/02/01 01:09:11ID:ViOttCyfperlvar(1)よめ
0068nobodyさん
05/02/01 09:48:19ID:???こういう場合って345はどこへいくんですか?
テストしたら$a==1,$b==2でしたので、$bの中身が後続で上書きされ続ける
ような動作はしないことを確認しました。
メソッドからの返り血が複数で合った時に受け取り側ではリストを用意さえすれば
リストの数が合わなくても前列のみが必要な時は通用するんですね。
0071nobodyさん
05/02/01 12:36:12ID:???($x, undef, $y) = foo();
と
($x, $y) = (foo())[0,2];
のどっち使いますか?
私は拾う値が少ないときは後者、捨てる値が少ないときは前者で
ビミョーなときはなんとなく気分で使い分けなんですが。
0072nobodyさん
05/02/01 12:57:50ID:???最後が 2 番目だという保証もないので前者でしょ。
0073nobodyさん
05/02/01 12:59:01ID:???0074nobodyさん
05/02/01 14:57:15ID:HcuaG0EwPerlメモにある
$str =~ s/(\W)/'%' . unpack('H2', $1)/eg;
このスクリプトはeucを前提にしてるようですが
Shift_JISでは間違った置換をする可能性がありますか?
基本的には大丈夫なような気がするんですが;
一応まだ間違う瞬間を見つけれてませんし・・・
不安なので宜しくお願いしますm(_ _)m
0075nobodyさん
05/02/01 15:29:34ID:???というケースが多数出てきそう
実用上は支障なさそうだが
はたしてそれって「正確にURIエスケープ」したと言ってよいものなのか?
007674
05/02/01 15:49:54ID:HcuaG0Ewやはりそういうことが起きるのですかorz
Shift_JISの文字列を正確にURIエスケープするのは無理なのでしょうか?
>実用上は支障なさそうだが
・・・?
あ、もしかしてエスケープする時点でバイトの途中で区切られても大抵の
アンエスケープ処理後に何の問題も起こらないということですか?
それならうれしいのですが・・・・
007874
05/02/01 17:25:29ID:HcuaG0Ewそれなら安心です。
ありがとうございましたm(_ _)m
0079nobodyさん
05/02/01 18:36:33ID:???ひとつ前の文字が [\x81-\x9f\xe0-\xfc] の範囲なら [\x40-\x7e] も置換する、とか。
0080nobodyさん
05/02/01 19:20:22ID:???backgroundでは駄目なんでしょうか?
0081nobodyさん
05/02/01 19:22:07ID:???evianでは駄目なんでしょうか?
0082nobodyさん
05/02/01 20:59:16ID:???0083nobodyさん
05/02/01 23:18:19ID:???2, 真性の馬鹿
3, 実はインド人だ
0084nobodyさん
05/02/02 00:09:28ID:hjWjou/0今gazou.cgiの直下にgazouフォルダがあり中にはn個のjpg画像があります。
これをgazou.cgiが呼ばれたら、jpg画像があるだけ(n個)htmlで出力したいのですが
どう書いたらいいのでしょうか?ちなみに10個ごとに改行を入れたいのですが、そういうことは可能なのでしょうか?
もしよろしければご教授ください。
0085nobodyさん
05/02/02 01:14:46ID:???あるディレクトリに入っているjpgファイルの一覧ページを作りたいのなら可能。
自分でできるだけのことをやって、行き詰まってからまたおいで。
0086nobodyさん
05/02/02 01:42:57ID:???4時間かけてやっとhello.cgiを動かした俺。
てめぇらなんかに負けるものかぁぁぁぁぁぁぁぁぁてかハラヘッタァァァ
008884
05/02/02 03:00:32ID:hjWjou/0require './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個ごとにべつのファイルを作成といったことはできるのでしょうか?
見当がつかなくここの先輩方にご教授いただけたら幸いです。
0089nobodyさん
05/02/02 03:47:54ID:???後は、条件分岐でごにょごにょと指定するだけ。
0090nobodyさん
05/02/02 08:38:32ID:???#!/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>';
0091nobodyさん
05/02/02 09:28:59ID:???@array[-1]
確か以前にマイナス値を与えると逆から数えると読んだのですが、今探しても
そのソースが見つからないのでお願いします。
一応動作はうまくいってますが、@array[$#array]とは違う働きをする瞬間が
存在したら怖いので賢者に聞きにきました。
0092nobodyさん
05/02/02 11:16:14ID:???http://www.kt.rim.or.jp/~kbk/perl5.005/perldata.html#Variable_names
http://www.kt.rim.or.jp/~kbk/perl5.005/perlfaq4.html#What_is_the_difference_between_
http://www.kt.rim.or.jp/~kbk/perl5.005/perltrap.html#General_data_type_traps
009391
05/02/02 11:25:02ID:???私が思っているほど-1についての動作は単純じゃないんでしょうかorz
009484
05/02/02 11:27:46ID:???ありがとうございます。これからいろいろ試してみたいと思います。
>>90
わざわざコードをかいてもらって本当ありがとうございます。
これから解読しつつ試してみたいと思います。
0096nobodyさん
05/02/02 13:11:44ID:???配列の添え字が負であったとき、それは配列の終端から数えられるようになりました。
@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だから気にせず使えよバカ。
0097nobodyさん
05/02/02 16:36:20ID:43fDDoaTforeachなどのループ文を書くときによく何回目のループかを知りたくて
my $i = 0;
foreach.....$i++;.....
のようにして$iを使用しますよね。
これはきっと昔から使われている手法だと思います。
でもちょっと面倒ですよね。
そこで思ったのですが、何故にデフォルトで何回目のループかを専用の特殊変数
に代入するような仕様にならないのでしょうか?
例えば
@+R
などを作って内側から1つ目のループが何回目かを調べる時は
$+R[0]
で、こういう感じで実装してあると結構便利だと思います。
まあ何故に仕様がこうであるかはここで言ってもしょうがないですし、
素人の脳みそでは理解できない事情があるのかもしれません。
こういう特集変数めいたものを自分で作ることは可能でしょうか?
例えばhogeモジュールをuseすれば自動的にそういう特殊変数が作成されるような。
しょうもないことですがあると便利だと思うんですよね。
0098nobodyさん
05/02/02 16:45:17ID:???010197
05/02/02 17:39:48ID:43fDDoaTパフォーマンスの問題でしたか。
そうですよね;
>>99
for以外のループ文でも使えないと・・・・・
それに汚いですよね。
>>100
どういうことですか?whileだけ特殊変数が用意されてるんですか?
ちょっと特殊変数一覧見直してみますm(_ \)m
0103nobodyさん
05/02/02 18:09:14ID:???010484
05/02/02 21:19:40ID:???0105nobodyさん
05/02/03 01:49:12ID:???#施錠
$try=3;
while(! rename('off.loc','on.loc')){
if(--$try <= 0){die;}
sleep(1);
}
#解錠
rename('on.loc','off.loc')
ただ、これでは施錠してから解錠する間にプロセスが逝った時施錠されたままになってしまいますが、
そこで、最後にrenameした時間を求めるにはどうすればよいのでしょうか
0106nobodyさん
05/02/03 03:31:38ID:???http://www.din.or.jp/~ohzaki/perl.htm#File_Lock
0107nobodyさん
05/02/03 13:38:41ID:???cpan検索するとないわけではなくて結構たくさん出て来
るんだがどれがいいんだかよくわからん。
でもhttpで何かゲットというとLWP使えって速攻で返って
くるのに、ロックだとそういうの見たことないし、実は
どれもあまりよくないというオチだろうか?
0109nobodyさん
05/02/04 03:38:45ID:???0110nobodyさん
05/02/04 12:26:33ID:O0itZOq3では配列を取り出し名がらやるにはどうやるんですか?
0111nobodyさん
05/02/04 12:47:46ID:???@array = (1,2,3,4,5);
for ($i=0; $i<=$#array; $i++) {
print $array[$i];
}
0112nobodyさん
05/02/04 13:42:59ID:???きょうび、flockが動かないサーバーなんてあるか?
flockの仕様がやや使いづらい、というのなら分かるがな。
そういう意味ではPerlメモで紹介しているmkdirによるlockを使うことも十分あり得る。
0113nobodyさん
05/02/04 18:09:07ID:???以下のように書いても動きませんでした。
何が間違ってるか教えてください。
#!/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__
0115nobodyさん
05/02/04 18:51:19ID:???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: $!";
ぐらいはしろよ。どこでだめになったかさっぱりわからんだろ。
0116nobodyさん
05/02/04 20:43:55ID:???0117nobodyさん
05/02/04 20:51:29ID:3semSWSAWeb板の内容でしたらすいません。
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を
選択した状態にしたいのですが、良い方法はないでしょうか?
0118nobodyさん
05/02/04 20:54:33ID:???選択状態にするには、次のようにselected を付ける。
<option value="value" selected>
0120nobodyさん
05/02/04 21:03:46ID:???条件分岐して selected 付きprintしたりしなかったりしたりしなかったりしたりしなかったりしたりしなかったり…
すればいいんじゃないの?
0121nobodyさん
05/02/04 21:05:00ID:???print qq{<OPTION VALUE="10"$hoge{10}>10\n};
以下略
"をエスケープするのは個人的に好きじゃない
0122nobodyさん
05/02/04 21:07:13ID:???print qq|<option value="$_"|;
print qq| selected| if $str eq $_;
print qq|>$_</option>\n|;
}
こうかな?
0124nobodyさん
05/02/04 21:11:59ID:???cgiの入力フォームで送信ボタンを押した後など
ブラウザでリロードを行うと同じ処理が繰り返し行われてしまいます
そのせいで、例えばリストの中の2番目のデータを削除していた場合
リロードの度に新しく2番目となったデータが削除されていってしまうのですが
こういった場合に、ある程度経験のある方は
どのようなやり方で解決しているのかお伺いしたいのですm(__)m
0125nobodyさん
05/02/04 21:15:56ID:2GvnZ25o2chの書き込み後の処理をまねてみるとか。。
0126nobodyさん
05/02/04 21:22:44ID:MsfARYCJrefreshを使いなさいという事です。
頑張って下さい。
0127nobodyさん
05/02/04 21:25:30ID:???require 'extlib/LWP/Simple.pm';
と書く不思議コーディングはははじめてみたがそれは置いといて、
dataディレクトリがないだろ。
0128nobodyさん
05/02/04 22:19:37ID:???1.locationやrefreshで飛ばしてブラウザにGETメソッドを記憶させる。
2.最後の投稿を記録しておいて、二重投稿(この場合削除)をチェック。
3.削除する前に確認画面を出す。
4.固有の番号指定で削除するようにする。
0129124
05/02/04 22:21:56ID:???2chの書き込み後の処理というのは、やはり入力フォームと表示部を分けるということでしょうか
確かにそれが一番いいのかもしれませんね
でもできればフォームと一体型で、根本的な解決方法がないものか気になるのでもう少しこのまま頑張ってみます
ありがとうございましたm(__)m
>126
refleshというものがあるのですね
これから検索をして勉強してみたいと思います
ありがとうございましたm(__)m
0130124
05/02/04 22:25:16ID:???おお、具体的な方法を4つも教えて頂いて本当に感謝です
1番目の方法だけまだ勉強不足で分からないので、いろいろ試してどの方法が一番いいか考えてみます
本当にありがとうございましたm(__)m
0131nobodyさん
05/02/04 22:57:25ID:???そういえばどこかの掲示板の作者がサポートの質問で
で二重投稿になるのは仕様だとバカみたいなこと平気で言ってたな
0132nobodyさん
05/02/05 00:13:26ID:???1はよく使われるけど、ボタンの2度押しは防げないよね。
手軽で便利なんだけど。
0133nobodyさん
05/02/05 00:21:40ID:KAYC+D6O確実じゃないかと。
0134nobodyさん
05/02/05 01:11:51ID:???$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";
何もでてきません
何がだめなんでしょうか?誰か教えてください・・・
0136nobodyさん
05/02/05 01:44:54ID:???二次元の読み出し方も間違っているが仮に読み出せたとして
$valueはどこで使われてるのよ?
表示させる@valueっていったい何よ?
0137nobodyさん
05/02/05 02:21:14ID:???0138nobodyさん
05/02/05 02:28:27ID:???0141nobodyさん
05/02/05 02:45:38ID:???0142137
05/02/05 02:51:46ID:???0143nobodyさん
05/02/05 03:17:56ID:???Perlの起動が上手くいきません…
XPでPerlのVerは5.8.3です
とりあえずデフォルトでインストールは終わったのですが
コマンドプロンプトを開くと即閉じてしまいます。
サイトみてもXPの説明が…
0144nobodyさん
05/02/05 03:28:41ID:???スレ違いです。
△▲ WebProg 初心者の質問 Part11 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1101635909/
0145nobodyさん
05/02/05 03:30:56ID:???0148nobodyさん
05/02/05 05:41:11ID:???とりあえず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>';
0149nobodyさん
05/02/05 17:35:50ID:???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なのになぜなのでしょうか…知っている方ご教
授いただければ幸いです。
0151nobodyさん
05/02/05 17:52:11ID:???fusianasanのほうは他の処理に原因があるのだろう。
@post_check_listは中身がリファレンスなんだから当然の結果。
eucとかそういう話は無関係。
0152nobodyさん
05/02/05 18:36:20ID:???日本語をwriteすると文字化けるというのは仕様でしょうか?
#以下ソース
$hoge = 'test1';
$hoge2 = 'あ';
format STDOUT =
TITLE : @<<<<<<<<<<
$hoge
TITLE2 : @<<<<<<<<<<
$hoge2
.
write (STDOUT);
#$hoge2が化けてます。
0153nobodyさん
05/02/05 18:42:39ID:???if ($name = ~/fusianasan/){
$name = "<strong>$host<\/strong>";
}
0155nobodyさん
05/02/05 19:50:46ID:???if ($name = ~/fusianasan/){
$name = "<strong>$ENV{REMOTE_HOST}<\/strong>";
}
0156nobodyさん
05/02/05 19:54:28ID:???つか、漏れの借りてる鯖は$ENV{'REMOTE_HOST'}禁止なんだよね。
0157nobodyさん
05/02/05 19:55:01ID:???でもいいな。
0161未承諾広告※ ◆TWARamEjuA
05/02/05 21:13:22ID:???0162149
05/02/05 21:15:54ID:???ありがとうございました。スペースを削除したら上手くいきました。
>>151
リファレンスにせずに、普通に
@post_check_list = ($name ,$mail, $honbun…
としたら上手くいきました。ありがとうございます。
>>155,>>157
それだと、名前欄に「ほげほげ fusianasan」などと入れたときに
ほげほげが消えてしまいます。
0163nobodyさん
05/02/05 21:39:54ID:???勘違いしてるみたいだけど、~ は正規表現の先頭に付ける文字じゃないからね。
後半のソースは左辺値がないからたまたま期待通り動いてるだけ。
どういう意味があるのかは調べてみてください。
0164nobodyさん
05/02/05 22:35:02ID:???$name = ~/fusianasan/;
これは
$name = (~($_ =~ m/fusianasan/));
と同じ意味。
0165nobodyさん
05/02/05 23:56:22ID:5Rr9/6OZprint << " END_OF_PRINT";
処理
END_OF_PRINT
って書くけど、
こんな時に処理部に例外処理が沢山あって
print << " END_OF_PRINT";
処理A
END_OF_PRINT
print << " END_OF_PRINT";
処理B
END_OF_PRINT
・・・
ってな感じで細かく使わないといけないけど普通のprint文を使うまでも無いって時はどうしてる?
なんかソースが汚く見えるんだよね。
0166nobodyさん
05/02/05 23:58:48ID:???意味わかんないんだけど。
スペースも意味わかんない。
0167nobodyさん
05/02/06 00:31:46ID:???例えとしてもそんなこと書いているようでは汚いのは当然かも。
0168nobodyさん
05/02/06 00:44:01ID:???0169nobodyさん
05/02/06 00:48:00ID:???0170nobodyさん
05/02/06 00:52:30ID:???0171nobodyさん
05/02/06 01:13:35ID:???サブルーチンを分けるか、ファイルを分ける。
スペースは意味わかんないから __END_OF_PRINT__ とか書く。
0173165
05/02/06 02:10:26ID:???0174nobodyさん
05/02/06 05:39:04ID:???一度変数に入れてしまう。
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;
0175nobodyさん
05/02/06 11:18:05ID:???処理A
EOT1
処理B
EOT2
0176nobodyさん
05/02/06 12:36:07ID:???@{[...]}とか使えばなんでも書けるけどさ...
0177nobodyさん
05/02/06 13:01:53ID:???0178nobodyさん
05/02/06 13:03:56ID:???綺麗とかそういう基準なんて、誰かが勝手に言い出した物で、
別に基準なんかじゃないんだからさ。
自分が後から見て理解できるように書けばいい。
0179nobodyさん
05/02/06 13:17:10ID:???0180nobodyさん
05/02/06 13:32:38ID:???複数ファイルのCRC16チェックを行い、その結果を表示するCGIを作ったのですが
1ファイル毎に結果が送られなくて、10個ほど毎にブラウザに返してきます。
これを1個づつこまめにレスポンスを送るにはどうすれば良いのでしょうか?
Unixの場合は $|=1 等で手段が有るようですが、Windows環境では無理でしょうか?
0181nobodyさん
05/02/06 14:53:09ID:???スレ違い
△▲ WebProg 初心者の質問 Part11 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1101635909/
0182180
05/02/06 14:55:56ID:???0183nobodyさん
05/02/06 16:44:56ID:fwG0kktYテキストエリアに表示させる時、改行文字は何になるのですか?
<TEXTAREA COLS=65 ROWS=5 NAME=\"ets\">$ets</TEXTAREA>
と記述し、$etsのデータの改行したいところに\nとか\rとか\r\r\nとか
入れてみたのですが、そのまま表示されます。
0184nobodyさん
05/02/06 16:46:35ID:???スレ違い
△▲ WebProg 初心者の質問 Part11 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1101635909/
0185nobodyさん
05/02/06 17:25:47ID:???0186nobodyさん
05/02/06 17:28:45ID:???$ets = '〜\n'; みたいにシングルクオーテーションだと \n 、
$ets = "〜\n"; みたいにダブルクオーテーションで書けば 改行 で入ると思う。
0187nobodyさん
05/02/06 17:43:51ID:???0189nobodyさん
05/02/06 17:51:47ID:???普通に質問に答えてあげればいいと思うが。
0191nobodyさん
05/02/06 18:27:46ID:fwG0kktYありがとうございます。
まだうまく行きませんが、WebProg 初心者の質問 Part11の方で
継続して質問しています。
0194nobodyさん
05/02/06 19:29:14ID:???自治初心者スレとか必要だな(w
0195nobodyさん
05/02/06 23:57:25ID:???0196nobodyさん
05/02/07 10:09:59ID:Xo+VK5jqメールアドレスをそのまま入力してもらうと正規表現がたいへんなので、
@はこちらで用意して左辺と右辺を別々に書いてもらうことにしました。
入力スペース @ 入力スペース
こんな感じです。そして不正なアドレスだと感知したらメールを送るのをやめます。
右辺は英数字とピリオド以外が混入していたら中止。
左辺は何が混入していたら中止にすればいいのでしょうか?
確かメールアドレスに含んでよい記号ってかなりありますよね;
@を除いてそれら以外が混入してれば中止とすれば安全なのでしょうか?
0197nobodyさん
05/02/07 10:28:38ID:???よくXSS対策などと言いますが、リファラーを取ってマッチングしない場合は
別の処理をするみたいな事をすればXSSなんて起こりませんよね?
もちろん結局はしないと変なスクリプト掲示板に埋められたり、注文客が
思いっきりスクリプト攻撃したりということがありますが、それってXSSでは
ないですよね。
つまりXSS対策って実はリファラーだけ取れば回避できるんですよね?
それともXSSっていうのの意味には前段落で挙げたようなことも含まれているんでしょうか?
0198sage
05/02/07 10:41:49ID:+1BETA+W既存のスクリプトを使用した方が早くないか?
>確かメールアドレスに含んでよい記号ってかなりありますよね
普通はアルファベットと数字、アンダーバーやハイフン程度だろ
>>197
しかしそう簡単にはリファラーを渡さないのがノートン先生ですよ
0199196
05/02/07 10:55:01ID:Xo+VK5jqドメイン側は
$domain =~ /[^\w\.]/;
としていてこれにマッチするなら不正と考えます。
ユーザ名側は確か通常URIに含められる文字列なら全て含めることができたような記憶があるんですよね;
print MAIL "to: ".$user.'@'.$domain."\n";
みたいにするんですが、UNIXには詳しくないのでどういう文字列を渡すと危険なのかが
把握できていません・・・
$user =~ /[^\w\-]/;
これだと実際には正常なアドレスなのに送れないケースが出てくると思うんですよね。
やはり既存のフォームメールスクリプトを探すのが早いですかね?
さっきPerlメモ読みましたが、ユーザ名側で何をエスケープするべきかは書いてなくて
ややこしいコードだけがありました。
ユーザ名側に含めることができる記号一覧があるRFC文書を探してますが、
英語に悪戦苦闘ですorz
0200nobodyさん
05/02/07 10:55:14ID:???正規表現以外でやろうとする方が大変。
ちなみに携帯のメールアドレスとか規格に則してなかったような。
>>197
リファラは偽装できる。
0201197
05/02/07 11:15:16ID:???やっぱ俺って天ちゃんなのね
0202nobodyさん
05/02/07 11:15:29ID:???>>198
メールアドレスのローカルパートって他の世界のメールシステムとの
やりとりもありうるので適切にエスケープすればほぼなんでもありの
仕様になっています。rfc2821の4.1.2にBNFがあるのでLocal-partって
とこを見ればいいですが、「"」でくくってQuoted-stringにすれば\を
前に置くことでCR,LF以外の任意の文字を書くことが出来ます。
くくらない場合は、英数字または「!#$%&'*+-/=?^_`{|}~」からなる1文字
以上の文字列、またはそれをを「.」をはさんで複数つなげたものが許され
ます。ただし、一部のケータイなどで連続した「.」を含んだり末尾が「.」
で終わる仕様に違反したアドレスを許しているので、あまり厳しくチェック
すると文句がでるかもしれません。
これを気にしなくてよければEmail::Validそのままでいいんだけどね。
0203nobodyさん
05/02/07 11:16:20ID:???http://bbq.uso800.net/code.html
にあるBBQによる方法で導入してみました
動作確認したいのですが公開串って何処で公開されてるんでしょうか
0204nobodyさん
05/02/07 12:26:41ID:???perlに関係ないじゃん。
rfcでアドレスに使える文字を調べないさいよ。
>>203
板違いだね。
初級ネット板かセキュリティ板へ。
0207nobodyさん
05/02/07 13:29:03ID:???0208nobodyさん
05/02/07 15:47:18ID:???壊れますよね。
いわゆる排他処理って言うと思うんですが、今まで一度もやったことがありません。
Perlの経験はネットショップをmysqlとの連携で構築したりその他ちまちましたものばかりです。
基本的にファイルではなくDB連動ばかりだったので勝手に排他処理をしてもらってたせいで。
どこかPerlでやる排他処理について詳しいサイトありますか?
一応windowsでもUNIXでも共通の方法を探してます。
0210nobodyさん
05/02/07 19:09:05ID:???今回は違う人が誘導したんでしょ。
誘導厨フォーマットじゃないし。
↓
>>000
スレ違い
△▲ WebProg 初心者の質問 Part11 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1101635909/
0211未承諾広告※ ◆TWARamEjuA
05/02/07 19:20:38ID:???【BBQ 3本目】公開串登録所 【ピンポイント規制】
http://qb5.2ch.net/test/read.cgi/sec2chd/1105274729/l50
ここを眺めればいくらでも(w
0213nobodyさん
05/02/07 21:02:12ID:???0214nobodyさん
05/02/07 21:42:44ID:???0215nobodyさん
05/02/07 21:54:28ID:???0217nobodyさん
05/02/07 23:02:26ID:???0218nobodyさん
05/02/07 23:05:47ID:???#!/usr/bin/perl
require './require.pl';
&hogehoge;
# hogehoge2を呼び出さずに終了
exit;
-------------------------
# require.pl
sub hogehoge{
(中略)
}
sub hogehoge2 {
(中略)
}
--------------------------
この場合に呼び出していない、require.plのhogehoge2はコンパ
イルされるのでしょうか。
それとも、呼び出さなければコンパイルされないのでしょうか。
教えていただければ幸いです。
0219nobodyさん
05/02/07 23:18:56ID:???ttp://homepage1.nifty.com/glass/tom_neko/web/web_04.html
http://web.archive.org/web/20040216083853/www98.sakura.ne.jp/~jun/perl/flock.html
0221nobodyさん
05/02/07 23:39:55ID:Cfgr4b2rEmail::Valid
Email::Valid::Loose
Docomoの変なのもおっけ
到達可能かもみます
0222nobodyさん
05/02/07 23:43:35ID:???コンパイルされますか…
# 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 {
(中略)
}
-----------------------
みたいな感じで別ファイルにして対処しようと
思います。ありがとうございました。
0223nobodyさん
05/02/08 02:09:22ID:???0224nobodyさん
05/02/08 02:15:40ID:???0225nobodyさん
05/02/08 02:54:05ID:???0226nobodyさん
05/02/08 03:39:12ID:???0227nobodyさん
05/02/08 03:43:09ID:???なんでこんなに即レスなの?
0228nobodyさん
05/02/08 03:51:50ID:???0229nobodyさん
05/02/08 13:26:19ID:???いつも誘導に反応する奴なんてまったくいないのに。
何人もいるように見せかけているが、近い時間に書いてるし。
いずれにしても注意してるヒマがあったら、ここでも誘導先でも
答えてやればいいのに。
0232nobodyさん
05/02/08 16:58:30ID:???みなさんはページ移動をどうやってますか?
私は今まで
if ( $form{page} eq "hoge") {#hogeページの処理
}elsif( $form{page} eq "hage" ){#hageページの処理
}
こうしてました。で、ふと思ったのですが、もしかしてページごとにサブルーチンに
しておいて、$form{p}の値を見てどのルーチンを呼ぶかを分岐させた方が
わかりやすいかもって。
みなさんはどうやってますか?
0235nobodyさん
05/02/08 18:48:30ID:???同じぐらいに時間に登場とはわかりやすい。
0236nobodyさん
05/02/08 19:24:33ID:???お前に何の権利があるんだよとか、いちいち注意してんじゃねーよとか
意味不明な反抗をする高校生みたいになってきてるな。
0237nobodyさん
05/02/08 19:25:19ID:???0239nobodyさん
05/02/08 21:45:37ID:???そこで画像サイズを取得し、<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 用の編集で動くようになったのでしょうか?
動くようになったこと自体はいいのですが、サーバー側に迷惑をかけてる可能性はありますでしょうか?
0240質問
05/02/08 22:09:04ID:???↓
表示したリストからpptファイルへリンク
これって出来ますか
0242nobodyさん
05/02/08 22:16:03ID:???君が初心者なのはわかった。
でも君がやろうとしてる事はちょっとだけ初心者の域を抜けかけてる。
初心者が下手にやると危険。
中級者になってから挑んでください。
0243239
05/02/08 22:44:01ID:???危険な事だという事はわかりましたので、素直に Image::Size を
サーバー管理者にインストールして貰うようにメールしてみます。
あと、私の犯した過ちは Win 用のファイルをあげた点で間違いないでしょうか?
0244nobodyさん
05/02/08 23:20:35ID:???自分のスクリプト内に、サイズ求めるソース組みこだらいい。
検索したら何かあるでしょ。
0246nobodyさん
05/02/09 00:34:32ID:???いいや。今のまま使い続けても、何も心配する必要は無い。
Image::Size は様々な形式の画像ファイルのサイズを得る機能を有しているが、
ある特定の形式(例えばgif)のみのサイズを得たい場合
には、その形式に必要な機能のみを、メモリに展開すれば済む。
そこで、実際に指定された画像形式に応じて必要な機能のみを
実行時にメモリに展開するのがAUTOLOADだ。
> 実際にした編集というのは use AutoLoader 'AUTOLOAD'; と __END__ の2行を消しただけです。
それをやると、Image::Size が対応しているあらゆる画像形式の
機能が全てメモリに展開されることになる。だから、メモリ容量が
多少無駄になるが、特に支障があるというわけではない。
0247nobodyさん
05/02/09 00:52:14ID:cKLRZBQZ0248nobodyさん
05/02/09 07:37:58ID:???cryptは8文字目以降は無視するようなので
crypt以外で8文字以上の文字列を暗号化する良い方法を教えてください
0251nobodyさん
05/02/09 10:13:54ID:???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’);
とローカルとして宣言するとブラウザに出力される事になります。
何が原因なんでしょうか?
0252nobodyさん
05/02/09 10:50:26ID:???空白や記号が全角になってるのを半角に直してperlに食わせてみたが
そもそも構文エラーでるじゃん。実際におかしいものと違うコードを
見せられてもなぁ。
0254251
05/02/09 11:27:13ID:???書き込むときってみやすいように全角使ったんですけど、
こういうのって直接コード書いたほうがいいんですかね?
#!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>";
}
}
0255nobodyさん
05/02/09 11:54:12ID:???Cでいったら/* */見たいなやつです。
0257nobodyさん
05/02/09 14:01:11ID:???Content-typtという打ち間違いがある状態でまともに動いて
いるとは思えないのだが、そのコードでちゃんとおかしな現象が
再現してるのを確認してるかい? おかしい現象が起きてるものを
そのまま出してもらわないと付き合いきれんよ。
ちなみにそのtypoを直して実行してみたところ、そのコードで
普通にファイルの中身も出力された。
0258251
05/02/09 14:43:07ID:???実際に動かしているコード
#!/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;
にするとすべてブラウザに出力されますね。
リファレンスとか絡んでるんだろうか?
0259nobodyさん
05/02/09 16:03:09ID:XVTcbf3E時間,名前,コメント
時間,名前,コメント
時間,名前,コメント
というようなデータの列挙が1000件以上あります。
これを元に色々な処理をしたいので、ハッシュに入れようと思ったけど、キーがないので入れられません;
1000件以上になるのでabcd...なども無理です。
そこで「a行数」のキーを与えようかとも思ったのですが、論理的なキーではないのでイマイチ気が乗りません。
何か良い方法はないでしょうか?普通はこういうときってどうするのでしょうか?
やはり「a行数」というキーを持たせるしかありませんか?
0260nobodyさん
05/02/09 16:05:36ID:???特にハッシュにしなきゃいけない理由って何かあるの?
0261nobodyさん
05/02/09 16:07:48ID:???0263259
05/02/09 16:15:15ID:XVTcbf3Eそうか・・・・・
>>261
それは知りませんでした;
しかし>>260さんが言うようにa行数のようにしたい時点で配列を使えばいい状況
ということですねm(_ _)m
配列の中にリファレンスでいれておきます。解決です。ありがとうございました!
0264nobodyさん
05/02/09 16:16:02ID:???配列に入れちゃダメなの?
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とかに入れるのってどうやってやんの?
0266251
05/02/09 16:27:57ID:???みんな、ありがとう。
いい夢みろよ!!
0267nobodyさん
05/02/09 16:51:03ID:???#!/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
0269nobodyさん
05/02/09 17:31:30ID:???chomp, push @data, [ split /,/ ] while <DATA>;
はいくらなんでも詰めすぎじゃないかと。
普通に書くなら
while (<DATA>) {
chomp;
push @data, [ split /,/ ];
}
ぐらいじゃないかなー。
0271nobodyさん
05/02/09 18:59:46ID:???私は
chomp, push @data, [ split /,/ ] while <DATA>;
の方が直感的に頭に入ってくるな
0273nobodyさん
05/02/09 20:09:21ID:???下主流
0274nobodyさん
05/02/09 21:09:26ID:???0275nobodyさん
05/02/09 22:00:05ID:???あれ面白い?っていゆーか実践的な内容?
0276nobodyさん
05/02/09 22:19:03ID:oNgMiBujデータを送ることができないと思うのですが、POSTで送る方法などはありますか?
0277nobodyさん
05/02/09 23:07:01ID:???http://homepage3.nifty.com/hippo2000/perltips/lwpcook.html#POST
0278nobodyさん
05/02/10 02:07:22ID:???とするとき、改行\nを消す方法があれば教えてください
0279nobodyさん
05/02/10 02:36:02ID:???chomp @hoge;
0280nobodyさん
05/02/10 03:26:26ID:???$::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);
}
0281nobodyさん
05/02/10 03:27:00ID:???{
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); #ディレクトリがまだあったら再帰
}
}
}
0282nobodyさん
05/02/10 03:27:47ID:???and !( grep { $now_dir =~ m[/$_$]; } @{$::info{'no_dir'}} ) #除外指定ディレクトリは無視。ところがこれがエラー
↑ここんことが変になるんですけど、どーしたらいいんかね?
0284nobodyさん
05/02/10 05:12:42ID:FuWRzUOO新しいサイトでフォームを使いたいのですがうまくいきません。
書き込み用のform.html(仮名)とform_mail.cgiは古いサイトでは
フォームの送信後メールがちゃんと届いたのですが、
新しいサイトでは何故か機能しません。
cgiのパールへのパスとドメイン所属のメールアドレス、
form.html内のform_mail.cgiへのパスは正しく書き換えている
(つもり)のに。。。ディレクトリーも同じように設定してます。
フォーム送信にhtmlとcgiファイル以外でしなければいけない事、
必要なファイルってありますか?
ひとつ疑問に思ったのは古いサイトではcgiのパーミッションを入力して
再接続すると前回に入れた数字(755)が残るのに、
新しいサイトでは入力後に再接続してもその数字は残っていません。
あとフォームを機能させるためにhtaccessって必要ですか????
分かる人どうか宜しくお願いします!!
0285284
05/02/10 05:14:53ID:FuWRzUOO0286nobodyさん
05/02/10 09:55:26ID:GQajLbsS$a = 1;
}elsif(条件b){
$a = 2;
}else{
$a = 0;
}
これを1行ないし2行で収めることはできませんか?
?演算子を使えばできるかと思ったのですが、3つは無理みたいで;
知恵をお貸し下さいm(_ _)m
0287nobodyさん
05/02/10 10:09:46ID:???$a = 条件a? 1: 条件b? 2: 0;
で普通にいけると思うけどなんか変になるのかね?
条件の部分は場合によってはカッコいるかも。
0288286
05/02/10 10:25:55ID:GQajLbsS!?
そういうのもありなんですねm(_ _)m
0289286
05/02/10 11:06:28ID:GQajLbsSXSS対策にメタ文字エスケープをするときってCGI関係ではよくありますよね。
基本的には埋め込む直前にケースバイケースのエスケープをするのですが、
みなさんはどうやってますか?
元の文字列を加工したものを『他の新しい変数に入れて』ますか?それとも
『元の変数に上書き』してますか?
後者だと元データがなくなるので何かと不都合の原因になりますよね。
しかし新しい変数を用意すると、色々なところで色々なエスケープが必要になるので
だんだん頭がこんがらがります;簡潔性を欠くといいますか・・・
0290nobodyさん
05/02/10 11:42:53ID:???俺は普通に上書きしてる
>元データがなくなるので何かと不都合の原因になりますよね
これの意味がわからん。必要なときは元に戻せばいいじゃないか。不可逆変換やってるわけじゃないんだから。
0291nobodyさん
05/02/10 11:45:26ID:???私は最終出力時にエスケープ派であります。といっても
最近はほとんどテンプレートライブラリ使うので、テンプレート
側でエスケープ形式を指定するだけのことがほとんどですが。
0292286
05/02/10 13:35:23ID:GQajLbsSありがとうございます。
やはりみなさんそれぞれなのですね。
見易さ・わかりやすさの点でやはり変数を用意したほうがいいのかなと思ってます。
%form
%form_html
%form_sql
現在こういう感じです。
0294nobodyさん
05/02/10 15:15:16ID:???インクリメントのせいで、一度入れないとユニークキーが何かわからないのですが
挿入した直後にそのユニークキーを表示させたいのですが、どうすればいいでしょうか?
ユニークキー以外は重複している可能性が十分にあるデータ群なので、途方にくれています
そのプロセスが今挿入したデータに挿入時に自動的につけられたユニークキーが
何だったのかを調べるにはどうすればいいでしょうか?
0295nobodyさん
05/02/10 15:21:20ID:???無理だろ。
だって極端な話にすれば、ユニークキー以外が全部同じ内容のものなら
自分のユニークが何なのかを調べる方法なんてない。
0296nobodyさん
05/02/10 15:27:41ID:???最近使ってないから忘れたw
0297nobodyさん
05/02/10 15:36:08ID:???それを元に取り出せるけどな。
まぁそのためだけに二つもフィールドを増やすのはあまり気分がよくないわな。
0298294
05/02/10 15:57:58ID:???そうなのですかorz
実際にどういうデータが入ったかを確認するすべはないんですね…
>>296
本当ですか!?DBI使ってます。調べてみます。
>>297
そのためだけに増えるのはちょっとしんどいですよねorz
自分が挿入したレコードに付けられたユニークキーを調べることができないって…
つまり自分が何を入れたのかを確実に調べる方法が用意されてないってことですよね;
0299nobodyさん
05/02/10 16:19:29ID:???俺いまPostgreでユニークキーをインサートするためにやっているのが、
普通に順序のテーブルからnextvalでとってきて、
INSERTするときにnextvalからとってきてのをvalueで指定してるけど、
その考え方はだめ?
0301294
05/02/10 17:06:32ID:???いえ、ユニークキーがautoincrementになってるので、実際に挿入するまでは
どういうユニークキーになるのかわからないんです。
それで挿入した本人に自分が今入れたユニークキーを知らせることができずに困ってるのです。
>>299
nextvalって使ったことないです。ちょっと勉強してきます。
0302nobodyさん
05/02/10 19:29:44ID:???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の問題だね。
0303nobodyさん
05/02/10 19:37:17ID:???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); #ディレクトリがまだあったら再帰
}
}
}
ちょっと書き換えちゃったけど、適当に戻しておいて。
0304nobodyさん
05/02/10 19:40:55ID:???my $aaa = "$bbb.txt";
0305nobodyさん
05/02/10 19:49:39ID:???区別って$bbbと".txt"の境界をはっきりPerlに伝えたいってこと?
とりあえず、"."は変数の一部とは見なされないから、そのままでもOKだけど、
もっと安全に書きたいというのなら、
my $aaa = $bbb . ".txt";
my $aaa = "${bbb}.txt";
0308282
05/02/10 20:46:53ID:???やべー。恥ずかしい。pathとpassを間違いまくってた。_| ̄|○
そっか、ハッシュを使うんですね。ハッシュ。
しかも所々細かいアドバイスありがとう。
って事で今からテストしてきます。
0309304
05/02/10 21:41:23ID:???0310nobodyさん
05/02/10 21:46:11ID:???0311nobodyさん
05/02/10 21:50:00ID:???$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>
";
0314nobodyさん
05/02/11 01:43:21ID:???しかし、「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;
0315nobodyさん
05/02/11 02:07:19ID:???0316nobodyさん
05/02/11 02:29:31ID:???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;
0317316
05/02/11 02:35:22ID:???$address =~ m|^http://([-_\.a-zA-Z0-9]+)/?(.*)$|;
$host = $1;
$path = $2;
と付け加えて、
print SOCKET "GET /$path HTTP/1.0\r\n";
と変更すると汎用性があっていいかも。
0318294
05/02/11 08:42:07ID:4xNa2hhvありがとうございます。
ユニークキーは一応Perl側で作成してますが、万が一の重複の可能性を考えて
インサート時にauto_incrementになってます。
なのでユニークキーについては役割は半々ですね。
LAST_INSERT_ID()ではアクセスが集中した時にミスりますよね?
プロセスAが入れる→プロセスBが入れる→プロセスAからのLAST_INSDERT_ID()を処理
=プロセスBが入れたものがプロセスAに渡されてしまうorz
0319294
05/02/11 10:01:49ID:4xNa2hhv今回の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
0320nobodyさん
05/02/11 10:31:52ID:???0321nobodyさん
05/02/11 11:11:35ID:???テスト環境は(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が選ばれる可能性が・・・・次に続けます
0322321
05/02/11 11:15:15ID:???$number = $number == 7 ? $number - rand 7 : $number;
print $array[$number];
前回言いかけましたがこうしても結局今度は$array[0]が選ばれる可能性がちょっと増える
ので不公平ですよね。
公平に0-6を抽選することはできないのでしょうか?
0323nobodyさん
05/02/11 11:40:10ID:eHptbqsS言ってることがよくわかりませんが
http://www.rescue.ne.jp/CGI-BBS/cgi/perl/20020909010545.shtml
このへん読んでみれば?
というかrand関数を使えば均等になるし、ちゃんとrand呼び出す前に
srand関数で初期化してますか?
0324314
05/02/11 11:54:58ID:???教えていただいた方法で無事取得できました。
ありがとうございました。
0325321
05/02/11 11:56:27ID:???Perl5.1以降は自動的にsrandされてるみたいです。
もしかしてrand 8;
って0-8をランダムに選ぶのではなく0-7(小数点つき)を選ぶんですかね?
確かにprint rand 8;として
>8
となった経験はありませんが、ただ確率が極端に8だけ落ちるからだと思ってました・・・
私の勘違いだったのでしょうか?
0326nobodyさん
05/02/11 11:57:37ID:???0328nobodyさん
05/02/11 14:06:49ID:???これで今年が何年なのかを表示させようと思ったらエラーがでました。
near ")["
となってたのですがこの形式はダメなのでしょうか?
gmtime(time+32400)自体はリストなので大丈夫だと思ったのですが。
0329nobodyさん
05/02/11 14:14:41ID:???0330nobodyさん
05/02/11 14:14:45ID:QAwMbYUp↑これをリスト扱いしてるでしょ。どう見ても。
0331nobodyさん
05/02/11 14:24:46ID:???参考
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 を変換する場合、どう書けばいいのでしょうか?
0332nobodyさん
05/02/11 14:32:58ID:???open FH,"+>>test.txt";
seek FH,0,0;
print FH "ファイルの先頭";
close FH;
これを実行したら何故かファイルの末尾にかかれました。
seekが効いてないのでしょうか?
0334328
05/02/11 14:34:37ID:???でも同じエラーがでます。
0335nobodyさん
05/02/11 14:42:49ID:???+>>
ではseekは使えない。ポインタの移動自体が不可能。
もし先頭に追加したければ一度中身を配列に読み込んでから
unshiftで先頭に入れて上書きするしかない。
>>334
当たり前。かっこなんかつけてどうこうなる状況ではない。
@{[gmtime(time+32400)]}[5]
とすればいい。
0337nobodyさん
05/02/11 15:37:08ID:???">>"はO_APPENDがつくのでwriteがかならずその時点でのファイルの
末尾からになる。
ファイルをもしなければ作成して読み書き両用で開きたいんじゃないかと
思うが「>」使うのでちょうどいいのはたぶんない。openでシステムコール
のオプションを明示的に指定できるのでそれを使うのがいいと思われる。
0339nobodyさん
05/02/11 17:00:15ID:CPrSGSxUprint(
"引数",
"引数",
);
↑こーゆーのってコーディングスタイルとしてどーなんですか?
エラーはでないみたいなんですけど。
0340nobodyさん
05/02/11 17:07:21ID:4xNa2hhvmy $test;
〜処理〜
undef $test;
}
ブロックの終端で人間が見たときにこのブロックでどういうローカル変数を使っているかを
わかりやすくするためにわざわざundefしてます。
私のテキストエディタでは関数名は太字になりますので、もの凄く見やすいです。
それでそのブロックないで作った(いじった)グローバル変数もまとめて列挙したいんですが、
# $global
とかしてもコメント用の色にはなりますが、太字にはならず見づらいです。
そこで何か変数に対して何もしない関数があればいいなと思ったのですが、何かいいのはありませんか?
scalar $global;
みたいな感じです。
undefにしろ完全に処理効率を落とすものでしかないのでなるべくその影響が
小さいものがいいです。undef以下の処理時間の関数だと最高です!
0341nobodyさん
05/02/11 17:15:59ID:???http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlstyle.html
あとは君が書いたスクリプトを誰が保守するのか考えた上でご自由に。
>>340
エディタの為のコードを書くな。コードに合わせてエディタを設定しろ。
0342340
05/02/11 17:26:02ID:4xNa2hhvエディタの設定ではできないのです。
0343nobodyさん
05/02/11 18:20:17ID:???リストの最後にカンマが付いているのを懸念しているのか?
結論から言えばアリ。ハッシュでも良く使うね。
{
foo => 1,
bar => 2,
}
後で項目追加したりするときに、ミスが出なくていい。
0344343
05/02/11 18:33:32ID:???http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldata.html#List_value_constructors
0345nobodyさん
05/02/11 21:22:27ID:???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);
0346339
05/02/11 21:26:56ID:CPrSGSxUこっちのほうがいいな、と。
Cのprintfだと引数1つしかだめなんでちょっと
おどろいたついでに確認してみたんですが・・
アリということなのでがんがんつかいますw
0347339
05/02/11 21:31:01ID:CPrSGSxUprint と print() だとなんか前者の方がよくみるんですが
print()の方でもいいんですよね?
関数に()がないのがなんか気持ち悪くて・・
0348339
05/02/11 21:37:39ID:CPrSGSxU↑に書いてありましたね、連投スマソ
0350nobodyさん
05/02/12 00:13:28ID:???あまりいい趣味とは思えないが、どうしてもやりたければ
use Filter::cpp;
#define NOOP(x)
とか?
0351nobodyさん
05/02/12 00:15:44ID:???俺は関数に限らず極力()を付けない。
基本的に見易さと理解しやすさが第一だから。
もちろんぱっと見たときにどういう優先順位かわからなくなりそうな時はつけるけどね。
>CGIで使う時にprintが乱立するのが見苦しいから
それとこれは君がしょぼいだけと言わざるを得ない。
出力内容はユーザによって変えないといけないことが多いCGIではprintを始める
以前にほとんどのデータを用意しておく。
そして何行にもなるならヒアドキュメントを使ってスッキリさせる。
まぁプログラミングなんて誰でもできるものだけど、
読みやすく効率のいいものが作れるかが馬鹿と賢者の分かれ目かな。
ってえらそうにごめんねm(_ _)m
とりあえず処理効率よりも読みやすさを薦めるよ。
0352nobodyさん
05/02/12 01:31:57ID:???演算子には()をつけないほうが読みやすいとされるそうです。
俺もそう思いますが、printは演算子です。
0353347
05/02/12 01:34:34ID:DEctNxAsなるほど〜、うまいことやる方法がきちんとあるのですね。
なんせCGIは初めてで正直まだ何もわかっていないんです。
でも351さんがおっしゃっていることは自分も同意で、普段書く時
は気をつけています、綺麗なコーディング。
とにかくがんばります。
0354347
05/02/12 01:40:35ID:DEctNxAsえ、、、PerlやPHPだとprintは演算子なんですかぁ、ちとびっくり。
てっきり関数かと思ってました。
だから()がいらないんですね、なるほどなるほど。
0355nobodyさん
05/02/12 03:35:24ID:W11W0gdqそもそもCGIでprint文なんていくつも書かないだろ。
出力用のルーチンに投げてprintは1つでお終い。そこで変数展開してやればいい。
0356nobodyさん
05/02/12 10:55:57ID:???0357nobodyさん
05/02/12 12:43:51ID:???正確に言うと少し違う。Perlの組み込み関数はある意味で全て演算子であるといえる。
>>356
それでいいよ。その方が分かりやすい。
0358s
05/02/12 16:09:49ID:???うまく読み取ってくれません。どうやればいいのでしょうか?
0360nobodyさん
05/02/12 17:35:59ID:???こら。好き勝手書くんじゃない。
0363nobodyさん
05/02/12 23:09:29ID:???0365nobodyさん
05/02/13 04:12:34ID:???print ←リスト演算子
scalar ←名前つき単行演算子
rand ←引数が一つの関数
sort ←関数
演算子はコンパイラが変換形式と答えを知っている。
関数はインタプリタにて処理が実行される。
0366nobodyさん
05/02/13 05:23:09ID:???例
82CA82E982DB
を
%82%CA%82%E9%82%DB
にしたいのです。
使われる文字はa-zA-Z0-9の半角英数です。
ちなみに漏れが考えたのは、2文字ごとにsplitで分割して配列に入れ、joinでくっつけて頭に%をくっつけるって方法だけど、これでいいっすか?
0370nobodyさん
05/02/13 12:40:44ID:NsfysfMzgoogleでperl http webなどとしてもURLのスキーマがヒットするので要領を得ないのです。
0371nobodyさん
05/02/13 14:54:56ID:???httpプロトコルを実装したモジュールなどいくらでもあるから
どういうものを探してるのかわからんが、LWPなどよく使うものなら
↓に少々載っている。
http://homepage3.nifty.com/hippo2000/perltips/index.htm
0373nobodyさん
05/02/13 16:50:52ID:Lwv6BlB8$a == 1 かつ $b == 2
みたいに条件にaかつbみたいな複数条件を付けるにはどう書いたらいいんでしょうか?
教えてエロイ人
0375nobodyさん
05/02/13 16:53:57ID:Lwv6BlB8即レスサンスコ
0376nobodyさん
05/02/13 20:33:35ID:???@xx=();とやってもだめでした。
for($i=0;$i<=$#xx;$i++){
$xx[$i]="";
}
↑こうすればできましたが、やっぱり一行で何とかなりませんか?
0377nobodyさん
05/02/13 21:00:28ID:???でできるけど。
0379nobodyさん
05/02/13 21:08:31ID:???@xx=()でだめということは、要素数を保ったままで全要素を
空文字列にしたいという問題なのかな?
もしそうなら、
map $_ = '', @xx;
$_ = '' for @xx;
for (@x) { $_='' }
あたりからお好きな奴を。下のほうに行くにしたがって
微妙に遅くなるけどそれほど差はない。map使う奴はvoid
コンテキストじゃないと遅くなるので注意。
空文字列じゃなくてundefでよければ、
@xx = ();
したあとに
$#xx = 要素数-1;
で要素数あわせる方が速いけど。
0380376
05/02/13 21:35:58ID:???0381nobodyさん
05/02/13 21:45:50ID:MAmE7PYm!~ /[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,6}$/
なんかもうちょっといいのあったら教えてください
0382nobodyさん
05/02/13 22:24:52ID:???メールのアドレスはまじめにやるとかなりメンドウななので、
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/
0383nobodyさん
05/02/14 02:06:35ID:???$host = $1;
if ( !$host || !gethostbyname($host) ) {
print "不正なメールアドレスです";
}
俺はこうしてる。
0384nobodyさん
05/02/14 07:52:59ID: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、 \:::::::::::::::..、 ~" / ヽ.___,./ //ヽ、 ー
0385nobodyさん
05/02/14 09:45:44ID:IE9wtcnBカンマ区切りでダブルクォートで括られてると中のメタ文字は評価しないってやつです。
0386nobodyさん
05/02/14 10:26:10ID:???ここを見ながらファイル操作をためしてます。
しかし
open FH,"+>file";
こうした時に何故かファイルの既存データが読み取れません。
+<を使うと普通に読み取れますが、このサイトは間違った事を書いてるのでしょうか?
+>は読み取りも可能だと一覧表には書いてあるんですが・・・・
0388nobodyさん
05/02/14 10:48:19ID:???'+>'はファイルを開くときにまずいったん空にするのでそうなる。
そのあと新たに書き込んだ内容は読み出せるので読み取り可能と
いうのはそういう意味でいっていて間違いではない。
open(2)のflagsパラメタでいうと
'+>'はO_RDWR|O_CREAT|O_TRUNC
'+<'はO_RDWR
0390386
05/02/14 11:07:15ID:???そういうことでしたか!ありがとうござます。
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で使えるんだと思ってよいのでしょうか?
そうでしたら今から契約サーバでもこれを試して排他処理を選択しようかなと
思ってるんですが。
0391386
05/02/14 11:37:39ID:???+<の時もflockはモードを2にしておいていいんでしょうか?
読み込み時にモード2でやるとロックがかからない時があるようですが、
+<これはどうなのでしょうか?
0392nobodyさん
05/02/14 11:42:51ID:???flockは9x系では使えないけどNT系は使えるということになってたと
思った。未実装だと致命的エラーになるはずだし。
0393nobodyさん
05/02/14 11:57:52ID:???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_ほげ」
という名前の定数を使った方がいいと思う。
0395385
05/02/14 12:25:37ID:IE9wtcnBどうもです
0396nobodyさん
05/02/14 13:58:03ID:IE9wtcnBEmail::Valid::Loose
この二つを使いたいのですがwin版perl5.6にはプリインストールされてないようです。
そこでppmを使用してEmail::Validだけインストールしてみました。
しかしどうやらMail::Addressともう一つ何かが必要なようでMail::Addressの法を
ppmでインストールを試みてみたらどうやらPPDがないので無理なようですorz
実は今までppm以外のインストールをしたことがありません。
しかしこの度メールフォームを作成したいので、XSS対策?代わりにメルアドチェックを
Email::Validに任せたいのです。
多分鯖にもインストールされてないモジュールだと思うので、winXP環境の
ものをそのままLinux鯖のユーザスペースに移して使おうと思ってます。
0397nobodyさん
05/02/14 14:00:26ID:IE9wtcnBしかしその場合はLinux上にコピーしたところで使用するのは不可能ですよね?
Email::Valid
Email::Valid::Loose
使用してる皆様アドバイスお願いします。
0398nobodyさん
05/02/14 14:13:07ID:???Email::Valid::Looseはperlだけで書かれているっぽいので、
コピーすればいけるんじゃないかな。
ちゃんとディレクトリを掘ったりuse lib追加したりは必要
だろうけど。
しかしLinuxなら普通の手順でインスコできそうなもんだが
貸し鯖かなんかですかね。
0399396
05/02/14 14:24:17ID:IE9wtcnBEmail::Valid::Looseは
Email::Validのサブクラスですよね?
Email::Valid自体もpureperlなんでしょうか?
実は私は中身を見てもそれがpureperlなのかどうか判断できない馬鹿者なんですorz
実際の実行はLinuxのレンサバですが、テスト環境がwinXPなのです。
以前にpureperlのモジュールをLinuxレンサバのユーザスペースに移して
使用したことはあるので、今回もpureperlならできると思いますが、
結局Mail::addressとNet::DNSモジュールあるいはnslookupが必要なので
むりぽですorz
行き詰ってるのでとりあえずソースを自分でコンパイルしてインストールする
方法を勉強してみます。
0400nobodyさん
05/02/14 14:36:52ID:???開発手元に持ったほうがいいよ。
俺はデスクトップ環境にはLAN上にRH9置いてる。
持って歩くノートにはWinXPをホストにしてcolinux+debianを使ってる。
perlモジュールはCPAN使ってインストしてる。
実機はレンサバだけどSSHできるのでCPANで ~/lib/perl5 とかにインストして use lib〜使ってる。
環境作るの少々めんどいけど、都度Win環境でごたごたするよりはまし。
マシンなければ colinux+debian(デストリは何でもいいけど)で、これ最強。
0401nobodyさん
05/02/14 14:40:17ID:???あまり知識がないなら簡単なチェックで我慢したら?
@.-_
確かこれ以外の記号を使ってるメールアドレスってないよ。
だからこれと英数字以外を含んでるなら「メルアドが不正!」みたいな
メッセージを出してメールフォーム画面に戻せばとりあえず問題ないけどね。
まともなメールフォームなら
"<>スペース
あたりも許容するべきだけど、まあないならないでいんじゃないかな?
0402nobodyさん
05/02/14 14:49:16ID:???Net::DNSまたはnslookupが必要になるのはmxcheckを有効にしたときで、
無効にしとけばいらないはず。
0403396
05/02/14 14:52:18ID:IE9wtcnBcolinux+debian
聞いたことない名前ですが調べてみますm(_ _)m
>環境作るの少々めんどいけど、都度Win環境でごたごたするよりはまし。
そうですよねorz
>>401
そうなのですか!?
メールフォームといっても相手していするアドレスに固定文章を送りつけるだけなので
メールフォームとは呼ばないのかもしれません^^;
>@.-_
でもrfc882か何かではサイトURLなどと同じ記号が許されてましたよね。
で、それが結構な数になりますが私も401さんが挙げてくれた記号以外を
使ったメールアドレスを見たことがありません。
でもちょっと不安です;
どなたか @.-_ この4種類以外の記号が使われてるメールアドレスを
見たことがある方はいますでしょうか?
0405nobodyさん
05/02/14 15:23:42ID:???別の世界のメールシステム(多いのはLotus)に中継される場合なんかで
hoge/fuga/[email protected]
みたいのはよく見ますね。hoge/fuga/gagaは適当に分解されて
向こうの世界のユーザ名やドメイン名みたいなものになるらしい。
あと+=?あたりは普通に名前の一部として使ってるのをたまにみるかな。
404が紹介した顔文字アドレスはさすがにまだ見たことないです(笑)
0406396
05/02/14 15:27:00ID:IE9wtcnBおお!これはありがとうございます!
つまり自前サーバ立ててる人以外は大丈夫ということですね。
自前サーバ立ててる人はきっと私より知識が豊富なので説明もしやすそうですし。
さっき他のサイトを色々見てたらみなさんけっこうrfc準拠アドレスでも
@_.-以外を含んでる拒否するんですね。
とりあえず現状はこれでよしとして、なるべく早くEmail::validにイコウシマス!
0407nobodyさん
05/02/14 16:25:33ID:???みたいな無名ハッシュリファレンスを引数にしますが、これってメソド側でどうやって
受け取るんでしたっけ?
sub test{
$a = shift;
$b = shift;
ここでどうやればいいのか忘れてしまいました。誰か知ってますか?
0408nobodyさん
05/02/14 18:51:18ID:M2nRDwE8バイト単位で返すようにすると1,000という風にカンマ区切りが入ってしまうのです。
具体的には<!--#include virtual="filesize.cgi?file=パス"-->として自動的にページに
?fileクエリで指定したファイルのサイズを区切りなしのバイト単位で出力したいのです。
<!--#include virtual="filesize.cgi?file=/test/test.jpg"-->バイト
1000バイト
どなたかどのように書けばよいのか分かりませんか?
0409nobodyさん
05/02/14 19:01:43ID:sFNZsuc6最新情報
0411nobodyさん
05/02/14 20:27:00ID:???好きなのどうぞ
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;
}
0413nobodyさん
05/02/14 21:34:32ID:azOG+8a2MCPANでImage::Magickモジュールを入れようとしましたが、エラーになってしまいました。
そこで、ついforce installをしてしまいました。その結果か、入っていないにもかかわらず、
MCPANではImage::Magick is up to dateと表示されてしまうようになりました。
現状どおり、Image::Magickが入っていないと表示されるようにするには、どのようにしたら
良いのでしょうか。よろしくお願いします。
0414nobodyさん
05/02/15 00:00:01ID:???uninstallしろよ。
できなきゃOSから再インストールしろ。
自己責任でforce installなんかやったんだろ。
ついでにスレ違いだ。
Perlモジュールについて
http://pc5.2ch.net/test/read.cgi/php/997829243/
0415nobodyさん
05/02/15 08:40:45ID:6J2om7eC数字アルファベット以外のすべての文字に
\をつけるにはどうすればいいんでしょうか
$hoge=~s/([^0-9a-zA-Z])/(?:\\)\1/g;
とかやってもうまくいきません
0417nobodyさん
05/02/15 09:38:39ID:???&hoge(%hash);
こうすればリスト形式で渡りますよね?
sub hoge{
my %hash = (@_);
こうすればハッシュが壊れることはないでしょうか?とりあえずテストは成功しましたが、
私の知らないおかしなことが起こる瞬間があると怖いです。
0419417
05/02/15 09:56:56ID:???リファレンスにするとルーチンで作らせたハッシュは全てリファレンスになり
出力整形時に
->
が大量に出てくるので嫌なのです;
0420nobodyさん
05/02/15 10:25:40ID:???0421417
05/02/15 10:34:23ID:???そういうことなのですか?^^;
例えばルーチンが複数のハッシュリファレンスオブジェクトを返してくるとします。
その時に受け取り側でデリファレンスしながら受け取ることっでできませんか?
1個なら
my %hash = %{[&method]};
でいいですが返り血がだと、あ、
my %hash = %{[(&method)[0]]};
my %hash2 = %{[(&method)[1]]};
とすればいいのかな?
0422nobodyさん
05/02/15 10:58:14ID:???$a = $b;
$b = $c;
$aと$bを入れ替える関数ってなかったでしたっけ?
0423nobodyさん
05/02/15 11:42:03ID:???又、どちらかを意識的に呼び出すにはどうすればいいでしょうか?
0426nobodyさん
05/02/15 12:08:39ID:kdpe8a8eおー!せんきゅー、ぶらざー
0427nobodyさん
05/02/15 12:16:30ID:???my %hash = %{[shift]} ;
}
shiftにはハッシュロファレンスが入ってますが、デリファレンスできないのでしょうか?
0428nobodyさん
05/02/15 12:21:04ID:5Ng5Me3b時々コンパイルできなくなってしまうのですが
0431nobodyさん
05/02/15 13:27:42ID:???それはなぜかではない。%{[shift]}がだめなのは
shiftでとりだした値(たぶんハッシュのリファレンス)
ひとつからなる無名配列を作ってそのリファレンスを
%{}でハッシュとしてデリファレンスするという無理
なことをしているから。
[]とか%{}の意味わbゥってないんじb...
0433nobodyさん
05/02/15 14:19:09ID:???試せば直ぐにわかることだが、レキシカル変数が優先される。
グローバル変数を参照するにはパッケージ名で修飾すればいいが、
グローバル変数とレキシカル変数に同じ名前をつけるのは奨励できない。
>>428
PerlのrequireはPHPのrequire_onceに相当する。
0434nobodyさん
05/02/15 14:48:48ID:dZXRK/qgDBI::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構文の発行などはできています。
画面上もエラーがでません。
しかし何故かログにはエラーとして残るようです。
どなたかわかる方いませんか?
0435434
05/02/15 14:50:57ID:dZXRK/qg$sth->finishがなかったせいでした。
しかしmysqlには不要なはずなんですがね;
disconnectも本来不要だから使うならfinishもしっかり使えとかいう感じですかね。
とりあえずすみません解決です。
0436428
05/02/15 15:09:22ID:5Ng5Me3b有難うございました
0437nobodyさん
05/02/15 19:48:45ID:sBhWNNlk2: 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へ直接画像データを渡すことはできないのでしょうか?
0438nobodyさん
05/02/15 19:51:25ID:FRNIfDdjオフラインでperlで作成したcgiを作成した場合で、cgiにパラメータを引き継がせたい場合
どのように起動すればいいのでしょうか?
./exsampl.cgi?a=abc
0440nobodyさん
05/02/15 19:57:05ID:???--exsampl.cgi
#!/usr/local/bin/perl
print "$ARGV[0]\n";
$ ./exsampl.cgi aho?
0441T女の竹田
05/02/15 21:07:10ID:???このへんのことかな?
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"
って感じ。
0442T女の竹田
05/02/15 21:11:17ID:???0443nobodyさん
05/02/15 22:05:37ID:???0444nobodyさん
05/02/15 22:26:13ID:ilxRQfx7ある関数内で必要な引数の数が、関数内の処理によって異なる場合、次のような方法はアリですか?
&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]);
}
}
きれいに書くにはどう言う方法を取ったら良いのでしょうか。
0445nobodyさん
05/02/15 22:34:23ID:???0447nobodyさん
05/02/15 22:49:03ID:???0448nobodyさん
05/02/15 22:57:13ID:???引数が複数の時には無名配列にしてる意味はなに?
引数の数で処理を分けるなら、
scalar @_ の数を見ればいいんじゃないの?
0449447
05/02/15 23:00:54ID:???&hoge("yahoo", "損", "氏ね");
sub hoge($;@){
unless( $_[1] ){
print "オマエモナー\n";
}else{
print "@_\n";
}
}
じゃ、ダメかい?
0450T女の竹田
05/02/15 23:13:38ID:???どのくらい共通でどのくらい共通じゃないか、
もうちょっとわかりやすい例にならない?
>>444では共通の処理がないからピンと来ないよ。
0451444
05/02/15 23:43:31ID:???共通の処理の方がかなり多いです。
うーんどんな例を出せば良いんだろう
0453nobodyさん
05/02/16 00:30:45ID:???enctype="multipart/form-data"としているのですが
一緒に文章を受信しようと
cgi-lib.plのReadParseで読んだデータを表示してみると
Content-Disposition: form-data; name="comment"
となっていて、フォームに入力した文字がありません
どうすれば一緒に受信できるのでしょうか?
0454nobodyさん
05/02/16 01:29:29ID:???正直、リファレンスで参照しろよと言いたいけど
どうしてもいやなら、こんなサブルーチンを作るといい!
sub deref{
for my $hash( @{ $_[1] } ){
%{ $hash } = %{ shift @{ $_[0] } };
}
};
testサブルーチンの戻値がハッシュのリファレンスのリストだとするとこうかける。
deref( [ test() ] => [ \%y1, \%y2, \%y3 ] );
または
deref( [ test() ] => [ \( %y1, %y2, %y3 ) ] );
0455nobodyさん
05/02/16 11:54:53ID:MwHh4jT0現在のページがSSLかどうかが入ってる環境変数はないのでしょうか?
0457nobodyさん
05/02/16 14:03:39ID:???そいつを、一行ずつ比較して同じなら削るPerl、、、
すまん、本職絵描きなんで誰か教えてくれ。
0458nobodyさん
05/02/16 14:21:03ID:???この配列の要素それぞれに2を足した数字を表示させたいです。
print map{return $_ + 2}@array;
としてみましたが、何も返されてませんでした;
どうにか変数などには入れず、@arrayの元々の値も変えずにできないでしょうか?
0459nobodyさん
05/02/16 14:21:20ID:???違う行にある場合は削らないの?
同じ行毎の比較のみ?
で、削るのは2つのファイル両方から削るの?
それとも二つのファイルから重複しないアドレスリストを求めたいわけ?
もちっと詳しく
0461nobodyさん
05/02/16 14:22:58ID:???マルチポストうざい。
http://pc5.2ch.net/test/read.cgi/hp/1106947416/177n
0462nobodyさん
05/02/16 14:26:26ID:???my @array = qw/1 2 3/;
print map{$_ + 2}@array;
print "\n";
print @array;
--result
345
123
0463458
05/02/16 14:26:45ID:???0464461
05/02/16 14:35:48ID:???0465458
05/02/16 14:37:22ID:???すいません;
これって
$hoge =~ s{}{}e;
これの右ブロックの中で使うにはどうすればいいですか?
$hoge =~ s{^([^\n]*)}{$1.
(join '',map〜).
"終端"
}e;
こんな感じで一応できましたがわざわざjoinしないといけないのがちょっと;
しかし強制的にスカラー評価されるところではこの方法以外にないのでしょうか?
0466458
05/02/16 14:43:22ID:???0468nobodyさん
05/02/16 14:58:35ID:???マルチ野郎はスルーしる
0469nobodyさん
05/02/16 20:09:14ID:???a1にあるXXX.plファイルをa2にあるPPP.cgiから
参照しようとしています。
PPP.cgiの中で
require "../a1/XXX.pl";
とするのは良いのでしょうか?
Copalだとエラーが出てしまいます。
0470nobodyさん
05/02/16 20:12:47ID:???$str =~ s/${value}/hoge/g;
をやるときに、$value の値に正規表現の制御文字(^$.[]…等)が
入っていると置換時にエラーとなってしまいます。
$value 内の文字をそのまま扱いたい場合はどのようにすればよいのでしょうか?
置換前に、$value の中の制御文字を全てエスケープするのかなと思いましたが、
他に簡単な方法があればご教授下さい。
0472nobodyさん
05/02/16 21:02:41ID:???ありがとうございます。
すみません、一つ忘れてました。。
$str =~ s/%__${value}\.begin__%(.+?)%__${value}\.end__%/hoge/g;
のような用途を予定しています。
\Q〜\E 内が全てエスケープされてしまうので、
本来使いたい正規表現が無効になってしまいますね…。
やはり変数個々に対してエスケープでしょうか。
0473472
05/02/16 21:24:45ID:???$str =~ s/%__${value}\.begin__%(.+?)%__${value}\.end__%/hoge/g;
を
$str =~ s/\Q%__${value}.begin__%\E(.+?)\Q%__${value}.end__%\E/hoge/g;
にすることで解決できたようです。(ホントに大丈夫かな…)
ありがとうございました。
0474nobodyさん
05/02/16 22:15:30ID:???0476nobodyさん
05/02/17 00:24:07ID:???0477nobodyさん
05/02/17 00:58:33ID:???0479nobodyさん
05/02/17 09:24:23ID:???@array = split(/,/,$hoge);
$array[1] = "hoge2";
$hoge = join(",",@array);
カンマで区切られた$hogeの指定個所を変更したいのですが、
今は上記のように、分割→変更→結合と3行に渡って行っています。
これをもっと効率の良い方法でやる事はできますでしょうか?
0480nobodyさん
05/02/17 10:40:36ID:ICaDRbeTprint "hoge\nhoge";
とやると、
hoge\nhoge
とそのまま表示されてしまうんですが、なにか間違いがあるんでしょうか。
0484nobodyさん
05/02/17 12:29:02ID:???0485nobodyさん
05/02/17 13:43:38ID:???この処理だけ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)
0486nobodyさん
05/02/17 14:31:44ID:???ベンチマークまでありがとうです。
hoge2が計算式だったり、要素数が多かったりする事も考慮すると、
見易さの面(個々によると思いますが)でも、今まで通りでOKみたいですね。
(空想の関数/,/,$hoge)[99] = $age + $sage;
みたいな感じで$hogeをカンマで区切った場合、
要素100番目の位置にダイレクトに代入できる技が無いものかと思いまして。
0487nobodyさん
05/02/17 16:18:01ID:lgJIuLRQprint $a{a,b,c};
こういう感じでハッシュも配列みたいにいっぺんに呼べるカナと思いましたが、
エラーでした;
@a{a,b,c}や%a{a,b,c}もやりましたがダメでした。
ハッシュって
print $a{a},$a{b},$a{c};
のようにいちいち一つずつでしかできないのでしょうか?
0488nobodyさん
05/02/17 16:33:32ID:???@a{'a', 'b', 'c'}
0489nobodyさん
05/02/17 16:36:41ID:???使い道ないかもしんないけどこういうのも
0490487
05/02/17 16:43:51ID:lgJIuLRQクォートでしたか。
@a{qw/a b c/};
こんな感じですね^^
0491nobodyさん
05/02/17 16:56:59ID:???strict subsしているときは、サブルーチンとして
宣言されていない裸のワードの存在が許されるのは
「{}」の間に単独で存在するときと、「=>」の左側
だけ。
Bareword "a" not allowed while "strict subs" in use at ほげほげ
って感じのエラー出てたはずだからちゃんとよめよ...
エラーメッセージの意味わかんない人は、ラクダ本の
診断メッセージって章にアルファベット順に意味と並
べて書いてあるので調べる癖をつけましょう。
0492nobodyさん
05/02/17 18:15:10ID:???Apache 2.0.52
perl ActivePerl 5.8.6.811
クライアントの要求のヘッダを取得したいのですが出来るものでしょうか?
WEB サーバーからのヘッダは取得は出来たのですが、今やりたい内容ではないですし …
ご教授よろしくお願いします。
0494nobodyさん
05/02/18 01:51:05ID:???そうであればこんな正規表現があるけど
$hoge = "hoge1,hoge1,hoge1,\n";
$hoge =~ s/((?:[^,]*,){1})[^,]*/$1hoge2/;
これで前から2番目の「hoge1」が「hoge2」に置き換わる。
{1} の部分を
{0} とすれば先頭の「hoge1」が「hoge2」に置き換わるし
{2} とすれば前から3番目の「hoge1」が「hoge2」に置き換わる。
{3} とすれば最後のカンマの後ろに「hoge2」が追加(改行が置き換わる)されるし
4以上の数字を指定すと置換えは行われない。
カンマの数が増えれば置き換え対象の指定位置も増える。
0495nobodyさん
05/02/18 01:54:39ID:???(空想の関数/,/,$hoge)[99] = $age + $sage;
みたいにしたければ
$hoge =~ s/((?:[^,]*,){99})[^,]*/$1.($age + $sage)/e;
ってやればよい。
0496キヨ
05/02/18 04:51:35ID: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で開くと綺麗に並んで表示されます。
","で区切られていないと上記の処理は出来ませんか?
それとも、","の区切りは関係なく、別の問題なのでしょうか?
0497nobodyさん
05/02/18 05:26:56ID:qmmO8oMVモジュールに頼らずに入力されたパスフレーズをSHA1かけてファイルに保存しようと思ってます。
再配布可能でSHA1ハッシュ値を計算するサブルーチンをwebで検索したところ
ttp://www.mirrors.wiretapped.net/security/cryptography/algorithms/rc4/arcfour.pl
こちらでsha1サブルーチンがあったので、ちょっとここのサブルーチンを拝借して
$string = "ax";
print sha1($string);
という風にテストしてみたところSHA1ハッシュ値とは全然違う文字列が出力されました。
どのようにすればちゃんとしたSHA1ハッシュ値が得らるのでしょうか?
0498nobodyさん
05/02/18 05:36:15ID:???「データがカンマ区切り","されていない形式で」っていっているんだから
sort の中の split で","分割しちゃだめでしょ。
0499キヨ@496
05/02/18 06:50:20ID:wywZhzNy有り難うございます!
splitの\,を\tに変えたら作動しました!!
5〜6時間近く悩んでいたのに…。
本当にありがとう御座いました!!
0500486
05/02/18 08:42:07ID:4JcRNkuB親切な人ありがとー
一行でやるには関数では無くて、正規表現でやる事になるのですね。
勉強になりました。
0501nobodyさん
05/02/18 09:39:28ID:???SELECT * FROM TEST_TABLE;
これで全レコードのゼンフィールドを取得したとして。
@arrayの中に全レコードのhogeフィールドだけをデリファレンスして入れたい。
hogeフィールドは0番目だと仮定。
fetchall_arrayrefで返されるのが配列リファレンス。更に中に配列リファレンスなので
my @array = @{@{$sth->fetchall_arrayref}[0..$#{$sth->fetchall_arrayref}]}[0];
とかでいけるかと思いきやダメでしたorz
誰かわかる方いますか?
0502nobodyさん
05/02/18 09:48:08ID:???my $rows = $sth->fetchall_arrayref;
my @array = map { $_->[0] } @$rows;
0503501
05/02/18 10:21:48ID:???ありがとうございます。
変数作るの機雷なんで
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];
です
0504nobodyさん
05/02/18 10:39:33ID:???0505504
05/02/18 10:47:26ID:dVwgIF/Dtruncate関数がダメならそれ以外で
open FH,"+<test.txt";
flock FH,2;
この状態のファイルの中身を一旦0にすることはできますか?
ファイルを上書きモ−ドで開くのは不可能です。このファイルを開いてる間に
処理内容が重複しては困ることをしてるので。
0506504
05/02/18 11:31:10ID:dVwgIF/D0508504
05/02/18 12:14:53ID:dVwgIF/D失敬な!
http://perl.misty.ne.jp/function02/truncate.html
http://www.7key.jp/program/perl/truncate.html
0509nobodyさん
05/02/18 12:16:49ID:???require './lib/lib1.pl';
--- lib1.pl ---
require './lib/lib2.pl';
open( FILE, "< file.txt" );
というファイル/ソースの時に、
original.pl を実行すると、
どこの file.txt, lib2.pl を読むのでしょうか?
この辺の位置関係を解説してるサイトがあれば
すみませんが教えてもらえると助かります。
0510nobodyさん
05/02/18 12:24:30ID:???0512nobodyさん
05/02/18 12:44:04ID:???$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);
0514503
05/02/18 13:29:28ID:???おお!
凄いですねそれ。どうなってるんですか?
無名関数のリファレンスを作ってるみたいですが、どうして->(リスト)が
引数として渡されるんでしょう?
0515nobodyさん
05/02/18 13:54:42ID:???これの降順ってのは無理?
print @hairetu[6..0];
for(0..2)の仕組みと同じっぽいから無理だと思うけど、ここならもしかして知ってる人がいるかもと期待してきてみた。
0517nobodyさん
05/02/18 14:00:30ID:???0518nobodyさん
05/02/18 14:19:43ID:???$code = sub{ $_[0]+100, $_[1]-20, $_[2] };
@list2 = $code->(@list);
$str = sprintf '%d%d%d', @list2;
これを一行にまとめているっていうのは理解できるよね。
参照演算子 "->" は、左辺値が関数リファレンスであれば
右辺に "()" を記述して関数を間接実行できる。
同様に左辺値が配列リファレンスであれば
右辺に "[]" を記述して配列要素を間接参照できるし
左辺値がハッシュリファレンスであれば
右辺に "{}" を記述してハッシュ要素を間接参照できる。
これは左辺値の評価結果が関数リファレンスでありさえすれば
"->()" でいつでも間接実行が行えるということ。
"sub{}" は無名関数リファレンスの値を持っているわけだから
無名関数を定義したと同時に実行させただけということになる。
もちろん関数を実行させているわけだから
"()" 内に指定したリストが引数として渡る。
0520503
05/02/18 14:36:44ID:???そういうことでしたか。わかりやすい説明ありがとうございました!
@{[]}や${\()}なんかと同じ位価値のある色々使えそうなテクですね^^
0521nobodyさん
05/02/18 14:39:12ID:???長い名前だね。[6,5,4,3,2,1,0]も[reverse 0..6]も変わらないorz
とにかくレスサンクス
0522nobodyさん
05/02/18 15:01:18ID:???> @{[]}や${\()}なんかと同じ位価値
そんなのが好きならこんなのもあるよ
${\do{}}
文字列のなかにブロック処理を記述できる。
$x = 1;
$str = qq(これは!${\do{
if($x){
"真";
}else{
"偽";
}
}}です\n);
print $str;
0523nobodyさん
05/02/18 15:03:28ID:???日本語で説明シテルサイトありませんか?
0525523
05/02/18 15:16:10ID:???ここに比較はかいてありましたが、何秒かかったかのやり方はどこあないでしょうか?
0526523
05/02/18 15:33:48ID:???英語読めませんが
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か?>
0528nobodyさん
05/02/18 16:50:42ID:???>どうしてパッケージ名なしで呼べるのでしょうか?
モジュールがuseされた時にデフォルトのパッケージ関数が
呼び出し側にエクスポートされるようにモジュール側で記述されているから
呼び出し側でモジュールをuseするとパッケージ関数がインポートされて
パッケージ名を明示しなくても関数が使用できるようになる。
下のは正式なエクスポート方法ではないけど、エクスポートの真似事ができる。
実行するとtestサブルーチンが定義されてないとのエラーメッセージがでるが
コメントマークを外すとTESTパッケージのtest関数が実行できる。
package TEST;
#$main::{test} = \&test;
sub test{
print @_;
}
package main;
test(1,2,3);
0529nobodyさん
05/02/18 16:53:37ID:???package TEST;
$main::{test} = \&test ;
sub test{
print @_;
}
package main;
test(1,2,3);
0530nobodyさん
05/02/18 20:21:21ID:???http://www.harukaze.net/~mishima/perl/man/perlvar.1.html
> @INC 配列 @INC には、do EXPR、require、use によって評価す
> る Perl スクリプトを探す場所のリストが納められていま
> す。 初期状態では、コマンドラインスイッチ -I の引数
> とデフォルトの Perl ライブラリディレクトリ (おそらく
> "/usr/local/lib/perl5") とカレントディレクトリを表わ
> す "." を順につなげたものです。
0531nobodyさん
05/02/18 20:38:12ID:???こっちはカレントディレクトリ。
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.
0533nobodyさん
05/02/19 12:26:16ID:???個人的には...split /&/......こういうデフォルトで$_を引数にとる関数が好き。
何でpushはとらないんかね。shifth取るくせに。
0535nobodyさん
05/02/19 15:55:05ID:???そっか。
ところで$_,@_の中身がセットされるときと削除される時のことを
詳しく説明してるサイトをどっかで見た気がするけど忘れてしまった。
誰か知らない?日本語のサイトなんだけど。
0536nobodyさん
05/02/19 19:19:29ID:???$_ は、map,grep を使ったときに、または、foreachで$_ が参照変数になったとき暗黙のlocal対象になるよ。
foreachで$_ 意外の参照変数を明示したらlocal対象にはならないけどね。
@_ は、サブルーチン内で暗黙のlocal対象になるよ。
だから、呼出されたサブルーチン内から呼出し元の@_の値を得ることはできない。
しかし、サブルーチン内でブロックがないまま、@_ にlocalを明示すると
呼出されたサブルーチン内のlocal前の@_ の値が、呼出し側の@_ に移るよ!
0537nobodyさん
05/02/19 19:20:29ID:???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
0538nobodyさん
05/02/19 22:54:09ID:???$ENV{'LINES'}にメールの行数、$ENV{'SIZE'}にメールのバイト数が格納されているのは確認しましたが、メール本文がどこにあるかわかりません。
メール本文がどこに格納されているのかご存知の方がいましたら、教えていただけないでしょうか?
0539nobodyさん
05/02/20 08:10:37ID:???use vars を使用しますが、これでは require した外部ライブラリでも使用できてしまいます。
引数として渡した変数以外は外部ライブラリに参照させないことはできますでしょうか。
よろしくお願いします。
0540nobodyさん
05/02/20 09:05:42ID:???0541nobodyさん
05/02/20 13:26:09ID:???サブルーチン外で普通に my しとけばいいと思うけど。
0542nobodyさん
05/02/20 15:17:15ID:O52bAFUw@foo = qw(テスト Perl 適当);
$bar = $foo[int rand $#foo+1];
これより簡単になりますか?
0543nobodyさん
05/02/20 15:52:41ID:???0544nobodyさん
05/02/20 16:28:38ID:???0546nobodyさん
05/02/20 17:53:43ID:FLHTnHy4というふうに配列をソートしたいのですが、
普通にソートすると、
(http://hoge/100.jpg,http://hoge/1.jpg,http://hoge/200.jpg,http://hoge/2.jpg)
というふうになってしまいます。
よい方法はありませんか?
0548nobodyさん
05/02/20 18:24:41ID:FLHTnHy4ぐぐってみましたがよくわかりません
モジュールですか?
0549nobodyさん
05/02/20 18:26:01ID:???できないのでしょうか?
0550nobodyさん
05/02/20 18:39:48ID:???sort{
my($an) = ( $a=~/(\d+)\.jpg\z/ );
my($bn) = ( $b=~/(\d+)\.jpg\z/ );
$an <=> $bn
}@array;
とか。
0553nobodyさん
05/02/20 19:05:02ID:???0554nobodyさん
05/02/20 19:06:12ID:???@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と互換がないかも。
これで変数に入れられるから、オブジェクトでも扱える。
(クラスメンバなら、ファイルハンドルのままでも構わないのでは。)
0555549
05/02/20 19:45:08ID:???0556nobodyさん
05/02/20 20:14:16ID:O52bAFUwfor(1..100){}
などとできますが、
飛び飛びの連続値を指定する場合はどうすればいいんでしょう?
for(1.20,30..100){}
とかじゃ無理だし、なにか上手いやり方はありますか?
0557nobodyさん
05/02/20 21:01:53ID:???1と20の間に . が2個あれば行くぞ。
0558nobodyさん
05/02/20 21:04:25ID:O52bAFUwうわ、ほんとだ。
自分の場合は間に1つだけの要素を挟んだりするんですが、そのばあいは
for(1..3, 5..5, 7..9){}
こんな感じですかね。
0559nobodyさん
05/02/20 21:06:11ID:???0560nobodyさん
05/02/20 21:08:32ID:O52bAFUw0561nobodyさん
05/02/20 22:23:17ID:???if ($pid= fork){
# ここは親プロセス
}elsif (defined $pid){
# ここは子プロセス
}elsif ($! =~ /No more process/){
# A
}else {
}
上記のようなソースをたまに見かけます(らくだ本など)が、A部分には
子プロセスが作れなかったのに何がくるのでしょうか?
わたしが思うに、子プロセス生成に失敗したので結果的に親プロセス部分
しか処理されないような感じがするのですが・・・。
0563nobodyさん
05/02/20 22:51:31ID:BvAf0Y1w$hoge(perl)の数値(文字列)をそのまま hoge(flash)に。
よろしくお願いしますm(__)m
0564nobodyさん
05/02/20 23:12:34ID:BvAf0Y1w0566nobodyさん
05/02/21 01:37:00ID:???0567nobodyさん
05/02/21 02:33:04ID:ZzrL/Ht5print等で、
1. print 'あ '.(ドット)"$hoge\n";
2. print 'あ ',(カンマ)"$hoge\n";
ドットを使うのと、カンマを使うのとでの違いはありますか?
0568nobodyさん
05/02/21 04:57:26ID:???0569nobodyさん
05/02/21 10:51:03ID:???SQL文はわかってるのですが、どう受け取ればいいのか;
my $value = $sth->fetchall_arrayref;
これだと一応受け取れますが、フィールド名のハッシュになってないので扱いにくいです。
しかしハッシュ系は
my $value = $sth->fetchrow_hashref;
しか見つけられなかったのですが、無理なのでしょうか。
このやり方は1レコードだけなのですが・・・
0570nobodyさん
05/02/21 11:09:40ID:???これの文字コードをjcode.plを使って変える時って
foreach (keys %$hash) { jcode::convert(\$hash->{$_},"sjis")}
で一応できましたが、なんか変な感じ。
そもそもリファレンスさえ渡したら向こうで中身を書き換えてくれるんですよね。
なので渡す時にデリファレンスしてからリファレンスを作るのって変。
ハッシュリファレンスの中身をjcode.plに効率よく渡す方法ってあるんでしょうか?
0571nobodyさん
05/02/21 11:38:37ID:???「ハッシュ全体へのリファレンス」と「ハッシュの個々のエントリへのリファレンス」は
全く無関係な別物だから、仕方ないだろう。そういうものだ。
0572nobodyさん
05/02/21 11:43:32ID:???map内で配列に手を加えればいいけどね。
いい例なのがこれ。
map {jcode::convert(\$_,"euc")} @$arrayref
あ、これも同じデリファレンス→リファレンスだなw
0573nobodyさん
05/02/21 14:03:46ID:???my %hash = (a => "あいうえお" , b=> "かきくけこ");
foreach (keys %hash) {jcode::convert(\$hash{$_},"sjis")}
0575nobodyさん
05/02/21 14:43:19ID:???あ、いや、>>570がjcode::convertにハッシュリファレンスを渡すためにわざわざ
最初の段階でリファレンスにして無意味だなと思っているみたいだったんで
だったらハッシュをわざわざリファレンスにしなくていいんじゃないと思っただけ。
0576nobodyさん
05/02/21 14:44:54ID:???「jcode::convertにハッシュ要素のスカラーリファレンス」と読み替えてくれ。
0577nobodyさん
05/02/21 15:16:50ID:???この$valueの中身を書き換えずに_を-に変えて出力するにはどうすればいい?
print ....
まったくわからないorz
0578577
05/02/21 15:28:46ID:???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がどこにあるか分からないとか?
0579577
05/02/21 15:31:51ID:???print "\n";
my $value = qq|aiu_oiy|;
print qq|@{[sub{my $a = shift; $a =~ s/\_/\-/g; $a}->($value)]}あいうえお|;
print "<br>";
print $value;
これでできたけどなんかなぁ。
まあいいけど>>578はなんでその後が表示されないんだろ?
0580nobodyさん
05/02/21 17:41:26ID:???$in{'ngword'} =~ s/\n/\'\,\'/g;
print BS <<"EOM";
# NGワード
\@ngword= ('$in{'ngword'}');
EOM
として、
ファイルハンドルBSに
@ngword = ('馬鹿','死ね,'あほ');
と書きたいのですが、
・"鹿"と"'"の間
・"ね"と","の間
にメモ張で見ると文字化けしているような
文字("■"を小さくしたようなもの)、Perl編
集用で使っているエディタだと改行が入っ
てしまいます。
なぜなのかわかりません。。。
0581nobodyさん
05/02/21 19:51:45ID:???, は、リスト評価。 . は、文字列を結合してからスカラー評価。
, と . では、演算子の優先順位が違うので、計算式が入る場合は注意。
>>577
print join( '-', split( '_', $value ) );
とか
print "$1-$2-$3" if $value =~/([^_]+)_([^_]+)_([^_]+)/;
とか
0583nobodyさん
05/02/21 20:08:42ID:???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";
0585nobodyさん
05/02/21 20:12:54ID:???http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify
0586nobodyさん
05/02/21 20:37:31ID:???@_ は関数内で暗黙の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;$_}}あいうえお|;
0587nobodyさん
05/02/21 21:46:42ID:LbE3SevLそれをデリファレンスしながら受け取りたいんですが不可能ですか?
my (%a,%b) = map{%{$_}}&hoge;
こんなことを考えてみたけど、よく考えたら全くダメだった;
0588nobodyさん
05/02/21 21:49:32ID:???Group\Apache\htdocs\test.cgi line 353.
こんなエラー内容なんだけど、誰かわかる?
^@こんな文字列検索しても出てこないんだよね。ライン付近を見ても異常が見当たらない。
0589nobodyさん
05/02/21 21:51:30ID:???0590nobodyさん
05/02/21 21:56:01ID:Mewlqio00591587
05/02/21 22:15:40ID:LbE3SevLこれで一応できました^^
0593nobodyさん
05/02/21 23:42:47ID:???ほんとはこういう必殺技があるんだけど型グロブが理解できなければ使わないほうがいい。
(*a,*b) = hoge();
0594nobodyさん
05/02/22 11:45:02ID:???いきなり
my %a;
for (1..10){
$a{a} += 2;
}
とかやっても失敗しなかったのですが、偶然ですか?
my %a = (a => 0);
とはじめにしておいたほうが当然無難でしょうけど、なんか面倒なんですよね。
面倒でもやっておかないと失敗することはあるんでしょうか?
0595nobodyさん
05/02/22 12:06:49ID:xOztdvV5よし行く象を最後にすべきだろう
0596nobodyさん
05/02/22 12:07:19ID:???0597nobodyさん
05/02/22 13:16:01ID:???未定義値を論理評価すると偽として解釈される。
未定義値を数値評価すると0として解釈される。
未定義値を文字列評価するとヌル文字列として解釈される。
未定義値の配列やハッシュは空要素として解釈される。
配列やハッシュの存在しない要素を参照すると値は未定義値である。
my指定した変数は、明示的に初期化しなければ未定義値で初期化されることが保証されている。
これを理解していれば>>594の場合で明示的に初期化する必要はない。
0598nobodyさん
05/02/22 14:13:34ID:cioenldLmy %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などに代表されるように通常は\これで作ったリファレンスを渡すと渡し側のものを
直接いじるのと同じ行為になると思ってたのですが・・・
ハッシュの場合は違うのか、それともデリファレンスしたものだから違うのかな?
0599nobodyさん
05/02/22 15:56:51ID:???my %hash = %{$_[0]->{b}};
で新しく作った%hashにコピーされてるから、
$hash{c}++;
はコピーされた方が変わるだけ。
元のプログラム全体については何をしたいのか意図がよくわからんので、
エスパー回答者にお任せします。
0600598
05/02/22 17:37:34ID:cioenldLそういえばそうですね;
ではやはり\を使って渡すのは危ないということですね。
元のプログラムはたんなるリファレンスのテストです。
0601nobodyさん
05/02/22 17:44:16ID:???おかしなところがあったら教えてください
メイン
#!/usr/bin/perl
@port = (80,1080,3128,8000,8080,8888); # チェックするポート番号
PrinthtmlHeader(); #htmlのヘッダーと<BODY>まで出力する関数
foreach(@port){
$result=IsOpenPort($_);
print $result;
}
PrinthtmlFooter(); #htmlフッタ出力
exit;
0602nobodyさん
05/02/22 17:45:28ID:iWUZ4gT8sub 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");
}
0603601
05/02/22 17:48:44ID:???usen-219x123x129x154.ap-us.usen.ad.jp:3128
この串でアクセスしてみると
001000
と出力されれば正常なのですが
100000と出力されます
proxy.or3.marketscore.com:8000
この串でも100000と出力されます
0604nobodyさん
05/02/22 18:16:06ID:???まず結果を1と0に丸めるのをやめて、だめな時はどこで
ひっかかってるかをきちんと調べるところからはじめる
べきだな。あとシステムコール類がエラーしたときは
ちゃんと$!を表示すること。
具体的にどこでどういう状況になってるかを特定してから
出直してください。
0605nobodyさん
05/02/22 19:28:41ID:???# 呼び出し元をわざと中間変数を使って分解してみよう!
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のリファレンスは、なにも渡ってないってことね。
0606nobodyさん
05/02/22 23:11:35ID:???/\b$hoge\b/
とやると、
$hoge = a の時だと
a~no や hu~a 等を含む文も引っかかってしまい、
$hoge = trouvero~ の場合
逆にどの文も引っかかってくれなかったりしてしまいます。
\bの仕様上、仕方ないのかもしれませんが、何か巧い方法はないでしょうか?
0607nobodyさん
05/02/22 23:19:59ID:???0608nobodyさん
05/02/22 23:40:27ID:???ほい。
/^$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$/
0609nobodyさん
05/02/22 23:47:16ID:???ポルトガル語に使う文字を定義して、?<!と?!を使うとか。
my $portuguese = "[a-z~]";
print "sim" if ($str =~ /(?<!$portuguese)$hoge(?!$portuguese)/i);
0610nobodyさん
05/02/22 23:54:15ID:???でよさげ。
0611nobodyさん
05/02/23 00:48:31ID:???ありがとうございました。
なんとか形にすることができました。
初めてperlに触れてみましたが、正規表現とかややこしいですね。
精進します。
0612nobodyさん
05/02/23 10:07:36ID:???できないのでしょうか?
print map "$_[0] + $_[1] = ",
@a
@b
こういうときにやりたいのですがl
0613nobodyさん
05/02/23 10:37:22ID:???@{[sub{my $str = shift; $str =~ s/\r\n|\r|\n/<br>/g; $str }->($form{test})]}
|;
こういうことがしたいのですがエラーになりました。
原因は|です。qq[]などでやれば問題ないのですが、そうはしたくありません。
大元を変えると他にも影響がでそうなので;
qq||のなかの正規表現でor演算子的に|を使うにはどうすればいいでしょうか?
0614nobodyさん
05/02/23 10:39:45ID:???二つでいいならハッシュにしたり。
それ以上の複数なら
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(なんたらかんたら;略;略){ #使用の詳細が不明なので略
略;
}
}
みたいなイメージで。
0615nobodyさん
05/02/23 10:44:07ID:???>>613
>大元を変えると他にも影響がでそうなので;
いみふ(ry
perlは処理の優先的にまず、区切り文字を探します。
0617nobodyさん
05/02/23 13:04:52ID:???$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が返されたのかを知るすべはありますか?
0618nobodyさん
05/02/23 13:49:08ID:???ほれ!
print qq|
@{[sub{my $str = shift; eval qq[\$str =~ s/\\r\\n\|\\r\|\\n/<br>/g]; $str }->($form{test})]}
|;
0619nobodyさん
05/02/23 13:53:36ID:???ほれ!
@hoge = sub{map{$_[0]->(map{shift@$_}@_[1..$#_])}0..$#{(sort{@$b<=>@$a}@_[1..$#_])[0]}}->( sub{$_[0]+$_[1]+$_[2]}, [@x], [@y], [@z] );
0622nobodyさん
05/02/23 14:01:11ID:???よくつかう処理はサブルーチンを用意すること。
変数展開の技巧や無名サブルーチンやリスト関数の技巧などは、理解できない内は使わない。
素直に書いた方が簡単な場合もある。
ただ、知ってて使う分には止めない。
0624nobodyさん
05/02/23 14:56:16ID:???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'];
0625617
05/02/23 15:04:23ID:???excuteの返りを変数に代入して、その帰りが0ならって感じでした。
0626nobodyさん
05/02/23 15:58:49ID:???マジレスするとこうやね。
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})]}
|;
もちろん読みにくいから終端文字を変えるなり、ヒアドキュメントを使うなりするのがいい。
0627nobodyさん
05/02/23 16:00:36ID:???何とかしてメール送りたいんですが・・・
0628nobodyさん
05/02/23 16:09:38ID:???Perl なら Net::SMTP モジュールを入れることで sendmail が無くてもメール送れる。
モジュールが使えない場合でも、
自分で SMTP 喋るようなスクリプトを Socket 使って書けば、メール送れる。
ただしサーバの出のポートが閉じてる場合は何やっても無駄だがな。
0630nobodyさん
05/02/23 18:32:31ID:8RQQ1GXEその辺りの知識が足りません。
それで、とりあえず誰かが作ったエスケープが既にしっかりできてるCGIを見て
勉強しようと思います。
ちゃんとエスケープができてるものって探しようもないので、そこらへんを理解してる方で、
これなら勉強にもってこいってcgIを教えてくださいm(_ _)m
0631nobodyさん
05/02/23 18:39:39ID:???http://www.google.co.jp/search?hl=ja&inlang=ja&q=perl+%E3%82%A8%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%97&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=
0633未承諾広告※ ◆TWARamEjuA
05/02/23 20:27:19ID:???eval {
my @ret_value;
:
:
return @ret_value;
};
こういう書き方はよくするけれども、、、
0634nobodyさん
05/02/23 21:10:15ID:???これなんですけど、&をつける場合とつけない場合の
違いが分かりません。でも、結局&をつけた場合とつけない場合
をprintで調べたら同じ値なのにどうして、&をつけるタイプの人と
つけないタイプの人がいるのか分かりません。
何か&に特別な意味はあるんでしょうか?
0635nobodyさん
05/02/23 21:29:59ID:???print map{ "$a[$_]+$b[$_]=" } (0..$#a);
>>634
内部的に
sub AF_INET(){ 2 };
こんな感じで定義されていると思ってちゃぶ台。
だから、
print AF_INET();
print &AF_INET;
でもOK。
0636nobodyさん
05/02/23 22:02:14ID:???どうも、返答ありがとうございました。
AF_INETって定数じゃなくてサブルーチンだったんですか。
なるほど。よく分かりました。
0637630
05/02/24 10:32:12ID:Q/hMlpe6???
どういう意味ですか?
私はHTMLレベルのエスケープなんて聞いてませんよ。
それともフォームメールに必要なエスケープがHTMLレベルだとでも思ってるのでしょうか。
0638nobodyさん
05/02/24 10:59:43ID:???や特殊な書式で書いてました。
しかしそれだと私しか理解できず、他人に使わせるのにいちいち書式のマニュアルを作成しないと
いけませんので、こんど全てをメジャーなものに変えようと思います。
一番いいのはexcelのcsv形式かなと思うのですが、どうですか?
ほとんどexcelを触ったことないので、いわゆるHTMLのthにあたるものができるのか
わからないのでまだ微妙ですが。
アドバイスお願いします。
0640nobodyさん
05/02/24 11:04:06ID:???Tomcat の設定ファイルみたいな感じで
0641nobodyさん
05/02/24 11:05:15ID:???「スレ違いだから自分でググって調べなさい」という皮肉だね、たぶん。
Perlのコーディングに直接にはなんの関係もない話をレスしないでねって暗に言っていると察っするが吉。
0642630
05/02/24 11:40:08ID:Q/hMlpe6さすがにここまで見当違いなレスをされるとあきれるね。
>>639
用がないならレスはしないでいいよ。暇だからって八つ当たりはやめとけ。
>>641
そうなんですかね。多分>>631は問題が何か理解できなかっただけでしょ。
HTMLレベルで考えてるとしか思えないね。
0643638
05/02/24 11:43:40ID:???何故かShift_JISのファイルをそのままパースできてるみたいですが、
これってEUCでもいいんですよね?
一応csvファイル事態はShift_JISですが、読み込んだときにEUCに変換して扱いたいんです。
パースして$csv->fieldsでとる前に変換はしておいたほうが回数も少なくて済みますし。
書き込み時には又、Shift_JISにしますけど。
0644631
05/02/24 11:45:55ID:???\ __ /
_ (m) _ピコーン
|ミ|
('A`) 体技:スルー!
ノヽノヽ
くく
0645638
05/02/24 11:50:40ID:???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>を直接書き換えているみたいで怖いんですが;
0647nobodyさん
05/02/24 12:29:11ID:???正直「エスケープ」というのがいまいちよくわからない。
open(PIPE," | sendmail $address") するときに $address の中に shell のメタ文字が
という対 shell サニタイズの話なのか?
俺がメールフォーム作るなら、そういう問題を考えなくて良いように Net::SMTP を使う。
もちろん、宛先アドレスが valid かどうかというのは検証するし、
Subject とかのマルチバイト文字は MIME エンコードするけど、
それって「エスケープ」の話じゃないよな。
0648nobodyさん
05/02/24 12:33:23ID:???関東と北陸、近畿に春一番
...2005/02/22(火) 21:07 [Windows] 無題
あいうえお
かきくけこ
...2005/02/21(月) 23:15 [Perl] 勉強
ああああ
ええええ
上のようなテキストから、
指定した文字列が含まれる(行頭が...の)タイトル行と、
その本文(内容)を抽出して出力するスクリプトを作りました。
動作しているのですが、
このようなwhile (<>) {の中にさらにwhile (<>) のある使い方が
書籍などを見ても見つからず分からないのですが、誤った使い方ですか?
もし間違いなら、どのような処理にすれば良いのか教えて下さい。
0649648
05/02/24 12:33:59ID:LxzKNGW5while(<>){
if(/^\.\.\..*\[$sample\]/){ # もし行頭に...がある場合
$title=$_;
print "$title"; # タイトル行の出力
while(<>){
if(!/^\..*/){ # もし行頭に.が無い場合
$body=$_;
print "$body"; # 本文の出力
}
if(/^\..*/){ # もし行頭に.がある場合
last;
}
}
}
}
0650630
05/02/24 13:15:43ID:Q/hMlpe6open 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系の話ですか?と聞いてから
返事がないのでよくわかりません。
0651630
05/02/24 13:18:55ID:Q/hMlpe6CGIでエスケープすべき文字についてお尋ねします。
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に特化した話
0652nobodyさん
05/02/24 13:19:33ID:???タイトルに$sampleを含むデータが連続してると、偶数番目のデータが表示されない。
二重ループでもできるが、単ループでフラグ使った方が簡単かと。
my $target;
while (<>) {
/^\.{3}/ and $target = /\Q[$sample]/; # 行頭が...なら対象データか判断
print if $target; # 対象データなら出力
}
0653649
05/02/24 13:58:07ID:???レスありがとうございます。
仰るとおり連続してると偶数番目が表示されませんね。
気が付きませんでした。
フラグを使うとここまで短くなるとは。。。
もっと勉強してきます。
ありがとうございました。
0654638
05/02/24 14:12:15ID:???しかし今後を考えて外部のライブラリファイルにまとめたいと思います。
そこで一つ問題点。
UNIX環境でCGIを動かすと、ライブラリ内でcsvファイルパスを相対パスで設定しても
カレントディレクトからの相対パスになってしまいますよね。
これでは色々なファイルから読めません。
環境が違えばこの前提も変わるかもしれません。
なので読み込む側から読み込むファイルへのパスを引数として持たせようかと考えました。
しかしよく考えると、それっておかしいですよね;
ライブラリがどのファイルを読むかを呼び出し側で設定しないといけないと、
なんかオブジェクト志向チックではないというか;
まあモジュールにしなければいいみたいな勢いですが。
ああ。よくわからん、もういいや。
0655nobodyさん
05/02/24 15:34:07ID:???モジュールの中でファイルを絶対パスで指定しておき、デフォルトではそれを使う
デフォルト以外のパスを使う場合は、呼び出し側からコンストラクタの引数で指定する
というのがよくあるやりかただと思う
0656nobodyさん
05/02/24 17:33:07ID:???この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];
ブサイクですがこういう方法しかないのでしょうか?
0657nobodyさん
05/02/24 17:44:00ID:???$hash{'hoge'}->{$_[0]} = [ @_[1 .. @#_], ];
0658656
05/02/24 17:52:16ID:???$hash{hoge}->{$_[0]} = $_[1];
$hash{hage}->{$_[0]} = $_[2];
これを一行で済ませたいんです。本当はhogeは10種類くらいあるのです。
なのでいちいち10行も使うと汚くなるので・・・
0659nobodyさん
05/02/24 18:11:55ID:???my $k = shift;
foreach (qw(hoge hage)) {
$hash{$_}->{$k} = shift;
}
でいちおうできると思うが、なんとなくデータ構造
見直したほうがいいんじゃないかという気もする。
0661nobodyさん
05/02/24 18:43:18ID:???my $k = shift;
$hash{$_}->{$k} = shift foreach (qw(hoge hage));
0662nobodyさん
05/02/24 18:47:04ID:???sub{
$hash{$_}->{$_[0]} = splice(@_,1,1) for qw/hoge hage/
}->(qw/a 1 2/);
でも、
>いちいち10行も使うと汚くなるので・・・
何ヶ所かで使うんだったら、659を関数化して使った方がいいと思うぞ。
0663656
05/02/24 20:13:43ID:???やはり
@hash{qw/hoge hage/}->{$_[0]} = @_[1,2];
こういうのは無理なんですね。
色々あげてもらって悪いのですが、ぱっと見の読みやすさで
$hash{hoge}->{$_[0]} = $_[1];
$hash{hage}->{$_[0]} = $_[2];
こうしておきます。
これをするのは外部サブルーチンにすることで良しとしておきます。
すみませんですm(_ _)m
0664nobodyさん
05/02/24 22:09:00ID:???@{[
map {"$i : $_<br>"} @array
]}
|;
こういう出力中にやるmapの中で$iに何回目のループかを持たせるにはどうすればいい?
my $i;
まずこれができないんだよね。
さらにmap {"$i : $_<br>"; $i++} @array
とすると$i++の渡されちゃう。なんか方法ないかな?
0665未承諾広告※ ◆TWARamEjuA
05/02/24 22:29:23ID:???とか。
0668nobodyさん
05/02/24 22:59:23ID:???@{[
map( "$_ : $array[$_]<br>", 0..$#array )
]}
};
じゃ、ダメなん?
0669nobodyさん
05/02/24 23:08:22ID:???2、無知なので何もできず。。。
3、頭のエラーがでてできなかったw
0671nobodyさん
05/02/24 23:49:43ID:???まずは頭のエラーを治してきて。
それはどうしようもねーや。
0672nobodyさん
05/02/25 00:04:58ID:???&routin({%hash});
こうすると%hash自体は安全に見えるけど、もしもこの中身が
my %hash = (a=>1 , b=>[qw/1 2 3 4 5 6/] , c=>\("あいうえお"));
こんなのだったらbとcは渡された先でいじられた時にメイン側の$hash{b}にも
影響出るよね。
0675nobodyさん
05/02/25 00:22:39ID:???リファレンスの中身を再帰的に嘗めてってツリー全体を複製する手もあるのかもしれんが
ファイルハンドラやソケットを持ってると原理的にお手上げだし
0676nobodyさん
05/02/25 00:25:59ID:???0677nobodyさん
05/02/25 01:05:47ID:???$value =~ s/\r\n|\r/\n/g;
としたのですが、これでは間違いようで馬鹿にされました。
$value =~ s/\x0A\x0D|\x0A/\0D/g;
JISの改行コードというサイトをみたらこれで合ってると思うのですが、大丈夫ですか?
それと改行コードはどうして\nでマッチを期待してはいけないのでしょうか?
0678672
05/02/25 01:08:15ID:???おぅ、みんなそこらへんは適当にごまかしてるわけね^^;
まぁしょうがないかな。壊されては困るものは面倒でも一旦完全に紐解くよ。
ソケット云々はまだ知らないのでそこらへんはまたいずれ悩むかなw
0681nobodyさん
05/02/25 02:41:38ID:SjmmN0vWprint "ほげほげ";
と、一度printしたものを出力させたくないのですが、
出力バッファの削除というのはどのようにすればいいのですか?
0682nobodyさん
05/02/25 02:53:34ID:???> 出力バッファの削除というのはどのようにすればいいのですか?
無理。
> 一度printしたものを出力させたくないのですが、
一度だけ出力するように設計する。
変数を使って、出力したかどうかを記憶させるなど。
0684nobodyさん
05/02/25 04:04:19ID:???readonlyなんとかとかいうモジュールで一時的に書き換え禁止にする。
$a = { b => { c = 1} }; $a->{b}{c} = 0とかもエラー吐いてくれる。
遅くなるけど
0686nobodyさん
05/02/25 14:22:51ID:???今まではexpiresも自分でルーチン作ってやってましたが、ちょっと使ってみようかと思って。
そこで気付いたのですが、CGI::Cookieを使ってやると
new CGI::Cookie (-value => "文字列")
-valueの中の文字列は
$value =~ s/(\W)/'%' . unpack "H2",$1/eg;
これとかでエスケープを自動的にしてしまうのでしょうか?
アスタリスクが%2Aに変換されて困りました。
あンエスケープすれば言いといわれればそれまででsが。
0688647
05/02/25 15:17:01ID:???いやだから sendmail じゃなく Net::SMTP でなら作れるってば
sendmail の -t オプションの詳細仕様ってよく知らないのだが、
ちょっと考えただけでも以下のような疑問が浮かんでくる。
1. RFC822で許されている範疇の特殊文字でセキュリティ的な問題が生じるのか?
2. 生じるとしてそれをエスケープで回避できるのものなのか?
3. 回避できるとして、そのときに使うエスケープの方法は?
バックスラッシュをつける? URLエンコード? MIMEエンコード?
で、3まで考えると、エスケープするということ自体がかなり馬鹿馬鹿しいように
思えてきて仕方が無いんだが。
0691nobodyさん
05/02/25 15:36:42ID:???それがある回数以上でるようならそれ以後のその文字列部分は削除する正規表現
を書きたいです。
スイッチを持たせるのが一番?
my $swith = 0;
$value =~ s{(あいうえお)}{1}g;
あぁスイッチの保有方法忘れてるおrz
0692nobodyさん
05/02/25 15:42:53ID:???my $p = 'gaga';
my $count = 0;
$s =~ s/(\Q$p\E)/++$count>=3?'':$1/ge;
0695nobodyさん
05/02/25 17:16:26ID:???>>743 Toにクエリを埋め込む時もメールのヘッダーが終わった後の本文でも 同じエスケープではないですよね?
とりあえず現状ではToの方は\だけエスケープしてます。 本文のほうは何もしてないままです。
UNIXのコマンド文になるようなのを気をつけなければならないのでしょうか?
745 :nobodyさん :05/02/10 22:07:44 ID:???
>>744
もしお前が釣りなら、俺を感動させたことを誇っていい。お前には才能がある。
もし本気でメール出すCGIを作るつもりなら、かなり道は険しいぞ。
こいつに聞くのが一番いいんじゃないか?
まあ俺はsendmailでエスケープ云々なんて今まで聞いたことがない。
っていうかそういうサイトを一度も見たことがない。
単純にだまされてるだけだろ。
0696nobodyさん
05/02/25 19:16:12ID:???Windows/DOSは\x0d\x0a
\x0a\x0dなんて環境は知らないなぁ。
ttp://www5.airnet.ne.jp/thepond/html/job/return.htm
ちょいとグーグルで見つけたサイトだけど、読んでおくといいよ。
0697nobodyさん
05/02/25 20:16:25ID:???value()を呼び出せばいいのでは?
ちょっと強引ですが
my %cookie = CGI::Cookie->fetch();
foreach(values %cookie){
$_ = $_->value();
}
とか
# CGI.pmから使うと、上の処理も不要になったりします。
# って、何か外してそうですね。
0698nobodyさん
05/02/25 20:45:31ID:HRqs4JtA> sendmailやSocket関数およびSocketモジュールはセキュリティ上、使用できません。
と書かれているのですが、ネットワーク関連はあきらめるしかないですか?
0699nobodyさん
05/02/25 20:55:25ID:???↑上のようにカテゴリを設定しています。このカテゴリは並べ替えや変更、増減が頻繁にあります。
album.cgiでは上のカテゴリ別ページに飛ぶリンクを一覧表示させています。
そのリンク先であるカテゴリ別ページは?category=houseという形になっています。
カテゴリ別ページに、前後へのリンクを付けたいのです。
houseを開いた時はcarとyour、skyを開いた時はyourとflowerというように。
後ろが無い場合に一番前に帰ることは出来なくても構いません。
現在はカテゴリを変更する度にいちいち書き換えているのですが…。
自動的にリンク出来れば嬉しいのです。よろしければヒント等戴けませんか?
0700nobodyさん
05/02/25 21:12:20ID:???Perl コーディングとは関係無いレベルで無理だろう
>>699
カテゴリ別ページで「自分が何番目のカテゴリとして呼ばれたか」を調べて
配列的に+1とか-1とかしてリンクを生成すれば良いのでは
0701nobodyさん
05/02/25 21:12:56ID:???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/
0703nobodyさん
05/02/25 21:57:54ID:???>701
スレ違いだったのですね、すみませんでした。
スレ違いだったのにヒント下さってありがとうございます。
おかげさまで思い付いたことがありますので、スマートな処理ではないのだと思いますが、試してみます。
それでも駄目でしたら誘導して戴けたスレッドの方で質問してみますね。
スレ汚しすみませんでした。ありがとうございました。
0704nobodyさん
05/02/26 06:43:27ID:???完全にリンクをつなげるには、現在位置$posから
my $prev = ($pos-1)%@category;
my $next = ($pos+1)%@category;
というように剰余を使うと簡単にできますよ。
0705nobodyさん
05/02/26 13:28:48ID:???$valueの中は常にこのフォーマットにしておきたいので、
$valueの中身が違うフォーマットだったら中身を削除するというスクリプトを書きたい。
フォーマットが異常かどうかの条件式を日本語でいうと。
1.区切りは&
2.サブ区切りは=
3.キーや値は[a-zA-Z\-]のみ許容
これをPerlで書くとどうなりますか?
$value =~ /^[a-zA-Z]*=[a-zA-Z](?:&[a-zA-Z]*=[a-zA-Z])*$/;
これでどうでしょう。穴があったら教えて下さい。それともっといい方法があるならお願いします。
0706705
05/02/26 13:36:10ID:???$value =~ /^[a-zA-Z]*=[a-zA-Z](?:&[a-zA-Z]*=[a-zA-Z])*$/;
これが
$value =~ /^[a-z]*=[a-z](?:&[a-z]*=[a-z])*$/i;
こうできるのかな?
そんなわけない???
0707nobodyさん
05/02/26 14:08:08ID:???%formの中から値が数字で1以上でないものは削除したいんです。
%form = map { $form{$_} > 0 ? ($_,$form{$key}):() } keys %form;
これで文字列ははじけますか?
0708nobodyさん
05/02/26 14:23:47ID:???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を作らずにリストの?個以降には特別な処理をするということはできませんか?
0709nobodyさん
05/02/26 15:08:00ID:???ソレダメ。
文字列も数値で10とか出せる。
例)
qq{10あいうえお}
だから面倒でも
$form{$_} =~ /^[\d]*$/ and $form{$_} > 0
とかするべきだね。
0710nobodyさん
05/02/26 15:32:07ID:???0711nobodyさん
05/02/26 16:05:09ID:???やろうと思えば
delete @hash{sub{@_[2..$#_]}->(grep /\-/, keys %hash)};
とかできるけど、見やすいかどうかは知らん。
0713nobodyさん
05/02/26 16:42:07ID:G5yzeqwRとあるソフトではExcelの形式と違って改行はCRLFのみ、各項目は全てダブルクォートで
括ってないといけません。
どうすればいいでしょうか?改行問題は別にいいですが、どんな時も項目をダブルクォートの中に
入れるのはわかりません。宜しくお願いします。
0715nobodyさん
05/02/26 17:20:53ID:???0716nobodyさん
05/02/26 20:04:03ID:???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」の場合、最後の「プレゼント」で表示されます。。
この部分だけでなにか悪いところがあるのでしょうか?
0717nobodyさん
05/02/26 20:07:48ID:???実力にもよるけど全体的な見なおしを。
それをそのまま使うなら、
文字列を比べる時は「eq」を使ってぬ。
0718nobodyさん
05/02/26 20:20:13ID:???「非売品」になるならわかるが「プレゼント」になるのは
かなり不思議だ...
0719nobodyさん
05/02/26 21:09:36ID:???条件の\-は、どこへ? 値は数字では?
> my $value = 'a=1&b=2&c=0';
を見る限りの勝手な解釈では
/(?:(?:^|\&)[a-zA-Z\-]\=\d)+$/;
ちなみに[a-zA-Z\-]に数字と '_' も含むなら \w が使える [a-zA-Z0-9_\-]→[\w\-]
0720nobodyさん
05/02/26 21:42:50ID:???どなたかご教授して頂けると嬉しいです(_ _)
自分で探したのですが、ファイルハンドルにしか出力する例しかみつからなくて。。
0722nobodyさん
05/02/27 02:37:46ID:G/Og0QBFクッキーの内容がブラウザに表示されてしまいました。
以下のプログラムは間違っているのでしょうか?
$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";
0724nobodyさん
05/02/27 03:03:25ID:bNUaI+sLあなたはきっとこうやってるのでしょう。
print "Content-type: text/html\n\n";
うにゃうにゃ
うにゃうにゃ
うにゃうにゃ
722のロジック
違うかい?
0725nobodyさん
05/02/27 03:11:14ID:???http://pc5.2ch.net/test/read.cgi/tech/1105953092/623
0727nobodyさん
05/02/27 12:50:54ID:Ff0cBb5omod_perlからPerl::RunにてPerlスクリプトを動かそうとしているのですが
ライブラリの参照先がApacheにおける標準のもの(?/apache/lib/perlとか)になってしまいます。
相対アドレスで任意に指定してやりたいのですが、可能でしょうか。
可能ならどうすればよいのでしょう?
0728nobodyさん
05/02/27 13:41:22ID:???0732nobodyさん
05/02/28 11:38:59ID:???<a href="$url">$host</a>にすべて置換する
ただし$hostに'.jp'があれば$hostの部分は'日本'とする
ってのを作りたいのですが、
"ただし"以降がうまくできません。
どう書いたらよいでしょうか?
0733nobodyさん
05/02/28 11:41:22ID:???0734nobodyさん
05/02/28 11:45:17ID:???<a href="http://google.co.jp/">日本</a>
ってなかんじです。
0735nobodyさん
05/02/28 12:01:41ID:???0736nobodyさん
05/02/28 12:14:24ID:???$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の部分って意味です。
0737nobodyさん
05/02/28 13:08:20ID:???$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;
0738nobodyさん
05/02/28 13:57:59ID:???そのあとに"日本"化すればよいんでは?
「urlっぽいのを見つけたら」なんて軽く書いてあるけど、結構面倒だよ。
<a>タグ化する正規表現だけでも。?、&、#、%とか含まれてたりするからね。
0739nobodyさん
05/02/28 16:02:53ID:???$text=~s((http://(?:[:@\w.-]+?(\.jp)(?::\d{1,5})?|[:@\w.-]+)[\w./~?=&;#+-]*))("<a href=$1>".($2?'日本':$1).'</a>')eig;
0740nobodyさん
05/02/28 16:32:26ID:???一個の正規表現でやろうとしないほうが良いんじゃね
0741nobodyさん
05/02/28 18:25:42ID:???print "hoge";
my $value ="hage";
ダブルクォートってみなさん何を使ってますか?
私は今までqq||;っていうのが多かったですが、qq||これは入れ子できませんよね。
qq[]やqq{}ならどうやら入れ子がいくらでも可能だということに今日気付きました。
print qq[@{[ map qq[$_],qw/a b c/ ]}];
こういうことがqq[],qq{}ならできるんですね。
結構このスレを覗いてるとqq||っていう人が多いようです。
どうしてなのでしょうか?qq[]これで入れ子を作るのは偶然大丈夫なだけとか???
0742nobodyさん
05/02/28 19:53:04ID:???0743nobodyさん
05/02/28 19:57:05ID:???俺の場合は2ch掲示板スクリプトとかSJISで書いてるからSJISの全角文字に含まれないのを使ってる。
print qq()が多いかなぁ。その中にカッコつかいたかったらエスケープしないでprint qq!!にしてるよ。
まあ、なんでもいいんだけど。
0744nobodyさん
05/02/28 19:57:46ID:???$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({)なので使えなかったりします。
0746nobodyさん
05/02/28 21:23:11ID:???SJISは2バイト目が、'[', ']' もあるから、そういう意味ではベストじゃないよ。
>>744の4つの中でSJISで使われないのは '(', ')' と '<', '>' だけだから。
0748741
05/02/28 22:40:39ID:???!?
でも()や<>はきついんですよね。
print qq<<html>>;
こういう感じになってHTMLの閉じ忘れがそのままPerlのエラーになりますよね。
prnt qq(${\(100*200)});
こっちは何でも大丈夫になるんですよね。
>>743さんの
>print qq()が多いかなぁ。その中にカッコつかいたかったらエスケープしないでprint qq!!にしてるよ。
という一言がもの凄く気になるんですが、ネストokですし・・・何をさしてるのでしょうか?
もしかして(これの片方だけをテキストとして埋め込む時などの事を言ってるのかな。
それだったらqq{}qq[]qq<>共通の問題ですよね。
qq{},qq[]これの問題点は基本的にSJISでコーディングするときだけで、EUCで普通に組む時は
変数内にSJIS文字が格納されていても問題ないから大丈夫なんですよね?
0749nobodyさん
05/02/28 23:51:38ID:???print qq[[];
これは括弧が合ってないからエラーになる。
そしてShift_JISで
print qq[コンピューター];
と書くと同じエラーになる。
原因は'ー'の2バイト目が\x5b([)だから。
…という話です。
同様に
print qq|酢|;
もアウトです。
use encoding "shiftjis";で回避はできますが、
(),<>,!や"といった\x20-\x3fの範囲の記号は
漢字コードとして使われないので、この問題は起きません。
またリテラルでなければ、問題ありません。
EUC-JPでは全く問題ありません。
0750nobodyさん
05/03/01 00:42:29ID:???open FH,">test.text" || &error("ダメだこりゃ");
こうやったんだけど何故かエラー処理が機能しない。
open (FH,">test.text") || &error("ダメだこりゃ");
こうやったら機能した。何でこんな不都合な優先順位なんだろうか・・・
関数をいちいち括弧で括るのは面倒だし、汚い。
my $dbh = DBI->connect() || &error("まずいよそれ");
これの場合は完全に機能しない。コネクトに失敗しても&errorが呼ばれない。
何とか呼ばれるようにしたいけど、この場合は無理なの?
0751nobodyさん
05/03/01 00:46:44ID:???0752nobodyさん
05/03/01 00:49:31ID:???eval でトラップ汁
0754nobodyさん
05/03/01 01:01:36ID:???>>>749
>優先順位なんだろうか・・・
だよ
>関数をいちいち括弧で括るのは面倒だし、汚い。
or だよ
>この場合は無理なの?
俺に聞いてるの?
0755nobodyさん
05/03/01 02:10:40ID:???0756nobodyさん
05/03/01 03:14:15ID:???0757nobodyさん
05/03/01 03:42:42ID:???split '*',$value;
こうするとエラーになります。理由は*が正規表現のメタ文字だからです。
しかしシングルクォートなのに展開されるのはこまります。
split '\*',$value;
split /\*/,$value;
こういうことはしたくありません。何とかできませんか?
0760nobodyさん
05/03/01 04:47:02ID:???長いんですが・・・・
エスケープしたくないのは一文字分うっとおしいからです。
quotemetaだともっと長くなってしまいますよねorz
でもこんな夜中に親切にありがとうござまいしたm(_ _)m
0761nobodyさん
05/03/01 05:34:57ID:???自分専用のライブラリでも作ったら?
sub sp($$){
my $reg_str = shift;
my $in_str = shift;
split quotemeta $reg_str, $in_str;
}
とか作っておけばそれ以後は
sp '*', $value;
とかできるじゃん。
0764nobodyさん
05/03/01 12:18:28ID:VBiT7+i4その時にPOSTメソッドでfoo=barなどの情報も送りたいと思っています。
ヘッダー情報はどのように出力させたらよいでしょうか?
0765nobodyさん
05/03/01 12:20:59ID:???POSTじゃ無理だから普通はGETでURLに埋め込む
どうしてもPOSTにこだわるなら.htaccessでmod_rewrite使う
0766nobodyさん
05/03/01 12:38:51ID:VBiT7+i4THX!
無理なんですか。
ありがとうございました。
0767nobodyさん
05/03/01 13:37:54ID:???これを条件文にして真なら
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はダサイので嫌いです。
?演算子でいきなりやれますか?
0768nobodyさん
05/03/01 13:39:45ID:???そうではなくて"| /usr/sbin/sendmail -t"これと">mailtest.txt";これの
どちらかを変数に入るようにして
open MAIL,$type;
などとしても動作するのですか?
0769nobodyさん
05/03/01 13:48:56ID:???ダサいとか思ってるのはお前だけだから
あと日本語の勉強頼む
0770767
05/03/01 14:08:26ID:???どういう意味でしょうか?
ダサイと思ってるのが自分だけだとしてそれが一体何の関係があるのですか?
右倣えしてれば満足できちゃう方ですか?
0771nobodyさん
05/03/01 15:09:18ID:???open MAIL, defined $ENV{'REMOTE_ADDR'} && $ENV{'REMOTE_ADDR'} ne '127.0.0.1'
? "| /usr/sbin/sendmail -t" : ">mailtest.txt";
ということ?
0772nobodyさん
05/03/01 16:02:49ID:???0773nobodyさん
05/03/01 16:26:39ID:???いちいち言わせないでね。
0774767
05/03/01 16:55:23ID:???もういいです。もっと綺麗に済ませました。ごめんなさい。
>>772
画面の前で一人で笑うんだね君は。
>>773
基本的に今回は私が八つ当たりをしただけなのでごめんなさい。
0775nobodyさん
05/03/01 16:57:23ID:???0776nobodyさん
05/03/01 17:01:59ID:???print <<"EOM";
そのとき
妹は
EOM
}
だとインデント無視しなければいけないのでいつも
if(1){
print "そのとき\n";
print "妹は\n";
}
と記述していますがこれだと面倒+速度遅くなってしまいます。
美しくかつ簡単で記述する方法はないでしょうか?
0779nobodyさん
05/03/01 18:08:05ID:AybE+O5Lprint分は全て以下のような形式で書いています。
print $handle qq("テスト");
これで、$handle="FH";とするか$handle="STDOUT";とするかでファイルに落としたり
画面にそのまま出力したり振り分けているのですが、
同一処理を画面に出しながらファイルに保存するにはどうしたらいいのでしょうか?
0780nobodyさん
05/03/01 18:16:06ID:???普通は出力なんて1回。だから出力内容をファイルにも入れたいなら
print $source;
open FH,">test.txt";
flock FH,2;
print FH $source;
close FH;
でおわる。
まずは出力はルーチンに投げておしまいというわかりやすいプログラミングを心がけてはいかが?
0782nobodyさん
05/03/01 18:22:57ID:???0783nobodyさん
05/03/01 18:28:20ID:???IO::Tee - Multiplex output to multiple output handles
http://search.cpan.org/~kenshan/IO-Tee-0.64/
0784nobodyさん
05/03/01 18:38:52ID:???Perlクックブックにレシピ1.11「ヒアドキュメントをインデントする」てのがある。
オレのもってるのは一つ前の版だが最新版でもどっかにあるだろう。
要約すると、「インデントつけといて自分で削れ」ってことみたいだな。
単に行頭の空白を全部削るやつとか、行頭の共通文字列を削る奴とか
いくつかの例がある。
0785nobodyさん
05/03/01 19:35:54ID:???つまりこういうことやね!
if(1){
print do{(local$_=<<" EOM")=~s/^ //mg;$_};
そのとき
妹は
EOM
}
0786743
05/03/01 19:47:30ID:???SJIS使ってて全角文字だったら文字の相性によってエラーが起きるの。
カッコつかうなら ( ) と < > 以外はこの問題が発生する可能性がある。
< > はタグで使うことが多くて見にくくなるから、普段は ( ) を使うんだけど、
その中にカッコを使いたいなら \) とかやらないで、 print qq!)! ってやってる、って意味。
! もこんな問題はおきません。
0787nobodyさん
05/03/01 20:11:50ID:???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";
}
0788nobodyさん
05/03/01 20:29:30ID:3fkZkmcbif(1){
print &fix;
}
sub fix {
return <<"EOF";
そのとき
妹は
EOM
}
0789nobodyさん
05/03/01 20:35:33ID:p/vg3iSUその時
私は
);
print join("\n", @messages);
空白があるとダメだけど。
0790nobodyさん
05/03/01 21:37:00ID:???#思いきってこんなんどう?
(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が嫌いだったら推めないけど
0791nobodyさん
05/03/02 11:01:25ID:???美しくもないしかなりの力技で処理的にも問題ありだと思うけど、
とにかくインデントしてソースの見た目をどうにかしたいってなら
if (1) {
$string = <<" EOF";
その時
妹は
EOF
$string =~ s/\t//g;
print $string;
}
↑インデントはTABでやってる場合ね
書き込みにTAB使えないから上のはスペースでインデントしてるけど
0792nobodyさん
05/03/02 11:01:57ID: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);
--------
アドバイスおねがいします!!!
0794nobodyさん
05/03/02 11:29:16ID:???print OUT @tes;
0796nobodyさん
05/03/02 14:24:28ID:???0799nobodyさん
05/03/02 17:19:36ID:???0800nobodyさん
05/03/02 17:28:30ID:jdtsRVWh外部ドメインにあるXMLを読み込んできて、そのまま吐き出す方法は
ございますでしょうか?
どなたかご教授お願いいたします。
0801nobodyさん
05/03/02 17:31:34ID:???スクリプトのトークンがほしいんだけど、
どうすりゃええのですか?
こーゆー時って、全部自分で作るの?
なんかモジュールないのかな?
記述渡したらリストになって返って来るヤツとか。
0802800
05/03/02 18:26:02ID:jdtsRVWh0803nobodyさん
05/03/02 18:30:33ID:???これ>>648,649,652 はどうして
マッチした行頭...の下の本文の行も出力されるのですか?
0805leaf.child
05/03/02 18:38:44ID:???メールは問題なく送れるのですが、"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);
誰かわかる人いませんかぁ??
0806nobodyさん
05/03/02 19:22:26ID:???いちばんありがちなのは、$headerSubjectの最後に改行が含まれている、
だが。
こういう問題が出たときは、パイプじゃなくてファイルに書き出すように
して出力をよく眺めるとかするのが正攻法だな。
0807nobodyさん
05/03/02 19:51:55ID:???|| && or and
これらの演算子は短絡演算子って言って、演算子の左辺の結果が満たされた場合右辺は実行されないんよ。
つまり、行頭が ... で始まる行は、左辺の結果が真になるから右辺が実行されて $sample が含まれているかチェックされる。
含まれていたら、$target がセットされて、含まれていなければ $target がリセットされる。
行頭が、 ... で始まっていない行は、左辺の結果が偽になるから、右辺が実行されない。
だから、 $target の内容は、 ... で始まる行の結果に依存されて出力されるというわけ。
0809leaf.child
05/03/03 02:20:05ID:QkSLneVbありがとうございました。
Subjectの改行を直したところ
問題点は表示されなくなりました
0810nobodyさん
05/03/03 07:35:14ID:???$targetの役割は、プリントするかどうかの状態を記憶することで、一般的にフラグと呼ばれている。
これが真であるうちは、プリントされる。
これが変更されるのは/^\.{3}/にマッチしたときのみなので、
次に...で始まる行までプリントされる仕組み。
0812nobodyさん
05/03/03 10:25:21ID:???and &&
には突っ込まないんだな
0813nobodyさん
05/03/03 10:56:31ID:???0814nobodyさん
05/03/03 11:14:57ID:???ここでしょう。
0815nobodyさん
05/03/03 12:18:45ID:???'&&', 'and' の左辺が偽を満たしたら右辺は実行されないけどそれが変なの?
0816nobodyさん
05/03/03 12:24:48ID:???>偽を満たしたら
そんなアクロバットな説明しなくていいですからwwwww
0817nobodyさん
05/03/03 12:28:35ID:???0818nobodyさん
05/03/03 12:38:12ID:???0819nobodyさん
05/03/03 12:44:30ID:???ありがとう、了解!
0820nobodyさん
05/03/03 12:50:57ID:???0821820
05/03/03 12:51:29ID:???0822nobodyさん
05/03/03 13:01:21ID:???my $value =qq(あいうえお);
$valueの中に入ってるひらがなを半角カタカナにjcode.plを使用して変えたい。
jcode::tr(\$value,"あ-ん","ア-ン");
こうするとおかしなことになりますがどうしてですか?
jcode::tr(\$value,"あ-ん","ア-ン");
jcode::z2h_euc(\$value);
これだと今のところ大丈夫です。
やはり直接半角に変換は不可能ですか?しかし・・・内部的な処理は同じではないのか・
0824nobodyさん
05/03/03 13:15:23ID:???全角ひらがなと半角カタカナのコードの並び順が違うから。
全角ひらがなと半角カタカナは同じ。
まず文字コードとキャラクタセットについて勉強しましょう。
0826nobodyさん
05/03/03 17:25:13ID:???ファイルハンドルから1行ずつ読み取るときに
while (<IN>) {
chomp }
while ( chomp( $hoge=<IN>) ) { 〜 }
0827nobodyさん
05/03/03 17:28:42ID:???FHから1行ずつ読み込んでchompするときは
while (<IN>) {
chomp
}
とか
while ( chomp( $hoge=<IN>) ) {
〜
}
な感じでやってるんですが
デフォルト変数$_の時
こんな感じに1度で済ますことは出来ないのですか?
while ( chomp <IN> ) {
〜
}
0828nobodyさん
05/03/03 17:42:29ID:F2b+bV+tchomp @_;
$_ = join ('',@_);
0830nobodyさん
05/03/03 18:01:27ID:???0831827
05/03/03 18:32:46ID:???>>828は一度に@_に入れてるんですよね?
使い所によっては便利ですね。勉強になります。
>>829
改行が無い場合は何もしないんじゃなくて0を返してたんですね
改行が無い場合は何もしないと間違って憶えてました
828さん、829さんありがとうございました
0832nobodyさん
05/03/03 20:42:46ID:F2b+bV+tOui.
もし、chompの後に$_で一つずつ処理をするのならば
@_ = <IN>;
chomp @_;
while ($_ = shift @_)
{
〜
}
という事もできます。
0835832
05/03/03 21:11:20ID:F2b+bV+tあ、本当だ。スマソ
0836nobodyさん
05/03/03 22:01:20ID:???0837nobodyさん
05/03/03 22:58:04ID:???sub my_chomp($);
while(my_chomp <DATA>){
...
}
exit;
sub my_chomp($)
{
$_ = shift;
chomp;
return(defined $_);
}
0838829=833
05/03/03 23:52:40ID:???結局、定石通り (>>827 の最初のやつ) にするのがベストだと思うようになった。
0839nobodyさん
05/03/03 23:59:42ID:Q1wNh1eiなぜでしょうか?(改行押すと送信になる)
データが壊れてしまうので、改行が入らないようにしたいのですが
どうすればいいでしょうか?よろしくおねがいします。
0840nobodyさん
05/03/04 00:22:07ID:???ん?
0841nobodyさん
05/03/04 01:13:12ID:???なぜ改行が入ったかは確かに謎だが、たぶん Perl コーディングに関係ない原因だとは思う。
コーディングで解決するなら >>840 みたいにするんだろうなあ。
>>840
それって入力が元々 $_ に入ってるんであって、決して ~ が抜けてるわけじゃないよな?
0842nobodyさん
05/03/04 01:17:56ID:???$_自体が書き換えられる
0843nobodyさん
05/03/04 01:24:24ID:???何故入るのかは分からないが、それによって壊れるようなプログラムを書くのは良くない。
取得したデータから改行を取り除くほうが安全だぞ。
0844839
05/03/04 04:55:51ID:???ありがとうございました。
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から書いたので・・・
0846nobodyさん
05/03/04 09:14:20ID:???0847nobodyさん
05/03/04 10:13:02ID:???・・・意図的に送りつけるのは簡単だが。
ファイルへ書き込むまでにいろいろ処理してるでしょ?
処理途中で改行が紛れ込んでしまうことだってある。コーディングミスで。
再現性を確立しないと追いかけるのは難しいなり。
0848nobodyさん
05/03/04 12:05:01ID:???君はXSSってのを少し勉強したほうがいいよ。
相手が送ってくるものは全てウイルスと思え。
その上でウイルスが送られてきても大丈夫なように作らないと、君のサイトが
ウイルスの配布元になったりするかもしれない。
まあウイルスってのはおおげさだけどね。
0849nobodyさん
05/03/04 12:35:30ID:???iniファイルのままサーバに置いておくと、
ブラウザで見たときに「ファイルの保存」ダイアログが開かずに、
iniファイルの中身が見えてしまいます。
「右クリックして保存しろ」などの注意文を書く、という手もありますが、
せっかく投稿ということで掲示板的CGIも作っているのでCGIを通すことで
ダイアログを開かせることにしました。
CGIはContent-Typeにtextと入れると広告が入るとかでちょっと苦労しましたが、
なんとかダイアログを出させて、正しい中身を送信できるようになりました。
しかし、ここで微妙な問題が残りました。
ダイアログを開いた時のデフォルトのファイル名が、「〜〜.cgi」になってしまうのです。
なんとかして.iniにできないかと調べているのですが、
御存じの方がいらっしゃいましたらお願いします。
# ファイル名が指定できなかったらCGIを通すのはやめて注意文方式にするつもり。
0851nobodyさん
05/03/04 13:11:12ID:???print "Content-Disposition: attach; filename=$file_name\n\n";
とか
0852nobodyさん
05/03/04 13:34:06ID:???windowsXPなどで画像・動画ファイルを選択して切り取りして上の階層に貼り付けるみたいな感じです。
普通に
open FH,"$filename";
my @file = <FH>;
こういう感じでバイナリーファイルも問題なくコピーできるんでしょうか?
それとも何かオススメのモジュールがありますか?
0853852
05/03/04 13:41:24ID:???どうすればいいんですか?
0854nobodyさん
05/03/04 13:42:11ID:???>>852 rename でだいたいうまくいく。うまくいかない場合はFile::Copyモジュールのmoveメソッド、だってさ。
0855852
05/03/04 14:07:07ID:???renameでできました。カレントの中にあるディレクトリ名だけを配列に入れたいんですが、
なにか言い方法はないでしょうか?
globでできるのかなと色々試してますが、ディレクトリだと判断できません。
0856852
05/03/04 14:16:19ID:???判断できないのかな。。。。
0857nobodyさん
05/03/04 14:16:27ID:???ちなみにディレクトリ内全部見る場合 readdir のほうが glob "*" より効率的らしい。
0858nobodyさん
05/03/04 14:37:52ID:???$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;
とやってみたんですがダメでした(当然かな・・・)
0859852
05/03/04 14:39:42ID:???#京
# ディレクトリ名だけ取得
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という名前でデスクトップ直下の画像ファイルを収納しているフォルダに
いれてましたので、その外側に影響を与えるはずはないからと安心してたのですが・・・・
本気でやばいので助けて下さい。元に戻す方法はないでしょうか。
0861852
05/03/04 14:52:31ID:???perl -c をやるつもりでそれをなしでtest.plを実行させてしまったので、
そのときのカレントディレクトリである
C:\Document and Settings\a
でこれを行ってしまったようですorz
最悪です。こういうことの修復はもう手動でしか出来ませんよね?
それでしたらパソコン初心者板に行って聞いてこようと思うのですが・・・
0862852
05/03/04 14:57:54ID:???もしも1発で回復する方法などありましたら・・ってそれじゃマルチになっちゃうか。
とにかくすみません。行って来ます。
0864nobodyさん
05/03/04 15:24:38ID:???プログラムに誤りがなければアクセスログを見て書込んだブラウザを追い掛けてみるといい。
ネスケ4以前とか一行テキストボックスにコピペで改行コードを含めたりできる。
他にもスクリプト経由で改行を含めたデータを送りつけられたりできるし
フォームページをパソコンにダウンロードしてフォームを改竄して送りつけることもできる。
テキストエリア意外のデータでも改行コードのエスケープ処理をするのは良い方法だ。
Perlコーディングとは関係ない話なのでこれまで。
0865852
05/03/04 17:06:39ID:???とりあえずフォルダ命をしっかり指定したこれからはやります。
0866852
05/03/04 17:14:04ID:???しかしこれの式ってOS依存なんですよね?
windowsXPですが、
C:\Documents and Settings\a
こういうディレクトリをglobに渡したいのですが、
glob "/Documents and Settings/a";
これではダメなようでどうやら半角スペースがダメみたいです。
半角スペースのマッチはどうするんですか?
それとこれはテストはwinXPですが実際にはlinuxなのです。
やはり互換性がありませんか?
";
0867nobodyさん
05/03/04 18:57:04ID:Xe71hSRxdbmopenを使うと、サーバはどのDBMを使っているのでしょう?
サーバ次第だと思いますが、何か設定箇所か法則性があれば
教えてください。
また、DBM次第で拡張子(db, pag, dir)がいくつかありますが、
このDBMは必ずこの拡張子という決まりはあるのでしょうか?
別サーバへのDBMファイル移行で詰まっています…
0868nobodyさん
05/03/04 19:00:20ID:???print <<EOM;
と
print <<EOF;
の違いって何ですか?
0871nobodyさん
05/03/04 20:38:45ID:???巷に配布されてるスクリプトにShift_JISが多いのは何故ですか。
Shift_JISで書くことで何か旨みがあるのですか?
0872nobodyさん
05/03/04 20:47:03ID:???0873nobodyさん
05/03/04 20:55:48ID:???0874nobodyさん
05/03/04 21:14:36ID:???0876nobodyさん
05/03/04 22:26:35ID:???$a =~ s/<br>/\n/g;
これをどう変えればいいですいか?
0877nobodyさん
05/03/04 22:40:30ID:???Windowsの「メモ帳」がShift_JISにしか対応してないことと、
テキストエディタ上で設定する必要があることに起因しているようですね。
ありがとうございます。
0878nobodyさん
05/03/04 23:28:05ID:???http://www.perldoc.com/perl5.8.0/pod/func/dbmopen.html
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perltie.html
http://www.att.or.jp/perl/man/anydbmfile.3pm.html
0880nobodyさん
05/03/05 00:22:28ID:???globの半角スペースは、OS依存でなくglobの仕様
glob '/usr/*/*/* /bin/* /etc/*/*';
という記述もできるようになっている。
半角スペースをファイル名の一部とみなしてほしい場合は
半角スペースの直前にバックスラッシュ(円マーク)を記述して
エスケープすればよい。
0881nobodyさん
05/03/05 02:58:35ID:hbhM7+40まずグーグルの使い方を覚えようね。
http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=%E6%94%B9%E8%A1%8C%20%E5%A4%89%E6%8F%9B+textarea&num=50
0882nobodyさん
05/03/05 09:42:12ID:???エロい人おしえてください
0883852
05/03/05 11:08:25ID:???エスケープは何度も試したんですが・・・・
どうやらシングルクォートでやらないといけないようですね。
"/Documents\ and\ Settings/a/*"
これではダメで
'/Documents\ and\ Settings/a/*'
これだといけました。そうなってくるとperlとしては半角をエスケープしてないことに
なるんだけどな・・・よくわからん。
0885nobodyさん
05/03/05 12:34:00ID:???ダブルクォートだと 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";
0886nobodyさん
05/03/05 14:24:31ID:???jcode.plがUnicode非対応。
自力でやるにも文字コードの判別、変換が困難。
Perl5.8以降限定や、Jcode.pm必須にするか、
文字コードのチェックを行わなければ大丈夫だろうけど、
そこまでしてUTF-8にこだわる理由が見出せない。
でも、XHTMLが主流になれば、移行していくと思うよ。
0887nobodyさん
05/03/05 14:38:07ID:???配布するスクリプトはまあいろいろ難しいだろうな
0888nobodyさん
05/03/05 15:02:07ID:???$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/;
にすれば期待通りの結果がでますが、どうすればいいのでしょうか。
パターンも置換文字列も変数を使用したいです。
0889nobodyさん
05/03/05 15:02:38ID:???0890nobodyさん
05/03/05 15:26:50ID:???メモ帳で UTF-8が開けるの初めて知ったよ(Win2000)
でもデフォはSJISだから95とかMeが廃れても無理っぽい。
0891nobodyさん
05/03/05 15:36:58ID:???スクリプト開発者はさすがにメモ帳デフォのままでコーディングしないっしょ?
0892nobodyさん
05/03/05 16:06:25ID:???$tmp = 'http://foo/bar/1234.jpg';
$pat = '(.*)\.jpg';
$rep = '$1.".png"';
$tmp =~ s/$pat/$rep/ee;
print "$tmp\n";
0894nobodyさん
05/03/05 17:11:23ID:???自分しか使えないスクリプトほどくだらないもんはない。
誰でも使えるものを作れるかどうかが、馬鹿とアホの分かれ道なわけで。
そもそもヘタレが多すぎだな。
環境によって書き換えてもらわないといけないなんてアホくさい。
普通は設定ファイルは別途にしておいて、その設定ファイルをいじるための
インターフェースも作っておく。
プログラムなんてのは他人に書き換えてもらう事を前提にするようなもんじゃない。
想定をこちらで決めてしまわなければどうしようもない。
0895nobodyさん
05/03/05 17:15:36ID:???重いとか聞いたのでまだ使ったことありません。
それにテンプレートを作るってことは変数が乱立せざるを得ないし、
構文を埋め込みok状態で使うならテンプレートファイルを別に作る意味も不明。
とか思ってるんですが、使用されてる方の意見を利かせて下さい。
今は基本的にHTMLはプログラム内にあります。まあ出力内容を作成する
ルーチンなので外部に置いてもなんら問題はありませんが。
逆に差がないなら分ける意味もないですうしね。
0896nobodyさん
05/03/05 18:58:05ID:???仕事で作る奴はちょろちょろ変更あるのでテンプレートで分けるように
なった。しょうもない文章の修正とかでいちいち本体いじるのうっとう
しいと思ってたのでなかなかよろしい。
で、慣れるとプログラムがすっきりするので、個人で作るような
のもテンプレ使ってたりします。
テンプレライブラリは重いといえば重いんだけど、1ページの表示が
遅いってほどじゃないので、気にすることないと思う。
0897nobodyさん
05/03/05 19:06:00ID:???メチャクチャなので使う気になれないんだよな。
きちんと変換表が統一される夢のような時代は絶対来ないけど
たぶんそのうちunicodeの変換表の有力な奴相互に判定/変換する
ようなライブラリができるだろうからそれ待ち(笑)
0898nobodyさん
05/03/05 19:27:37ID:???そもそも文字コードなんて商売上の理由なんだろうから歩みよりはないだろうし。
俺はこれからもSJIS使っていくぞ。
0899nobodyさん
05/03/05 19:29:22ID:???俺の場合だと hash や array にぶちこんで渡すので変数が乱立するってことは無い
DBI の fetchrow_hashref で取ってきた hash をそのまま Template に渡してはいおしまい、みたいな感じで
お蔭でプログラムの見通しが断然良くなった
正直 Template 使わない CGI はもう書きたくない
普通は重いんだろうとは思うが、俺んとこは mod_perl 環境なので、
パース済 Template のキャッシュも効いて、全然重さを感じない
0900nobodyさん
05/03/05 20:03:51ID:???0901nobodyさん
05/03/05 20:55:09ID:???例えば、ある顧客のデータと、管理者のデータを一度に表示したい時、
{
client_name => 'hoge', client_address => 'foo',
admin_name => 'hage', admin_address => 'bar',
}
とかで渡してやらんとだめだ。
{
client => { name=> 'hoge', address='foo' },
admin => { name => 'hage', address='foo' },
}
とかじゃだめってことね。
この点Template-Toolkitは偉すぎる。
0902nobodyさん
05/03/06 09:56:09ID:???ちょっとでもスクリプト軽くしたい一心から、
HTML::Templateは問題外と思っている。
HTML::Templateを、数万回/day呼ぶとやっぱ重いかな?
0904nobodyさん
05/03/06 13:35:38ID:???0905895
05/03/06 13:41:02ID:???私的にはhashやarrayの中に入れることも乱立だと思ってます。
プログラムの見通しは現状でずいぶんいいんですよね。
開始100行部分辺りがプログラムの流れで細かい処理はルーチンを下のほうに作って
あって、そいつらはグローバルをいじることはできなくしてあるし。
間違っても全体の流れてきな処理と個々の処理を同列視しないように作ってます。
こういうやり方にしてから拡張もいくらでもできるようになったし。
でも皆さんなかなか評判がいいようなのでちょっと遊びスクリプトを作る時には
使ってみようかな。ありがとうございました。
0906nobodyさん
05/03/06 14:50:24ID:???すごく同意 なので私は
$ref->{aaa}->{bbb}を$hash{'aaa-bbb'}に変換する関数を作って使ってます。
$change->{form_data} = \%form_data;
とかが出来るようになって幸せ
0908nobodyさん
05/03/06 16:13:12ID:???ただの構造化で満足している人がTemplateを使えるとは思いませんが。
そもそもビューを切り離すことにメリットを感じない程度の小規模スクリプトしか
書いてないんでしょうから。
0909nobodyさん
05/03/06 16:18:15ID:???まあ使ってみて目覚めるということもあるから、生温かく見守ってあげようや
漏れも頭ではMVCとか知ってたけど、実際にモノを作ってみるまで恩恵がわからんかった
0910nobodyさん
05/03/06 17:13:17ID:???まあこのスレのレベルではしょうがないか。
0911nobodyさん
05/03/06 17:48:51ID:???Templateを単純なコード埋め込み可能テキストくらいにしか使えてないんだろうな。
かわいそうに。
0912nobodyさん
05/03/07 02:01:45ID:???Templateは置くだけじゃ使えないよね?
しかたなくHTML::Template派。
0913nobodyさん
05/03/07 02:03:59ID:dh8KtD970914nobodyさん
05/03/07 02:12:46ID:???syntax onを忘れずに
0917nobodyさん
05/03/07 04:10:46ID:???確かにSTDINの内容を渡しちゃうのはキモいけど
my $cgi = new CGI();
my $template = HTML::Template->new(scalarref => \$html, associate => $cgi);
とかよく使われてる手法じゃない?
0919nobodyさん
05/03/07 08:07:45ID:???$template->param(%form_data);
としてクライアントにテンプレートの変更権限が無い場合
%form_dataが例え汚染されていたとしても
重大な影響は与えないと思う。
とはいえ
hoge.cgi?mail=危険なタグ
とかされた場合、ブラウザクラッシュとかもありえるから
サニタイズは必要ですね
0920nobodyさん
05/03/07 09:27:19ID:???一応、出力時にエスケープできるオプションもある。
>>919
http://www.google.co.jp/search?q=XSS
0923nobodyさん
05/03/07 18:44:45ID:???perlソース側ではprint文、HTMLタグは一切記述せず(httpヘッダくらいはいいかな)
テンプレート側だけで対応する事になるのでしょうか。
速度や保守性を考えるとどのぐらいの割合がいいのかなと思いまして。
0924nobodyさん
05/03/07 19:55:37ID:???基本的に表示のための加工処理はテンプレートに集中させるべきだと思いますが。
ヘッダは本体スクリプトで。
0925nobodyさん
05/03/07 20:36:15ID:C7YlD7f8$remolog = './remolog.cgi';
のように./をつけているのを多く見ます。
./に何か御利益があるんですか?
0926nobodyさん
05/03/07 23:25:57ID: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)
にするとなぜかエラーになりません。
原因はなんなのでしょうか?よろしくお願いします。
0928926
05/03/07 23:32:09ID:???解決しました。ありがとうございました。
0929nobodyさん
05/03/08 00:18:06ID:???else if
とか
for(i = 0
とかやっちゃう
0930926
05/03/08 00:40:31ID:l83v9ZYFopen で 一つ上のディレクトリにあるファイルに書き込みを行いたいと思ってます。
ですが… open DATA "> ../hogehoge.txt";
としてもうまくいかないんです。なにがおかしいのでしょうか?
0932926
05/03/08 00:54:09ID:l83v9ZYFopen (DATA, "> ../hogehoge.txt");
これでうまくいかなかったのですが…
これに続く文は
print DATA "hagehage1\n";
print DATA "hagehage2\n";
…
close(DATA);
わかんないっす。
0934nobodyさん
05/03/08 01:10:31ID:???0935nobodyさん
05/03/08 01:12:22ID:???とりあえず
open (DATA, "> ../hogehoge.txt") or die $!;
とかしてエラーになるかどうか、エラーならどんなメッセージか
を確認することを薦める。というかopenにエラートラップするのは
基本だ。
0936926
05/03/08 01:30:33ID:???windowsのローカルのApache2ではパーミッションとかわかんないです。
プロバイダのはフォルダには書き込み権限設定してませんが、ファイルは666にしてます。
>>934
意味がわからないです。もうちょっと自分で調べます。
>>935
やってみます。
皆様、ありがとうございます。
0937926
05/03/08 01:33:05ID:l83v9ZYFInternal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
でした。たぶん前と変わりません。。。
0938926
05/03/08 01:35:23ID:???「CGI の内部エラーが発生しました。」と日本語表示されました。
こんな事していいのかな。。。
0939926
05/03/08 01:42:39ID:???原因は他にありそうです。m(_ _)m
0940926
05/03/08 01:59:17ID:l83v9ZYFprint DATA "<a href=\"http://";
print DATA "127.0.0.1";
print DATA "/\">今は入れないよ</a>\n";
こういうのを書いていたのですが、1行にするとエラーが回避されて正常動作するようになりました。
理由わからないです。
ダブルクォーテーション関係ありますか?
0941nobodyさん
05/03/08 03:08:26ID:???ようわからんけど、コマンドプロンプトじゃなくブラウザで動作確認してるみたいだから、
#- - - - - - - - - - - - - - - - - -
#!/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」とかに変えたらできたりしないかね? 普通は関係ないけど)
0942nobodyさん
05/03/08 03:13:58ID:???0943nobodyさん
05/03/08 03:17:45ID:???0944nobodyさん
05/03/08 07:35:02ID:???0945nobodyさん
05/03/08 08:00:51ID:???use CGI::Carp qw(fatalsToBrowser);
しとけ。dieしたときのメッセージがブラウザにも出るようになる。
0946nobodyさん
05/03/08 15:24:44ID:???# 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);
もあり? うーん。
0947926
05/03/08 15:42:14ID:???Premature end of script headers
でした。
0949nobodyさん
05/03/08 20:32:35ID:/HU/2hpG何となく3番目。
0950nobodyさん
05/03/08 21:01:58ID:???s/((?:\G|>)[^<]*?)foo/$1bar/g;
と書けますが、
・1回だけでいい(gオプションをつけない)
・最初にタグ以外の文字があるテキスト(そこにもマッチさせたい)
とした場合、どのように書いたらいいでしょうか。
なるべく速いほうがいいのですが。
0951nobodyさん
05/03/08 21:27:00ID:???0953nobodyさん
05/03/08 22:07:09ID:???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
みたいに表示したいんですけど
どうしたらいいんでしょうか?
0954nobodyさん
05/03/08 22:19:35ID:???0955nobodyさん
05/03/08 23:02:12ID:???0956nobodyさん
05/03/08 23:12:33ID:???0958nobodyさん
05/03/09 03:18:19ID:???$aaa =~ s/<.*>//i;
にしてたのですが、
<TD>あああ</TD>
こういう1行に2つ以上タグがあるところは除去されてしまうようです
ちゃんと<TD>あああ</TD>⇒あああにするにはどうすればいいですか?
0961nobodyさん
05/03/09 03:39:03ID:???ちなみにどうやったか書いてって〜
0962nobodyさん
05/03/09 06:39:54ID:???ヘッダを出力する前にプロセスが終了してる。
理由としては
1. HTTPヘッダを出力していない。
2. ヘッダを出力する前にエラーが起きている。
のどちらか。
1.は出力するように修正する。
2.はエラーログにperlのエラーが出力されているので、それを見て修正。
Apacheの場合、改行二回するだけでも、
デフォルトのcontent-typeを吐いてくれる。
(httpd.confをいじってなければtext/plain)
0963nobodyさん
05/03/09 15:42:37ID:TPYzASqD<?
require ("./test/index.html");
?>
これをperlで再現したいのですが、
是非方法を教えて頂けませんでしょうかorz
0966nobodyさん
05/03/09 15:53:39ID:???PHPくだスレでのレスは放置かYO。
それに、
「PHPではrequireはコレコレこういう機能がありますが、
Perlでそれを実現するにはどうしたらいいですか?」
って感じの質問の仕方が真っ当だと思うが。
0967nobodyさん
05/03/09 16:00:05ID:TPYzASqDすいませんでしたorz
あと、Perlでreqireを使ってphpを呼び出すことは可能でしょうか・・・?
require "./test/index.php";
print index("$index");
↑
これはphpでrequireを使ってindex.phpを呼び出したときの成功ソースです
perlでは失敗しましたorz
ちなみにindex.phpの構造はこんなかんじです
<?
function index($index) {
return "hello!";
}
?>
0968nobodyさん
05/03/09 16:03:53ID:???0972nobodyさん
05/03/09 16:38:24ID:???0973nobodyさん
05/03/09 16:42:30ID:bpuh5/Rpopen new, '>new.txt';
@data = split /\t/;
if($data[0] eq 'kawagoe'){
print new "$_";
}
これですと、データを全て新ファイルに記憶してしまいますが、
data[2](タブ区切り三つ目のデータ)だけを省いて記録するには
どのように書き換えたらよいでしょうか?
0975nobodyさん
05/03/09 17:25:19ID:ox3iJUQYセッションを組み込もうと思っています。
phpで発行したセッションはperlからは利用できないのでしょうか?
0977nobodyさん
05/03/09 17:59:25ID:???こういう馬鹿はほっとくに限る。
次の質問どうぞ↓
0980nobodyさん
05/03/09 19:07:34ID:???split せんでも、それくらいなら
s/^([^\t]*\t[^\t]*)\t[^\t]*/$1/;
とかでどうかな。
データが長い上何回も繰り返すんだったら、
index と substr でも組み合わせたらいいかと。
[2]だけじゃなく、何個も消すのだったら、@data を splice して join すればいいよ。
0982nobodyさん
05/03/09 19:09:56ID:???@csv = <CSV>
foreach (@csv){
処理
}
この処理で
・splitで分解してeq
・正規表現でマッチ
どちらが早いですか?
0983nobodyさん
05/03/09 19:39:04ID:???0986nobodyさん
05/03/09 20:06:10ID:???Perlで処理効率云々を言ってもなぁ
それもCGIレベルの話でどちらが云々いうなら、画像サイズなんかを極限まで
落としたほうがよほど効果的だよ。
0988nobodyさん
05/03/09 21:05:13ID:???$live = '<a href=\"*************\">現行スレ</a><br>':
〜〜〜
print "$live";
このようにしたのですがエラーがでます
なにか間違えたりたりないとこがあったらご指摘お願いいたします
0990nobodyさん
05/03/09 21:08:38ID:???0992nobodyさん
05/03/09 21:12:18ID:???予断ですが。
シングルクォーテーションの中でダブルクォーテーションはエスケープする必要ないし、
変数1つを出力するのに、ダブルクォーテーションでくくる必要もないです。
0993nobodyさん
05/03/09 21:15:04ID:???そんなのは<tag attr=>>を除去できるかと言っているのと同義。
$aaa =~ s/<[^>]+?>//is;
でFA?
0995nobodyさん
05/03/09 21:22:52ID:???0996nobodyさん
05/03/09 21:29:52ID:???0997nobodyさん
05/03/09 21:33:23ID:???0999nobodyさん
05/03/09 21:38:34ID:???$aaaにはタグを除去したいHTMLテキスト全体が入っているものとする。
また、HTMLテキストのコメント内および引用符でくくられた属性内には
>を含まないものとする。
1000nobodyさん
05/03/09 21:45:08ID:uon8ZypZ10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。