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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/11/26(日) 14:38:23ID:SlmGsFMB
Perlのコーディングで困ってる人のスレです。

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

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

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

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

前スレ http://pc8.2ch.net/test/read.cgi/php/1153987463/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0180nobodyさん2006/12/04(月) 18:24:06ID:???
>>178
で、いつ Perl の話になるんだ?ならないんだったらスレ違いだから。
0181nobodyさん2006/12/04(月) 21:26:59ID:???
こっちで、質問していいのかわかりませんが
ActivePerl Build 819 MSWin32
には、HTML埋め込み型のaspl(C:\Perl\eg\PerlEx\examples.aspl)とか
あるんですが

Apache(Linux系)とかでも、埋め込み型で動かせるのって
なかったでしょうか?
昔に、そんなのがあった気がするんですが
名前が思い出せなくて
01821812006/12/04(月) 21:29:45ID:???
すみません
思い出しました。
Embperlとかでした
0183nobodyさん2006/12/05(火) 00:10:37ID:???
$str = "AoUDqGrsqcUSgVGsCphafNXhkEtsfCcANeLDsTFq";
$str =~ s/[C-G][pqst]/1-9/g;
print $str;

置き換えたところ1から9と順に置きかえたいのですが
置き換えた部分すべて1-9と表示されてしまいます。
どの部分を変えればよいのでしょうか??
0184nobodyさん2006/12/05(火) 00:35:41ID:???
>>183
これがお望みのものか?

$str = "AoUDqGrsqcUSgVGsCphafNXhkEtsfCcANeLDsTFq";
$cnt = 1 ;
$str =〜 s/[C-G][pqst]/$cnt ++/eg ;
print $str . "\n" ;
01851832006/12/05(火) 00:43:04ID:???
>>184
すっげぇ簡単ですね・・・できない自分にショックです。
教えてくれてありがとうございます。
0186nobodyさん2006/12/05(火) 01:58:21ID:???
正規表現中でインクリメントって出来るのか
知らなかった (;゚Д゚)
0187nobodyさん2006/12/05(火) 02:21:49ID:???
まあPerlの正規表現に慣れると、PHPのpreg_なんとかって、てんでウンコだね。
0188nobodyさん2006/12/05(火) 02:23:05ID:???
画像を連続で出力する時、以下の場合だと画像名が同一で
後から送られてきた画像が上書きされてしまいます。

binmode(STDIN);
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'} );

print "Content-type: image/jpg\n\n";
open(IMG,">sample.jpg");
binmode(IMG);
print IMG $buffer;
close(IMG);

これを No1.jpg No2.jpg・・・のように連番で保存させたいのですが
どこを変えればいいのでしょうか?
よろしくお願いします。
0189nobodyさん2006/12/05(火) 04:54:50ID:???
初めてのperlの練習問題で、引数で指定したファイルの
最後の行から順番に表示するってのがあって、答えは納得できたのですが
↓でうまくいくのが、foreachをwhileにするとうまくいかない理由がわかりません
reverseがなければwhileでもエラー出ないのですが・・・
何故なんでしょうか?よろしくお願いします

foreach (reverse <>) {
chomp;
print "$_\n";
}
0190nobodyさん2006/12/05(火) 12:05:35ID:???
>>189
それ、あなたの期待する $_ もしくは @_ への代入が実行されてない。
以下が機能しないのと同じこと。
reverse 'foo' ;
print $_ . "\n" ;
print @_ . "\n" ;

reverse 関数は単独使用時に「左辺が指定されてなかったら $_ or @_ に代入する」
なんて機能を持ってない(つーか勝手にコンテキストの判断してもらっても困るw)。
foreach VAR ( LIST) BLOCK の場合は () 内のリストを暗黙の内に一個一個 $_ に
入れてくれるけど while ( EXPR ) BLOCK は、そんな器用なことはしてくれない。
() 内に条件式を必要とするだけ。
while ( <> ){ } は、あくまでも while ( defined ( $_ = <> ) ) { } の省略。

