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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/09/15(金) 14:01:51ID:gobry0n2
Perlのコーディングで困ってる人のスレです。

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

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

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

お勧めサイトは >>2-10

前スレ http://pc8.2ch.net/test/read.cgi/php/1153987463/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0081nobodyさん2006/09/22(金) 11:13:44ID:???
変ななりすましはスルーでOK
0082nobodyさん2006/09/22(金) 11:56:21ID:???
だが、否定ぐらいはしとけと。
0083nobodyさん2006/09/22(金) 12:14:06ID:???
>>57
最近のperl使ってシェルを経由させずに起動すれば良いだけ。

> Sendmail の引数で指定するのは、一般的にはやっちゃいけない方法と言われてるね
無知をさらけ出されても困る。
0084nobodyさん2006/09/22(金) 13:09:56ID:???
>>76
自分で鯖立てればいいだけじゃん。
0085nobodyさん2006/09/22(金) 16:20:39ID:URN28btq
post データが
a0=1&b0=1&a1=4&b1=2&a2=2&b2=2&・・・&an=8&bn=9
と"a".$i =数字と"b".$i=数字となっているものを
postgresql にperl でupdateしたいのですが、

for($i=0;$i < n; $i++){
$str ="update table set a=$html->param('\"a\".$i') where b=$html->param('\"b\".$i)";
$sth=$dbh->prepare($str);
$sth->execute();
}
こんな感じでupdateしたいのですが,試行錯誤の上に挫折中です。
うまい方法はないですか?
0086nobodyさん2006/09/22(金) 16:31:12ID:d6rNV+wj
$html->param('\"a\".$i')
をprintしてみたらどうでしょうかね
0087nobodyさん2006/09/22(金) 16:38:47ID:???
$html->paramはなんですか?文字列ですか?メソッドですか?
$strに何が代入されてるんですか?
0088nobodyさん2006/09/22(金) 16:50:49ID:???
>>87
どうみても $html は CGI のインスタンスだし、$str には SQL 文が代入されてるがな。(´・ω・)

文字列の中でメソッド呼び出しってできたっけ?
一旦 param の内容を変数に代入してから $str に埋め込んでみては?
0089nobodyさん2006/09/22(金) 16:50:53ID:URN28btq
>>87
>$html->param

$html=new CGI;
です。
>$str
にはpostgresqlに対するupdate のストリングが入って欲しいものです。

>>86
CGI=HASH(0x804c914)->param('"a".1')
となりました。
0090nobodyさん2006/09/22(金) 16:56:20ID:???
てか、パラメータを直接 SQL 文に埋め込むと SQL インジェクションできるんじゃね?
0091nobodyさん2006/09/22(金) 16:58:49ID:???
流石○○板だな
0092862006/09/22(金) 16:58:56ID:???
>>89
いや意味的には>>88と同じで変数を確認ってことです
っつーかbのシングルクォート
0093nobodyさん2006/09/22(金) 17:03:18ID:???
$html->paramはなんですか?クォートの中から呼び出せるんですか?
$strに何が代入されてるんですか?
確認しましたか?
0094nobodyさん2006/09/22(金) 17:04:10ID:???
アッー!
0095nobodyさん2006/09/22(金) 17:51:48ID:???
>>85
$htmlってのは
use CGI;
my $html = new CGI;
したもんだと仮定しますた。それから、
$dbh は、DBI/DBD::Pgで接続したときのインスタンスと仮定しますた。んで、

まず、$html->param('\"a\".$i') ってのがおかしい。全体をシングルクォートしてしまうと$iは展開されません。
まあ、$html->param("a$i") だとします。

そんで、ダブルクォーテーションの中に $html->param("a$i") を入れちゃうと、
$html と ->param("a$i") とに分かれて解釈されちゃうので、外に出してください。

だけれど、せっかくprepare使うんなら

my $sth = $dbh->prepare("update table set a=? where b=?");
for ( $i=0; $i < n; $i++) {
    $sth->execute($html->param("a$i"), $html->param("b$i"));
}

