【Perl】初心者コーナーPart10
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
02/02/24 22:18ID:zOj6Yq/31:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。
参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://pc.2ch.net/test/read.cgi/php/988809842/
CGIの質問はこちら【CGIだけど、なんか質問ある?part5】
http://pc.2ch.net/test/read.cgi/php/1009331505/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
過去ログ、その他の役立ち情報は>>2-10を見よう。
0182nobodyさん
02/03/03 23:42ID:???0183nobodyさん
02/03/04 00:10ID:???strict下ならvarsモジュールを使えばいいのに。
localとは違うからいいの?
018495
02/03/04 00:12ID:KNDHr4Nosub sub_routin {
my (%data) = @_;
use strict;
use Fcntl;
use SDBM_File;
my %hash = ();
my $data_base = 'data_base';
tie (%hash, 'SDBM_File', $data_base, O_CREAT|O_RDWR, 0666);
#この命令自体はあまり意味は無いが、要はハッシュのハッシュを使いたい
foreach my $number (1..100) {
while ( my ($key, $value) = each (%data) ) {
$hash{$number}->{$key} = $value;
}
}
untie (%hash);
}
上のように、tieからuntieの中でハッシュのハッシュを使おうとすると
Can't use string ("HASH(0x1c37ddc)") as a HASH ref while "strict refs"(以下略)
などと怒られてしまい、使えません。多次元構造のデータの外部化って無理なんですか?
0185183
02/03/04 00:12ID:???http://www.midnightroam.org/source/minibbs2_77.txt
0186nobodyさん
02/03/04 00:16ID:???$hash{$number, $key} = $value にすれば?
0187nobodyさん
02/03/04 00:17ID:???漏れの場合はvarsを知らなかったので、myを
使ってる。「strict使ったら怒られたから、
myを付けたらOKだった」という感じだった。
varsを使った方がいいのかな。
0189149
02/03/04 02:25ID:zvOvcxtF自分なりにいろいろやってみたのですが、全く別の問題だと分かりました
$string = 'Watashi ga Kaita. Watashi ga Keshita';
while ($string =~ /Watashi/igo) {
$value = 'Watashi(=Yamada)';
$string =~ s/Watashi/$value/i;
}
print "$string";
なのですが、無限にループ(?)しているような状態になります
表示したい文字列は
Watash(=Yamada)i ga Kaita. Watashi(=Yamada) ga Keshita
にしたいのです
この例の場合には置換で1行で出来るのですが、whileループの中で
いろいろと処理をさせたいのでこの様にしています
$value = 'Ore(=Yamada)';
$value = 'Yamada';
のようにすると無限ループのような状態にならずに
Ore(=Yamada) ga Kaita. Ore(=Yamada) ga Keshita
Yamada ga Kaita. Yamada ga Keshita
と変換されて表示されるのでパターンマッチに使った文字列から
始めない場合はうまくいくようなのですがその理由も良くわかりません
なんかそもそもアプローチ自体がおかしいような気がしてきてはいるのですが
ご教授いただけるとうれしいです
0190nobodyさん
02/03/04 02:27ID:???>表示したい文字列は
>Watash(=Yamada)i ga Kaita. Watashi(=Yamada) ga Keshita
Watashi(=Yamada) ga Kaita. Watashi(=Yamada) ga Keshita
です 申し訳ありません
0191nobodyさん
02/03/04 03:03ID:???鯖に存在するファイルの読み書きは知ってるんですが
ファイル自体を出力する処理方法ってありますか?
(更新ごとに新しいファイルを出力するみたいな)
よろしくお願いします。
0196nobodyさん
02/03/04 10:14ID:???Watashi ga Kita Watashi ga Kita
↓
Watashi(=Yamada) ga Kita Watashi(=Yamada) ga Kita
↓
Watashi(=Yamada)(=Yamada) ga Kita Watashi(=Yamada)(=Yamada) ga Kita
↓
Watashi(=Yamada)(=Yamada)(=Yamada) ga Kita Watashi(=Yamada)(=Yamada)(=Yamada) ga Kita
$string =~ /Watashi$s/igo
0199nobodyさん
02/03/04 13:40ID:???0200nobodyさん
02/03/04 13:43ID:???-P causes your script to be run through the C
preprocessor before compilation by Perl. (Because
both comments and cpp directives begin with the #
character, you should avoid starting comments with
any words recognized by the C preprocessor such as
"if", "else", or "define".)
0202nobodyさん
02/03/04 13:52ID:???0203nobodyさん
02/03/04 13:56ID:???use constant NDEBUG => 1;
use constant STRING => "hello, world!\n";
if(defined &NDEBUG){
print STRING;
else{
# ..
}
それはそうと>>201は何故こんなに偉そうなんだ?
0205nobodyさん
02/03/05 06:00ID:???whileループの突入条件とそのループ内で同じ文字列のマッチングを行っているのが原因。
これでは文字列のどこまでマッチ作業を試行したのかわからなくなってしまうよ。
具体的にはwhileループ内のマッチ作業によってpos($string)がundefで上書きされてしまう。
$string = 'Watashi ga Kaita. Watashi ga Keshita';
while ($string =~ /Watashi/ig) { # ←◆g修飾詞によってpos($string)が設定される。
$value = 'Watashi(=Yamada)';
$string =~ s/Watashi/$value/io; # ←◆pos($string)がundefで上書きされる。(゚д゚)マズー
}
print "$string";
要するに$stringのマッチ開始位置が巻き戻ってしまう。
このため突入条件のマッチングはg修飾詞があっても常に$stringの先頭から行われてしまい、
$string内にWatashiという文字列がある限りwhileがループを続けてしまう。
>189がやりたい(であろうと漏れが考えた)事をむりやり書き下してみると、
# pos再設定とマッチ以後の文字列置換でむりやり解決
$string = 'Watashi ga Kaita. Watashi ga Keshita';
while ($string =~ /Watashi/ig) {
$value = 'Watashi(=Yamada)';
my $position = pos $string;
if (substr($string, $-[0]) =~ s/Watashi/$value/io) {
$position += length $value;
}
pos $string = $position;
}
print "$string\n";
こんな感じになるんだろうか。でもこんなスクリプトは見た事が無い。
アプローチというか何というか、たぶん他にもっと良い書き方があるのだと思う。
単純に解決したいならループ内で $string =~ s/Watashi(?!\(=Yamada\))/$value/io とか、
処理を挟むなら $string =~ s/Watashi/&process(...)/eg とか。
取り敢えず、普通whileの突入条件とそのループ内で同じ文字列のマッチングは行わない。
perlretutやperlop,perlfaq6などを読むと良いかもね。
つうか正直何をやりたいのか良くわからないから的外れかもしれない。そんときゃスマソ。
0206nobodyさん
02/03/05 06:12ID:???$position += length($value) - length('Watashi');
だね。どーでもいいか。
0207nobodyさん
02/03/05 13:00ID:???&subname; で飛ばす場合は、どちらの方がメモリ消費が少ないのでしょうか?
自分は()を付けると、サブルーチン先の@_と、呼び出しもとの@_は別物と認識するので、
@_に代入するとその分メモリを消費するが、何も代入しない場合はどっちでも変わらないのでは?
と考えるのですが
0208208
02/03/05 22:03ID:OFFg29v+いつも「エラー2」が出てしまいます。何でうまくいかないのかさっぱり分かりません。
どなたかお知恵を貸してください。
acountlist.dat はこんな感じになってます。
id01:pwd01:point01
id02:pwd02:point02
...
------------------------------------------------------------
print "IDを入力してください\n";
$id = <STDIN>;
chop($id);
print "パスワードを入力してください\n";
$pwd = <STDIN>;
chop($pwd);
open(DATA,"<../xxxxxxx/acountlist.dat") or die;
while($line = <DATA>){
chop($line);
@acount = split(/:/,$line);
if($id eq $acount[0]){
if ($pwd eq $acount[1]){
print "いらっしゃいませ $acount[0] さん\n";
print "現在あなたは $acount[2] ポイントお持ちです\n";
exit;
}else{
print "エラー1";
exit;
}
}else{
print "エラー2\n";
exit;
}
}
close(DATA);
------------------------------------------------------------
0209nobodyさん
02/03/05 22:23ID:???acountlist.dat (accountlist.datのスペルミスだとは思うけど)
の最初の行に書いてある人はOKだね。
0210nobodyさん
02/03/05 22:24ID:???それじゃid01の人しか受け付けないよ.
0211208
02/03/05 23:22ID:???おかげさまでうまくいきました。
0212nobodyさん
02/03/05 23:55ID:???どうせましょう
0213nobodyさん
02/03/06 10:16ID:???データベースから引っ張ってきた件数をGoogleみたいに
1 2 3 4 5 ・・ と自動的にリンクを貼りたいんですが。
0214nobodyさん
02/03/06 10:23ID:???10〜100までの10の倍数の乱数を出したい場合。
1〜10の乱数を出して10倍する。
0215nobodyさん
02/03/06 10:25ID:???ひょっとして、乱数は関係ない?
foreach(1 .. 100){
if($_%10==0){print qq(10の倍数);}
}
って事?
0217nobodyさん
02/03/06 14:04ID:???10の倍数とか関係なかった(ごめん)
どうやったらデータベースから引っ張ってきたデータ件数を
Googleみたいに 1 2 3 4 5 ・・ ってリンクできるんだろ
perlじゃないのかな・・・
0218nobodyさん
02/03/06 14:13ID:???$i=0;
foreach(1 .. $n){
if($_%100==0){print qq(<a href=./hoge.cgi?start=$_>) . ++$i . qq(</a>);}
}
googleはこんな感じだろ。
0219nobodyさん
02/03/06 14:16ID:???$j = HIT数;
for($j=0;$j<=$n/100;$j++){
print qq(<a href=./hoge.cgi?start=) . ($j*100) . qq(>$j</a>);
}
ちなみに>218でもこの方法でも0 1 2 3 となるから、実際には1を足すように。
0220nobodyさん
02/03/06 14:17ID:???>219の最後の一行は忘れて。
頭寝てるかもしれないからもう沈むわ。
混乱させてスマン。
0225nobodyさん
02/03/06 16:04ID:???の略ですm(_ _)m
0226nobodyさん
02/03/06 21:21ID:qVNAtP8C教えて下さい。
0227nobodyさん
02/03/06 21:29ID:???正規表現に通したりすると落ちたりするんですか?
あと2バイト文字でファイル名を作らせるのはまずいですか?
URIエスケープすればどうだろう?
0228nobodyさん
02/03/06 21:33ID:???この辺を参考に。
0230nobodyさん
02/03/06 22:04ID:???ありがとう。
メールやネットニュースが対応してないので使わないクセを付けようということなのかな。
そういや,おれの通ってる大学のイタイ教師がメールのフッタに
「半角カナが世にはびころうとする風潮に断固反対する会 会員No.xx」とか書いてたのを思い出した。
どーでもイイが・・・
0231かなり初心者
02/03/06 22:08ID:+Uo+pWisそれを<a href="3"> >>3 </a>のように置換するやり方ってどうやるので、
しょうか?(ちなみに、数字は可変します。)
お願いします。(コードでご説明下さい。)
0232nobodyさん
02/03/06 22:11ID:???$message =~ s/>>([0-9]*)/<A HREF="$1">$1</A>/g;
0233nobodyさん
02/03/06 22:12ID:???$message =~ s/>>([0-9]*)/<A HREF="http://xxxx.xx.com/xxx.cgi?Res=$1">$1</A>/g;
などにすると良い。
0234nobodyさん
02/03/06 22:14ID:???だった。
0236nobodyさん
02/03/06 22:17ID:???じゃないとバグるな。
0237nobodyさん
02/03/06 22:19ID:???0238かなり初心者
02/03/06 22:27ID:+Uo+pWis数字なのですが、2桁の場合も考えられます。
その場合でも、ご提示頂いた物でOKなのでしょうか?
お願いします。
0239nobodyさん
02/03/06 22:30ID:???ローカルで試してみろよ。
できるから。
0240235
02/03/06 22:33ID:???oを付けると、正規表現中に変数があっても、その正規表現の
コンパイルを最初の一度しか行いません。そのため、
2度目以降のマッチングの際にコンパイルしないぶん早くなります。
なので、通常正規表現中に変数を入れない場合はoをつけとく
方が有利です。
で、正規表現中に変数があって、それが変更される
にもかかわらずoを付けると、当然予期する結果が得られません。
0241かなり初心者
02/03/06 22:34ID:+Uo+pWis助かりました。(^_^;)
0242nobodyさん
02/03/06 22:35ID:???なんだこいつは?
EUCもS-JISも悪。JISに統合せよ,だと?
半角カナもJISが対応していないから使うな,ということなのか。
正直WebページのキャラセットにJISなんて使う気もせんが・・・
http://www2.justnet.ne.jp/~chic/TRON005.HTML
http://homepage1.nifty.com/VET06031/kanaok/kanaok.html
0244nobodyさん
02/03/06 22:36ID:???なるほど!ええこと聞いた!情報ありがとう。
>239
ほんまかいな・・・
foreach(1..100000){}で囲むのか?(笑
0245nobodyさん
02/03/06 22:42ID:???meta で指定すれば問題ないやろ?
0248nobodyさん
02/03/06 22:50ID:???ごめん,今気付いたんだが>237へのレスだと思ってた・・・
変なこと言ってすまん・・・
0251nobodyさん
02/03/07 06:18ID:WTUe3Qf10252nobodyさん
02/03/07 08:50ID:hIR8dzV60253nobodyさん
02/03/07 09:09ID:???http://www.google.com/search?hl=ja&q=CGI+User-Agent&btnG=Google+%8C%9F%8D%F5&lr=lang_ja
0258nobodyさん
02/03/07 13:23ID:???意味わかりませんか?User-Agentってようは相手のブラウザを認識するのですよね?
私が聞きたいのはページ(htm,html,texなど)で作成したものに直リンクできない
ようにするための参照制限のことです。
今のところCGI関連のホームページで色々探してみましたが、不可能という答えしか
掲載されていませんでした・・・。
もし知っている方がいらっしゃいましたら教えて下さい。
0260nobodyさん
02/03/07 13:32ID:???だから、CGIでページを生成することにして、そのページへ
携帯電話からアクセスしてきたら弾けばいいじゃん。
htmlファイルへのアクセス制限は、CGIとは別問題で、
.htaccessでDoCoMoからのアクセスを拒否するだけだよ。
0261nobodyさん
02/03/07 14:04ID:???ありがとうございました。
>>259
もしかしたらいい案している人いるかもしれないから
聞いたんじゃん?
代用できる方法知ってるかもしれないし。
私CはわかるけどPerlはさっぱりわからんのじゃ!
初心者なんだから・・・
0262nobodyさん
02/03/07 14:11ID:???初心者である事を免罪符のように使う人物である。
0264nobodyさん
02/03/07 14:21ID:???0265nobodyさん
02/03/07 14:24ID:???i-modeのページも、あれでいて結構気を使うんだよ。
半角カナにしろだの、ここは絵文字にしろだの、クライアントが
うるさいんだよね・・・
0268
02/03/07 14:47ID:q6SBx/iVサンプルとか載ってるととっても助かります
教えて下さい。
0269nobodyさん
02/03/07 14:49ID:???0271nobodyさん
02/03/07 16:32ID:???0272nobodyさん
02/03/07 16:36ID:???よそで基礎知識を付けてからのほうがデマ吹き込まれなくていい。
あらゆる書籍、webサイトで調べてそれでもわからなかったときの
最後の手段が2ch
0276nobodyさん
02/03/07 17:02ID:???0277271
02/03/07 17:05ID:???http://www.harukaze.net/~mishima/perl/perl_j.html
0278nobodyさん
02/03/07 17:09ID:???0279前述のs///oの質問した人
02/03/07 17:13ID:???そのとおりである!
・・・おれはよく甘えるがなー・・・
いやおれも分かる範囲ならできるだけ答えるよ。
でも>261は最初の質問の時点でスレ違いだったからなぁ・・・
0280s///o厨
02/03/07 17:16ID:???試しに自分のページを「エンコード:西ヨーロッパ言語」で見てみ。
それが毛唐ドモのPCに映る画面。
■ このスレッドは過去ログ倉庫に格納されています