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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10 
0046nobodyさん2006/03/03(金) 10:37:23ID:???
>>43-45
-b [value] を満たすにはちと改造が必要だが、Getopt::Std
0047nobodyさん2006/03/03(金) 10:42:49ID:???
>>46
Getopt::Std だと value と string1 が区別できるようになるの?
0048nobodyさん2006/03/03(金) 10:59:23ID:???
>>46
お返事ありがとうございます。

使ってみましたが、おっしゃるとおり -b [value]はそのままでは受け渡せませんでした。
単純に -x の次の値を値として取得しているだけのようなので、
このモジュールでは難しいように思います。

とりあえず -b none という「値を指定しないという値」を作って、
問題が出たときはこの値を明示することにしました。
0049nobodyさん2006/03/03(金) 12:45:49ID:FQZyKwaV
正規表現どうしてもうまくいかないので質問させてください。

曜日 月 日 時:分:秒 年
Sat Jan 1 13:12:26 2005
Sun Jan 2 14:16:50 2005

と言うデータがあったら「時」の部分だけ取り出す正規表現を教えてください。
上の二件のデータですと13:と14:の部分です。
0050nobodyさん2006/03/03(金) 12:46:58ID:???
>>49
上手くいかなかった正規表現を晒してみ。
0051nobodyさん2006/03/03(金) 12:47:36ID:???
正規表現なんか使わんでもsplit多用したらできるんとちゃう
0052nobodyさん2006/03/03(金) 12:50:41ID:FQZyKwaV
($hogehoge[$i] =~ m/([0-9]\: +\d+)/)
とかやってました・・・
全然だめです
0053nobodyさん2006/03/03(金) 12:53:12ID:FQZyKwaV
ちなみに
=~ m/([A-Z][a-z]{2} +\d+)/)
とやったら月日はうまく出せたんです。

Sat Jan 1 13:12:26 2005
Jan 1
0054nobodyさん2006/03/03(金) 12:57:19ID:???
そこまでいけたらもうひといきやん。 +(\d+)
0055nobodyさん2006/03/03(金) 13:28:52ID:???
>>38

ttp://www.att.or.jp/perl/faq/perlwin32faq/perlwin32faq11j.html#ppm_and_proxies
0056nobodyさん2006/03/03(金) 13:48:50ID:???
モジュールで質問です。

--- Module.pm ---
package Module;
use strict;
use CGI;
1;

--- script.pl ---
use lib '.';
use Module;
$cgi = new CGI;
print "hoge\n";
exit;

このようなファイルがあるときに、
perl script.pl を実行すると、"hoge" が出力されます。
use Module; することで、use CGI が script.pl で
実行されたように継承されると思うのですが、
Module.pm 内の use strict; までは継承されないのでしょうか?

もちろん、script.pl に use strict を入れると $cgi でエラーが出ます。
同じように、use warnings も各スクリプト上でしか機能しないのでしょうか?
0057nobodyさん2006/03/03(金) 14:17:45ID:FQZyKwaV
曜日 月 日 時:分:秒 年
Sat Jan 1 13:12:26 2005
Sun Jan 2 14:16:50 2005

上のデータを
=~ m/([0-9][0-9]\:+(\d+))/)
とやったところ
結果が

13:12
14:16
と出てしまいます。

曜日 月 日 時:分:秒 年
と言うデータがあったら「時」の部分だけ取り出したいので

13:
14:

と出したいのですが、どうもうまくいきません・・・
0058nobodyさん2006/03/03(金) 14:24:58ID:???
いや、だから 月 日 の正規表現から繋げてけばいいじゃーん。
あと、無駄なカッコは外そう。
m/[A-Z][a-z]{2} +\d+ +(\d+\:)\d+/
0059nobodyさん2006/03/03(金) 16:30:44ID:???
>>56
script.pl 内で use Module 後に CGI->new が可能なのは、
use CGI が*どのファイルで行われているかに関わらず、*
現在のプロセスに CGI.pm 中のコードが読み込まれた後だから。