などとしてはいかがでしょうか?

※上記のソースで n が裸で出てくるのはおかしいです。use strictすれば教えてくれます。
※SQL-injectionのチェックはしてくださいね。
0096nobodyさん2006/09/23(土) 06:00:23ID:08cXFZbB
Perlで、サニタイズするときの定番の関数は何ですか?
PHPだとhtmlspecialchars()というのが標準で備わっているんですけど、Perlでそれに相当するものは何になるんでしょうか。
(自分で書くのは簡単なんですけど、できればPerl標準のものがあればそれを使ったほうがいいかなと考えています。)
0097nobodyさん2006/09/23(土) 06:57:54ID:???
PHPのそれに相当するビルトイン関数はないよ
0098nobodyさん2006/09/23(土) 07:46:28ID:???
>>97
ライブラリ関数で結構ですので、教えていただけませんか。
0099nobodyさん2006/09/23(土) 08:34:56ID:???
Perl標準もデファクタスタンダードと呼べるものもないと思うよ

HTMLを使用するモジュールには大概あるから(CGI、TT、HTML::Templateなど)
あとは自前で用意するんじゃないかな
0100nobodyさん2006/09/23(土) 08:39:51ID:???
>>98
http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod#item__escaped_string___escapeHTML__unescaped_string___
0101nobodyさん2006/09/23(土) 09:31:06ID:???
サニタイズゆうな。クズ。
0102162006/09/23(土) 16:17:05ID:???
今日、@IT に自分が質問していた内容に関する記事が追加されました。

http://www.atmarkit.co.jp/fsecurity/rensai/hoshino10/hoshino01.html

自分が書き込んでから数日以内のことなので、ひょっとしたらこのスレ見ててくれたのかな、と思ったりw
偶然かもしれないですけど・・・

もし、見ていてくれたのなら 杉山 さん、本当にありがとです。
0103nobodyさん2006/09/23(土) 17:05:32ID:???
ねーよw
0104nobodyさん2006/09/23(土) 17:24:16ID:???
>>16 より引用

> バイナリエディタで解析した " (ダブルクォート) の 16進表記は、"22" です。
> ここで、$hoge に バイナリレベルで "82" をいれてみるとどうなるかやってみました。(バイナリファイルを一般のテキストエディタで表示したときの、"・"(半角) と表示されるあれです。)
> それを出力して、IE と Firefox と Opera で表示したところ、 "82 22" で 1つの不正な文字 "・"(全角) として表示され、ダブルクォートが消えうせていました。


>>http://www.atmarkit.co.jp/fsecurity/rensai/hoshino10/hoshino02.html より引用

> 赤坂さんの入力には、「%82」という文字列が含まれている。


22 はダブルクォートだけど、82 はようするに22と組み合わされて1つの2バイト文字と扱われればいいわけで、82である必然性が無い。
参考リンクの、http://applesoup.googlepages.com/bypass_filter.txt にも 82 は出てこないからね


以上の理由により、杉山氏はこのスレを見ている可能性が高い
0105nobodyさん2006/09/23(土) 17:43:34ID:???
http://www.atmarkit.co.jp/fsecurity/rensai/hoshino10/hoshino03.html によれば、
php なら、mb_convert_encoding($_GET{'hoge'},'SJIS','SJIS')) で対策できるみたいだね。

Perl の jcode.pl で同じことやったが、無理だったわ。
不正な文字列を変換してもそのままになっちゃうみたい。

Perlで対策するにはどうすればいいんだろうか・・・。
0106nobodyさん2006/09/23(土) 17:59:04ID:???
>>29 じゃだめなんかい。
そんなに面倒だったら、受け取った文字列の後ろにスペース一個くっつけとけば?
01071052006/09/23(土) 18:02:03ID:???
>>106
なるほど
それでできるのか
ありがとうございます
01081052006/09/23(土) 18:15:29ID:???
$str = qr/^([\n\x20-\x7e\xa1-\xdf]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])*$/

の qr ってなんだろう。と調べてみました。

http://psst.jp/syn/archives/000199.html