foreach と同一結果を得たければ、やはり一旦配列に突っ込むのが正攻法
@foo = reverse <> ;
while ( defined ( $_ = shift @foo ) ){ print $_ ; }

以下は見た目、正解っぽく感じるかも知れないが当然ダメ。
while ( defined ( $_ = reverse <> ) ){ print $_ ; }
別のお話しになってしまうので説明割愛。
0191nobodyさん2006/12/06(水) 00:09:51ID:???
>>186
> 正規表現中でインクリメントって出来るのか
> 知らなかった (;゚Д゚)

s/// 式の右部分は正規表現じゃないということも知らなかったんだね。ふぁいと。
0192nobodyさん2006/12/06(水) 00:57:09ID:???
…言われて見ればそうだね・・・orz
01931892006/12/06(水) 05:32:50ID:???
>>190
ありがとうございました
同じように使われることはあるけど
そもそも機能がかなり違うのですね
勉強になりました
0194nobodyさん2006/12/06(水) 17:53:32ID:???
$a = "1167354687","3546879867321","735246;
1 while $a =~ s/(.*\d)(\d\d\d)/$1,$2/;

配列の最初の部分しか出力されないのですがどうしたらよいでしょう?
0195nobodyさん2006/12/06(水) 18:14:05ID:???
配列について勉強し直してはどうかな。
0196nobodyさん2006/12/06(水) 19:17:48ID:???
>>191-192
わかってると思うけど、式が評価されるのは /e オプションの効果です。
ただ単に右部分に式書いても評価されないので注意。

>>194
まず書いたスクリプトが動くかどうか確かめましょう。
0197nobodyさん2006/12/06(水) 23:57:05ID:???
ブラウザ上で更新したcsvファイルを
即時別のサーバーへftp接続してアップロードしたいと思っています。
サーバーにNet::FTPをインストールすることができない状況で可能ですか?
良い手があれば教えてください。
サーバーのOSはSolaris9、CGIバージョンは5.8.8です
0198nobodyさん2006/12/07(木) 00:53:15ID:???
flockについて質問です。

x.cgiを
open(OUT,"+<$file") ;
flock(OUT, 2);
@data = <OUT>;
#close(OUT); closeしません。

ブラウザでx.cgiをcloseしないで処理終わりました。
違うブラウザでx.cgiを実行したんですが、flockで止まりませんでした。

x.cgiのプロセスが終わると、flockはcloseしなくても
解除されるんでしょうか?
ループとかさせて、プロセスが生きてたりすると
x.cgiのflockで止まりますか?

よろしくお願いします。
0199nobodyさん2006/12/07(木) 01:38:36ID:???
プロセスがexitする時、全てのファイルはcloseされる。
0200nobodyさん2006/12/07(木) 01:41:43ID:???
プロセスが死ねばロックも解除されます
で、flockはアドバイザリなのでflockを使ってないプログラムなどからは問答無用で読み書きできます
0201nobodyさん2006/12/07(木) 07:35:05ID:???
たとえプロセスが死んでなくても再びopenされるときにcloseされます
0202nobodyさん2006/12/07(木) 11:11:15ID:SekHzZx8
shift JISのページに設置したテキストボックスのボタンを押すと、euc-jpのページ
で使われている検索エンジンにジャンプし検索結果を表示したく思います。
今のままですと、文字化けが起きてしまいます。

(HTMLソース)
<form method="POST" action="http://www.hogehoge.co.jp/cgi-bin/search/"; target="_blank">
<input type="text" name=textdata size="20">
<input type="submit" name=botan value="Search">
</form>


文字化けがしないようperlプログラムをかませて、shift JISに変換してから変換させたい
のですが、どのようなコードを書いたらよいでしょうか?
0203nobodyさん2006/12/07(木) 11:26:48ID:???
Encodeで変換後にURLエンコードしてリダイレクトが簡単かと思う
0204nobodyさん2006/12/07(木) 11:27:17ID:???
テンプレぐらいは読みましょう
こっちのスレのほうがオススメ
http://pc8.2ch.net/test/read.cgi/php/1145308869/
0205nobodyさん2006/12/07(木) 12:06:04ID:???
>>203-204
ありがとうございます。
0206nobodyさん2006/12/07(木) 16:35:47ID:???
>>200
そうなのか。
それは知らなかった…。