strict プラグマはその書き方だとファイルスコープに対して
効いているので、別ファイルのコードに影響は及ばない。

> use warnings も各スクリプト上でしか機能しないのでしょうか?
http://perldoc.jp/docs/perl/5.8.1/warnings.pod
0060nobodyさん2006/03/03(金) 17:46:07ID:???
HTTP::Date とか使えば日付はいじれるんじゃないかなぁ。
0061nobodyさん2006/03/03(金) 18:22:06ID:???
なにそれ? Date::Manip とかの方がよくね?
0062nobodyさん2006/03/03(金) 19:59:14ID:5hL2Isoz
質問です:フォームで選択したcheckbox select のvalueを外部ファイルに保存し、
GETリクエストから渡された値を外部ファイルから検索し該当する行に保存されたものをフォーム上に復元したいのですが、
テキスト、チェックボックス、ラジオボタンまでは出来たのですが Selectをどう再現すればいいかで悩んでます。
外部ファイルへの保存は {テキストエリア,チェックボックス1,2,3,セレクト1,2} という形で各valueを保存しています。
例: inputtext,chked1,,chked3,sel13,sel0
読み出しはカンマ区切りを変数に読み出す形で行っています。
open (DATA,"hozon.dat"); @DATA = <DATA>; close (DATA);
foreach $linename (@DATA)
if ($linecont =~ /$name/i ){
($textfield1,$chk1,$chk2,$chk3,$sel1,$sel2) = split (/,/,$linecont);
if ($chk2 eq "chked2") {$chked2 = "checked";} else {$chked2 = "";}
以下復元処理
#htmlでは <input type="checkbox" value="chked2" $chked2> といった具合です
#<select name="select1">
#<option value="0" selected=もじゃもじゃもじゃ >セレクト選択肢1</option> ←ここを復元したい、選択肢は60個程
0063nobodyさん2006/03/03(金) 20:02:24ID:5hL2Isoz
っと
$names は GETで渡された変数です。
0064nobodyさん2006/03/03(金) 20:36:38ID:???
>>61
それ、異様にデカくね?
0065nobodyさん2006/03/03(金) 20:37:34ID:???
>>62
なんかしらんけど、HTML::FillInForm でも使ってろ。

http://search.cpan.org/~tjmather/HTML-FillInForm-1.06/lib/HTML/FillInForm.pm
0066ヽ(´ー`)ノ ◆.ogCuANUcE 2006/03/03(金) 21:06:07ID:???
>>57

use HTTP::Date qw(parse_date);

my $n = (parse_date('Sat Jan 1 13:12:26 2005'))[3];
# => 13
0067nobodyさん2006/03/03(金) 23:13:58ID:???
index.htmlを自動で生成してある特定の部分だけランダムに生成するようにして、
cgiにアクセスするとindex.htmlが更新されるcgiを作ったのですが、
5日ごとに自動で更新できるようにしたいのです。
調べてみてもそういった手法はないみたいです。
チャットのようなものや、cgiにアクセスした状態でないとできないみたいです。
cgiファイルがアクセスされることなしに自分で実行して、5日ごとにページが更新されている
そんなcgiを作成してみたいのです。
よろしくお願いします。
0068 ◆TWARamEjuA 2006/03/03(金) 23:35:03ID:???
cronさんでそのcgiさんを定時に呼び出してあげるとか?
自鯖ならcronさんだけで桶だけれども。
0069672006/03/03(金) 23:53:28ID:???
>>68さんあいがとう。
調べてみたら、私が利用しているロリポップではcronがつかないのです・・・。
他の方法を調べてみます。・・・。
0070nobodyさん2006/03/04(土) 00:08:26ID:???
過去更新した日から5日以上経っていたら、更新するんじゃだめなの。
0071nobodyさん2006/03/04(土) 00:14:17ID:???
>>57
もう解決してるけど。月日と時が欲しいんだよね。

my $date = "Sat Jan 1 13:12:26 2005";
my($md, $h) = ($date =~ / (¥S+ ¥d+) (¥d+):/i);
0072nobodyさん2006/03/04(土) 00:17:26ID:???
>>71
?
0073nobodyさん2006/03/04(土) 00:20:24ID:???
>>69
じゃ、cron使える所にプログラム仕込んで
5日に1回、cgiを叩くようにする。

もしくは、変更される箇所をJavaScriptにする。
日付を5で割った余りを見て、そこだけランダムに生成。
これだとcgiも要らない。
ソースは見えちゃうけど。
0074nobodyさん2006/03/04(土) 00:27:13ID:???
>>72
>>49,53 を見てたら月日と、時間が別々に要るっぽかったので。
モジュールを使わない方向で、オートマトンが短くなるように書いてみた。

iオプションは要らなかったか…
my($md, $h) = ($date =~ / (¥S+ ¥d+) (¥d+):/);
0075nobodyさん2006/03/04(土) 01:05:20ID:???
どーしてモジュールつかわないんだろう。
0076692006/03/04(土) 02:01:29ID:???
>>70さん それで全然OKです。

>>73さん javascriptの併用もOKです。それでしたら決められた日時が来たら、再度cgiを読みこむ
       といった具合にしてみたいです。

ちょっとまた調べてきます。レスをありがとうございました。
0077nobodyさん2006/03/04(土) 02:13:12ID:8Fz2Q4U8
1: %2Fを「/」にしたいです。。

2: $hoge =~ s/%2F///g; と書いてみましたが

3: エラーが出て上手くいきませんでした。

同じようにして
$hoge2 =~ s/%3A/:/g;
は、うまくいったのでサーバの問題とかそういうのではないと思います。
よろしくおねがいします。
0078nobodyさん2006/03/04(土) 02:15:35ID:???
/\//
0079nobodyさん2006/03/04(土) 02:17:29ID:8Fz2Q4U8
>>78
うぁーん、できました。・゚・(ノД`)・゚・。
ありがとうございました
0080nobodyさん2006/03/04(土) 04:36:18ID:???
>>77
s[%2F][/]gとかs|%2F|/|gという風にも書ける。
こっちの方が見やすいからお勧め
0081nobodyさん2006/03/04(土) 04:38:32ID:???
>>76
訪問者があった段階でCGIを動作させ、前回更新より5日経っていたら書き換えってことにすればいいのでは?
0082nobodyさん2006/03/04(土) 04:44:18ID:???
やる必要は無いのだろうが、個人的には%もエスケープしてあげたい
0083nobodyさん2006/03/04(土) 05:01:24ID:???
>>77
ところで、もしかしてやりたい事はこれだったりする?
$hoge =~ s{ %([[:xdigit:]]{2}) }{ pack('H2', $1) }gex;
0084nobodyさん2006/03/04(土) 15:23:11ID:???
ホスト名の始めのピリオドまでを置換で消したいのですがうまくいきません。
「○○○.」○○○.jp や 「○○○.」○○○.○○○.jp のような。

$host_name =~ s/.+\.//;


ってやってみましたがうまくいきませんでした。
ご教授お願いします。
0085nobodyさんNGNG
+ や * の直後に ? を書くと最短マッチ
0086nobodyさん2006/03/04(土) 16:11:17ID:???
>>85
�d!!うまくいったよ!!!
最長とか最短とかも理解できたよ、ありがと!!
0087nobodyさん2006/03/04(土) 16:51:16ID:???
>86さんではないけど、>85さんいい事知りました
ありがと
0088nobodyさん2006/03/04(土) 20:33:30ID:???
掲示板のスクリプトにおみくじ機能を入れたいのですが、なかなかうまくいきません。

$omikuji = '大吉','中吉','小吉'.'吉','凶';

と指定した後に

# おみくじ
$name =~ s/おみくじ/$omikuji/g;

としているのですが、大吉しか表示されません。
どうすればいいのでしょうか?
0089nobodyさん2006/03/04(土) 20:44:58ID:???
ハァ?
0090nobodyさん2006/03/04(土) 21:09:45ID:???
g→eg
0091nobodyさん2006/03/04(土) 21:13:06ID:???
>>90
>>89
0092nobodyさん2006/03/04(土) 21:16:44ID:???
またおみくじかよお前ら飽きないなwww
0093nobodyさん2006/03/04(土) 21:47:11ID:???
>>88
googleで、「おみくじ perl」で検索してください。
0094882006/03/04(土) 22:14:18ID:???
おかげさまでできました。
みなさんありがとうございました
0095762006/03/05(日) 00:33:38ID:???
>>81
なるほど、そういうアプローチもありますね。
今なお探しているんですが、ソースを組み合わせるところまで行っていません・・。
0096762006/03/05(日) 02:19:28ID:???
結局こういう風にしました。

同一IPアドレスから一日一回しかindex.htmlを生成しない

5日おきくらいに自動更新できればいいかなと思ったんですが、
googleのこと考えると更新のペースは早いほうがいいと判断したためです。
これで正常動作したら完成です。
レスしてくれた皆様、ありがとうございました。
0097nobodyさん2006/03/05(日) 02:22:34ID:???
いちいちほうこくしなくても、だれもきたいしてないからきにすんな。
0098nobodyさん2006/03/05(日) 18:43:40ID:???
制御について
if ($1 ne "1") { print "hage"; }
条件に1か2でない場合hageを実行したいのですが
if ($1 ne "1”) { 処理内容 } elsif ($1 ne "2") { 処理内容 } else { 処理内容 }
これだと3つ処理内容が分割されてうまくいきません
条件が2つ実行内容は1つの場合どういう分がいいのでしょうか?

0099nobodyさん2006/03/05(日) 19:10:38ID:???
条件そのままに解釈すると
if (($1 ne "1") or ($1 ne "2")) {print "hage";}

たぶんやりたいのは
if (($1 ne "1") and ($1 ne "2")) {print "hage";}
0100nobodyさん2006/03/05(日) 19:22:40ID:???
>>99
無駄に括弧つけると読みにくいでつよ?
0101982006/03/05(日) 19:43:37ID:???
>>99
下のでできました、ありがとうございます
0102nobodyさん2006/03/05(日) 19:45:31ID:???
ついでだからandと&&を勉強しておこう
0103nobodyさん2006/03/05(日) 22:15:53ID:???
and と && に違いが?
0104nobodyさん2006/03/05(日) 22:21:35ID:???
ないと思ってる?
0105nobodyさん2006/03/05(日) 22:26:02ID:???
ifの時に関しては違い無いと思ってる
ほかは知らん使ったことないので
0106nobodyさん2006/03/05(日) 22:26:31ID:???
ほんと・・・初心者ばっかだなこのスレw
0107nobodyさん2006/03/05(日) 22:28:41ID:???
>>105
ifの時も違うよ。優先順位に注目。
0108nobodyさん2006/03/05(日) 22:28:53ID:???
とかいいつつ答えられてない煽るしか能のないチンカスがいるのはこのスレですか?
0109nobodyさん2006/03/05(日) 22:30:54ID:???
>>107
なるほど
いっつも &&、||、! しか使わんから気が付かなかった
thx
0110nobodyさん2006/03/05(日) 22:36:08ID:???
>>100
このスレ初心者が多いから括弧つけといた方が安全かもね。
0111nobodyさん2006/03/05(日) 22:39:11ID:???
>>108
「優先順位に注目」って書いてあるじゃん。馬鹿?
0112nobodyさん2006/03/05(日) 23:16:44ID:???
括弧のありなしは初心者云々では語りきれない。
01131032006/03/05(日) 23:19:42ID:???
おまいらもっと建設的になれよ('A`)
0114nobodyさん2006/03/05(日) 23:23:40ID:???
> 111
前レスから12秒・・・コレでなにも読めないか?
難儀だなオイ
0115nobodyさん2006/03/05(日) 23:24:52ID:???
自分の無知を晒してる馬鹿が居てワロス
0116nobodyさん2006/03/05(日) 23:29:40ID:???
As more readable alternatives to "&&" and "||" when used for control flow,
Perl provides "and" and "or" operators.

The short-circuit behavior is identical.
The precedence of "and" and "or" is *** much lower ***, however,
so that you can safely use them after a list operator
without the need for parentheses.
-- "perlop" man page
0117nobodyさん2006/03/05(日) 23:30:19ID:???
演算子の優先順位を眺めてたら ... っていう演算子があるのを発見した。
この流れのおかげだ。
0118nobodyさん2006/03/05(日) 23:31:22ID:???
>>117
/regexpA/ .. /regexpB/;
/regexpA/ ... /regexpB/;
下の時に使う奴だね。
0119nobodyさん2006/03/05(日) 23:45:42ID:???
...は
/regexpA/ ... /regexpA/;
の時に初めて存在価値があるわけだが。
0120nobodyさん2006/03/06(月) 11:21:16ID:???
初心者はすぐカッコつけるぅ
0121nobodyさん2006/03/06(月) 12:01:55ID:???
初心者はまずカッコから入るべし
0122nobodyさん2006/03/06(月) 16:10:02ID:???
↓ ギャッツビーつけて
0123nobodyさん2006/03/06(月) 17:03:49ID:???
↑古い
0124nobodyさん2006/03/06(月) 19:32:55ID:???
はい次
0125nobodyさん2006/03/06(月) 20:31:38ID:???
俺?
0126nobodyさん2006/03/06(月) 22:27:03ID:???
Perlでcoolなblogを作りたいと思っています
とりあえずActivePerlを入れて、blogのTopPageのDesignだけはCompleteしました
0127nobodyさん2006/03/06(月) 22:40:18ID:???
そうですか。
0128nobodyさん2006/03/06(月) 23:31:12ID:???
>125
そ、お前
何か質問無いの?
0129nobodyさん2006/03/07(火) 00:15:38ID:???
特に。
0130nobodyさん2006/03/07(火) 00:26:19ID:???
明日の夕飯のオカズ希望。
美味くて独創的なのがいい。
0131nobodyさん2006/03/07(火) 03:44:15ID:???
カレー味のカップヌードルにお湯を麺が丁度浸る程度まで入れて5分ほど放置
余ったお湯を捨てる (捨てるお湯の量が多いと味が薄くなるから気をつける)
温泉卵をぶち込む
軽くかき混ぜて食す

( ゚Д゚)グラッチェ
0132nobodyさん2006/03/07(火) 07:11:14ID:???
それは・・・オカズなのか?
0133nobodyさん2006/03/08(水) 10:57:35ID:???
perl4なベタベタコーディングから抜け出せないヘタレです。
質問なのですが、たとえば、
@aray1 = ("abc","AAAabcBBB","CCCabcDDD","\n");
foreach $line (@aray1){
$line =~ s/abc/xxx/g;
push(@aray2,$line);
}
print join(":",@aray1);
print join(":",@aray2);
と書いた場合、
>abc:AAAabcBBB:CCCabcDDD
>xxx:AAAxxxBBB:CCCxxxDDD
と出力されると記憶していましたが、実際には、
>xxx:AAAxxxBBB:CCCxxxDDD
>xxx:AAAxxxBBB:CCCxxxDDD
と出力されました。perlのバージョンは5.8.7です。
ぐぐったりしてみたんですが、perl4から5に変わるときに、上のコードの場合で言うところの$lineが、配列@aray1の値が代入されるんじゃなくて、実体を参照するようになったような、そうじゃないような曖昧な情報しか見つけられませんでした。
配列の値が代入されるって言い切ってるサイトもあるし。だとすれば上のようなコードで@aray1の中身まで置換されるのおかしいし。

実際のところ、
・perl4からperl5に上がった時に変更になった
・元々そうだった
・その他(コード自体に問題あり)
…
どうなんでしょうか?
わかる方いらっしゃいますでしょうか?
0134nobodyさん2006/03/08(水) 11:29:56ID:???
>>133
Perl4 の頃からそういう仕様だが。
<q cite="http://flex.ee.uec.ac.jp/texi/perl/perl_13.html#SEC32">
配列値が(配列値を返す expression ではなく)実際の配列の場合は、
ループの中で変数を変更することで配列要素を変更することができる。
</q>
0135nobodyさん2006/03/08(水) 13:05:53ID:???
foreach $line (@aray1){
の行を下記2行に書き換えてごらんあれ
foreach (@aray1){
 my $line = $_;
01361332006/03/08(水) 13:44:41ID:???
>> 134
>> 135
早速の回答ありがとうございます。
そうですか…perl4時代から既にそうだったんですね…orz
自分の無知を恥じます。

ところで、となると、foreachは与えられた配列の個々の要素の値をスカラー変数に「代入する」という表現のwebが散見されますが、この表現は間違いということなんでしょうか?
0137nobodyさん2006/03/08(水) 13:46:53ID:???
@hoge("a","b","c","d");

print "@hoge";
の時
a.b.c.d
みたいに間に「.」をいれて取り出したいんですがどのような書き方が最適でしょうか?
ご指導ご鞭撻のほどを
0138nobodyさん2006/03/08(水) 13:57:11ID:???
print join('.', @hoge);
0139nobodyさん2006/03/08(水) 15:14:48ID:???
>>136
正規のドキュメントと違う事を書いてる二次情報は間違いなんじゃない。
正規のドキュメントにツッコミ入れられるレベルの人なら書いた人に連絡
取るだろうし。

>>137
普通は >>138 のようにした方がいいけど
{ local $" = '.'; print "@hoge"; }
というやり方もある。
0140nobodyさん2006/03/08(水) 15:39:20ID:???
ありがとうございます
続けざまで申し訳ないんですが
require 'cgi-lib.pl'
&ReadParse(*in)
@hoge = @in('a','b','c');
で@hogeの値を取った場合
もしa(@hoge[0])に値が入れられてなかったら,をいれないみたいな処理
はできるでしょうか?
>>138さんのやり方でやるってみたのですが
,b,c
みたいになってしまいます
01411332006/03/08(水) 15:54:17ID:???
>>139
おっしゃるとおりで。
探しやすさとか読みやすさにかまけて正規ドキュメントのチェックを疎かにしてた僕が居ましたYO!って感じです。
勉強になりました。
0142nobodyさん2006/03/08(水) 16:13:07ID:???
perl5.8使ってるけど
>133みたく
foreach $aaa (@list){
ってやった場合、$aaaには実態じゃなくてリファレンスが入ってた
$aaaを別の値にしたら@listの内容も変った
0143nobodyさん2006/03/08(水) 19:09:21ID:IC708NPT
現在掲示板を作っている者です。
投稿された内容を表示する際、
投稿内容にアドレスがあればそれをそのアドレス先のリンクに置き換えたいと思っています。
まず、投稿内容から"http://"を探して次にそのアドレスの終わりを見つけ
アドレスの最初から終わりまでを置換しようとしています。
投稿内容から"http://"はindexをつかって見つけることが出来たのですが、
どうすればアドレスの終わりを見つけるのかが分かりません。
どのようなにすればアドレスの最初から終わりまでの位置を見つけることが出来ますか?
0144nobodyさんNGNG
どうせ置き換えるんだからサブスティチュート使えばいいじゃん
0145nobodyさん2006/03/08(水) 19:30:45ID:???
適当に正規表現でも使えばいいじゃん
0146nobodyさん2006/03/08(水) 19:48:33ID:???
>>140
文法が怪し過ぎるので一から勉強し直してくれ。
http://www.site-cooler.com/kwl/perl/2.htm

@hoge = grep defined && length, @in{'a','b'.'c'};

>>142
「リファレンスが入っている」とはこういう状態を指すんだけど。
print "$_\n" for my @ref_array = \(0..9);
print "$_\n" for my @num_array = (0..9);

実体に「別名」を付ける時は「エイリアス」と表現する事が多い。
http://www.kt.rim.or.jp/~kbk/perl5.005/perlsyn.html#Foreach_Loops

>>143
http://www.din.or.jp/~ohzaki/perl.htm#AutoLink
■ このスレッドは過去ログ倉庫に格納されています