つまり、>>29 は、「^([\n\x20-\x7e\xa1-\xdf]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])*$」を、正規表現としてコンパイルしているわけですね。


実際に $GET_hoge の無効な文字列を削除するには、

$GET_hoge =~ s/$str//g

とすればいいわけですね。

ありがとうございます。
0109nobodyさん2006/09/23(土) 18:23:40ID:???
この脆弱性、CGI配布サイトで配られている大部分の掲示板スクリプトとかにとかに影響していますね・・・
漏れの使っている Child Tree とかはもろ影響してるし

実はphpユーザなんでPerlのことよくわからないや(´・ω・`)
しかも自分で書いたスクリプトじゃないから修正が大変です><

本来出力時のエスケープがいいと思うのですが、、print 内の変数を全て書き換えるのは大変なので、
GET と POST として送られてきた全てのデータに >>29 の正規表現を適用させる方法は無いでしょうか

どうかお願いします
01101052006/09/23(土) 18:33:56ID:???
あれ、動かしてみたけど、駄目でした。

> つまり、>>29 は、「^([\n\x20-\x7e\xa1-\xdf]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])*$」を、正規表現としてコンパイルしているわけですね。

まではいいんですが、

> 実際に $GET_hoge の無効な文字列を削除するには、
> $GET_hoge =~ s/$str//g

は違ったようですね。

「^([\n\x20-\x7e\xa1-\xdf]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])*$」は正しいパターンなので、

if ($GET_hoge !~ $str) {
&error("貴方が送信した文字列はShift_JISとしてValidではありません。");
}

みたいに使うってことだったようです。
0111nobodyさん2006/09/23(土) 18:36:49ID:???
Encode.pmでは無理か?
0112nobodyさん2006/09/23(土) 18:38:01ID:???
>>109
製作者に言えよw
0113nobodyさん2006/09/23(土) 18:52:41ID:9+jKDZxZ
指定したファイルを読み込んで、そのファイル内に記述された$aaa等の変数をperl内の内部変数に置き換えるにはどうすれば良いですか?
0114nobodyさん2006/09/23(土) 18:57:30ID:???
>>110
最後の1バイトがゴミかどうか調べてみれば?

>>113
while(<DATA>){
${$1} = $2 if /^(\w+)=(.*)/;
}
print $aa;
__END__
aa=bb
0115nobodyさん2006/09/23(土) 19:01:07ID:???
^([\n\x20-\x7e\xa1-\xdf]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])*$ の意味を考えてみた

"\n" は改行文字、"\x" はなんだか良く分からないけど、バイナリレベルで調査するって宣言かな
"\x20-\x7e" は、16進数の "20" から "7e" ってことか
2桁の16進数だから、

16^2 = 256 = 2^8 = 1バイト

つまり、この [] の1ブロックで、1バイトってことだね
1ブロック目、2ブロック目、3ブロック目全てが 1バイトのよう

これを括弧でかこって繰り返しにしている

あれ?

ってことは、3バイトの文字列で始まり、それが0回以上繰り返される?
例えば、ユーザ入力値が "ab" だったら不正扱い?

でも試してみたらそうならないし

う〜ん
0116nobodyさん2006/09/23(土) 19:36:39ID:???
正規表現ってそんなわかりにくいのかな。

>>110,115
その場合こう。
というかちょっと数行に分けて書き換えてみるからこれでわかって。

my $reg_alpha = qr/(?>[\t\r\n\x20-\x7e]+)/; # アルファベットの連続
my $reg_han_kana = qr/(?>[\xa1-\xdf]+)/; # 半角カナの連続
my $reg_multi = qr/(?>(?:[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])+)/; # 2バイト文字の連続

$GET_hoge =~ s/^((?:$reg_alpha|$reg_multi|$reg_han_kana)*).*$/$1/;

テストはしてない。
0117nobodyさん2006/09/23(土) 19:39:36ID:???
>>113
状況がよくわからんが、
・require
・eval
・正規表現
お好きなのを使ってどうぞ
0118nobodyさん2006/09/23(土) 19:42:38ID:???
>>116
あー、o 修飾子つけた方がよかったかもしらん。たいしてかわらんかもだけど。;
0119nobodyさん2006/09/23(土) 19:49:01ID:???
>>115
全然違う…。

[¥n¥x20-¥x7e¥xa1-¥xdf]
が、ASCIIキャラクタとsjis半角カナ ... A

[¥x81-¥x9f¥xe0-¥xfc][¥x40-¥x7e¥x80-¥xfd]
がsjis2バイト文字 ... B

/^(A|B)*$/
だから、1バイト文字と2バイト文字で構成されている文字列にマッチする。
(sjisのみ対応)

正規表現の2バイト目の最後、0xfdまで文字あるから直しておいた。
0120nobodyさん2006/09/23(土) 19:51:21ID:???
>>116
(´・ω・)
$GET_hoge =~ s/^((?:$reg_alpha|$reg_multi|$reg_han_kana)*).*$/$1/os;
01211152006/09/23(土) 20:10:01ID:???
>>116
ご親切にありがとうございます。
あとでそれぞれの修飾子の意味を調べながら解読してみようかと思います。

>>119
なるほど。
プロポーショナルフォントなせいで "|" を見落としていました。
そのせいで、3バイトを意味すると思って混乱していたようです。
誤解が解けてすっきりしました。
本当にありがとうございます。

「ASCIIキャラクタとsjis半角カナ」 と 「sjis2バイト文字」 では当たり前かもですが、1バイト目が重複することはありえないわけですから、
Shift_JIS の [?x81-?x9f?xe0-?xfc] で終わっているようなのは不正ですね。

# http://www.atmarkit.co.jp/fsecurity/rensai/hoshino10/hoshino02.html
# [マルチバイト文字の1バイト目(0x82)] ってどういうことなんでしょう。
# "82" がマルチバイト文字の1バイト目ということは分かるんだけど、"0x" って・・・。
# マルチバイト文字の1バイト目が "82" であるということを、"0x82" と表記するって決まりがあるんだろうか。
01221152006/09/23(土) 20:10:35ID:???
2chブラウザでコピペしたときに正規表現が変になっちゃいました
0123nobodyさん2006/09/23(土) 20:21:34ID:???
おまえらおもしろいな

use Encode qw/encode decode/;
encode( 'sjis', decode( 'sjis', $q->param('query') ) );
0124nobodyさん2006/09/23(土) 20:23:05ID:???
>>121
0x の接頭辞は、16進数である事を示す。
0x82 で16進数の82を指す。
0125nobodyさん2006/09/23(土) 20:24:48ID:???
貼るの忘れた
http://search.cpan.org/~dankogai/Encode-2.18/Encode.pm#Handling_Malformed_Data
0126nobodyさん2006/09/23(土) 20:43:33ID:???
まあ、いちいち変換→逆変換するのは無駄い気もするけどね。
01271212006/09/23(土) 21:39:58ID:???
>>124
サンクスです
0128nobodyさん2006/09/23(土) 21:39:59ID:???
PERL5ってこのスレでいいの?
0129nobodyさん2006/09/23(土) 21:49:51ID:???
>>123
あーEncodeって半端なマルチバイトを落としてくれるのか知らなんだ
入力された文字コードのチェックするしコストにはならないよね
0130nobodyさん2006/09/24(日) 00:58:20ID:???
Encode.pmはjcode.plよりも劣るから使ってない
jcodeにはutfパッチのやつとかあるしさ
0131nobodyさん2006/09/24(日) 01:07:12ID:???
>>130
凄い釣りですね^^
次はPerl5はPerl4より劣るから使ってないとか言い出すんですか?
0132nobodyさん2006/09/24(日) 01:15:21ID:???
ワロス
0133nobodyさん2006/09/24(日) 01:27:45ID:???
そんなエサに俺様がクマー
0134nobodyさん2006/09/24(日) 04:38:21ID:???
勉強になるなぁ。
0135nobodyさん2006/09/24(日) 04:47:31ID:???
釣りの?(´・ω・`)
0136nobodyさん2006/09/24(日) 05:19:33ID:???
=チラシの裏
最近 perl の
  my $this = shift or return;
  $hoge ||= 'hogehoge';
  $piyo &&= piyopiyo($piyo);
