Perlコーディング初心者質問スレ Part 50
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/06/26(月) 00:46:38ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0268nobodyさん
2006/07/06(木) 00:02:49ID:???0270nobodyさん
2006/07/06(木) 00:44:34ID:???ファイルを作ったのが自分かどうかはわからないが。
0271nobodyさん
2006/07/06(木) 00:59:56ID:FMcswvIHバッチ処理(これはなんとか解決)を実行後に、元のHPでリンクされた
urlを新しいブラウザで開きたいのですが記述方法がわかりません。
どう記述すれば良いのでしょうか?
つまらない質問ですがよろしくお願い致します。m(__)m
0272nobodyさん
2006/07/06(木) 01:26:41ID:???0273nobodyさん
2006/07/06(木) 01:30:44ID:???0274nobodyさん
2006/07/06(木) 02:13:42ID:???perlって、サーバで動きますよね。
自分のパソコンで動かそうと思ったら、
apache,activeperlとかインストールしないとだめです。
ここで質問ですが、exeファイルみたいなので、
activeperl無しで動かすことってできるんでしょうか?
perlでアプリケーション作ったら、
apacheとactiveperlもいっしょに入れて、
自分でインストールしてください。
ということになるんでしょうか?
たとえば、チャットのクライアントソフトなど
作るときってどうなりますか。
よろしくお願いします。
0275nobodyさん
2006/07/06(木) 02:26:05ID:???∩( ´∀`)∩ドウゾ (っ´∀`)っ))アチラヘ
CGI設置について質問 【Part2】
http://pc8.2ch.net/test/read.cgi/php/1104624784/
0276nobodyさん
2006/07/06(木) 02:45:14ID:???0277nobodyさん
2006/07/06(木) 03:58:15ID:???こんにちはこんにちは!
この辺を見るといいんじゃないかな…!
http://hamachiya.com/junk/memo_PAR.html
0279nobodyさん
NGNGttp://0xcc.net/diary/20040716.html
0280nobodyさん
2006/07/06(木) 14:12:07ID:???すごい便利なものがあったんですね。
でも、説明読んでみるとソースコードが
簡単に見れるのと、複雑なコードが正常に
動かないとか書いてありますね。
もうちょっとネットや本の資料探してみます。
0281nobodyさん
2006/07/06(木) 16:24:22ID://0K++zo変数を区別する記号付けってどうやるのか度忘れしたので教えて下さい。
検索ワードのご教示だけでも良いです。
[例]
$i = 1;
print "hoge$i_code";
等を正しく表示したい。
0282nobodyさん
NGNG0283nobodyさん
2006/07/06(木) 16:26:57ID:???0284nobodyさん
2006/07/06(木) 16:33:30ID:???0285nobodyさん
2006/07/06(木) 16:54:28ID:???OSはWINです。
すごい初心者で変な質問ですみません。
perlで、dosコマンドを実行することって
できるんでしょうか。
たとえば、
print "del a.txt";
というようにファイルを消そうと標準出力しても
実行できませんでした。
可能でしたら、方法ご教授お願いします。
0286281
2006/07/06(木) 16:56:24ID:gzQtm5v/それです!ありがとうございます。
>>283>>284
print <<HTML;
hoge$i_code
HTML
だとどうなんですかね。
汎用性に問題あり?
教えてクレクレ君の分際で偉そうにすみません。
ありがとうございました。
0288nobodyさん
2006/07/06(木) 17:11:28ID:???実行するだけならsystem関数、その出力が欲しいならバッククォートまたは、パイプでopen。
だが、そのファイルを消すというのが単なる例じゃないとしたらunlink関数を使うべき
>>286
284はこういう場合に問題ありだな
"${i}nhoge"
0294nobodyさん
2006/07/07(金) 12:05:06ID:???Perl5.8で、jcode.plやJcode.pmを使わずに
全角英数と半角英数の変換を行う方法があれば、教えてください。
0295nobodyさん
2006/07/07(金) 12:32:03ID:???step1. 文字コードについて理解する
step2. がんばる
0296294
2006/07/07(金) 14:25:27ID:???下記のようなスクリプトをUTF-8で保存し、
入力テキストファイルもUTF-8で記述したところ、うまく動作しました。
$_ = decode('utf8',$_);
の部分の意味がよくわからないので教えてください。
ここは何をしてるんでしょうか?
use strict;
use utf8;
use Encode qw/ encode decode /;
while (<>){
$_ = decode('utf8',$_);
tr/[0-9]/[0-9]/;
print;
}
0297nobodyさん
2006/07/07(金) 15:11:08ID:???オアエスゴイナww
0298nobodyさん
2006/07/07(金) 15:19:10ID:gJw2prbrやっぱforeachとかで中身を展開しながら1コずつ処理するしかない?
jcode.plとかJcode.pmとで配列そのものを扱う方法ってある?
>>294
英数字限定なら正規表現でどぞ。
0299nobodyさん
2006/07/07(金) 15:40:01ID:???0300298
2006/07/07(金) 16:19:58ID:???CGI.pmでフォームの内容を配列に入れて文字コードごにょごにょってのは
結構色んなとこで使われそうな処理なんで、実装されてたりするのかなぁ、と思ったもんで。
無いと分かれば、安心して配列回しまくれますわ。さんくす。
0301294
2006/07/07(金) 16:27:23ID:???[]は要らないよ、とおっしゃっているのでしょうか?
>>298
正規表現というと、具体的には?s///を使ってできるという意味ですか?
0302nobodyさん
2006/07/07(金) 17:13:35ID:???1byte 単位(正確には 8bite 単位)の処理から utf8 の文字列処理に
変換している。
$_ = decode('euc-jp', $_ ) ;
なら、8bite 単位の羅列を euc-jp でエンコードされてると見做
した上で、utf8 に変換。
0303294
2006/07/07(金) 17:26:00ID:???レスありがとうございます。
バイト単位から文字単位へ、という事が必要なので
読み込ませるテキストがUTF8でも必要、という事でしょうか。
読み込ませるテキストの文字コードがわかってない時はややこしそうですね。
0305205
2006/07/07(金) 20:47:14ID:???open(F,">$localsubjectpath")||die"subject.txtをopen出来ません:$!";
foreach(@localsubject){print F $_;}
close(F);
が追記モードになっていたために2重に書き込んでしまうという症状が起きました。
上書きモードで実行したらうまくいきました。
くだらない質問に答えてくれて本当にありがとうございました。
0306nobodyさん
2006/07/07(金) 21:37:02ID:???解決おめ。
234で指摘したのとほぼ同じ原因でないか…自力で二日も模索乙
まさか、まだ追記モードを使っていたとは夢にも思ってなかった訳だが。
0307nobodyさん
2006/07/07(金) 22:07:16ID:???おめ。
俺はがんばって >>234 のコードを読解して新しく書き直してるのかと思ってたw
少しは参考にすればいいのにね。
0308294
2006/07/08(土) 10:38:42ID:???こちらでの質問はこれで終わりとし、
別スレでこちらで回答していただいた事を元に
少しポイントをしぼって質問してみたいと思います。
回答していただいた方々、ありがとうございました。
0309294
2006/07/08(土) 10:40:49ID:???0310nobodyさん
2006/07/08(土) 13:48:22ID:???0311nobodyさん
2006/07/08(土) 14:50:57ID:9n4HcMAb「〜」の変換がうまくいきません。
変換できずに、「\x{ff5e}」になってしまいます。
JISにも「〜」ありますよね。
どうしたら回避できるでしょうか?
0312nobodyさん
2006/07/08(土) 14:58:49ID:???どの文字コでも設定と正規表現で2行だと思うけどw
0314nobodyさん
2006/07/08(土) 15:15:04ID:???Unicodeと既存のエンコーディングのマッピングを作る際に、〜のマッピングがメーカーによって
WAVE DASHとFULLWIDTH TILDEの二つに分かれてしまったことに起因する問題。
http://ja.wikipedia.org/wiki/Unicode
事前に"\xEF\xBD\x9E"(\x{FF5E})を"\xE3\x80\x9C"(\x{301C})に変換して統一してやればOK。
ちなみにUTF-8はASCIIとの兼ね合いは勿論のこと、1バイト目の範囲が2バイト目以降の範囲と
重ならないように設計されているから、utf-8フラグを使用しない場合でも、ずれてマッチする心配はしなくて大丈夫。
0316nobodyさん
2006/07/08(土) 15:28:25ID:???とってもまだるっこしいですが、
encode('iso-2022-jp', decode('shiftjis', encode('cp932', $x)))
とする手もあります。
日本は既存の文字コードとunicodeの対応表をつくるにあたって
統一に失敗して大きく2種類(JISとMS)できてしまったため、こんな
面倒を強いられるのです。恨むなら当時の関係者を恨んでください。
ちなみに「〜」を\x{ff5e}にするのはMS流で、JISだと\x{301c}に対応
させることになっています。
個人的には日本語に関してはunicodeはunicode-jisをunicode-msの
2種類あると思って、それらを自動判定して相互変換するJcode相当の
モジュールが欲しいなと思います。
0317nobodyさん
2006/07/08(土) 15:31:47ID:???そういう面倒を吸収してくれるライブラリがやっぱり必要なんじゃない?
0318nobodyさん
2006/07/08(土) 15:39:20ID:???→ Jcode (それ以下)
とかやって、その自作モジュのとこで対策すればいいのかもだね
0319nobodyさん
2006/07/08(土) 15:40:35ID:???ttp://search.cpan.org/dist/Encode-EUCJPMS/EUCJPMS.pm
使え的な指摘がありますよ。
0320nobodyさん
2006/07/08(土) 15:41:10ID:???0321311
2006/07/08(土) 15:41:57ID:9n4HcMAb〜は事前に\x{301c}に変換したいと思います。
実際、携帯電話からの入力なので、
Encode::from_to( $x, "CP932","UTF8");
としてUTF8に変換してたのですが、CP932→UTF8なので「〜」が\x{ff5e}になってしまうんでしょうか?
0322nobodyさん
2006/07/08(土) 15:55:45ID:???0323nobodyさん
2006/07/08(土) 16:11:50ID:???0324nobodyさん
2006/07/08(土) 17:22:37ID:H4L43ePpこれを省略せずに書くとどうなりますか?
配列の1番目から4番目まで限定的ではなく
配列内全てをforeachする書き方が分かりません。
@hoge_Aと@hoge_Bの要素数は同じです。
0325nobodyさん
2006/07/08(土) 17:40:04ID:???> push @fuga, $hoge_A[$_] . $hoge_B[$_] foreach 0..3;
> これを省略せずに書くとどうなりますか?
foreach my $i (0,1,2,3) {
push @fuga, $hoge_A[$i] . $hoge_B[$i];
}
0326nobodyさん
2006/07/08(土) 17:41:41ID:???省略せず、じゃなくて一般化の話かな。
まず要素数を取得し、そこから範囲を作る。そのRangeに対してforeachもしくはmap
push @fuga, $hoge_A[$_] . $hoge_B[$_] foreach 0..@hoge_A-1;
or
@fuga = map { "$hoge_A[$_]$hoge_B[$_]" } map 0..@hoge_A-1;
しかし、要素数は同じと言い切れるんだったら、同時に管理されるデータなんだろ?
なら関連性のある二つのデータを別の配列に入れると言う、その構造を何とかしたほうが良いと思う。
@fuga = map { "$_->{A}$_->{B}" } @hoge;
そうすると、こんな風にできる。詳しくはperllolを参照
0327nobodyさん
2006/07/08(土) 17:44:23ID:???@hoge_A-1 を $#hoge_A
と書くのがBest Practice。
$#は配列の最後の要素番号を表すから、
配列のインデックスとして使う場合に適している。
0329326
2006/07/08(土) 18:01:09ID:H4L43ePp「配列の1番目から4番目まで回す」んじゃなくて
「(0,1,2,3)という配列を回す」ってことだったんですね。
ありがとうございます。
>>326
大変詳しい回答と説明ありがとうございます。
想定通りの結果を得ることができました。
>関連性のある二つのデータを別の配列に入れると言う、その構造を何とかしたほうが良いと思う。
まさにその通りで、そのために今回の処理をしようとしていました。
具体的には(情報の後出しになってしまいますが...)
フォームから「月」と「日」を取得し、「日付」という配列に格納するための処理です。
とにもかくにも、アドバイスまでいただいて本当にありがとうございました。
>>327
より良いコードのためのアドバイスありがとうございます。
勉強になりました。
0330nobodyさん
2006/07/08(土) 18:04:13ID:???0331nobodyさん
2006/07/08(土) 18:51:46ID:???環境なくなっちゃって確認できなくて orz
0332nobodyさん
2006/07/08(土) 19:08:45ID:???0334nobodyさん
2006/07/08(土) 20:17:42ID:???1 while $cnt != push @fuga, ( shift @hoge_A ) . ( shift @hoge_B ) ;
つーのを思いついた自分に鬱
0335nobodyさん
2006/07/08(土) 21:09:20ID:???ある掲示板スクリプト(bbs.cgi)があるとします。
自分のWEBサイトではこの掲示板をいくつか設置しているのですが、
そのたびに、「bbs1.cgi」、「bbs2.cgi」、「bbs3.cgi」みたく名前を付けて設置しています。
これをクエリを使用して「bbs.cgi?c=1」や「bbs.cgi?c=2」みたくしたいのですが、考え方が分かりません。
ちなみにできればWEB上から必要な数を必要なだけ作成できるようにしたいと思っています。
アルゴリズムだけで構いませんので、どうかよろしくお願い致します。
0336nobodyさん
2006/07/08(土) 21:17:18ID:???0337nobodyさん
2006/07/08(土) 21:59:16ID:???>>335
そのスクリプトの構造にもよるけど十中八九大改修。
他の掲示板と共有できない点を洗い出すことから始めるといいよ。ログファイルとか。
ファイル名変えてる=同一ディレクトリって所から危なっかしいけどPerl関係ない…
改造スレあたり行くのが無難だと思う。
0338nobodyさん
2006/07/08(土) 22:33:57ID:???print $x;
としようと思うのですが、$xはリファレンスの可能性があります。
リファレンスの場合であってもref関数でチェックなどせずにそのまま表示しようと思うのですが、リファレンスだとメモリの場所がわかるわけですよね。
これが何かセキュリティ上問題になるようなことはあるのでしょうか。
例えば、他の変数の内容を閲覧できてしまう、といったことがあれば考え直そうと思うのですが。
0339nobodyさん
2006/07/08(土) 22:38:32ID:???無理なのでもうすこし地道に勉強してからの方がいいと思われる。
0340nobodyさん
2006/07/08(土) 22:39:14ID:???0341nobodyさん
2006/07/08(土) 22:42:45ID:???そんなことで悩んでる暇があったら表示されないようにちゃっちゃと
書き直すほうが早い。
メモリの場所がわかっただけで即やられるということはないだろうが、
他のセキュリティホールとの合わせ技でなんかされる可能性を
否定するのは難しい。
0342nobodyさん
2006/07/09(日) 05:26:05ID:???> これが何かセキュリティ上問題になるようなことはあるのでしょうか。
直接の問題はないと思う。
が、何を「セキュリティ上問題」とするかによるだろうね。
「メモリの場所がわかる」ことも見方によれば問題だろうし。
0343nobodyさん
2006/07/09(日) 05:32:57ID:???ログ読み込みで
open fh,"log$ENV{QUERY_STRING}.dat";
ログ書き込みで
open fh,">log$ENV{QUERY_STRING}.dat";
・・・不特定多数が来る板だとキケンかもw
0344nobodyさん
2006/07/09(日) 05:40:13ID:???$xはリファレンスでなかったら何になる可能性があるの?
リファレンスになるかもしれない$xを表示したいwebコンテンツ
って言うのが謎なんだけど・・・w
0345338
2006/07/09(日) 07:29:33ID:???ありがとうございます。
>>344
確かにそうですね、、よく考えるとそう思います。
ちょっとアルゴリズムを再考してみます、ありがとうございました。
0346nobodyさん
2006/07/09(日) 13:14:05ID:OFKeC9Kgそういうことはできますか?
簡単な例で言うと、
@DATA = ('B','A','A','B','A','D','C','D');
という配列を対象とした場合は、
@DATA = ('B0','A0','A1','B1','A2','D0','C0','D1');
といった感じです。
map{$count{$_}++}@DATA;
という風にしていくつ重複があったかを調べることはできたんですが
その都度、数字を振る方法が分かりません。
分かる方、どうぞよろしくお願いします。
0347nobodyさん
2006/07/09(日) 13:21:34ID:???0348nobodyさん
2006/07/09(日) 13:24:03ID:???>>347
何故に grep ?
0349nobodyさん
2006/07/09(日) 13:36:33ID:???>>347さん
>>348さん
即回答ありがとうございます!
どちらの方法でもうまくいきました。
348さんの記述の方がより簡潔なのでそちらの方を使わせてもらおうと思いますが
347さんの記述も参考にして勉強します(恥ずかしながら記述の内容が理解できてないので)。
ありがとうございました!
0350nobodyさん
2006/07/09(日) 15:12:46ID:???それだと 0 が付かないと思ったら、ちゃんと付くんだね。
++ で空の値が 0になる方が. の連結より評価が先になるってことか。
grep 使うのは @data に書き戻さないで良いから(@dataを直接書きかえる)。
>>348 のを grep で書くと
grep { $_ = $_ . $count{$_}++ } @data;
0351nobodyさん
2006/07/09(日) 15:29:54ID:???>grep 使うのは @data に書き戻さないで良いから(@dataを直接書きかえる)。
いや、map でも無精しなければ…。s/grep/map/ してみ?
0352nobodyさん
2006/07/09(日) 15:42:53ID:???でよくね?
# TMTOWTDI
0354nobodyさん
2006/07/09(日) 16:19:00ID:???制御構文の後置って書いていて気持ちいいんだよな
0355nobodyさん
2006/07/09(日) 16:29:17ID:Grc/Miyg以下のようなハッシュと配列があります。
my %sex = (
'm' => '男性',
'f' => '女性',
);
my @list = ('name','age','sex','mail','addr', ・・・);
プログラム中で、
while (my($key,$val) = each(%sex)){
・・・
}
という処理を行いたいのですが、%sexの'sex'という文字列を、@listから拾いたいのです。
while (my($key,$val) = each(%{$list[2]})){
・・・
}
というふうに。
もちろん上記の例では「ハッシュではありません・・・」という意味のエラーが出るのですが、
やりかたがわからず困っています。
each(eval ('%' . "$list[2]")
でもやっぱりダメで、他に考え付きません・・・
よろしくお願い致します。
0356nobodyさん
2006/07/09(日) 16:39:01ID:???ってか普通は %sex とかを $hash->{sex} = {}; とかってやる気がする。
ちなみに eval でやるなら
each(eval ('%' . "$list[2]") → each(eval ("\\%$list[2]") こうじゃね。
0357nobodyさん
2006/07/09(日) 16:46:51ID:???0358nobodyさん
2006/07/09(日) 16:46:54ID:???0359355
2006/07/09(日) 19:33:47ID:???配列@listには、"配列やハッシュに使う「名前」"だけを格納してるのです。。
>>358
evalの使い方を間違えていたのですね。
ありがとう。その例でできました。
0360nobodyさん
2006/07/09(日) 20:03:39ID:???>配列@listには、"配列やハッシュに使う「名前」"だけを格納してるのです。。
どういう経緯でそうなったかは知らないけど、
eval使いまくりで効率悪くなる事この上ないなぁ。
my %var = (
'sex' => {
'm' => '男性',
'f' => '女性',
},
...
);
みたいにして
each %{$var{$list[2]}}
とすると、eval使わなくていいけど。
0361nobodyさん
2006/07/09(日) 20:04:15ID:???デバッガ作るんでもなけりゃ名前をキーにしたハッシュにしとけよ。
0362nobodyさん
2006/07/09(日) 20:39:33ID:???0363nobodyさん
2006/07/10(月) 09:14:03ID:???メモリの取得とか開放とか 変数使ったときの内部の挙動が
いまいち心配なのですがどうしたらよいでしょうか
0364nobodyさん
2006/07/10(月) 09:41:10ID:???perlのGCはリファレンスカウントなので循環参照を作って使い
捨てるとメモリリークになる。これに注意すれば無限に太り続ける
ことはないだろう。
perlは基本的にosからとったメモリは返さないので、一度でも大量に
メモリを使うと太ったままになる。それが困るようならたまにexecする
ぐらいしか手はない。
例外もあるがくわしくはperlfaq3の
How can I free an array or hash so my program shrinks?
参照。
0365nobodyさん
2006/07/10(月) 16:54:29ID:kBFNwS+Apushで複数の配列に同時に要素を代入する方法ってありますか?
■ このスレッドは過去ログ倉庫に格納されています