質問なのですが、

・Perl で flock したファイルを php で読み書き。
・php で flock したファイルを perl で読み書き。
・test1.cgi で flock したファイルを test2.cgi で読み書き。

この場合って、正常にロックはされるのでしょうか。
0207nobodyさん2006/12/07(木) 16:40:00ID:???
>>206
flockがちゃんと動作する環境で正しくプログラムかけば。
02082062006/12/07(木) 16:53:51ID:???
>>207
なるほど
私はflockがちゃんと動作する環境で正しくプログラミングしていると思われるので大丈夫ですねb

安心致しました^^
0209nobodyさん2006/12/07(木) 18:20:59ID:???
>>199
>>200
>>201
お礼遅れました。
flockわかりました。
ありがとうございました。
0210nobodyさん2006/12/07(木) 20:53:15ID:???
WindowsXP上でコマンドプロンプトを作業ディレクトリの指定なしに起動させて、
プロンプトに最初から C:\DOCUME~1\user\デスク~1> となっているときに
perl -MCwd -e "print cwd"
とすると、C:/DOCUME~1/user/デスク~1 を返すのですが、
C:\DOCUME~1\user\デスク~1> cd "C:\Documents and Settings\user\デスクトップ"
C:\Documents and Settings\user\デスクトップ> perl -MCwd -e "print cwd"
とすると、C:/Documents and Settings/user/デスクトップ を返してしまいます。
これを、常に C:/DOCUME~1/user/デスク~1 を返して欲しいのです。
どなたかご存じでしょうか。
0211nobodyさん2006/12/07(木) 21:02:43ID:???
>>210
perl -MWin32 -MCwd -e "print Win32::GetShortPathName(cwd)"
でも何に使うの?
02122102006/12/07(木) 21:52:30ID:???
>>211
おお素晴らしい。ありがとうございます。
ファイルメーカーPro内で外部コマンドを呼べる外部関数(Peta-Execute)があるんですが、
この中で短いパスで呼ばないとコマンドが動かないみたいなんです。長いパス付のコマンド
(というかperlの第一引数となるplファイル)にダブルクォーテーション付で呼んでも動作しなかった
ものですから。Winの問題なのか、関数の問題なのか、ファイルメーカーProの問題なのかわからず、
今試行錯誤中です。
0213nobodyさん2006/12/07(木) 23:14:06ID:SekHzZx8
perlの質問になるか微妙なところですが、


<form method="POST" action="hogehoge.cgi" target="_blank">
<input type="text" name="text_name" size="25">
<input type=submit name="img_botan" value=OK>
</form>

↑のボタン(type=submit)を↓のようにして、同じ機能を持たせるには、
formタグ内をどのように変更したらよいでしょうか?
<input type="image" name="img_botan" value="OK" src="hogehoge.gif">


「type="image"」で作成してしまうと、postで上のデータを受け取った時
img_botanのvalue値の「OK」が受け取れない状況です。
0214nobodyさん2006/12/07(木) 23:17:11ID:???
ボタン → button
まず英単語からな
0215nobodyさん2006/12/07(木) 23:30:43ID:???
>>213
微妙どころか全然Perlから離れとるがな(´・ω・)

<input type="hidden" name="img_botan" value="OK">
<input type="image" src="hogehoge.gif">
0216nobodyさん2006/12/07(木) 23:56:27ID:???
submitはnameの値を見るといいよ
0217nobodyさん2006/12/08(金) 09:56:10ID:ewFyIfPg
http://www.matubusi.com/cart/cgi-bin/kaitori.cgi?id=5
ここの買取口数とメールフォームの口数を買い取り口数にマイナスする計算の連動
似たようなスクリプトありませんか?もしくは作れますか?
よろしくお願いいたします
0218nobodyさん2006/12/08(金) 10:03:05ID:???
やりたいことをもっと具体的に書け
0219nobodyさん2006/12/08(金) 10:48:17ID:joMMTMjE