こういう書き方にエクスタシーを感じてきた。 if文いらないのステキすぎ。
=cut
0137nobodyさん2006/09/24(日) 05:33:37ID:???
おまいらPerlメモを知らないのか?
ttp://www.din.or.jp/~ohzaki/perl.htm
0138nobodyさん2006/09/24(日) 11:31:51ID:???
良くわからない正規表現使うよりは、
String::Multibyteモジュールを使ってみるのも。
use String::Multibyte;

my $str = "イリーガル\x82";
my $sjis = String::Multibyte->new('ShiftJIS');
print $sjis->islegal($str) ? 'true' : 'false';

ttp://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
も参考になる。
0139nobodyさん2006/09/25(月) 00:34:54ID:wf+gGDeG
21:00pmにc:\beta.exeを終了させるプログラムはどのようなソースになりますか?
0140nobodyさん2006/09/25(月) 01:22:59ID:???
>>139
>>1 ぐらい読め。
> 【投稿する際の注意】
> 質問するときは内容をよく吟味してから投稿してください。
> 「コマンドの意味がわかんない」とかはマニュアル見ましょう。
> 回答者さんは何でも屋じゃありません。
>
> 1: 自分はこういう事がしたい。
> 2: それでこんな風にやってみたが・・・
> 3: こんなエラーが出て上手く行かなかった。
0141nobodyさん2006/09/25(月) 06:43:54ID:???
>>99,100
さんくすです。
0142nobodyさん2006/09/27(水) 10:30:04ID:???
ひさびさにPerlメモ見たら、

