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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/05/25(水) 06:36:28ID:PVpWgcdf
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0220nobodyさん2005/06/05(日) 00:02:38ID:???
ありがとう!
0221nobodyさん2005/06/05(日) 00:43:39ID:???
printf "%.2f",12345678/1024/1024;
0222nobodyさん2005/06/05(日) 04:55:26ID:???
それ切り捨てじゃないし
0223nobodyさん2005/06/05(日) 13:21:23ID:???
変数名なんとかしろよw
0224nobodyさん2005/06/05(日) 15:28:16ID:???
質問があります。
↓のような場合で、

for($i=0;$i<=10;$i++){
$po[$i] .= int(rand(6));
}

これはあくまで例なのですが、似たような場合などでも、
randで選ばれる数字が同じものが続けて入ってしまう事が良くあるのですが、
これをもっとばらけさせたいのですが、何か方法があるのでしょうか?
上手く説明できずにすみませんが何卒よろしくお願いします。
0225nobodyさん2005/06/05(日) 16:27:58ID:???
>>224
0〜5までの数字から完全にランダムに選んだ場合、
直前と同じ数字になる確率は1/6もあるわけで、
10回も続けてやれば一度でも同じになる確率は
8割以上だからまあ当たり前だろうな...

同じ数字が続くのがいやならひとつ前の数字を
保存して同じ数字にならないように細工すりゃ
いいんじゃねーの。

お手軽コース:
同じ数字の間はやり直す

少し考えたコース:
0〜4までの乱数を求めて、前の数字と等しいか
大きければ1を加える。

0226nobodyさん2005/06/05(日) 16:42:19ID:???
>>224
コード書いてみたがね。
同じ数字が並びそうなら振りなおすなも。

my @numbers;
my $last = $num = -1;
for(my $i = 0; $i <= 10; $i++){
$num = int(rand(6)) while($last == $num);
$numbers[$i] = $last = $num;
}
print @numbers;

# 11回振ってるようだが、いいんきゃーも?
0227nobodyさん2005/06/05(日) 18:10:57ID:???
WindowsのMySQL+DBIの使い方で困ってます。詳しい方、教えてくれないでしょうか。

下のテーブルをセレクトしたいだけなんですが、mysqlのコマンド上ではちゃんと表示される日本語がPerlで出力させるとクエスチョンマークで表示されてしまいます。

↓こういう風に表示させたい。
>2005-06-05 17:27:47<>0<>ニュースタイトル!<
>2005-06-05 17:27:48<>0<>news title!<

↓こういう風になってしまう。
>2005-06-05 17:27:47<>0<>?????????<
>2005-06-05 17:27:48<>0<>news title!<

どうやったら日本語を出力できるんでしょうか。どなたかご教授お願いします。m(__)m

◆ソース(perl v5.8.6)
$dbh = DBI->connect("DBI:mysql:$dbname", $dbuser, $dbpass, {PrintError => 0, RaiseError => 0, AutoCommit => 0});
$datasp = $dbh->selectall_arrayref(q{
SELECT * FROM NEWS
});
for($n = 0; $n < scalar(@$datasp); $n++){
printf(">%s<>%s<>%s<\n",$datasp->[$n][0], $datasp->[$n][1], $datasp->[$n][2]);
}
0228nobodyさん2005/06/05(日) 18:11:25ID:???
上の続き・・・

◆テーブル
| NEWS_DATE       | NEWS_IMPORTANCE | NEWS_TITLE     |
| 2005-06-05 17:27:47 |                 0 | ニュースタイトル! |
| 2005-06-05 17:27:48 |                 0 | news title!      |

◆DBステータス
mysql Ver 14.7 Distrib 4.1.12a, for Win32 (ia32)
Connection id: 1
Current database: testdb
Current user: root@localhost
SSL: Not in use
Using delimiter: ;
Server version: 4.1.12a-nt
Protocol version: 10
Connection: localhost via TCP/IP
Server characterset: sjis
Db characterset: sjis
Client characterset: sjis
Conn. characterset: sjis
0229nobodyさんNGNG
前回と同じ値だからといって再度乱数を発生させると、ループがかさばる可能性もあるですよ。