<form method="POST" action="hogehoge.cgi" target="_blank">
<input type="text" name="text_name" size="25">
<input type=submit name="img_button1" value=action1>
<input type=submit name="img_button2" value=action2>
</form>

↑のボタン(type=submit)を↓のようにして、同じ機能を持たせるには、
formタグ内をどのように変更したらよいでしょうか?
<input type="image" name="img_button1" value="action1" src="hogehoge1.gif">
<input type="image" name="img_button2" value="action2" src="hogehoge2.gif">

「type="image"」で作成してしまうと、postで上のデータを受け取った時、
「img_botan1」のvalue値の「action1」と
「img_botan2」のvalue値の「action2」が受け取れない状況です。


>>215
すみません、質問が悪かったです。
1つのform内でしたらhiddenを使えば解決するのは分かってました。
ごめんなさい。
0220nobodyさん2006/12/08(金) 11:25:23ID:???
>>219
もともとイメージマップの機能だから値はボタンを押したときの画像内でのマウス
カーソルの座標が送られてくるんじゃなかったっけ。どのボタンかを識別する
用途ならnameを一意につけて値のありなしだけ判定すれば分だと思われる。
0221nobodyさん2006/12/08(金) 14:19:44ID:???
>>220
ありがとうございました!
0222nobodyさん2006/12/08(金) 14:31:08ID:???
YouTubeの動画掲示板を作ろうと思ってます
例えば書き込みの際、動画場所を
http://www.youtube.com/watch?v=2m0P-Q0joxU
のように指定させます。

そこからflvと再生待ち画像のパラメータを取得したいのですが

$url= http://www.youtube.com/v/2m0P-Q0joxU
#↓(ここに飛ぶ)
$url= http://www.youtube.com/p.swf?video_id=2m0P-Q0joxU&eurl=&iurl=http%3A//sjc-static6.sjc.youtube.com/vi/2m0P-Q0joxU/2.jpg&t=OEgsToPDskKKNZHbTD7d-oE2My88f86P

のように飛び先のアドレスに変換するにはどうしたらいいのでしょうか?
分かりづらくてすいません。
02231/22006/12/08(金) 15:14:42ID:EPvPWdgJ
すみません、質問させてください。

ttp://www.nishishi.com/cgi/tinyurl/
ここのcgiを設置したのですが、設定ファイルをfileopenする所でエラーになるようです。
(配布されている状態のままアップすれば動くはずなのですがエラーになりました)

原因としては何が考えられるでしょうか?

環境:Windows IIS 6.0
   Activeperl 5.6.1
02242/22006/12/08(金) 15:15:52ID:???
多分ここでエラーになっていると思うのですが↓

# -------------------------- #
# データの読み込みと一致確認 #
# -------------------------- #
sub checkdatas
{
  my $checkstring = shift @_;
  # データファイルを呼んで一致項目を探す
  my $redurl = "";
  if( open(IN,"$datafile") ) {
    foreach my $oneline ( <IN> ) {
      if( $oneline =~ m/^$checkstring,(.*)/ ) {
        # 見つかったらループを抜ける
        $redurl = $1;
        last;
      }
    }
    close(IN);  # ファイルを閉じる
  }
  else {
    # 読めなかったらエラー
    &errorexit("設定ファイルが読み込めませんでした。");
  }
  return $redurl;
}

-----
よろしくお願いします。
0225nobodyさん2006/12/08(金) 15:50:17ID:???
>>223
作者に聞けよ・・・
02262232006/12/08(金) 16:13:02ID:???
すみません。質問書いた直後に自己解決しましたorz
サーバの設定により、設定ファイルのパスをフルパスで設定する必要があったようです。
お騒がせ&スレ汚しすみませんでした。。。
0227nobodyさん2006/12/08(金) 17:01:59ID:???
>>222
マルチポスト乙
0228nobodyさん2006/12/09(土) 03:02:11ID:MKj32g5X
質問です。
perlのセッション管理について教えてください。
CGI::Sessionモジュールでセッション管理を行おうと思っているのですが、このソースでセッションがブラウザに表示されるのですが、
セッションが/cgi-bin/sessionフォルダに保存されません。
コマンドラインで perl session.cgiと実行すると正常にセッションが保存されます。
どなたか解決法教えて頂けませんか。