※上記の内容について
最近の perl(perl5.8.8等)では,index 関数を使うよりも, /\Q$keyword\E/ という正規表現を使った方が速いようです.実行速度は perl のバージョンや実行環境,スクリプト等に影響されるため,必要に応じてベンチマークをとるのがよいでしょう.

って書かれてた。7月下旬に更新されたらしい。
数年越しでも書き換えなきゃいけない情報をちゃんと更新するのは偉いなあ・・・。ちょっと遅いけど、まあGJ!
0143nobodyさん2006/09/27(水) 12:02:27ID:???
正規表現を使わないなら関数を使うより速いことが多い
0144nobodyさん2006/09/27(水) 16:45:21ID:???
日本語でおk
0145nobodyさん2006/09/27(水) 16:57:20ID:???
/\Qpenis\E/ ⇒ 正規表現なし ⇒ 高速
/^pen(?: )?is$/ ⇒ 正規表現あり ⇒ 低速

C言語のstrcmp()に置き換えできるような場合、Perlでは/〜/を使う方が速い
…とどこかのサイトに書いてあったがURLを紛失してしまった
0146nobodyさん2006/09/27(水) 17:13:22ID:???
でも誤差程度ならindexでいい気が。
0147nobodyさん2006/09/28(木) 08:51:24ID:???
@new_word_list = keys %new_bad_hash;
print "new_word = $new_word","\n";
print "last_bad_hash{new_word} = $last_bad_hash{$new_word}","\n";
とすると
$new_wordはちゃんと入っているのですが、ハッシュの値が表示されません。

@new_word_list = keys %new_bad_hash;を
@new_word_list = ("A","B","C");と直に書くとうまく表示されます。

printで表示すると両者ともA B Cと表示されます。
前者と後者の違いはなんだろうと思い、
chomp、=~ s/\s/ /g;をしてみたり、lengthで長さを確認してみたのですがいっこうに
違いがみいだせません。
この違いは何なんでしょうか?
0148nobodyさん2006/09/28(木) 08:55:20ID:???
すみません>>147の$new_wordは@new_word_listから適当にとってきたものです。
0149nobodyさん2006/09/28(木) 09:11:56ID:???
$new_word もそうだが、
%last_bad_hash は %new_bad_hash と関係あるのか >>147 じゃわからないんだがw
情報小出しにしないで、自分で質問文読んで理解できるように書いてね・・・
0150nobodyさん2006/09/28(木) 09:28:43ID:???
えと、%last_bad_hash は %new_bad_hashとキー($new_word)が同じハッシュで、
%new_bad_hashからキーを取り出して$last_bad_hashのハッシュ値を得ようとしています。

