Perl コーディング初心者質問コーナー Part35
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/05/26 16:48ID:kkhhiYmo【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0238nobodyさん
04/06/09 08:54ID:???どの方法を取るにしても、スクリプトを書き換えないと無理。
一番簡単な方法は、クエリ部分を引数(ARGV)で取るようにして、
``かqx//かsystemあたりで呼び出す。
分からなければ、Perlの入門書をどうぞ。
0240nobodyさん
04/06/09 11:04ID:???0241nobodyさん
04/06/09 11:17ID:???>>236
http://pc5.2ch.net/test/read.cgi/php/1049514428/528-529
0242nobodyさん
04/06/09 13:31ID:???0243nobodyさん
04/06/09 14:24ID:???今回の対応が親切だろうか?
よーく考えてご覧。
むしろ自分の首をしめてるのが良く分かるだろう。
0245nobodyさん
04/06/09 16:06ID:jOx/oerj0246nobodyさん
04/06/09 16:12ID:???0248nobodyさん
04/06/09 23:17ID:???もらって、一つの連想配列にキーと値にわけて収納するというのを、リファレンスでやりたい
んですが
@test = qw/sda-1we pj-odfao of-134t/;
foreach $a(@test){
($x,$y)=split('-',$a);
$form={$x,$y};
}
print %$form;
>of134t
当たり前の結果ですが上書きされて行って最後の代入結果だけ残ります。上書きさせずに
一度に$formの中に標準入力からのデータのリファレンスを作るのはどうやればいいでしょうか。
少し言葉が変かもしれないですがごめんなさい。
0249248
04/06/09 23:23ID:???$form{$x}=$y;
$ref=\%form;
以外でやりたいんです。なんかリファレンスを普通の変数のように作成したいと思いまして。
0250248
04/06/09 23:32ID:???ところで、javascriptでは関数内でグローバル変数を使うなって言われますけど、
perlでもメソッド内であまりグローバル変数を使わないほうが良いんでしょうか?
リファレンスもローカル変数化するべきでしょうか?
0251nobodyさん
04/06/09 23:32ID:iD3wLltHhttp://yougo.ascii24.com/gh/search/
への用語検索をHP内に埋め込んでいるのですが、
ソースをEUCで記述すると、入力した言葉が文字化けして送られてしまいます。
何か良い解決策などは無いでしょうか?
ソースは、↓のように作っていて、JISで記述した場合は正常に動きました。
<FORM method="GET" action="http://yougo.ascii24.com/gh/search/"
<INPUT TYPE="text" name="pattern"><INPUT TYPE="submit" name="pattern">
</FORM>
0252nobodyさん
04/06/09 23:33ID:???0253nobodyさん
04/06/09 23:35ID:???グローバル変数は基本的に使わないほうがいいんじゃ?
当然リファレンスも
あと、>>252は>>249にね
>>251
で?
0254248
04/06/09 23:55ID:???ありがとうございます。あとから
@test2 = qw/q 1 w 2 e 3 r 4 t 5/;
をさっきの$formのりファレンスに追加したい場合もあるなと思って試してたら返事が遅くなりました。
まだできてませんけど;
メソッド内でのグローバル変数はやはり禁止にしたほうが何かといいですよね。
メソッド1での代入結果をメソッド2で使うんですが、リファレンスにしてそれだけ
呼び出し元にreturnで返そうと思います。(まだテストしてないので可能かはわかりませんんが・・・)
とにかくありがとうございました!
0255251
04/06/09 23:58ID:iD3wLltH入力した値が、文字化けせずに日本語のまま、正常に送られるようにしたいのです。
わかりにくい日本語ですいません・・・
0256nobodyさん
04/06/10 00:00ID:???うん?よく意図が読み取れないけど、メソッドっていうなら、普通にメンバ変数?(間違った言葉使ってるかも)に代入すればいいだけじゃ?
sub method1{
〜〜〜
$self->{hogehoge} = "unko-";
$self->method2();
}
sub method2{
〜〜
print $self->{hogehoge};
}
みたいに。
0257nobodyさん
04/06/10 00:02ID:???向こうがJISだったら、JISで送るしかないんじゃ?
<form>タグのencなんたらってのでこちらの送信するときの円コードは変えることができると思う。 ブラウザの挙動は知らないけど。
0259nobodyさん
04/06/10 00:10ID:Zv7Yb66M微妙にスレ違い。<form ... ACCEPTCHARSET="shift_jis">
0260248
04/06/10 00:10ID:???my @test1 = qw/q 1 w 2 e 3 r 4 t 5/;
my @test2 = qw/y 6 u 7 i 8 o 9 p 0/; #この行はまだ実験中なので無視してください。
my $form;
$form={map {split /-/}@test1};
return $form;
}
$form=&method;
print $form->{q};
一応動作はしますがなんか変な感じですね。
>>256
$selfは
my $self=shift;
とかをメソッドの初めにしてるということですよね?
今まで、うまくオブジェクト指向ちっくな部分が理解できてませんでしたけど、
なんかもの凄いヒントもらった気がします。ちょっと考えてみます。
0261nobodyさん
04/06/10 00:18ID:???うぬ? 微妙にわかってないかな。 my @test1 = qw/q 1 w 2 e 3 r 4 t 5/; なら、別に'-'でsplitする必要はないので、$form = { @test1 }でいいんじゃないかな。
あと、@array = qw/a A b B c C/; %hash = @array;と、
%hash = qw/a A b B c C/;で、%hashの中身は、同じね。
{}んで、囲んだたら中のリストの内容がぎじぇりgへおりgはえおじぇいrひあえhrがれがえrげhてぇt
ごめん、なにいってるわからなく。
>
0262248
04/06/10 00:27ID:???splitの部分は途中で@test1の中身を変えてしまったままを忘れてました。
>あと、@array = qw/a A b B c C/; %hash = @array;と、
>%hash = qw/a A b B c C/;で、%hashの中身は、同じね。
なんとなくで思ってましたが>>261さんのおかげで、確信がもてました。
$self->{hogehoge}="文字列";
はリファレンスのアドレス?メモリ番号といいますか、それが決まる前に値を入れる・・・
というか、値を入れるのと同時にアドレスも持つみたいな感じを以前に読んだ気がします。
かなり良い感じになってきたので、解説サイト行って勉強しなおしてきます。今なら前より
理解できそう。
0263251
04/06/10 00:37ID:outd/ELTありがとうございます。しかし、その内容では駄目なようでした・・・
板違いスイマセンでした。この内容だとHTMLなのかな・・・?
0264248
04/06/10 09:53ID:???my $self = shift;
my @test1 = qw/a-9 b-67 c-876 d-765/;
my @test2 = qw/e-rt f-asdd g-fgf/;
$self->{form}={map {split /-/}@test1,map {split /-/}@test2};
}
sub method2{
my $self=shift;
my @test=qw/a b c d e f g/;
print map{$self->{form}{$_}@test;
}
$self->{form}をデリファレンスするのに今はこんなやり方しか思いつかないんですが、
method2でわざわざ@testに$self->{form}の各キーを代入しないでもいい方法はないでしょうか。
$$self{form}でもアドレスが出てくるので、$$$self{form}でいけるかなと思いましたがやはり
駄目でした。
0267248
04/06/10 11:41ID:???(モジュールの場合)
コンストラクタ
sub new{
my $self = shift;
bless {
data1 => {qw/a 1 b 2 c 3/},
data2 => {qw/d 4 e 5 f 6/}
},$self;
}
で初期化しておいてmethodに$a={qw/a 2 b 4 c 6/}を投げたら
sub method{
my $self = shift;
my $a = shift;
$self->{data1}={%{$a}};
}
のように$self->の中身に処理結果を反映させて行く。みたいな感じでいいでしょうか?
これなら一応グローバル変数は排除できるっぽいです。
0268nobodyさん
04/06/10 12:02ID:Niohn4Xp以下の様にして予定表のリストから名前と年月が一致した予定を配列に入れて
foreach $yotei(@yotei) {
chomp $yotei;
($yo_name,$yo_year,$yo_mon,$yo_day,$yo_kaisi,$yo_end,$yo_naiyou) = split(/<>/,$yotei);
if ($name eq $yo_name) {
if ($yo_year eq $year) {
if ($yo_mon eq $month) {
$h_yotei[$yo_day] = $yo_naiyou;
}
}
}
}
後で、次の様にして表示しているのですが、これだと1日に1件の内容しか表示できません。
for(my $i=1;$i<=$lastday;$i++){
print "<td>$h_yotei[$i]</td>\n";
}
1日に複数の内容を表示させるにはどのように変更すればいいでしょうか?
0269nobodyさん
04/06/10 12:40ID:???push @{$h_yotei[$yo_day]}, $yo_naiyo;
に変えて、
for(my $i=1;$i<=$lastday;$i++){
print "<td>$_</td>\n" foreach @{$h_yotei[$i]};
}
とかか?
なんかしっくりせんけど。
0270nobodyさん
04/06/10 13:56ID:???月の日数文のファイルをつくって、ファイル名はもちろん年月日とかで。
そんでifにかけて真ならファイルオープンして中身を表示とかは?
これなら新しく予定を書きこむのも、新しい日付分のファイルを作るのもperlで可能。
素人も使えるようにUIもperlで整えればいいのでは?
0271270
04/06/10 13:58ID:???0273nobodyさん
04/06/10 17:01ID:???$self->{data1}={%{$a}};
これは、$aをデリファレンスして、んで、リファレンスを取ってるから、±0なことをしてると思うよ。
$aにハッシュのリファレンスが入ってるんだから、$self->{data1} = $a;でok
あと、この辺の話題になると、ム板のPerlスレにいったほうがいい。
0274nobodyさん
04/06/10 17:35ID:???ハッシュのコピーをしてるんじゃないの?
こうじゃなくて
$self->{data1} = \%{$a};
ならたしかにお前のいうとおりだが。
0275267
04/06/10 17:50ID:???$self->{data1}={%{$a}};
ありがとうございます。アドレスごと書きかえるだけでいいんですね。でも、アドレスごと
書き換えた場合は( {%{$a}} でも同じですけど )初めにコンストラクタで作られた
$self->{data1}のメモリ使用領域はどうなるんですか?
$self->{data1}はアドレスを格納しているだけなので、後でアドレスを書き換えたとしても
書き換え前のアドレス先には値が保存されているままなのでしょうか?
それとすみませんが、ム板っていうのはどこでしょうか。webpg板とweb制作板くらいしか使った事ないのですみません。
0276nobodyさん
04/06/10 17:56ID:???あ、あぁ、そういうことか
>>275
$self->{data1} = $a;とした場合は、$self->{data}->{hogehoge}を変更したら、$a->{hogehoge}も変更されると思う。
ム板->プログラム板
0277nobodyさん
04/06/11 12:04ID:???例ですが、data.txtに
1<TAB>2<TAB>3
と入っているとします。
$file="data.txt";
open(DATA,"<$file");
@line=<DATA>;
以下略
配列にデータを格納します。
QUERY_STRINGにxxx.cgi?num=3などとあって、この数値と配列の中身を評価する時ですが、
num=3の3は数値としてとらえてもいいと思うのですが、
$fileから読み出した文字列が数値である場合、それは文字列として評価するべきなのでしょうか、それとも数値として扱っていいのでしょうか。
ex.1 if ($num == $line[0]) {
ex.2 if ($num eq $line[0]) {
こういう扱いの違いについてです。
0278未承諾広告※ ◆TWARamEjuA
04/06/11 13:52ID:9CQ7zNJb都合の悪いときのことをいろいろと想像してみると楽しめるんじゃないかなぁ。
0279nobodyさん
04/06/11 14:05ID:???文字列比較の場合、num=03とやると3と一致しないね。
0280nobodyさん
04/06/11 20:43ID:???文字列を分割して配列に格納するまでは良かったのですが
配列の最後の文字列だけを取得する方法がわかりません。
$0で取得した/var/tmp/hoge.plのファイル名だけが欲しくて
$filename = (split(/\//,$0))[2];
としてみました。ディレクトリ変更する場合も考えて頭から数えないで
最後の文字列を取得できればと思います。
どなたか、ご教授よろしくお願いします。
0281nobodyさん
04/06/11 21:01ID:???0283nobodyさん
04/06/11 21:30ID:???use File::Basename;
my $filename = basename $0;
とかは?
0284280
04/06/11 21:32ID:???ありがとうございます。無事、ファイル名を取得する事ができました。
これで半日悩んでた自分がバカでした。修行を積んできます。
>>281
申し訳ありません。自分のレベルじゃまだまだ理解不能です。
今後の課題のひとつにしたいと思います。
ありがとうございました。
0285280
04/06/11 21:36ID:???数分違いでレス遅れました。
自分のレベルじゃ配列ぐらいしか思いつきませんでした。
basenameは、今後の参考にさせていただきたく思います。
ありがとうございました。
0286nobodyさん
04/06/12 00:34ID:???my $a = "aiueo" ; #コメント
の時に今まで半角スペースでやってたけどもしかしてTabでも問題ないの?
プラットフォーム全て共通でTabでもokかな?
0287nobodyさん
04/06/12 00:36ID:???ごめんね
このスレの住人では力になれないようだ
まずは日本語からだ!
0288286
04/06/12 00:55ID:???俺へのレス?
コメント開始までの見やすさのための空白にTabを使っていいのかなっていう質問。
Tabキーを押すと入力されるやつね。
なんかTabってソフトウェアによってコードが違うとか聞いた事あるから、もしかして
UNIXとWINDOWSでは違うのかなと思ったり、そもそもperlのコメント前にそんなの使って
いいのかなと・・・・
やっぱり日本語変かな・・・ごめん
0289nobodyさん
04/06/12 00:58ID:???そんなに手間のかかることじゃないし。
0291286
04/06/12 01:15ID:???2行もレス付けてくれるならyes|noも言って欲しい・・・・・
>>290
かなりのプログラミング言語ではホワイトスペースはどれだけ会っても半角スペース1分として認識される。
みたいなことが見つかった。使っていいんだろうけど、不安。だから誰かに大丈夫と言って欲しい。
0292nobodyさん
04/06/12 01:39ID:???0293nobodyさん
04/06/12 02:10ID:???入れ子をわざわざスペース4個でやれと?
アフォの子ですか?
0294nobodyさん
04/06/12 02:15ID:K+1+iYDq1. aタグでcgiにリンクします。
2. まずそのcgiは、aタグをクリックした人のIPアドレスを取得します。
3. その取得したIPアドレスを(毎日0:00にリセットされる)IPリストと照合します。
4. IPリストに同じIPアドレスがあれば、リンク先に飛ばしません。
5. IPリストに同じIPアドレスがなければ、IPリストにそのIPアドレスを書き込み、リンク先に飛ばします。
一日に二回以上、同一IPアドレスからの訪問を拒否するCGIです。
ここで質問ですが、そのリンク先に残るリファラはCGIになるのでしょうか?
このリファラをaタグの貼ってあるHTMLのままにすることは可能でしょうか?
0296286
04/06/12 02:35ID:???ありがと!かなりすっきりした!
>>293
憎まれ口を叩きながらも教えてくれてありがと。
>>295
結構普通にありますよね。それで俺もなんかあるのかなと
0297286
04/06/12 02:43ID:???関数の使いかたってあるのかな?
結構元もとの関数の意味を考えて使うと、何の処理なのかわかりやすいかもね。
例えばforeachとmapはmapの方が処理速度は速いけど、mapは返り血を出すから、
返り血が必要ない時には使わない。とかって・・・・意味ないか・・・
倫理マークアップの必要性をを軽く勘違いしちゃったね;
0298294
04/06/12 10:23ID:K+1+iYDqレスありがとうございます。
どのような方法か簡単に教えていただけませんか?
0299nobodyさん
04/06/12 10:52ID:???0300nobodyさん
04/06/12 11:50ID:???ファイルを開いた時点のファイルサイズがEOFになるのでしょうか?
それとも、追加書き込みされた分も読める?
0301nobodyさん
04/06/12 11:56ID:???読んだ時点でのEOFまで読める。
経験上、Linuxは糞で偶に嘘読まされる。信頼性が必要な時は他のプリミティブで同期取らないとだめぽ。
0302294
04/06/12 12:01ID:K+1+iYDqではもう少し詳しく教えていただきたいです。
0304nobodyさん
04/06/12 12:08ID:K+1+iYDqlocationで飛ばしたらいいだけ?
0306nobodyさん
04/06/12 12:18ID:???0308nobodyさん
04/06/12 12:46ID:???読んだ内容が、書かれているはずの物と異なる瞬間が存在して、その瞬間に読んだときに
ファイルが壊れているように見える。
再現性が非常に低いから解析できてないけど、どうしてもシステムのバグ以外には考えられない現象に遭遇したら、
そんなこと言ってた名無しがいた事を思い出せば、ちっとは得するかもな。
0309nobodyさん
04/06/12 13:25ID:???書き換え前の内容と書き換え後の内容が混ざってるぐらいは
あってもしょうがないかなと思うけれども、どちらでもない
ゴミが読めるってことでしょうか? そうだとするとかなり嫌
な感じだな...
0310nobodyさん
04/06/12 13:33ID:FD8KxqwO1.
ショッピングサイトを立ち上げているのですが、”決済する” のボタンを押すと、カード会社のサイトにジャンプし
、そのサイトで情報入力を行い、その戻りを受けてユーザに完了画面を出力しようと思います。
2.
こちらから、form post で、カード会社のCGIを呼び出し、カード情報入力画面をだします。
そのCGIは結果を success 又は ng でこちらに返してくるのですが、このままのつくりだと、
ユーザにカード情報入力後の画面に success , 又はngと ぽつんと表示され訳がわからない状態となります
3.
そこで、 form post属性で他のcgiを呼び出し、その結果を受けて、”xxxx円 決済が完了しました ありがとうございます
トップに戻る” と出したいのです。form post で呼び出したcgiの結果を判定する方法がわからないので、教えて下さい。
0313nobodyさん
04/06/12 14:09ID:???良かったら、どこのサイトか教えてくれないか?
2chで質問しながら作るような奴が作ったサイトでは絶対に買物したくないからな。
0314nobodyさん
04/06/12 15:25ID:???0316nobodyさん
04/06/12 16:01ID:???そんな馬鹿な奴は挙手汁。
0317nobodyさん
04/06/12 16:10ID:???http://pc5.2ch.net/test/read.cgi/tech/1085564875/223
0318nobodyさん
04/06/12 16:51ID:???ああ!!
いやマジで何なんだろうと悩んでたよ。<good>とか<evil>とかいうタグがあるのかと。
0319nobodyさん
04/06/12 21:53ID:???0321nobodyさん
04/06/13 12:39ID:???アイタタタ
0323nobodyさん
04/06/13 14:13ID:???0325nobodyさん
04/06/13 15:25ID:???0326nobodyさん
04/06/13 17:04ID:???2: それでラマ本を読んでみたが
3: 画面の作り方すら分からない
よろしこ。
0327nobodyさん
04/06/13 18:14ID:???マジレスしてよかったのかな
0329nobodyさん
04/06/13 19:01ID:???コマンドプロンプトでとかは無理かい
0330nobodyさん
04/06/13 19:37ID:???Advanced Perl Programmingに、Perl/Tkで作った
テトリスの作例があるから参考にしてみたら?
コードだけなら下のURLからダウンロードできるよ。
ttp://examples.oreilly.com/advperl/
0331nobodyさん
04/06/14 08:30ID:???どこで質問すればいいのかわからなかったのでここで質問をします
スレ違いの場合は誘導お願いします
2chではread.cgiを使ってブラウザでも読めるようなcgiを作ってますが
cgiで引数を指定するのは?のはずなのにcgiの次が/で引数にはならないと思います
どうやったら?を入れなくても引数を指定することが出来るんでしょうか?
0332nobodyさん
04/06/14 08:37ID:???おまえ馬鹿?引数とか意味もわからず使うなよ。お前の言いたいのはformのmethodだろ。
form method で調べて来い
0334nobodyさん
04/06/14 08:53ID:???どちらか片方の用語だけでも調べようと思い
perl +fromやperl method 用語などでもぐぐりましたが全然でてきません。。。
もう少しヒントをください
0335nobodyさん
04/06/14 09:45ID:???>2chではread.cgiを使ってブラウザでも読めるようなcgiを作ってますが
>cgiで引数を指定するのは?のはずなのにcgiの次が/で引数にはならないと思います
>どうやったら?を入れなくても引数を指定することが出来るんでしょうか?
つまり Perl で CGI の 引数 について知りたいわけだろ?
自分で書いておいて何故わからんのか
■ このスレッドは過去ログ倉庫に格納されています