session.cgi
#!/usr/bin/perl
use strict;
use CGI;
use CGI::Session;

my $cgi=new CGI;
my $session=CGI::Session->new(undef,$cgi,{Directory=>'./session'});
$session->expire('+10m');

my $cookie=$cgi->cookie(-name=>"CGISID",
-value=>$session->id(),
-expires=>"+30m");
print $cgi->header(-charset=>'euc-jp',
-cookie=>$cookie),

$cgi->start_html('セッションテスト'),
$cgi->h1($session->id);
print $cgi->end_html;

コマンドラインで perl session.cgiと実行するとセッションIDが作成されますが、ブラウザで実行するとなぜか生成されません。
どなたか教えて頂けませんか。
0229nobodyさん2006/12/09(土) 03:05:44ID:MKj32g5X
すいません最後の2行間違いです 読み飛ばしてください;;

ブラウザだとセッションが保存されなくて困っています。
0230nobodyさん2006/12/09(土) 11:36:47ID:???
セッションディレクトリをフルPATHで書いてみて
0231nobodyさん2006/12/09(土) 17:43:35ID:???
セッションフォルダに書き込み権が無いんでしょ。
0232nobodyさん2006/12/09(土) 21:29:28ID:???
>>222
↓のスレッドにレス付けておきました。

Perlについての質問箱 28箱目
http://pc8.2ch.net/test/read.cgi/tech/1162273941/
0233nobodyさん2006/12/10(日) 11:50:46ID:Mfd0yjZD
Perlのオブジェクト指向について、インスタンスの変数名は何にしてる?例えば、日付取得モジュールで言うと、

例1:my $date = new Date;
例2:my $date_ins = new Date;
例3:my $date_obj = new Date;

例1だと、日付を格納する変数名と被るから、別の名前にしようと思うんだけど・・・
みなさんのご意見をお聞かせ下さい(´・ω・`)
0234nobodyさん2006/12/10(日) 13:38:22ID:???
コーディングの質問をどうぞ
スタイルはご自由に
0235nobodyさん2006/12/10(日) 14:14:09ID:???
1か3が好み。間接オブジェクトはやめれ。
$date = Date->new;
$data_obj = Date->new;
0236nobodyさん2006/12/10(日) 14:16:42ID:???
my($nam, $date, $name, $email, $d_may, $comment, $url, $font, $ico, $type, $del, $ip) = split(/<>/, $line);

上のようなコードで、$date を受け取れますが、$date のみを受け取りたい場合にはどうすれば良いのでしょうか?

他を $hoge とかにすればいいという考えもできますが、それだと一度変数にいれるという処理が無駄であり
高速で処理をしたいので処理速度低下に繋がると思います。

シンプルな方法があれば教えて下さい。

たしか、変数部分に何かの定義済み定数をいれたら、その部分を受け取らないということになったようなきがしたんですが、
忘れてしまいましたorz
0237nobodyさん2006/12/10(日) 14:28:59ID:???
my $date = ( split /<>/, $line )[1];

my( undef, $date ) = split /<>/, $line;

my( undef, $date, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef) = split /<>/, $line;
02382362006/12/10(日) 14:34:16ID:???
>>237
なるほど
undef でしたか…。
こんなに早く回答をいただけるとは幸いです。
ありがとうございました。
0239nobodyさん2006/12/10(日) 15:35:39ID:???
perlのcryptが異常に遅いのですが、なんとかならないでしょうか?

今時貧民的プログラミングをする必要はない、ログやロジックはシンプルにした方が良い、と思って掲示板作ったんですが、
速度が異常に遅いんです。

原因調べたら、掲示板のID生産のために crypt を使っているのですが、そこがとっても遅いんですね。
それを外したら100倍近いスピードに。

ようするにIPからIDを生成のために crypt を使っているんですが、表示のたびに全員分の生成をするので時間がかかるんです。
高速で実行できる crypt モジュールみたいのはないでしょうか?


0240nobodyさん2006/12/10(日) 15:48:35ID:???
> 表示のたびに全員分の生成をするので
書き込み時にcryptも作ってログに書けばおk。
time→書き込み日時も同様。

もしくは、ある程度ユニークな文字列が得られればそれで良いというのなら
cryptなんて使わなくても自分で適当なサブルーチン組めばいい。
02412392006/12/10(日) 15:53:23ID:???
>>240
> 書き込み時にcryptも作ってログに書けばおk。
やっぱそうですよね(´・ω・`)