しばらくいじってたんですが、
キーが全部アルファベットだとうまくいくみたいです。
日本語だと前者はダメで、直に書いた後者は大丈夫でした。
0151nobodyさん2006/09/28(木) 12:32:45ID:???
>>147
整理すると、
$new_word の値は、%last_bad_hash のキーであるはずなのに、$last_bad_hash{$new_word} の値が表示されないのですね。
%last_bad_hash のキーの中に $new_word の値が存在しないからそのような現象が起きるので、$new_word の値と、
%last_bad_hash のキーをすべて表示させてみてはいかがですか。値の中にスペースが入っているということはないんですか?
2バイト文字の場合文字コードの問題もありますよ。
print unpack("H*", $new_word);
print unpack("H*", join(",", keys %last_bad_hash));
とでもやって値を比較してはどうですか。
0152nobodyさん2006/09/28(木) 13:43:21ID:???
文字コードの問題でした。。。。EUCとJISが混在してました。
すみません。ありがとうございます。
0153nobodyさん2006/09/28(木) 17:27:09ID:???
はじめまして。
スレ違いでしたら、申し訳ありません。

社内で使用するために、掲示板を設置する作業を請け負いました。
フリーの添付ファイルアップロード機能付きの掲示板を設置したのですが、
添付ファイル名に日本語が使用したいという希望により、
レス番などを用いたユニークなファイル名に変換して、
サーバーへ保存する改造を行いました。
すると、ダウンロードする際に名前が変わってしまうので(当たり前ですよね;)
どうにかならないかとの希望が出て、どうすればいいか迷っています。

コメント文を保存しているファイルには、
『添付ファイルの元の名前』『サーバー保存用に変換している名前』も書き出しています。

添付ファイルのダウンロードは、単純に<a></a>で直接ファイル名を指定しております。
ダウンロードの際に、元のファイル名に変換するという事が出来るのでしょうか?
また他に何かいい方法があれば、お知恵を貸していただきたいのですが。
よろしくお願いします。
0154nobodyさん2006/09/28(木) 17:40:49ID:???
> また他に何かいい方法があれば、お知恵を貸していただきたいのですが。
> よろしくお願いします。

御社の出入り業者に発注すればよろしいのではないかと。
0155nobodyさん2006/09/28(木) 18:04:21ID:???
>>153
できるよ。
ファイル名に変換するんじゃなく、保存するときのデフォルトのファイル名を変えるってだけだけど。
0156nobodyさん2006/09/28(木) 18:09:05ID:???
簡単に言うとこうか
print "Content-Disposition: attachment; filename=\"$filename\"\n";
くわしくは ↑ でぐぐって。
0157nobodyさん2006/09/28(木) 18:31:39ID:???
日本語ファイル名だとさらにひとひねり必要だが、↑をぐぐってよく調べれば
その辺もわかるだろう。
0158nobodyさん2006/09/28(木) 18:58:11ID:???
http://www.google.com/search?num=75&hl=ja&rls=ja&q=Content-Disposition+attachment+filename&lr=lang_ja

なんか、ややこしいね
0159nobodyさん2006/09/28(木) 19:03:19ID:???
>>154-158
レスありがとうございます。
頭こんがらまくりですが、がんばって調べてみます。
でも多分、私なぞの頭では無理そうなので、
「出来ません!」と開き直る率高しです。(;´Д`)

>>154さんのご指摘の通り、
こんなHP担当もどきに頼まず、ケチってないで外注さんに依頼しろ!って感じです。
グチってもしかたないですがw

ありがとうございました!
0160nobodyさん2006/09/28(木) 21:27:50ID:???
> でも多分、私なぞの頭では無理そうなので、
> 「出来ません!」と開き直る率高しです。(;´Д`)

