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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10 
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
0147nobodyさん2006/03/08(水) 21:45:07ID:???
>146
あ〜そうそれ
エイリアスってやつ
言葉間違えたorz
01481432006/03/08(水) 22:04:58ID:IC708NPT
>>144-146
リンクに置換することが出来ました。
ありがとうございます。
0149nobodyさん2006/03/10(金) 14:44:19ID:Uu8wqJhR
お願いします。

変数「$daylimit」にaaaa/bb/cc(またはaaaa/b/c)の形で日付が格納されています。
これを元にソートしたいのです。
そこで疑問が2つあります。
1.aaaa/bb/ccからスラッシュを抜く方法(aaaa/bb/cc→aaaabbccにする)
2.1月または1日などの10の位がない時に0を付け足す方法(aaaa/b/c→aaaa0b0c)
これはどのようにしたら良いのですか?
方法を教えてください。お願いします。
0150nobodyさん2006/03/10(金) 14:51:12ID:???
sprintf "%04d%02d%02d", split "/", $daylimit;
ちなみに日付は文字列順になるから/は抜かなくてもおk
0151ヽ(´ー`)ノ ◆.ogCuANUcE 2006/03/10(金) 14:53:34ID:???
>>149

1. split('/', $daylimit)
2. sprintf('%04d%02d%02d', split('/', $daylimit))

sort する時は sprintf() した結果を cmp で比べるといい。
0152nobodyさん2006/03/10(金) 15:00:19ID:Uu8wqJhR
すばやい解答ありがとうございます。

ということは、

$daylimit2 = sprintf('%04d%02d%02d', split('/', $daylimit)) ;

として、$daylimit2でソートしたらOKって事ですね。
ありがとうございました。
0153nobodyさん2006/03/10(金) 20:49:15ID:???
質問した方も答える方も綺麗に終わると気持ちいいもんだね
0154nobodyさん2006/03/10(金) 20:55:15ID:???
おしりだって洗ってほしい。
0155nobodyさんNGNG
あの世から純ちゃん降臨キタ━━━━━━(゚∀゚)━━━━━━!!!
0156nobodyさん2006/03/11(土) 01:02:36ID:???
おねがいします
よくある商品を選んだら注文フォームに飛ぶHPを作りたいのですが
注文フォームで すでに商品名が入力済みの形を取っている
を実現したいのですが
よろしくお願いします

0157nobodyさん2006/03/11(土) 01:14:18ID:???
だからなんだよ。何処までやってみて、何が出来ないのか具体的に書け。
0158nobodyさん2006/03/11(土) 01:24:04ID:???
それはPerlの質問なのか?
type="text" なら、input のvalue に商品名入れな
0159nobodyさん2006/03/11(土) 01:32:55ID:???
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
01601562006/03/11(土) 02:44:05ID:???
すいません perl やる以前の問題でした
まずタグから勉強して出直してきます
0161nobodyさん2006/03/11(土) 03:03:59ID:2NEkCx5l
WinXP で AvtivePerl 5.8.7 を使ってるのですが、
ソースに use encoding が入っていると、
デバッガ動かしたときに
「問題が発生したため、Perl Command Line Interpreter
を終了します。ご不便をおかけして申し訳ありません。」という
ポップアップが出てしまいます。
(-d 無しだと普通に動く)
インストールやりなおしたりしたんですが現象変わりません。
なぜ??
0162nobodyさん2006/03/11(土) 04:37:32ID:???
AvtivePerl なんか使うひとはばかだから。
0163nobodyさん2006/03/11(土) 05:06:27ID:???
>>161
バグデータベースにも登録されてる。
ttp://bugs.activestate.com/show_bug.cgi?id=39261
漏れは回避方法知らん。

>>162
参考までに貴方の開発環境をお聞かせ願いたい。
cygwinのperl?それともPCのOSにLinuxかBSD辺りを常用してるとか?
0164nobodyさん2006/03/11(土) 05:36:10ID:???
多分NegativePerlとかだろ
0165nobodyさん2006/03/11(土) 05:42:46ID:???
>>163
> 参考までに貴方の開発環境をお聞かせ願いたい。
> cygwinのperl?それともPCのOSにLinuxかBSD辺りを常用してるとか?

VMware とか colinux とか知らない馬鹿ワロス
0166nobodyさん2006/03/11(土) 06:04:34ID:???
>>165
そうか、貴方はスクリプトを書いては一々仮想マシン上に移してテストしてるのか。
VMwareの共有フォルダ機能やSambaでも使って手軽にやってるのかな。
若しくは自動でFTP経由で変更分をアップロードするスクリプトでも組んでるか。
参考になった。ありがとう。
0167nobodyさん2006/03/11(土) 06:23:19ID:???
>>166
> そうか、貴方はスクリプトを書いては一々仮想マシン上に移してテストしてるのか。
> 若しくは自動でFTP経由で変更分をアップロードするスクリプトでも組んでるか。

その機械に ssh なり何なりでログインして書くという方法もありますよ?
0168nobodyさん2006/03/11(土) 08:11:37ID:???
>>166
冗談で言ってるんですか?
0169nobodyさん2006/03/11(土) 08:44:56ID:???
>>168
釣れた釣れた
0170nobodyさん2006/03/11(土) 09:48:52ID:???
ち ん ぷ ん か ん ぷ ん
0171nobodyさん2006/03/11(土) 11:10:44ID:???
たまにスレがちょっと伸びてると思ったらprz
0172nobodyさん2006/03/11(土) 16:05:01ID:???
my $mes=$form->Get('MESSAGE');
my $mail=$form->Get('mail');
my $adc;
my $randam=int(rand(15));

if ($randam < 1){ $abc = q| ☆☆☆☆☆ | }
elsif ($randam < 2) { $abc = q| ☆☆☆☆☆ | }
が15行です

☆の部分に最初は顔文字が入って、正常に動いてたのですが
日本語に入れ換えたらエラーが出てうまくいきません

日本語で30文字ぐらい(改行有り)赤色の文字色で表示させたいのですが、どのように記述したらよろしいでしょうか?
puleは全然わからない初心者ですがよろしくお願いします
0173nobodyさん2006/03/11(土) 16:18:52ID:???
>>172
puleはヒドイ・・・
q|〜|は好きな記号をクォートにする構文。
この場合 | を使ってるので文字列中に | があれば問題になる。
sjis使ってるならこれらの文字の下位バイトも問題に。「−ポл掛弓芸旨酢掃竹倒怖掟」(一例)
q{〜}とかq!〜!とかq(〜)とかに変える。
あとはエラーメッセージの最後にエラー行載ってるからそれを参考に。
0174nobodyさん2006/03/11(土) 16:50:30ID:???
>>172
初心者になってから来てください。ここは拾ったCGIの改造を手伝うスレとは違うので。
0175nobodyさん2006/03/11(土) 17:14:12ID:???
あと必要最低限の英単語も覚えた方がいいと思う
酷すぎる
■ このスレッドは過去ログ倉庫に格納されています