もう完成しちゃったし使用を開始しているので既にログがある状態なんです

・ファイルを読み取ってIDをファイルに書き込むプログラムを作る
・それを使って既にあるログにIDを追加する
・掲示板CGIへの投稿時にログにIDを追加するようにする

面倒ですが上の手順でやってみます

0242nobodyさん2006/12/10(日) 16:04:54ID:???
ログが永遠に保存されるような構造でないなら
・新規の書き込みにはcryptでID情報を追加
・既存のID無しログはいちいちcryptするか適当な嘘IDを表示
というようにしておけばそのうち古いログが流されて問題なくなるよ。

なお、ログの修正をするのなら一度落としてきてローカルでやるように。
02432392006/12/10(日) 16:15:27ID:???
>>242
なるほど…

ログは永久保存な仕様なんです
なので諦めてログ修正することにします

ローカルにはPerlとかインスコされてなくて面倒なので鯖でやることにします
専鯖なので負荷は余裕です>A<
0244nobodyさん2006/12/10(日) 16:27:25ID:???
> ローカルにはPerlとかインスコされてなくて面倒なので鯖でやることにします
> 専鯖なので負荷は余裕です>A<

(゚Д゚)ハァ?

俺の中に僅かに芽生えていたこいつに協力しようという感情が消滅した。
後はもう勝手にやってくれ。
0245nobodyさん2006/12/10(日) 16:28:14ID:???
2chの特定の板の全datファイルを定期的に取得したいのですが、参考になるサイトはありませんか?
2chに負荷がかからないように、差分のみを取得するようにしたいのですが。
0246nobodyさん2006/12/10(日) 16:53:29ID:???
>>245
それで何をしたいのかにもよる。
0247nobodyさん2006/12/10(日) 16:58:21ID:???
>>244
別にどっちでやったって関係なくね?
一度DLする意味が何処にあるんだろうか
0248nobodyさん2006/12/10(日) 19:12:06ID:???
>>245
差分取得の参考にでもして。
ttp://makegumi.no-ip.info:8080/src/makegumi1702.lzh.html
ハナモゲラ追加すれば今でも使えるはず。
板のdat取得は、subject.txtよめばいだけだから。
0249nobodyさん2006/12/10(日) 22:53:28ID:???
ファイルを開いて、中身を全部一旦取り込むっていうのは
open(EN,"hoge.txt");
@old = <EN>;
close(EN);
これで@oldにファイルの中身(複数行)全て入ってますよね・・・?
リファレンス見ていたら益々分からなくなってきた(´△`;)

hoge.txtの中身をhoge2.txtに移すっていうのをやりたいのだけど
・・・動かねぇorz
0250nobodyさん2006/12/10(日) 23:05:46ID:???
my $buff;
open(EN,"hoge.txt");
read(EN, $buff, (-s EN));
close(EN);
でもおk
0251 ◆TWARamEjuA 2006/12/10(日) 23:48:32ID:????BRZ(6677)
qx|cp hoge.txt hoge2.txt|;♪
File::Copyとかとか♪
0252nobodyさん2006/12/11(月) 01:30:10ID:???
>>250
レスありです。
読み込んだ@oldを新たなファイルに書こうとすると
1行しか書かれず。。。

もう訳が分からないのでシンプルにファイルリネームで対応しました・・・。
0253nobodyさん2006/12/11(月) 01:31:19ID:???
そんなヴァカな…
読み込み&書き込みらへんのソース晒してみて
0254nobodyさん2006/12/11(月) 16:28:57ID:???
某Osの某ブラウザで掲示板投稿すると「~」が全角に変わってしまいます
問題はurlのリンク記載なので修正すればいいと思うのですが、これがうまくいきません

以下の自動リンクの正規表現の置換部分で、リンクの記載内に「〜」がある場合、
強制的に「~」にする方法をご指導ください

$tmp_data =~ s/(https?\:\/\/[^\s|\:|\<]+)\.(\/?)([\-_\.\!\~\*\'\(\)a-zA-Z0-9\;\/\?\:\@\&\=\+\$\,\%\#]*)/<A HREF="$1.$2$3$4" TARGET="_blank">$1.$2$3$4<\/A>/ig;

0255nobodyさん2006/12/11(月) 17:28:11ID:???
そんなマジカルなブラウザがあるのか
0256nobodyさん2006/12/11(月) 18:27:02ID:???
はい、林檎さんの正妻です
0257nobodyさん2006/12/11(月) 18:44:20ID:???
マジカルっつーか、Safariを始めとするOS Xの一部ブラウザでは
Shift_JISのHTMLで書かれたフォームから送信すると
そういう不具合が起こることがある。
Shift_JISとユニコードの変換を厳密にやりすぎるからとか
どこかで読んだような気もするがどこだったかは忘れた。

まあ「safari チルダ」あたりでググると対処法とか色々出てくるよ。
0258 ◆TWARamEjuA 2006/12/11(月) 19:51:49ID:????BRZ(6677)
んじゃ妾ってとこか?@FireFox(lzyc)
0259nobodyさん2006/12/11(月) 19:58:53ID:???
くぐりました、今のところ良い方法が見あたりません
また探してはみます
利用者にあれこれさせるのは難しいので、置換部分の
アドバイスがありましたら宜しくお願いします
0260nobodyさん2006/12/11(月) 21:26:03ID:???
ググれば置換に関する情報も出てくるはずだけどな。

ていうかShift_JISでフォームを書かなきゃいいんじゃね?
0261nobodyさん2006/12/11(月) 23:07:25ID:???
検索文字列で 〜 にマッチするようにして、
置換文字列を make_link みたいな関数にして /e で評価する。
その関数の中で 〜 → ~ の変換を行う。とか。

sub make_link {
  my $url = shift;
  $url =~ s/〜/~/;
  return qq{<A HREF="$url" TARGET="_blank">$url</A>};
}

$tmp_data =~ s/(https?\:\/\/[^\s|\:|\<]+)\.(\/?)([\-_\.\!\~〜\*\'\(\)a-zA-Z0-9\;\/\?\:\@\&\=\+\$\,\%\#]*)/ make_link("$1.$2$3$4") /ieg;
0262nobodyさん2006/12/11(月) 23:27:08ID:???
>>260
だめでした
>>261
いろいろ考えましたが、私とは次元が違いますね
凄い
有り難うございます
0263nobodyさん2006/12/12(火) 03:31:20ID:???
multipleの受け取り方教えてください。
$name=$FORM{'name'};
のように、nameを受け取ったとして、
複数選択されてるときhogeは、
どんな風に受け取ればよいでしょうか。
$hoge=$FORM{'hoge'};
ってすると、$hogeの値はhoge2になっているみたいなんです。
hoge1も受け取りたいのですが。

<INPUT type="text" size="20" name="name" value="">
<select size="〜" name="hoge" multiple>
<option value="hoge1" selected>hoge1</option>
<option value="hoge2" selected>hoge2</option>
</select>

よろしくお願いします。
0264nobodyさん2006/12/12(火) 05:19:33ID:???
CGI.pm使えば配列で取得できる
0265nobodyさん2006/12/12(火) 05:50:23ID:???
>>264
ありがとうございます。
先ほど、CGI.pmで取得の仕方を解説してる
ページ見つけました。
動きが全然想像できないです。

CGI.pm使ってない方法検索しております。
よろしくお願いします。

0266nobodyさん2006/12/12(火) 09:42:44ID:???
$forms{$name} = $val;
って感じで入れてると思うけど、簡単に書いちゃうと

if(deinfed($forms{$name}){
  $forms{$name} .= "\0" . $val;
}else{
  $forms{$name} = $val;
}

のようにして、取り出すときは

my @tmpdata = split(/\0/, $forms{'hoge'});

とすれば複数選択したデータが @tmpdata に入ります。
ただしバイナリデータに対しては有効な技じゃないし、入力されたデータに対して \0 の存在をチェックし
エスケープしてやるなどの対策も考慮してください。

バイナリデータとか不正なデータをとりあえず無視して動作を確認したいなら上記可能。 なはずです
0267nobodyさん2006/12/12(火) 10:31:41ID:???
複数値を受け取るのは $FORM{'hoge'} だけと決まってるんだったら
配列に叩き込むほうが手っ取り早いしわかりやすいのかも。

if ($name eq 'hoge') {
  push @hoge, $value;
} else {
  $FORM{$name} = $value;
}

>>266 =~ s/deinfed/defined/ のcgi-lib.pl方式でもいいし、あとは質問者さんの好みで。
0268nobodyさん2006/12/12(火) 10:50:06ID:???
なかなか面白い間違いをしてたなorz
訂正thx
0269nobodyさん2006/12/12(火) 10:54:18ID:???
肝心なことが書き込まれてないが
hoge=hoge1とhoge=hoge2が順番に送られてくる
受け取ったものがhoge=hoge2になってるのは順番に同じ変数に入れてるから。
$hoge='hoge1';
$hoge='hoge2';
print $hoge;
こうなってるので後はどうするかは受け取り側で変えればいい。
0270nobodyさん2006/12/12(火) 20:02:31ID:???
関数の引数に配列を使った場合、配列のn番目ってどう指定すればいいんですか?
例えば
&func(@list1,@list2);

としたら、funcの中で$list1[4]とか$list2[6]とかを参照したいんです。
0271nobodyさん2006/12/12(火) 20:12:36ID:???
すればいいじゃない
0272nobodyさん2006/12/12(火) 20:48:08ID:???
ヒント:
&func(\@list1, \@list2);
0273nobodyさん2006/12/12(火) 21:16:11ID:???
>>270
&func( \@list1, \@list2 );

sub func {
  my( $list1, $list2 ) = @_;
  $$list1[4];
  $$list2[6];
}
0274nobodyさん2006/12/12(火) 21:23:56ID:???
考えることをさせるためにヒントだけにしたのに…
0275nobodyさん2006/12/12(火) 21:50:20ID:???
mkdir "foo/bar/baz"
ってやったときに、foo/barが存在しないとエラーで死ぬんだけど、再帰的に掘ってくれるような
モジュールってない?ないんなら自前で組んでもいいけど、あるんなら再発明したくないし。
0276nobodyさん2006/12/12(火) 22:12:56ID:???
sub mkdir2{
my @subdirs = split(/\/, shift);

my $curdir = curdir();

foreach my $subd (@subdirs){
  mkdir $subd if !-e $subd;
  chdir $subd;
}

chdir($curdir);
}
0277nobodyさん2006/12/12(火) 22:14:40ID:???
>>269
嘘こけ、順序は保証されてねーぞ。ブラウザの実装依存。
0278nobodyさん2006/12/12(火) 22:18:53ID:???
こんなモジュールしかねえや
ttp://search.cpan.org/~stevan/Tree-Simple-VisitorFactory-0.10/lib/Tree/Simple/Visitor/CreateDirectoryTree.pm
0279nobodyさん2006/12/12(火) 23:15:54ID:???
>>275
`mkdir -p foo/bar/baz`とかじゃ嫌?
0280nobodyさん2006/12/12(火) 23:16:19ID:???
>>275
File::Path
■ このスレッドは過去ログ倉庫に格納されています