坊や頭大丈夫かい?
0161nobodyさん2006/09/28(木) 23:16:37ID:???
>>160
ああああ ごめんなさい。
書き方悪かったですね。
私に依頼してきた、社内の人にです。
私には分不相応ですので、ファイル名には気をつけてくださいと伝えるつもりです。
教えてくださった事は、勉強しています。
0162nobodyさん2006/09/29(金) 00:22:15ID:CoNVbZUT
$HOUSYUGAKU = "-892-4305-2940";
$KOSUU = "-4-1-2";
$GOUKEI_HOUSYUGAKU = "-3568-4305-5880";
$SYOHIN_CODE = "-CODEA-CODEB-CODEC";

@housygaku_list = split(/\-/,$HOUSYUGAKU);
@kosuu_list = split(/\-/,$KOSUU);
@goukei_housygaku_list = split(/\-/,$GOUKEI_HOUSYUGAKU);
@syohin_code_list = split(/\-/,$SYOHIN_CODE);

for($i = 0; $i < @housygaku_list; $i++) {
$TOTAL .= "&si=" . $housygaku_list[$i] . "." . $kosuu_list[$i] . "." . $goukei_housygaku_list[$i] . "." . $syohin_code_list[$i];
}

として、$TOTALの値を&si=892.4.3568.CODEA&si=4305.1.4305.CODEB&si=2940.2.5880.CODEC
としたいのですが、&si=...&si=892.4.3568.CODEA&si=4305.1.4305.CODEB&si=2940.2.5880.CODEC
となってしまいます。

どのようにすれば問題解消するでしょうか?
ご教授お願いします。
0163nobodyさん2006/09/29(金) 00:24:23ID:???
自宅サーバ板で聞いたら鯖関係なかったみたいなので
こちらで質問します

↓これ自分です
948 名前:DNS未登録さん :2006/09/26(火) 20:33:39 ID:szdp6kC6
質問です。ググッたけど分かんなかったです
環境はWinXP Home SP2 apache1.3.27

画像をアップロードして掲示板から参照するCGIを
作ったんですが、日本語ファイル名をSJISで
アクセスしようとすると、FORBIDDENになります

例えば
猫.jpgにhttp://%94L%2ejpgでアクセスできない
あ.jpgにはできる

ログを見ると罵.jpgにアクセスしようとしています
罵.jpgは%94l%2ejpgなので、SJISの2バイト目のL大文字がl小文字になってる事が
原因だと思うんですが、何か解決策はないでしょうか?

もしやWindowsが大文字と小文字区別しないから無理、とかですか?

どなたかお願いします


いただいたレスでLを%4Cにすればイイとあったんで
$filename =~ s/(\W)/'%' . unpack('H2', $1)/eg;
$filename =~ s/([A-Z])/'%' . unpack('H2', $1)/eg;
↑の様にして見ましたが結局%94%4c%2ejpgでアクセスしても
Apacheのエラーログに罵.jpgにアクセスしていると書かれます

これってこういうものなんでしょうか?
0164nobodyさん2006/09/29(金) 01:06:10ID:???
HTML に URL エンコードされた文字列を書くんじゃなくて、直接日本語ファイル名を HREF に書いてみ
01651632006/09/29(金) 01:24:30ID:???
レスありがとうです
猫.jpgにアクセスしてみたんですが同じでした