my @dice_seed = (1..6);
my @dice_rand;
for(reverse (0..$#dice)){
push @dice_rand, splice @dice_seed, rand $_, 1;
}
みたいな。。。
0230nobodyさん2005/06/05(日) 19:24:15ID:???
>>227
たぶんこれ。オレも以前はまった。

ttp://www.mysql.gr.jp/frame/modules/bwiki/?FAQ
の「mysql コマンドでは大丈夫なのに、PHP,perl,accessなどで文字が ? に化けるのは? 」
02312272005/06/05(日) 20:35:05ID:???
>>230
ログイン直後に SET NAMES sjis を追加したらできました!
ありがとう!!!
もう、perlあきらめてphpで開発しようかと思ってたら
phpでも同じだったんですね・・・

◆ソース(変更後)
$dbh = DBI->connect("DBI:mysql:$dbname", $dbuser, $dbpass, {PrintError => 0, RaiseError => 0, AutoCommit => 0});
$dbh->do('SET NAMES sjis');    # ←追加
$datasp = $dbh->selectall_arrayref(q{
SELECT * FROM NEWS
});
for($n = 0; $n < scalar(@$datasp); $n++){
printf(">%s<>%s<>%s<\n",$datasp->[$n][0], $datasp->[$n][1], $datasp->[$n][2]);
}
0232 ◆5KhTfX3Q0E 2005/06/05(日) 23:16:56ID:???
はじめまして、よろしくお願いします。

1: HTMLを取得して例えば
<A href="http://www.**.co.jp/~sample/image/a.jpg">
<A href="image/a.jpg">
<A href=http://www.**.co.jp/~sample/image/a.jpg>
<A href=image/a.jpg>
とあるものをすべて
<A href="http://www.**.co.jp/~sample/image/a.jpg">
に統一したい。
2:
$url = $ENV{'QUERY_STRING'};
$url =~ s/$0//gi;
$surl = $url;
if($surl !~ /\/$/){$surl =~s/(.*)\/.*/$1\//i;}
use LWP::Simple;
$html = get $url;
&jcode'convert(*html,'sjis');
#携帯で見れるようにしたいのでテーブル等不要と思われるものを削除
#出来ればここも1行に統一できればうれしいです
$html =~ s/<(?:TABLE|TD|TR|TH|script|TBODY|font|B|U|I|center|form|dl|dt).*?>//gi;
$html =~ s/<\/(?:TABLE|TD|TR|TH|script|TBODY|font|B|U|I|center|form|dl|dt).*?>//gi;

3: 相対パスと絶対パスの相互の方法がまったく思い浮かばずにいます

これぐらいでよろしいのでしょうか。よろしくお願いいたします。
0233nobodyさん2005/06/06(月) 01:24:14ID:???
>232
>これぐらいでよろしいのでしょうか。
もう少しやりたいことと何が問題なのかを整理して書いてくれ。
1と3って同じことだと思っていいのか?
とりあえず hoge/./ を取り除いたりまではしてない。

my $server = 'http://www.example.com'; # サーバのところまで
my $base = 'http://www.example.com/~sample/'; # 相対パス起点

sub absolute($)
{
my $str = shift;
$str =~ s/^"//;
$str =~ s/"$//;
if($str =~ m,^/,) {
return qq("$server$str");
} elsif($str =~ m,^http://,) {
return qq("$str");
} else {
return qq("$base$str");
}
}

$target =~ s,(<A[^>]*\s+href=)("[^"]*"|\S*)([^>]*>),$1.absolute($2).$3,eigm;

2: まとめればいいんだな?
$html =~ s/<\/?(?:TABLE|TD|TR|TH|script|TBODY|font|B|U|I|center|form|dl|dt).*?>//gi;
個人的には
$html =~ s,</?(?:TABLE|TD|TR|TH|script|TBODY|font|B|U|I|center|form|dl|dt)[^>]*>,,gi;
の方が好きだな。
0234nobodyさん2005/06/06(月) 01:26:42ID:???
>233
$target =~ は $html =~ だと思ってくれ。
0235nobodyさん2005/06/06(月) 01:31:08ID:???
>232
度々申し訳ない。>>1 のテンプレ?に合わせようとしてたんだな。
でもやっぱり何が問題なのか、どこがポイントなのかを整理して欲しいとは思う。
0236nobodyさん2005/06/06(月) 14:15:56ID:nLjgLi0T
質問させてください。
flockを使わずにflockと同じ動作する方法って、ありますか?
0237nobodyさん2005/06/06(月) 14:29:00ID:???
そうさなあ。あれは何年前のことじゃったか…。
0238nobodyさん2005/06/06(月) 15:25:52ID:???
なにもかも、懐かしい思い出じゃった…
0239nobodyさん2005/06/06(月) 15:44:24ID:???
>>236
【Perl】ファイルロック(排他処理)について語ろう
http://pc8.2ch.net/test/read.cgi/php/1024795138/
0240nobodyさん2005/06/06(月) 23:17:43ID:???
本当になつかしい
0241nobodyさん2005/06/06(月) 23:52:50ID:7fi2eBpp
実行ボタンクリックすると、フォーム内のデータをファイルに書き込むと言う
多分超簡単なものを作ってます。

ファイルをオープン後
$buff=<DAT>;
@buff=<DAT>;
としました。
これは、データの1行目と全てのデータを表示させたかったからなのですが
どうやら上記のように書くと@buffには、$buffを除いたものしか入ってこないようです。

簡単に、データの1行目、1行目を含む全データを格納したいのですが
どうしたらいいでしょうか。
0242nobodyさん2005/06/06(月) 23:58:16ID:???
@buff=<DAT>;
$buff=$buff[0];
02432412005/06/07(火) 00:07:20ID:???
>>242
なるへそ…出来ました!
アザース!!!
0244 ◆5KhTfX3Q0E 2005/06/07(火) 00:12:36ID:???
>>233
できました、ありがとうございます
整理できていなくてすいませんでした
いまさらですが整理というか用途を書きますと

携帯からこのcgiにアクセスし、
****.cgi?http://www.abc.*.jp/
と言う形でみたいページのアドレスを指定します
指定されたアドレスをcgiで取得し、テーブルなどの携帯では不要なタグを切り捨てます
次に、アンカー?<A〜タグにあるhrefにこのcgiをかえすように、
href=****.cgi?リンク先
と言うようにかえたいので、hrefのぶぶは絶対パスに統一する必要があるのですがこの方法が分からずにいました
あともう一つ間違えてたら分かればでいいので教えていただきたいのですが、
>>232のソース+>>233パスを統一するソースのみのソースで何故かbodyタグまで消されるのですが、理由分かりますでしょうか
0245nobodyさん2005/06/07(火) 09:57:36ID:???
正規表現の中に |B| があるから Bで始まるものタグが消されてるんじゃね?
Blockquote とか UL とかも消されてるはず。
もうちょっと正規表現考えた方が良かったね。 プ
0246 ◆5KhTfX3Q0E 2005/06/07(火) 10:46:09ID:???
>>245
たしかに…
気づきませんでした
ありがとうございます
0247nobodyさん2005/06/07(火) 12:03:54ID:???
質問です。
↓これだけの文章だと、"newdir"というフォルダがなければ、作るまで永遠に繰り返すってことになりますかね?
while (!mkdir("newdir", 0755)) {
  
}
0248nobodyさん2005/06/07(火) 12:32:22ID:???
サーバークラッシュさせたいってこと?
0249nobodyさん2005/06/07(火) 14:54:20ID:???
↓こうやらないと、フォルダが作られたら、ループが終わっちゃうんでは?

while (!mkdir("newdir", 0755)) {
 rmdir("newdir"); 
}
0250nobodyさん2005/06/07(火) 15:29:22ID:???
>>249
「作るまで永遠に繰り返す」だから作ったら終わっていいんじゃない?
0251nobodyさん2005/06/07(火) 16:38:25ID:???
>>247-250
これってどこでフォルダが作られてるの?
while(この部分)←この部分でフォルダが作られる?!
0252nobodyさん2005/06/07(火) 17:02:56ID:???
Yes. mkdir は フォルダを新しく作ったら 1、失敗した場合は 0 を返す。

なので、もし既にnewdirフォルダが存在していた場合、無限ループになるわけで。
0253nobodyさん2005/06/07(火) 17:26:57ID:???
>>252
ありがとうございました!
0254nobodyさん2005/06/07(火) 17:46:05ID:???
で、なんの役に立つんだ、ソレ、、、
0255 ◆wSkAcTBWJw 2005/06/07(火) 17:50:20ID:Jzx4SwvB
質問です。

\%hogehoge と記述した場合、どのような意味を成すのでしょうか?

具体的には↓のような文章なのですが、

return \%hogehoge if (rename($hogehoge{path}, $hogehoge{cureer}));

ifの中が真(renameに成功)の場合は\%hogehogeの中に何かを入れているのでしょうけども、
よく分かりません。どなたか教えてください。
0256nobodyさん2005/06/07(火) 18:06:11ID:???
リファレンスで調べよ
0257nobodyさん2005/06/07(火) 18:22:21ID:???
横から補足。
「perl リファレンス」でぐぐれって事な
0258nobodyさん2005/06/07(火) 18:39:51ID:???
renameに成功した場合は
hogehoge{path}を戻り値がリファレンスとして返される。
0259nobodyさん2005/06/07(火) 18:46:16ID:???
あ、違う
renameに成功した場合は
$hogehoge{cureer}を戻り値とし、リファレンスとして返される。
0260nobodyさん2005/06/07(火) 18:56:32ID:???
>>255

> \%hogehogeの中に何かを入れているのでしょうけども、
何も入れてないでしょ。
renameに成功したら、return \%hogehoge を実行してるだけ
0261nobodyさん2005/06/07(火) 19:59:03ID:???
とにかくリファレンスを理解しろ。話はそれからだ。
つーかそれからの話などそれで消えてなくなる。
0262nobodyさん2005/06/07(火) 20:07:48ID:???
>>259は何を言ってるんだ?
0263nobodyさん2005/06/07(火) 20:24:23ID:???
>>262
何か勘違いしてるのでしょう。ほっとけば気づくのでは。
0264nobodyさん2005/06/07(火) 20:33:44ID:B1nXEBrs
open(FILE, "+>$file");
$xx = <FILE>;
$xx++;
print FILE $offCount;
close(FILE);

ファイルから値とって、1増やして上書きしたいんですけど、上の通りにしてもできないんです。
$fileの初期値を1にして、上の通り実行すると、$fileが空っぽになる

open(FILE, "+<$file");
$xx = <FILE>;
$xx++;
print FILE $offCount;
close(FILE);

こんな感じで追加書き込みモードにすると、うまく行くので、変数にはちゃんと値が入ってるみたいです。

ご指摘お願いします。
0265nobodyさん2005/06/07(火) 20:44:04ID:???
>>264 下のでできたならいいじゃん。
$offCount ってなんだよ。
+> はまず最初にファイルを真っ白にするんだが。
0266nobodyさん2005/06/07(火) 21:48:12ID:???
cgi(perl)で書くHTMLについて質問させてください。

@hoge という配列に適当な文字列を複数pushして、
<textarea>@hoge</textarea>とすると、テキストエリア内で各要素の間に半角スペースが入ってしまいます。

簡単にこの半角スペースを消す方法や、別の楽な書き方はないでしょうか?
foreachで書いていくのが妥当でしょうか?
0267nobodyさん2005/06/07(火) 22:01:43ID:B1nXEBrs
>>265
すいません、$offCount は $xx と脳内変換しといてください・・・
追加書き込みモードじゃなくて、上書きしたいんですができます?
0268nobodyさん2005/06/07(火) 22:05:05ID:???
>>266 join
0269nobodyさん2005/06/07(火) 22:41:21ID:???
>>266
$,
0270nobodyさん2005/06/07(火) 22:42:15ID:???
>>266
$"を空文字列にする
0271nobodyさん2005/06/07(火) 22:48:25ID:???
そういや mod_perl 使うと $\ とか $, が効かなくなるのはどうにかならんのかな。

>>267
seek truncate tell とかで検索しとけ。
0272nobodyさん2005/06/08(水) 00:46:36ID:???
>>268-270
ありがとうございます。$"=undef; とするとかなり簡潔になりました。
0273nobodyさん2005/06/08(水) 02:11:43ID:3Bw2MIjp
>>271
ごめんわからへん
0274nobodyさん2005/06/08(水) 07:35:48ID:???
>>272
俺も若い頃 print FILE "@log"; とか書いてスペース入るのが困って foreach (@log) { print FILE $_; } とか書いてた甘酸っぱい記憶を思い出したよ・・・ orz
0275nobodyさん2005/06/08(水) 09:55:34ID:???
ttp://www.ipa.go.jp/security/awareness/vendor/programming/a04_01.html
↑を見てsysopenを使おうとしたんですが、Fcntlを使わなければmodeの指定は出来ないんでしょうか?
固定の数値なら直値で打っちゃうんだけど、環境依存するものですか?
0276nobodyさん2005/06/08(水) 10:04:49ID:???
>>275
建前上は環境依存するものなのでFcntl使っとけ。
いちいちいくつになってるか調べたりこの環境では
OKか気にするのは無駄。
0277nobodyさん2005/06/08(水) 11:35:43ID:???
>>276
ありがとうございます。
やはり環境依存する可能性があるものなんですね。。
迷うorz
0278nobodyさん2005/06/08(水) 18:09:13ID:iGltiuvK
foreachの使い方についてご質問させてください
配列の要素をすべてではなく一部飛び飛びで
取り出したいのです。

$count = @DATA_N;
foreach (5..$count) { 処理 }

とすれば5番めの項目から最後までと言うことらしいのですが
では1番目と5番目以降というように
いくつか項目を飛ばして取り出すには
どのようにすればいいのでしょうか?
よろしくお願いいたします。
0279nobodyさん2005/06/08(水) 18:33:55ID:???
foreach (1, 5..10, 15..$count)

つーか配列の "5番目の項目" の添え字は [4] なのは理解してるよね? 一応釘
0280nobodyさん2005/06/08(水) 18:47:04ID:iGltiuvK
ありがとうございます
>添え字は [4] なのは理解してるよね? 一応釘
はい[0]から始まると言うことは理解しております:汗
そうですね「,」で区切ればいいのですね。
「..」は「から〜まで」と言う風に理解すればいいのですね!
勉強になりました。
ありがとうございました。
0281nobodyさん2005/06/09(木) 01:19:34ID:???
/usr/tmp とかのテンポラリーなディレクトリがあったら、これって勝手に使っていいのかな?
CGI.pm だと使ってるようだから?、後始末さえしっかりやればいいのかのう。
0282nobodyさん2005/06/09(木) 11:30:41ID:???
open(LFILE,"+<$logfile");
@log = <LFILE>;

($sec,$min,$hour) = localtime(time);
$aftertime = "$hour:$min:$sec unixtime:" . time ;
$data = "$aftertime \n";
unshift(@log,($data));
while($log){
print LFILE $_;
}
close(LFILE);

質問です
$logfileに時間を一番上に追加してゆく処理を行いたいと思い、
↑のようにコーディングしたのですが、全く更新されません。
なぜですか?
0283nobodyさん2005/06/09(木) 11:51:59ID:???
>>282
問題点1:
while($log) → foreach (@log)

問題点2:
LFILEの中身を呼んだ後seekしてないのでこのままでは続きから書かれるだろう

問題点3:
そもそもファイルの頭に追加するという設計を見直した方がいい。
末尾への追加は簡単だが、頭へ追加しようとすると全部書き直しになるので
普通はそういうことははじめからしなくていいようにしとくものだ。
0284nobodyさん2005/06/09(木) 12:12:41ID:???
設計し直し、っていうか勉強し直しが必要なような。
0285nobodyさん2005/06/09(木) 12:27:48ID:???
出来ました!
頭に追加したほうが、見やすいので、そういう設計にしました。
ありがとうございました!
0286nobodyさん2005/06/09(木) 13:53:02ID:r/eHxoG7
特定の条件でCGIからメールが
送信できなくてこまってます・・

www.hoge.co.jp サーバで
メール送信CGI mail.cgi があって
ここからメールを送信させているんですが
送信先メールアドレスが

[email protected] とか [email protected] のような
hoge.co.jp サーバ以外への送信ならうまくいくんですが

[email protected] とか [email protected] への
送信だとうまく送信されない(届かない)ようなんです。

mail.cgi自体は同じものを使用していて
@hoge.co.jp 以外のメールアドレスへの送信はうまくいっているので
sendmail の問題?なのかもしれませんが
何か調べる必要がある点などありましたらご教授お願いします。
02872862005/06/09(木) 13:55:21ID:r/eHxoG7
ちなみにですが
メールが届かないメールアドレス([email protected] とか [email protected] )自体は
他のメーラやWEBメールから送信されたメールを
正常に受信できてます。

あくまで www.hoge.co.jp 上の mail.cgi から
[email protected] へメール送信しても届かない・・・という感じです。
0288nobodyさん2005/06/09(木) 13:55:42ID:???
意味がわかんね
02892862005/06/09(木) 14:19:27ID:r/eHxoG7
すんません、もっかい整理します。

www.hoge.co.jp 上に mail.cgi を設置しています。
mail.cgi の内容は次のような感じです。

  mail.cgi
  ----------------------------------
  $head = "From: [email protected]\n";
  $head .= "To: [email protected]\n";
  $head .= "Subject: TEST MAIL\n";
  $head .= "Date: $Date\n";
  $head .= "Content-type: text/plain\n";
  $head .= "Mime-Version: 1.0\n\n";

  $body = "テスト";

  open(MAILER, "| /usr/sbin/sendmail -t") || exit(0);
  print MAILER $head;
  print MAILER $body;
  close(MAILER);
  ----------------------------------
02902862005/06/09(木) 14:20:03ID:r/eHxoG7
ここで

  $head .= "To: [email protected]\n";

の送信先部分が [email protected] だと
メールを送信してもメーラ側で受信できず(届いていない)

  $head .= "To: [email protected]\n";

のように [email protected] 以外へメールを送信した場合は
正常にメーラ側でメールを受信できる状況です。
なので、コードがおかしい分けでなく
www.hoge.co.jp 上の sendmail か何かの設定がおかしいのかも
しれませんが・・・。なんなんでしょう・・。

ちなみに [email protected] のメールアドレス自体は
他のメーラやWEBメールから送信したメールを
正常に受信できています。
0291nobodyさん2005/06/09(木) 14:54:19ID:???
"@hoge" の部分が配列として評価されて "" になっちゃってんじゃないの?
シングルクオートで囲むか "\@hoge" とエスケープしてみ。

ていうか、 abc.co.jp とか test.co.jp とか実在するドメインを例に使うな。
予約ドメインの example.co.jp とか example.ne.jp とか example.jp とかを使え。
0292nobodyさん2005/06/09(木) 17:33:54ID:???
input type="file"で指定されたcsvファイルをデータとして読み込みたいんですが、
モジュールを使わないという前提で、参考になるサイトはありませんでしょうか。
ぐぐり疲れました・・・orz
0293nobodyさん2005/06/09(木) 18:27:43ID:???
>>292
http://www.studyinghttp.net/body#Form-data
理解できなきゃ素直に CGI.pm 使うなり、
CGI.pm バラして必要なトコだけパクりなされ。
0294nobodyさん2005/06/10(金) 00:38:57ID:gI851X9W
sss
0295nobodyさん2005/06/10(金) 00:52:30ID:gI851X9W
上の誤投稿でした、すんません
質問なんですけど、shiftやpopは先頭か末尾ですよね。
そういうのじゃなくて配列の任意のデータを削除したいんですが、どうやるんでしょう?
0296nobodyさん2005/06/10(金) 01:22:16ID:???
splice
0297nobodyさん2005/06/10(金) 09:07:37ID:???
>>293
ありがとうございます。
とりあえず隅から隅まで読んでみますー
0298nobodyさん2005/06/10(金) 10:31:53ID:???
>>295 いつの日か delete も使えるようになったよね
0299nobodyさん2005/06/10(金) 11:01:32ID:n3jB9OmG
初歩的な疑問ですんません
# 処理
my %in;
&decode;
&html if (!$in{send});

$inや%inは何か特別なのでしょうか?
0300nobodyさん2005/06/10(金) 11:07:59ID:???
なんで特別とか思ったの?
0301nobodyさん2005/06/10(金) 11:23:36ID:???
>>299
違う
ttp://www.rfs.jp/sitebuilder/perl/02/nw01.html
0302nobodyさん2005/06/10(金) 12:00:39ID:???
CGI.pmのメソッドradio_groupで作成されるオブジェクトにラベルタグを付けたいです。

<input type="radio" name="yes" value="1">はい
<input type="radio" name="yes" value="2">いいえ
を
<input type="radio" name="yes" value="1" id="yes1"><label for="yes1">はい</label>
<input type="radio" name="yes" value="2" id="yes2"><label for="yes2">はい</label>
にしたい。

メソッド改造は汎用性が無いので
正規表現とかでなんとかならないでしょうか?
0303nobodyさん2005/06/10(金) 12:01:26ID:???
>>229
cgi-lib.pl使った時のデフォじゃね?
ttp://amateras.sourceforge.jp/cgi-bin/fswiki/wiki.cgi/free?page=cgi-lib.pl
0304nobodyさん2005/06/10(金) 12:04:13ID:???
どうでもいいけど、 <label><input /></label> のが気持ちがいいよ。
03052992005/06/10(金) 12:06:16ID:n3jB9OmG
ありがとうございます
ページを読みましたが$inはなかったです。
03062992005/06/10(金) 12:12:11ID:n3jB9OmG
cgi-lib.plの中に%inという連想配列があるからなのですね!
ありがとうございます。
早速cgi-lib.plをみてみます。
0307nobodyさん2005/06/10(金) 12:26:18ID:???
あぼーん
03083022005/06/10(金) 12:29:51ID:???
>304
私もそう思うけど

<input type="radio" name="yes" value="1" id="yes1"><label for="yes1">はい</label>
なら、とりあえず

%labels =('1','<label for="yes1">はい</label>');
$co->radio_group(
           -name=>'yes',
           -values=>['1','2'],
           -labels=>\%labels);

で、いけるんで・・・。
これもむちゃくちゃ使いにくいけど。(・・`)
0309nobodyさん2005/06/11(土) 01:51:46ID:KxmWI2vs
質問です。

配列の中から文字列を検索して、
その文字列が含まれている配列の添え字を取得することはできますか?

例えば、
$data[0]="おじいちゃん<>76歳";
$data[1]="おばあちゃん<>72歳";
$data[2]="おとうさん<>56歳";
$data[3]="おかあさん<>52歳";

みたいな配列@dataがあって、そのなかから"72歳"という文字が
含まれている配列の添え字(この場合だと1)を取得したいのですがどうすればよいでしょうか?
0310nobodyさん2005/06/11(土) 02:23:38ID:???
use strict;
my @data;
$data[0]="おじいちゃん<>76歳";
$data[1]="おばあちゃん<>72歳";
$data[2]="おとうさん<>56歳";
$data[3]="おかあさん<>52歳";
my $str = "72歳";
for ( 0..$#data ) {
 if ( $data[$_] =~ /$str/ ) { print; }
}
__END__
0311nobodyさん2005/06/11(土) 02:46:40ID:???
$data[0]="おじいちゃん<>76歳";
$data[1]="おばあちゃん<>72歳";
$data[2]="おとうさん<>56歳";
$data[3]="おかあさん<>52歳";
my$str = "72歳";
for(0..$#data){
print $_ if [split(/<>/,$data[$_])]->[1] =~ /$str/;
}
0312nobodyさん2005/06/11(土) 03:03:41ID:???
print map { $_->[0] } grep { (split /<>/, $_->[1])[1] =~ m/$str/ } map { [$_, $data[$_]] } 0 ..$#data;
0313nobodyさん2005/06/11(土) 03:03:43ID:???
@index = grep m/72sai$/, 0..$#data;
03143132005/06/11(土) 03:05:12ID:???
index そのままマッチテストした。だめだね。
03153122005/06/11(土) 03:06:40ID:???
>>313
オマイので気付いた('A`)
print grep { (split /<>/, $data[$_])[1] =~ m/$str/ } 0 ..$#data;
0316nobodyさん2005/06/11(土) 09:07:57ID:???
質問させていただきます。
変数名を変数で扱うことができますでしょうか?
分かりにくいので例を示しますと、

$TEST = "test";
$OUTPUT = "[[[TEST]]]";
$OUTPUT =~ s/\[\[\[(.*)\]\]\]/$$1/g;
print "$OUTPUT";

↑これで、”test”という出力がほしいのですが… 
3行目のコーディングはWindows版のActiveperlでは動くのですがLinux版ではエラーになってしまいます。(もともと、あんなコードで動くことが予想外なんですが。)

よろしくお願いします。
03173092005/06/11(土) 10:20:03ID:???
>>310-315
できました。ありがとうございました。
0318nobodyさん2005/06/11(土) 10:58:39ID:???
>>316
それであってるはずだがsymbolic referenceを使うことに
なるのでstrict refsな時は問題がでるかもしれん。

というかエラーになるというのならエラーメッセージぐらい
示せよ...
0319nobodyさん2005/06/11(土) 12:06:49ID:???
以前サーバのルートディレクトリじゃないディレクトリに大きなファイルをアップロードしたのですが、
そのファイルをほしいと言う人がいるので、その人にファイルを与えようと思っています。
しかし、そのファイルを再びダウンロードしてアップロードするとすれば 1 日ぐらいかかってしまいますので、
CGI からそのファイルにリンクしようと思っています。

しかし、 perl 初心者なので、自分が作ったプログラムをサーバ上で実行していいかわかりません。
どうか、以下のプログラムは大丈夫か確認していただけないでしょうか。

#!/usr/bin/perl

&output;

sub output {
   open(IN,"(ここにファイルパス)");
   print "Content-type: application/x-zip-compressed\n\n";
   binmode(IN);
   binmode(STDOUT);
   print <IN>;
   close(IN);

   exit;
}
0320nobodyさん2005/06/11(土) 12:11:42ID:???
なんでCGIで出力しなきゃならんの?w
迷惑だからやめれ。
そのファイルへのリンク貼るか教えるだけでいいじゃん。
■ このスレッドは過去ログ倉庫に格納されています