Perl コーディング初心者質問コーナー Part35
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/05/26 16:48ID:kkhhiYmo【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0159nobodyさん
04/06/06 17:34ID:???$名前ってのがそうです。
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
0160158
04/06/06 17:49ID:RQ9IWgny変数に代入されている値がスカラーかハッシュへのリファレンスかで
処理する内容を変えたいのですが,プログラム内部でそれを判断する
方法はないでしょうか?
0161nobodyさん
04/06/06 17:49ID:???$noって=$filenameですよね?
なぜ$filenameを$noで再度置き換える必要があるのでしょうか?
後、print "$no";で一度記述してるのに
後にif文で再度同じ事をしてるのはなぜですか?
#! /usr/local/bin/perl
# ログファイル名
$filename = "count.txt";
# ファイルを開く
if (!open(FP,"$filename")) { # 失敗
$no = 0;
} else { # 成功
$no = <FP>;
close(FP);
}
# 1つ増やす
$no++;
print "$no";
if (!open(FP,">$filename")) { # 失敗
print "ファイル $filename がオープンできませんでした ($!)\n";
}else{
print FP $no;
close(FP);
}
0163nobodyさん
04/06/06 18:42ID:???ref <変数> でリファレンスかそうでないかがわかるよ。
リファレンスじゃないなら偽。
リファレンスなら、種類によってARRAYとかHASHとかが返される。
0164nobodyさん
04/06/06 18:56ID:kS2UjgnM「\x{0082}ノ\x{0082}ル\x{0082}\x{00f1}\x{0082}イ」
と、表示されてしまいました。
「use encoding 'shift_jis';」を指定しており、
もし「use encoding 'shift_jis';」の一行を取り除くと、
ちゃんと「にほんご」と表示されます。
「use encoding 'shift_jis';」を指定した場合も、、
「にほんご」と表示されるようにするには、どうしたらよいでしょうか。
環境
ActivePerl 5.8.3 Build 809
Windows XP Pro SP2, IIS
0165164
04/06/06 18:57ID:kS2UjgnM--- ここから ---
use CGI;
use encoding 'shift_jis';
$cgi = CGI::new();
$text1 = $cgi->param('text1');
print <<EOM;
Content-type: text/html
<HTML>
<BODY>
$text1<br>
</BODY>
</HTML>
EOM
--- ここまで ---
0166160
04/06/06 19:09ID:???うまくいきました。ありがとう。
XML::Simpleで取り出したデータ構造が,同じ階層でスカラだったり,
ハッシュだったりしたので困ってました。
漏れが買った本には載ってなかったけど新しい関数だからかな?
<参考>
ttp://www.futomi.com/cgi-bin/lecture/perl5ref.cgi?MODE=CATEGORY&CATENO=21
ttp://www.futomi.com/cgi-bin/lecture/perl5ref.cgi?MODE=DISP&FUNC=ref
0167161
04/06/06 20:05ID:ZCQZgjkYのに後にイフで再度書き込もうとしてるのはなぜですか?
print "$no";
if (!open(FP,">$filename")) { # 失敗
print "ファイル $filename がオープンできませんでした ($!)\n";
}else{
print FP $no;
close(FP);
}
0168nobodyさん
04/06/06 20:18ID:???print "$no";
if (!open(FP,">$filename")) { # 失敗
print "ファイル $filename がオープンできませんでした ($!)\n";
}else{
print FP $no;
close(FP);
}
print "$no";
したらどうよ。
0169nobodyさん
04/06/06 20:20ID:???後ろの方には FP が入ってるわけですが、そこんとこどうよ?
0170nobodyさん
04/06/06 20:35ID:ZCQZgjkYprint FP $no; がcount.txtへの書き込みという事ですか?
0171nobodyさん
04/06/06 20:38ID:???0172nobodyさん
04/06/06 20:39ID:???とりあえずファイルハンドルを知れ。
0173nobodyさん
04/06/06 21:03ID:???固有名詞で通常大文字で記述する。
print FP $no;
のような形式はファイル自身に書き込むこと。
ですよね?
あれ?なんでファイルハンドルつける必要あるのですか?
0174nobodyさん
04/06/06 21:04ID:qBVB6Avxbenchmark.pmを使った際の出力結果
例えば
0 wallclock secs ( 0.02 usr 0.00 sys + 0.02 cusr 0.01 csys = 0.05 CPU)
というのは何を表すのでしょうか(処理時間であるということぐらいはわかりますが)
wallclock secs,usr,sys,cuser,csys,cpuってそれぞれなんなんですか?
usrはユーザ側の処理時間??
あと同じCPUでも
0 wallclock secs ( 0.02 usr 0.00 sys + 0.02 cusr 0.01 csys = 0.05 CPU)
2 wallclock secs ( 0.02 usr 0.00 sys + 0.03 cusr 0.00 csys = 0.05 CPU)
のようにwallclock secsに大きな違いが出るのは何故なんでしょうか?
0175nobodyさん
04/06/06 21:20ID:???usr: (そのプログラム自身が)ユーザモードで消費したCPU時間
sys: (そのプログラム自身が)カーネルモードで消費したCPU時間
cusrとcsysはそのプログラムから起動された子プロセスが消費した分
最後のx.xx CPUはそれらの合計。
実時間は他のプログラムが動いていたり、IOの待ちがあったりすると
かなり変動する。
0178nobodyさん
04/06/06 23:24ID:ZCQZgjkY0183nobodyさん
04/06/06 23:56ID:???あのスクリプト自身があまりうまく出来てないと言うことですかね、
と言うことは私の疑問もあってるんでしょうか。
一応参考書の例文なのですが。
0184nobodyさん
04/06/07 00:05ID:???疑問とは?
>$noって=$filenameですよね?
これか?違う
>print "$no"; がhtmlへの書き込みを示してて、
これか?違う
>print FP $no; がcount.txtへの書き込みという事ですか?
これか?そう
0185nobodyさん
04/06/07 00:49ID:T5+evT2p数十〜数百個ほど取りこぼしがあるのですが、これって既出ですか?
もしそうならすいません。確実に取得できる方法はありますか?
ファイル名でソートしてちゃんと時系列で処理をしたいのですが、この問題のために
作れなくて困っています。
0187nobodyさん
04/06/07 01:04ID:???1個目、2個目なのですがまず1個目は
$filenameから読み込んだ数値を$noとするということでしょうか?
2個目だけはどうしても必要とは思えないのですが。
その後、ifで再度書き込まれるわけですし。
0188nobodyさん
04/06/07 01:13ID:???これに引っかかってる?
http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm#file
0189nobodyさん
04/06/07 01:36ID:???>$filenameから読み込んだ数値を$noとする
そう。ファイルハンドルをスカラ変数に代入は1行読み込み。
>2個目
print "$no"; は標準出力へ$noの値を出力。
print FP $no; はファイルへ$noの値を出力(書き込み)。
必要あるなしなんて書いたやつがそうしたかったのだろうよ。
0190nobodyさん
04/06/07 01:39ID:???名前に元質問のレス番を入れろ。
コーディングスレなんだから「私の疑問も・・・」とか「1個目、2個目」なんて
書かずにどのコードについてなんなのかもうちょっと文章を考えて書け。
0191nobodyさん
04/06/07 04:40ID:???どこがおかしい、もしくは基本的に間違いと言う所をご指摘願います。
#行数・項目数(, 区切り)とも不確定のCSVファイルを読み込み、
#@page2 に $page[n行目][n項目] と言った感じの2次元配列で格納したい
open (IN, "./link.csv");
my @page = (<IN>);
close (IN);
my (@line, $i, @page2);
$i = 0;
foreach (@page){
@{$line[$i]} = split(/,/);
push(@page2, @line);
}
print $page2[3];
#@page2 の中の3行目を表示したいけど、結果は ARRAY(0x155c7c8) と出る
#$page[3][3] とすると、最後の行の目標項目が表示される
0193nobodyさん
04/06/07 05:53ID:???http://www.kt.rim.or.jp/%7ekbk/perl5.005/perllol.html
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perldsc.html
0195nobodyさん
04/06/07 08:45ID:mlYstQXaありがとうございました。
>>176
有効桁は・・・昔BASICをやってたときに#をつけると倍精度とか・・・
(よくわかってないんで自分で調べてみます)
0196164
04/06/07 12:47ID:c3dnKsSQようやく解決できました。
>>165 のように書いてしまっていたので、指摘の通り、
「use encoding 'shift_jis';」をまずはじめに書くように直しました。
なおかつ、それでも化けていたのですが、
「use encoding 'shift_jis';」に「Filter=>1」を加えたところ、
ようやくきちんと「にほんご」と表示できました。
どうもです。
0197nobodyさん
04/06/07 13:27ID:???サブルーチンの呼び方に関してなのですが、例えばjcodeですと
jcode'convert (*value, "sjis"); ← Perl4
jcode::convert (\$value, "sjis"); ← Perl5
などの書き方ができますよね。
Perl5ならどちらの記述でも動きますが、
Perl4にも対応させるなどの汎用性という面では、
常にPerl4の記述で書いたほうがいいのでしょうか?
0199nobodyさん
04/06/07 13:49ID:???わざわざ古い書式を使うこともあるまい。
0200nobodyさん
04/06/07 13:50ID:???君が赤ラクダを持っているならともかく、今時 Perl4 で
問題なく動くスクリプトを書く方が難しいと思うがな。
jcode'convert(*value, "sjis"); # ×
&jcode'convert(*value, "sjis"); # ○
ま、自己満足以外のメリットは殆どないが、やりたきゃご自由に。
http://flex.ee.uec.ac.jp/texi/perl/perl_toc.html
0201nobodyさん
04/06/07 14:25ID:???あれを Perl5.8 対応にしてヨブが粘土板を UTF-8 で刻むようなチュートリアルが読みたい
0202nobodyさん
04/06/07 17:08ID:SF6UmQvxあるデレクトリのテキストファイルのみを取得したいのですが、
opendir DIR, '/home/foo/bar' or die;
@files = grep { -f }readdir DIR;
print join("\n", @files);
とすると空でなにも表示されません。2行目を
@files = grep { !-d }readdir DIR; # デレクトリではないもの
とするとデレクトリ以外のファイルが取得できます。
ファイルテスト演算子「-f」では取得できないのですか?
0204202
04/06/07 17:51ID:SF6UmQvx返事、ありがとうございます。
そうかとも思ったんですが、ならば !-d で判定できているのは…んん?
えーとあれですかね、この場合判定できているのではなくて、
存在しない->よって「!-d」も真値が返ってきてる、って事ですか?
つまり判定できているわけではないってこと?
0205202
04/06/07 17:54ID:SF6UmQvxすいません、フルパスで -f で大丈夫でした。
お騒がせしました。
0206nobodyさん
04/06/07 20:46ID:UI3v3779掲示板CGIにアクセス解析CGIを組み込みたいと思ってます。
Bodyの中にタグとして書き出すのでなく、CGIの中で完結させたい
(ソースを見てもわからないようにしたい)のですが、
具体的にどのようにすればいいのでしょうか。
サブルーチンで解析CGIを呼び出す、というヒントは読んだのですが
呼び出しの記述の仕方がわかりません。
なんとなくこんなふう書くのではないかと思うのですが↓
sub access {
??? = './acc/acc.cgi?a=b&&c=d';
}
どなたかアドヴァイスおねがいできませんか!
0208nobodyさん
04/06/07 20:59ID:???0209nobodyさん
04/06/07 21:02ID:SF6UmQvxsystem("/home/hoge/bin/command arg > file");
とするとcommand の出力はfileに書き出されます。
@array = system("/home/hoge/bin/command arg");
としても@arrayには何も格納されません。
シェルから
$ /home/hoge/bin/command arg
とすると出力が画面に表示されます。
command の仕様には「標準出力に表示します」とあるだけです。
訳あってこれ以上の情報が取得できない状況です。
command の出力を変数に取り込むにはどうすればいいんでしょうか。
0210nobodyさん
04/06/07 21:02ID:???ついでにプログラミングは100年は早い。
0213nobodyさん
04/06/07 21:16ID:???ついでにプログラミングは100年は早い。
おまけに日本語を喋れない。
0214nobodyさん
04/06/07 21:29ID:???http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlfaq8.html#Why_can_t_I_get_the_output_of_a_
0216nobodyさん
04/06/08 01:10ID:???例えば
@data = 1 2 3 4 5 〜 100
があり その中のある数にもっとも近いモノからソートすると言う事は出来るでしょうか?
例えば↑の配列 5 に一番近い数字からソートすると 4 6 が先頭の並び順になる…というような感じなんですが…。
ちょっと無理っぽいような気もするのですが可能ならば何卒お教え下さいませ。
0217nobodyさん
04/06/08 01:36ID:???0218nobodyさん
04/06/08 01:47ID:???> 5 に一番近い数字からソートすると 4 6 が先頭
どっちなんだよ?
@new = sort(grep($_ >= 5, @data));
5を好きなように変えれば?
0220nobodyさん
04/06/08 14:30ID:???user(add|mod) -p 暗号化パスワード -s /bin/true -d /home/www/アカウント アカウント
でユーザの追加、変更を行っているのですが、例えば、「test」というパスワードを設定
すると、「test」でも「test999」でも「test48278467276484」でもFTPで認証できてしまい
ます。つまり、「test*」で認証できてしまいます。
「test」をusermodで「test876」にしても、上記同様関係なく「test*」で認証できて
しまいます。
デフォルトで用意されている「admin」というアカウントではこのような症状にはなら
ないので、どうもuseradd|mod側で使っている「-p」の暗号化したパスワードが怪しいの
ですが、解決に結びつかず、1日が経過してしまいました。
もしも何か解決策がありましたら、どうかご教授ください。
0223nobodyさん
04/06/08 16:04ID:???perlに関係ないことだ。
0225nobodyさん
04/06/08 17:50ID:???system ("|rm -r $dir");
で桶ですか?
0226nobodyさん
04/06/08 18:10ID:???0227220
04/06/08 18:48ID:???現在も模索中でございます。
>>221
Redhat9です。
>>222
「testtest」と設定しても、testtest*になって
しまうようです、、、
0228nobodyさん
04/06/08 19:02ID:???0229nobodyさん
04/06/08 20:17ID:???>しまうようです、、、
とりあえずそれは正常だ。
0230220
04/06/09 02:55ID:???「test123test」とやってみましたが、同じように「test123test*」
で認証できてしまいました。
>>229
正常なのですか?
はじめから用意されていた「admin」というアカウントでは、
このパスワード入力方法では通用しませんでした。
0232206
04/06/09 06:49ID:siBsh0Gf改造スレできいてみましたが、あちらでもスレ違いなのだそうです。
やはりここしかないのかと思います。
あちこち行ってますが、重複投稿でなく誘導ということでご容赦ください。
>>206のようにcgiでcgiを呼び出して使ってる方はいないでしょうか?
requireでもopen(<IN>, "**.cgi")でも駄目でした。
検索をしても、cgiのBody内に解析のタグを仕込む方法ばかり出てきてしまいます。
ヒントだけでもよいのでおねがいいたします。
0233206
04/06/09 06:59ID:???0234nobodyさん
04/06/09 07:00ID:???0236206
04/06/09 07:51ID:???配布先のFAQには
>アクセスログの取得がばれるとまずいと言う場合は、なんとかPerlを勉強して、
>CGIの中からサブルーチンとしてアクセス解析を呼ぶなどの方法で対処して
>いただければと思います(ここまでくると手法としてはけっこう厄介ですが)。
と書いてあったんです・・・。
勉強して対処しろ、と書いてる人に具体的方法は聞けないと思い
私なりに調べたり試したりしましたが答えが出ませんでした。
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なんたらってのでこちらの送信するときの円コードは変えることができると思う。 ブラウザの挙動は知らないけど。
■ このスレッドは過去ログ倉庫に格納されています