エラーログも
(2)No such file or directory: file permissions deny server access:
と出るのが気になります。なんでパーミッションエラー?
ファイル名が違うのなら404だと思うんですが…
0166nobodyさん2006/09/29(金) 06:55:52ID:???
うちの IEタン と Fxタン では %94L.txt 、 %94l.txt 両方とも普通に判別してできたけど?
何が違うんだろうねえ。
windows でも、たとえば 猫.txt と 罵.txt は同じフォルダに共存できてるので、そのせいじゃないっぽい気がするけどね。
もしかしたらブラウザのせいかもしれないよ。
0167nobodyさん2006/09/29(金) 10:12:37ID:???
向こうでも見たけど、普通にアクセス権がないだけとかじゃねーかよ。
0168nobodyさん2006/09/29(金) 10:44:20ID:???
あるあるwww
0169nobodyさん2006/09/29(金) 13:34:48ID:???
まじかよw
「Apacheのエラーログに罵.jpgにアクセスしていると書かれます」
が全てにおいてなってるって信じてそれは除外してたのにw
0170ソケット2006/09/30(土) 01:35:35ID:jL8SsxbP
次のコードでソケットが生成できないです。ヒントでも欲しい。。。
どうもサーバの問題な気もするけど。。。
$proto = getprotobyname('tcp');
unless($iaddr = Socket::inet_aton($host)){return;}
$sock_addr = Socket::sockaddr_in($port, $iaddr);
unless(socket(SOCKET, Socket::PF_INET, Socket::SOCK_STREAM, $proto)) {
print "error"; return;
}

でerrorになります。スクリプトはコピペじゃなくて手書きなので、
万一誤記があったら申し訳ありません。
ただし、問題のコードは別のレンタルサーバで動いていたので、
実機に誤記はないはずなんです。
$hostはlocalhostです。

環境:fedora core4 perl5.8
0171nobodyさん2006/09/30(土) 01:41:09ID:???
>>170
とりあえず、情報が少なすぎるので氏ね
0172ソケット2006/09/30(土) 01:51:07ID:jL8SsxbP
申し訳御座いませんでした。
perlのバージョン:5.8
インストールされているライブラリは多くて書き込めないのですが、
fedora core 4 の「サーバインストールモード」でインストールして、
その後sendmail-cf、qpopper、gccをrpmで入れました。

すみません。他にどんな情報が必要なのかが。。。
サーバ関係の板かな?
0173nobodyさん2006/09/30(土) 01:55:43ID:???
そんな断片的なコードで動く動かないと言われても、
誰も答えることができないよという意味。

ぼくのちんちんで彼女がイってくれません。どうしてでしょう?と同じだもん。

最小のテストコードで試して何が悪いか追求しましょう。
0174ソケット2006/09/30(土) 03:31:10ID:???
不快な思いをさせまして、すみませんでした。
追求してみます。
0175nobodyさん2006/09/30(土) 08:18:25ID:???
>ぼくのちんちんで彼女がイってくれません。どうしてでしょう?と同じだもん。
例えが素晴らしい
01761632006/09/30(土) 13:43:31ID:???
>>167-169
レスありがとうです

猫.jpgと 罵.jpgを同じフォルダに置いて
http ://%94%4c%2ejpgにアクセスすると罵.jpgが表示されます
しかもその際他の画像よりロードが長いです
また、http ://猫.jpgでも罵.jpgが表示できました

%94%4c%2ejpg→%94L%2ejpg→%94l%2ejpg→罵.jpg
こういう流れなのでしょうか…?
0177nobodyさん2006/09/30(土) 16:11:26ID:???
>>176
mod_encoding
スレ違い
0178nobodyさん2006/10/01(日) 12:28:14ID:???
正規表現に、ー(長音記号)を使うにはどうしたら
いいのでしょうか?
0179nobodyさん2006/10/01(日) 12:58:10ID:???
???
0180nobodyさん2006/10/01(日) 14:00:28ID:???
>178
日本語でおk
01811782006/10/01(日) 17:57:37ID:???
すみません。

perlのCGIでhtmlファイルを標準出力に出力しようとしています。
それでhtmlのformのvalueに「カラー」と入れています。
そしてCGI側で変数に
$color = "カラー";
としていて、$colorとマッチした行を書き換えたいのです。

それで
$line =~ s/$color/xxxxx/;
と書いているのですが、
htmlファイルが上手く出力されません。

この行をコメントアウトするとhtmlがすべて出力されるので
この行に問題があるようなのです。

■ このスレッドは過去ログ倉庫に格納されています