Perlコーディング初心者質問スレ Part 47
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/03/01(水) 15:39:31ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0048nobodyさん
2006/03/03(金) 10:59:23ID:???お返事ありがとうございます。
使ってみましたが、おっしゃるとおり -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:の部分です。
0051nobodyさん
2006/03/03(金) 12:47:36ID:???0052nobodyさん
2006/03/03(金) 12:50:41ID:FQZyKwaVとかやってました・・・
全然だめです
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:???0055nobodyさん
2006/03/03(金) 13:28:52ID:???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:FQZyKwaVSat 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:???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:???0061nobodyさん
2006/03/03(金) 18:22:06ID:???0062nobodyさん
2006/03/03(金) 19:59:14ID:5hL2IsozGETリクエストから渡された値を外部ファイルから検索し該当する行に保存されたものをフォーム上に復元したいのですが、
テキスト、チェックボックス、ラジオボタンまでは出来たのですが 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で渡された変数です。
0065nobodyさん
2006/03/03(金) 20:37:34ID:???なんかしらんけど、HTML::FillInForm でも使ってろ。
http://search.cpan.org/~tjmather/HTML-FillInForm-1.06/lib/HTML/FillInForm.pm
0066ヽ(´ー`)ノ ◆.ogCuANUcE
2006/03/03(金) 21:06:07ID:???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:???cgiにアクセスするとindex.htmlが更新されるcgiを作ったのですが、
5日ごとに自動で更新できるようにしたいのです。
調べてみてもそういった手法はないみたいです。
チャットのようなものや、cgiにアクセスした状態でないとできないみたいです。
cgiファイルがアクセスされることなしに自分で実行して、5日ごとにページが更新されている
そんなcgiを作成してみたいのです。
よろしくお願いします。
006967
2006/03/03(金) 23:53:28ID:???調べてみたら、私が利用しているロリポップではcronがつかないのです・・・。
他の方法を調べてみます。・・・。
0070nobodyさん
2006/03/04(土) 00:08:26ID:???0071nobodyさん
2006/03/04(土) 00:14:17ID:???もう解決してるけど。月日と時が欲しいんだよね。
my $date = "Sat Jan 1 13:12:26 2005";
my($md, $h) = ($date =~ / (¥S+ ¥d+) (¥d+):/i);
0073nobodyさん
2006/03/04(土) 00:20:24ID:???じゃ、cron使える所にプログラム仕込んで
5日に1回、cgiを叩くようにする。
もしくは、変更される箇所をJavaScriptにする。
日付を5で割った余りを見て、そこだけランダムに生成。
これだとcgiも要らない。
ソースは見えちゃうけど。
0074nobodyさん
2006/03/04(土) 00:27:13ID:???>>49,53 を見てたら月日と、時間が別々に要るっぽかったので。
モジュールを使わない方向で、オートマトンが短くなるように書いてみた。
iオプションは要らなかったか…
my($md, $h) = ($date =~ / (¥S+ ¥d+) (¥d+):/);
0075nobodyさん
2006/03/04(土) 01:05:20ID:???007669
2006/03/04(土) 02:01:29ID:???>>73さん javascriptの併用もOKです。それでしたら決められた日時が来たら、再度cgiを読みこむ
といった具合にしてみたいです。
ちょっとまた調べてきます。レスをありがとうございました。
0077nobodyさん
2006/03/04(土) 02:13:12ID:8Fz2Q4U82: $hoge =~ s/%2F///g; と書いてみましたが
3: エラーが出て上手くいきませんでした。
同じようにして
$hoge2 =~ s/%3A/:/g;
は、うまくいったのでサーバの問題とかそういうのではないと思います。
よろしくおねがいします。
0078nobodyさん
2006/03/04(土) 02:15:35ID:???0079nobodyさん
2006/03/04(土) 02:17:29ID:8Fz2Q4U8うぁーん、できました。・゚・(ノД`)・゚・。
ありがとうございました
0082nobodyさん
2006/03/04(土) 04:44:18ID:???0083nobodyさん
2006/03/04(土) 05:01:24ID:???ところで、もしかしてやりたい事はこれだったりする?
$hoge =~ s{ %([[:xdigit:]]{2}) }{ pack('H2', $1) }gex;
0084nobodyさん
2006/03/04(土) 15:23:11ID:???「○○○.」○○○.jp や 「○○○.」○○○.○○○.jp のような。
$host_name =~ s/.+\.//;
ってやってみましたがうまくいきませんでした。
ご教授お願いします。
0085nobodyさん
NGNG0087nobodyさん
2006/03/04(土) 16:51:16ID:???ありがと
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:???0092nobodyさん
2006/03/04(土) 21:16:44ID:???009488
2006/03/04(土) 22:14:18ID:???みなさんありがとうございました
009576
2006/03/05(日) 00:33:38ID:???なるほど、そういうアプローチもありますね。
今なお探しているんですが、ソースを組み合わせるところまで行っていません・・。
009676
2006/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";}
0102nobodyさん
2006/03/05(日) 19:45:31ID:???0103nobodyさん
2006/03/05(日) 22:15:53ID:???0104nobodyさん
2006/03/05(日) 22:21:35ID:???0105nobodyさん
2006/03/05(日) 22:26:02ID:???ほかは知らん使ったことないので
0106nobodyさん
2006/03/05(日) 22:26:31ID:???0108nobodyさん
2006/03/05(日) 22:28:53ID:???0112nobodyさん
2006/03/05(日) 23:16:44ID:???0113103
2006/03/05(日) 23:19:42ID:???0114nobodyさん
2006/03/05(日) 23:23:40ID:???前レスから12秒・・・コレでなにも読めないか?
難儀だなオイ
0115nobodyさん
2006/03/05(日) 23:24:52ID:???0116nobodyさん
2006/03/05(日) 23:29:40ID:???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:???/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:???とりあえずActivePerlを入れて、blogのTopPageのDesignだけはCompleteしました
0127nobodyさん
2006/03/06(月) 22:40:18ID:???0128nobodyさん
2006/03/06(月) 23:31:12ID:???そ、お前
何か質問無いの?
0129nobodyさん
2006/03/07(火) 00:15:38ID:???0130nobodyさん
2006/03/07(火) 00:26:19ID:???美味くて独創的なのがいい。
0131nobodyさん
2006/03/07(火) 03:44:15ID:???余ったお湯を捨てる (捨てるお湯の量が多いと味が薄くなるから気をつける)
温泉卵をぶち込む
軽くかき混ぜて食す
( ゚Д゚)グラッチェ
0132nobodyさん
2006/03/07(火) 07:11:14ID:???0133nobodyさん
2006/03/08(水) 10:57:35ID:???質問なのですが、たとえば、
@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:???Perl4 の頃からそういう仕様だが。
<q cite="http://flex.ee.uec.ac.jp/texi/perl/perl_13.html#SEC32">
配列値が(配列値を返す expression ではなく)実際の配列の場合は、
ループの中で変数を変更することで配列要素を変更することができる。
</q>
0135nobodyさん
2006/03/08(水) 13:05:53ID:???の行を下記2行に書き換えてごらんあれ
foreach (@aray1){
my $line = $_;
0136133
2006/03/08(水) 13:44:41ID:???>> 135
早速の回答ありがとうございます。
そうですか…perl4時代から既にそうだったんですね…orz
自分の無知を恥じます。
ところで、となると、foreachは与えられた配列の個々の要素の値をスカラー変数に「代入する」という表現のwebが散見されますが、この表現は間違いということなんでしょうか?
0137nobodyさん
2006/03/08(水) 13:46:53ID:???print "@hoge";
の時
a.b.c.d
みたいに間に「.」をいれて取り出したいんですがどのような書き方が最適でしょうか?
ご指導ご鞭撻のほどを
0138nobodyさん
2006/03/08(水) 13:57:11ID:???0139nobodyさん
2006/03/08(水) 15:14:48ID:???正規のドキュメントと違う事を書いてる二次情報は間違いなんじゃない。
正規のドキュメントにツッコミ入れられるレベルの人なら書いた人に連絡
取るだろうし。
>>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
みたいになってしまいます
0141133
2006/03/08(水) 15:54:17ID:???おっしゃるとおりで。
探しやすさとか読みやすさにかまけて正規ドキュメントのチェックを疎かにしてた僕が居ましたYO!って感じです。
勉強になりました。
0142nobodyさん
2006/03/08(水) 16:13:07ID:???>133みたく
foreach $aaa (@list){
ってやった場合、$aaaには実態じゃなくてリファレンスが入ってた
$aaaを別の値にしたら@listの内容も変った
0143nobodyさん
2006/03/08(水) 19:09:21ID:IC708NPT投稿された内容を表示する際、
投稿内容にアドレスがあればそれをそのアドレス先のリンクに置き換えたいと思っています。
まず、投稿内容から"http://"を探して次にそのアドレスの終わりを見つけ
アドレスの最初から終わりまでを置換しようとしています。
投稿内容から"http://"はindexをつかって見つけることが出来たのですが、
どうすればアドレスの終わりを見つけるのかが分かりません。
どのようなにすればアドレスの最初から終わりまでの位置を見つけることが出来ますか?
0144nobodyさん
NGNG0145nobodyさん
2006/03/08(水) 19:30:45ID:???0146nobodyさん
2006/03/08(水) 19:48:33ID:???文法が怪し過ぎるので一から勉強し直してくれ。
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
■ このスレッドは過去ログ倉庫に格納されています