Perlコーディング初心者質問スレ Part 56
at PHP
1:nobodyさん
07/09/16 19:49:43
Perlのコーディングで困ってる人のスレです。
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ スレリンク(php板)
過去ログ倉庫 URLリンク(user.ftth100.com)
2:nobodyさん
07/09/16 19:51:29
ム板Perlスレより 1 of 2
[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: URLリンク(www.site-cooler.com)
[本]
リャマ: URLリンク(www.oreilly.co.jp)
駱駝: URLリンク(www.oreilly.co.jp)
Effective Perl: URLリンク(www.ascii.co.jp)
クックブック: URLリンク(www.oreilly.co.jp)
Perl ベストプラクティス: URLリンク(www.oreilly.co.jp)
Perl Hacks: URLリンク(www.oreilly.co.jp)
[オンラインマニュアル] (追加)
最新のドキュメント: URLリンク(search.cpan.org)
perl5.8.xのドキュメント(一部): URLリンク(www.kt.rim.or.jp)
perl5.005_03 のドキュメント: URLリンク(www.kt.rim.or.jp)
日本語ドキュメント検索: URLリンク(www.cpan.jp)
perldoc.jp: URLリンク(www.perldoc.jp)
Perldoc.com: URLリンク(www.perldoc.com)
3:nobodyさん
07/09/16 19:52:04
ム板Perlスレより 2 of 2
[モジュール]
CPAN.com: URLリンク(search.cpan.org)
河馬屋二千年堂: URLリンク(homepage3.nifty.com)
[テクニック]
Perlメモ: URLリンク(www.din.or.jp)
Perlのページ: URLリンク(homepage1.nifty.com)
Perlの小技: URLリンク(homepage3.nifty.com)
[Perl5.8Unicodeメモ]
URLリンク(www.pure.ne.jp)
URLリンク(www.namazu.org)
URLリンク(www.lr.pi.titech.ac.jp)
4:1
07/09/16 19:56:03
独断でPBPとPerl Hacksを追加してます。
5:nobodyさん
07/09/16 20:04:09
>>1
お疲れ様です。
前スレ最後に質問してしまいました。
こちらに再投稿させていただきますm(__)m
use Math::BigFloat;
my $tr = Math::BigFloat->new((@array * (1-0.68)/2));
と書くの大変なので
my $a = use Math::BigFloat;
my $tr = $a->new((@array * (1-0.68)/2));
と書いてみましたがエラーでした。
こういう意図を実現するのは無理ですか?
小数の計算をさせた上で配列のインデックスにする場合はBigfloatしておかないと危ないです。
やってない$trに
$array[-($tr +1)];
とすると実質インデックスが2個変わってしまいます。
15.999だったのが、+で16になり、さらに1が足されて17になる。
そんな現象を確認しました。
簡単な記述方法はないでしょうか。
6:nobodyさん
07/09/16 20:22:00
>5
use bignum
7:nobodyさん
07/09/16 20:40:18
>>6
???
どういうことですか?
英語読めませんが、URLリンク(perldoc.perl.org) を見てやったところ
全くMath::BigFloatが不要になってしまいました。
冒頭でuse bignumをしておけば小数点の変な誤差が発生することは皆無になるんですか?
代償として重くなるとかがあるので、軽くしたいなら面倒でもMath::BigFloatを使えばいい。
簡単にしたいならbignumを使えばいい?
8:nobodyさん
07/09/16 20:56:51
use bignum;
my $tr = (@array * (1-0.68)/2);
メチャクチャな計算になりました。
@arrayは100なので16になるべき計算なのに50が入ってました。
もちろんbignumをつかわなければ16が入ります。
bignumを使うと他にも多大な影響があるようですね。
どういう基準で影響を与えてくるんでしょうか。
9:nobodyさん
07/09/16 21:58:06
>>前996
$#test
で最後の添え字をゲット。
10:nobodyさん
07/09/16 23:09:56
>8
再現しない。再現する最小コードは?
use strict;
use warnings;
use bignum;
my @array;
$array[99] = 0;
print scalar(@array), "\n"; # 100
my $tr = (@array * (1-0.68)/2);
print "$tr\n"; # 16
11:nobodyさん
07/09/16 23:24:10
>>10
#!/usr/bin/perl
#京
#use bignum;
my @array;
for (1..100){ push @array,$_ }
@array = sort {$a<=>$b} @array;
my $tr = (@array * (1-0.68)/2);
print $tr;
これでできると思います。EUCコードで記述されています。
use bignum;をコメントアウトするかしないかで表示が変わります。
本来とは違う挙動をしているのでしょうか?
12:nobodyさん
07/09/16 23:35:36
普通にprintしていたものを、突如ファイルに納めたくなりました。
print 1;
というのが何千行もあった場合
print FH 1;
とやりなおすのは間に色々な式が挟まってる為一括ではできません。
標準出力先をファイルハンドルに変える設定などが冒頭でできるなら一発でできると思うのですが。
13:nobodyさん
07/09/16 23:36:59
select関数でおk
14:12
07/09/16 23:53:18
>>13
うわ!
感謝感激恐悦至極にございますm(__)m
15:nobodyさん
07/09/17 00:17:12
>11
俺のとこだと再現しないわ。環境は
This is perl, v5.8.8 built for MSWin32-x86-multi-thread
This is perl, v5.8.8 built for cygwin-thread-multi-64int
16:nobodyさん
07/09/17 00:32:28
>>11
どっちも16になるぜよ
17:nobodyさん
07/09/17 00:44:08
>>15-16
This is perl, v5.8.1 built for MSWin32-x86-multi-thread
(with 1 registered patch, see perl -V for more detail)
5.8.1のみの問題ですかね?
そんなに違いがあるのでしょうか。
一体何なのでしょうか?
ちなみにbignumって何に使うためのものなのですか?
浮動小数の誤差関係に使えるというのは一つですよね。
本筋はそれですか?
だとしたらこんな影響が出てしまう理由がわかりませんし。
EUCコードでやっておられますよね?
それかもしかしたらbignumの方がバージョン変わってるとか?
18:nobodyさん
07/09/17 06:36:57
>>17
1. 再現せず。きちんと計算される。
This is perl, v5.8.1-RC3 built for darwin-thread-multi-2level
2. bignum は BigFloat と Math::BigInt, Math::BigInt::Lite のラッパー
それぞれググレ。でかい方に関しては
perl -le 'print 2**2**2**2**2' # => inf
perl -Mbignum -le 'print 2**2**2**2**2' # => やってみ?
とか
perl -le 'print 10**16' # => 1e+16
perl -Mbignum -le 'print 10**16' => 10000000000000000
効能が分るだろ。
19:nobodyさん
07/09/17 07:36:15
前スレ993へ
% cat Hoge.pm
package Hoge ;
use 5.005_02 ;
use vars qw( @ISA @EXPORT ) ;
use vars qw( $hoge ) ;
use subs qw( hoge ) ;
use Exporter ;
use Cwd ;
@ISA = qw( Exporter ) ;
@EXPORT = qw($hoge hoge ) ;
$hoge = 42 ;
sub hoge{ return 42 ;}
1;
% perl -Mstrict -Mwarnings -MHoge -le 'print $hoge; print hoge'
ってか朝っぱらから何やってんだろ俺。
20:nobodyさん
07/09/17 07:37:27
ああ、いらんモジュール use しとるし orz...
21:nobodyさん
07/09/17 11:15:49
-wスイッチを使うと警告を出すというんですが、これは一体どういう意味の警告なんですか?
-cは確か構文チェックをしてくれるわけですよね。
22:nobodyさん
07/09/17 11:37:55
print scalar(grep{$_>15}(1..99));
>84
print scalar(1..99);
>何も表示なし
print scalar(0,1,2);
>2
リストをscalarに渡すとどうなるかというのが知りたかったのです。
要素数を出してくるのか末尾要素だけ評価するのか。
真ん中のやつは何も評価しなかったようですが。何故なんでしょうか。
それとgrepでリストが作られるのかと思っていたら配列が作られているのですよね?これは。
scalar(配列) とすると要素数が出てきて
scalar(リスト) とすると末尾要素が評価される
scalar(n..m) とすると何も起こらない
grepの返り値は配列だということでokですか?
23:nobodyさん
07/09/17 11:46:15
1/0
これをやらせるとIllegal division by zero at hogehogeと警告されます。
0/1
こっちは警告なしなので大丈夫なんだと思いますが。
あまり気にしてないと、無自覚のうちに0による除算が発生してしまうことってありますよね。
意識的に0による除算が行われないよう、例えば
my ($r,$p) = (rand,rand);
print $r/$p;
こういう場合は
my ($r,$p) = (rand,rand);
if ($p>0){ print $r/$p }
と保険?を掛けておくのが推奨されるコーディングなのでしょうか?
24:nobodyさん
07/09/17 11:56:26
>>22
perl -w -le 'print scalar (1..99)'
Use of uninitialized value in range (or flip) at -e line 1.
range 演算子は、君の希望の挙動の他に
while( <> ){
print if ( /^\s+/ .. /^$/ ) ;
}
つう風にも使う。で、上述ではperlの中の人がどっちの機能
を求めているのか判断出来ない。=> エラー出して保留
∴まともに機能してないよ
25:22
07/09/17 12:16:00
>>24
while( <> ){
print if ( /^\s+/ .. /^$/ ) ;
}
読めないorz
正規表現の部分は「先頭から空白文字が1個以上あるか」「中身が空であるか」の二つですね。
で、..この範囲演算子はどういう意味でしょう?
ついでにwhileの評価式自体が皆目検討がつきません。
26:nobodyさん
07/09/17 12:24:45
>>25
例だからあまり意味のないものを書いたんで。。。
「先頭から空白文字が1個以上ある行」から
「中身が空であるか」まで
を出力せよ。
と言う意味になります。ホントは/^\S+/ のつもりだったのよw
後は、、、ぐぐれ。
27:21
07/09/17 12:26:13
すいません。試してるんですが。
Use of uninitialized value in addition (+) at 行数
こういうのやsubtractionとかがちょくちょく出てくるんです。
「初期化されてない値を使ってる」みたいな意味だと思いますが、
具体的にどういうエラーなのかわからず再現ができないでいます。
28:22
07/09/17 12:32:34
>>26
う〜んどうしてそうやって動くのでしょうか?
一旦中身が空である行を迎えたら自動でループはlastされるのですか?
ifに掛けられるのは1行ずつですよね。
う〜ん・・・
29:nobodyさん
07/09/17 12:37:27
>>28
左の正規表現が真 => スイッチオン
右の正規表現が真 => スイッチオフ
for( 1..1000){
print $_ if $_ == 10 .. $_ == 100 ;
}
つかまじでググってくれ。
21氏は質問の意味自体が理解不能だ。
俺は消えるので、相手してくれる人はいなくなるかもしらんが
頑張れ
30:21
07/09/17 12:38:16
my $pl = undef;
my $ze = $pl + 1;
my $we = $pl - 1;
レスこないのでガンばてたら、これでadditionとsubtractionエラーが再現できました。
この二つのエラーが出たら未定義値が格納されてる変数が計算に使われてるって思っておけばいいですよね。
でも一応スクリプト自体は動くんですが、-wはuse strict程度の感覚なのですか?
31:nobodyさん
07/09/17 14:45:52
>>26
それ範囲演算子じゃないから。普通は使いません、ていうか使うな。
明らかに不適切な例を唐突に持ち出して何がしたいんだか。
32:nobodyさん
07/09/17 15:07:46
>>31
ぐぐっても分らなかったのかw
33:22
07/09/17 16:17:24
>>32
確かにまだ理解できていませんが、>>31は僕ではないです。
回答してくれる方にそんな不遜な態度は取りません。
34:nobodyさん
07/09/17 16:27:17
仕事押しつけられて、戻って来たらなんかオレ煽られてんなあ。
31=21 か?
Programming Perl の P135 の範囲演算子の項を読んだ後に
まともに煽ってくれ。つか突っ込みどころは他にもあるんだから。
35:nobodyさん
07/09/17 18:09:34
> Programming Perl の P135 の範囲演算子の項を読んだ後に
> まともに煽ってくれ。つか突っ込みどころは他にもあるんだから。
とりあえず、該当箇所をスキャンしてうp汁。
36:nobodyさん
07/09/17 18:24:44
>>35
URLリンク(perldoc.jp)
の範囲演算子の項はほぼ上述書物と同じだ。
37:22
07/09/17 19:13:34
とにかく仲良くして下さい。
38:nobodyさん
07/09/17 19:21:59
scalar って書いてあるから、スカラコンテキストで評価するか。
↓
> スカラの ".." の被演算子が定数表現であるときは、
> その被演算子は暗黙に、変数 $. と比較されることになります。
↓
ちょっくら$.と比較するか。
↓
$.にundef入ってるし。
↓
Use of uninitialized value
39:nobodyさん
07/09/17 20:57:51
やっぱりどうもプログラム系のスレの住人って人とのコミニュケーションが下手っぽいよね。
変な皮肉を言ったり、あえて言葉足らずにしてみたり。
そういう悪い癖に自分で気付いてるんだろうか。
こういうところが、「キモイ」イメージが付いてしまう原因なんだろうな。
40:nobodyさん
07/09/17 21:44:30
変な分析したがりが一番キモい
41:nobodyさん
07/09/17 23:15:28
つまりここにいる奴は全員キモイってことだな。
42:nobodyさん
07/09/18 01:53:41
ま、いくら挑発しても答えてやらないけどな
43:nobodyさん
07/09/19 19:41:21 uZuxrlKv
Perl の CGI::Application モジュールを使ってアプリを作成しているのですが、
デバッグの仕方でつまづいています。
というのも CGI::Application の場合 ランモードのそれぞれのメソッドからブラウザに表示させたい
htmlを return しますよね?
で、その途中で 勝手に「 print $hensu; 」みたいにやっても画面上には表示されません。。。
もちろん「 return $hensu; 」とやればその変数の内容は表示されるのですが、複数の変数の値を
一度に表示させたいのですーー。
こんな時みなさんどうしてるのでしょう???
44:nobodyさん
07/09/19 19:47:18
V に TT とか使えばいいんじゃね?
45:nobodyさん
07/09/19 20:52:24
ヘッダを出力する前にprintしてもブラウザには表示されないよ
CGI::App::Plugin::DebugScreenとかLogDispatchとか使ってたっけかな
手っ取り早いのはData::DumperとかYAML使ってwarnでダンプとか
httpdのエラーログにね
46:nobodyさん
07/09/19 23:34:44
CGI::Application ってテストサーバないのか。ダサいな。
47:nobodyさん
07/09/19 23:44:49 BE:914760566-PLT(15017)
あるよ
URLリンク(search.cpan.org)
URLリンク(search.cpan.org)
48:nobodyさん
07/09/20 00:36:25 FmGzC+A0
DBIを使用してDB処理をした場合、sqlのログってどうしてます?
プリペアードステートメント使っていますが、肝心の値の部分が「?」なので、実際に流れるクエリが分かりません。
49:nobodyさん
07/09/20 09:16:22
モジュールの質問ならpodくらい見てからしろよ
URLリンク(search.cpan.org)
>DBI->trace($trace_setting)
>DBI->trace($trace_setting, $trace_filename)
>DBI->trace($trace_setting, $trace_filehandle)
>$trace_setting = DBI->trace;
50:nobodyさん
07/09/20 12:35:47 yNzQPcIL
>>44
>>45
43です。レスありがとうございます。
なるほど、簡単にはいかないんですね。。CGI::Applicationしょぼ!
結局グローバルな変数(ハッシュ)に変数の値を保存していって
cgiapp_prerun (メソッド名間違ってたらスマソ)でその変数に
値が入っていればブラウザに表示するという方法でいきます。
ていうかこれぐらいのこともできないのかよ。CGI::Application
51:nobodyさん
07/09/20 13:40:05
ヘッダの送る前にprintしてもブラウザに出力されないのは当たり前だろ・・・
自分の無知を認識しろよ
52:nobodyさん
07/09/20 13:45:10
だからwebprogは揶揄される
53:nobodyさん
07/09/20 14:21:55
今時 CGI::Application なんか使うなよ…
54:nobodyさん
07/09/20 19:18:46
じゃあ何使えって言うんだよ。
どこのレンタルサーバでも使えるような方法で頼む。
55:nobodyさん
07/09/20 21:46:49
if文ダラダラ使えってことじゃね
56:nobodyさん
07/09/20 21:49:39
あるいはR信者が言語批判したかっただけとか
57:nobodyさん
07/09/20 21:50:20
yukiwiki 的にサブルーチン呼べば?
値は PATH_INFO とかでとればよい。
58:nobodyさん
07/09/21 04:57:02 9/Wk3rtw
質問です。
ネットに落ちてるサンプルを見ながら、アクセス解析や掲示板などを書いて
練習しているのですが、データを書き込んでいく空ファイルは
どこのサンプルでも自前で事前に用意しています。
これを、日時ごとに070921.dat、070922.dat…のように自動生成させたいのですが、そのようなことは出来ないのでしょうか?
よろしくお願いします。
59:nobodyさん
07/09/21 05:11:32
問題なく出来ると思う。
60:nobodyさん
07/09/21 05:15:49
テキスト表示のアクセスカウンタを作っているのですが、<img>タグで呼び出すとテキストを返せません。
SSIが使えないならば、直接CGIにアクセスさせるしかないんでしょうか??
61:nobodyさん
07/09/21 09:28:25
質問させてください。
GDでファイルを生成→表示というスクリプトを組んでいますが
どうやら生成されるまえに表示する処理が実行されてしまい。うまくいきません。
リロードすれば表示されるようにはなるのですが・・・
生成されるまで待つ→表示処理実行
という事を考えて生成→slepp 2とか10;→次を実行
と、してみましたがうまくいきません。
生成完了するまでウェイトをかける方法を教えていただければありがたいです。
よろしくお願いします。
62:61
07/09/21 09:35:31 EZVVl+6I
自己解決しました。
sleepでOKでした。
よくみると
コメントアウトしてましたw
63:nobodyさん
07/09/21 14:07:32
>>60
scriptタグのsrcでアクセスさせる。JavaScript。
64:nobodyさん
07/09/21 20:24:02 yGE03KVM
winXPsp2とactive perlでローカルテストをする時の質問なのですが、
例えば print 1; という命令のあるplファイルをダブルクリックしても1が表示されません。
いや正確には一瞬何かが出てきてるっぽいんですが、閉じるの早すぎです。
コマンドプロンプトから実効命令をするとprint先がコマンドプロンプトに来るので、
勝手に閉じることはないようですが。
いちいちコマンドプロンプトやらずに簡単なコードテストの時はダブルクリックで済ませたいのですが
方法ありましたら教えてください。
65:nobodyさん
07/09/21 20:46:57
>>64
END{<STDIN>}
とか書いとけば。
66:64
07/09/21 21:00:38 yGE03KVM
>>65
ありがとうございます。
うまく出ました^^
endって一体なんなのですか?
perlの説明サイトとかで関数調べてendありませんし。
最後にやるってことですか?
となると<STDIN>が閉じさせない命令の本体になるんでしょうか?
どういう理屈なんでしょうjか。
67:nobodyさん
07/09/21 22:37:24
>>66
URLリンク(perldoc.jp)
perlmodのBEGIN, CHECK, INIT and END BEGIN CHECK INIT ENDのところ。
プログラムの終了するところで、
<STDIN>で、コンソールの入力待ちをしてる。
68:64
07/09/21 23:02:02 yGE03KVM
>>67
コンソール???あの黒い画面のことかな。
で、試しに適当に打ち込んだら本当に入力できました。
最後にenterを押したら画面が消えました。
perlの方にはしっかりとその内容が送られてるんですかね?
試しに
my @array = <STDIN>;
print $array[0];
としてみましたが、今度はenterを何度押しても画面が閉じません。
配列に入れてるから無限に取るっぽいですね。
my $scalar = <STDIN>;
print $scalar;
END{<STDIN>}
としたらうまくいきました。
任意の内容を入力してenterした瞬間に制御が一瞬コードに行ってprint $scalar;が実行されました。
ローカルでやるときはこうやって引数を取るというのも面白いですね。
物凄い面白いことを教えていただいて感謝です。
69:nobodyさん
07/09/22 13:27:49
質問です。
Class::DBI使ってDB操作する場合、二つのレコード間で主キー以外のデータを交換するには
どのように書いたらいいですか?
70:nobodyさん
07/09/22 15:58:05
#! /usr/local/bin/perl
print "content-type:text/html\n\n";
print "<html>\n";
print "<head><title>タイトル</title></head>\n";
print "<body>\n";
print "<h2>テスト</h2>\n";
print "</body>\n";
print "</html>\n";
↑これでInternal server error 500になる。
ただしレンタルサーバー上ではエラーだが、
自分のパソコンでやったらちゃんと表示される。
ソースにもし間違いがあったら
場所と対処法を具体的に指摘しろ。
71:nobodyさん
07/09/22 17:15:55
>>70
態度でかいぞ。
そんなやつには教えてやらん。
#! と /usr の間に半角スペースが入ってるのが問題とか言わん。
72:nobodyさん
07/09/22 17:44:10
>>68
和んだ、俺も10年くらい前Cやった時そんなだった。
73:69
07/09/22 19:54:58
すみません。解決しました。
74:nobodyさん
07/09/22 21:34:17
>>70
パーミッションはちゃんとやってあるのか?
とりあえず雑魚が粋がるのはやめておけ。
75:nobodyさん
07/09/22 22:09:17 VEv2R0s3
スレリンク(php板:369-372番) から来ました。
URLリンク(ws.strikeiron.com)
このサービスを SOAP::Lite から使いたいんですが、ドキュメントのWSDL関連部分を読んでも
use SOAP::Lite;
print SOAP::Lite
-> service('URLリンク(www.xmethods.net)')
-> getQuote('MSFT');
としか書いてません。
WSDLを見てみると、GetStockQuotesメソッド(オペレーション?)のパラメタとして
QuoteTicker(MSFTとかの文字列)だけでなく、オブジェクト構造みたいなのを組んで
メアドなども渡さないといけないようなんですが、どう書けばいいんでしょうか。
76:75
07/09/22 22:43:31
URLリンク(guide.soaplite.com)(wsdl)
> SOAP::Liteでは今のところWSDL 1.1のサポートは限定されているが〔中略〕、
> 複雑な型(types)を記述に含まないサービスにはアクセス可能だ。
と書いてあるので、無理なのかもしれませんね・・・
77:75
07/09/23 03:01:09
やっと自己解決・・・
URLリンク(wsparam.strikeiron.com)
という、もっと単純なWSDLを使用。
URLリンク(www.strikeiron.com)
ここの下のほうにPerlのサンプルが(も)置いてあるので、それを改造。
わかりやすいのでSOAP初心者にはおすすめかも。
78:nobodyさん
07/09/23 03:53:09
>>74
なぁーんてこった!
cgiファイルのパーミッションを
755にしたらそれで動いたぜ
そんなこと教科書には
どこにも一言も書いてなかった!
ローカルで動かす教科書だからかな?
サノバビーィーーーッチ!
それでパーミッションが500でも
動くのはなんでだ?
79:nobodyさん
07/09/23 05:27:46
それくらいググれカス
80:nobodyさん
07/09/23 06:45:28
やはりWebProg板はレベルが低いな。最高。
81:nobodyさん
07/09/23 06:53:38
だって初心者スレだもん。いいじゃない。
なんか、すごくレベルの高い質問が最近多すぎな気がする。俺のレベルが低いだけなんだろうけどw
Webprogなんだから、動けばいいじゃない的な考えがイクナイ?
82:nobodyさん
07/09/23 07:50:40
if ( $hoge =~ /$moge/ ){ print "もげら" }
って感じで書いて$mogeが展開されてくれないみたいなんだけど、
特別な書き方があるのかな。
ぐぐったけど正規表現ばかりで、変数をつかってる例が全然見つからなかったんだけど、
こういう記述方法自体があまり一般的じゃなくて、他の書き方があるのかな。
教えてちゃぶだい。
83:nobodyさん
07/09/23 08:00:28
>>82
$mogeの中には何が入ってるの?
2バイト文字関係とか、文字コードでこけてる可能性もありそう。
84:nobodyさん
07/09/23 11:07:04
>>82
変数使うときはquotemeta()くらいはかましときなはれ。
85:nobodyさん
07/09/23 14:57:13
サンクス!
quotemetaでいけたよ。
1)index($hoge, $moge) でもやったけどダメ
2)auotemeta() してみた
3)$hoge =~ /$moge/ で成功!
4)でもなぜかそれ+ index($hoge, $moge) じゃダメ
って感じだった。
中に入ってるのはどちらもEUCの2バイト文字列なんだけど、
なぜか$mogeが空の文字列として扱われてしまってるっぽい動作だった。
print $hoge.$moge;とかで出力するとちゃんと出力されるんだけどね。
良く分からないけどとりあえず解決はしてよかった。
ありがとう。
86:nobodyさん
07/09/25 00:47:19 XOfpdsF8
はじめまして。
use strict;
use diagnostics;
という宣言をした状態で、
Name "html::copyright" used only once: possible typo at bbs.cgi line 554 (#1)
というwarningが出ました。
html::copyrightは、htmlモジュール で、
$copyright = 'hogehoge ';
などというように、宣言されています。
warnings は、他のモジュールの変数は見てくれないのでしょうか?
実は、html::copyright 以外にも数十個でていて、紛らわしいことこの上ないです。
(他のwarningにも混じってしまい、識別が困難です)
このwarningをつぶしたいのですが、何とかする方法はないでしょうか?
87:nobodyさん
07/09/25 00:49:11 XOfpdsF8
x 実は、html::copyright 以外にも数十個でていて、紛らわしいことこの上ないです。
o 実は、html::copyright 以外にも used only once: possible typo が、数十個でていて、紛らわしいことこの上ないです。
used only once: possible typo・・・
は、意味は、わかっておりまして、
一度しか使ってないので、ミスじゃない?ってことなのですが、
実際には、ちゃんと、htmlモジュールで代入してから、mainで参照しているのに・・・ということです。
88:nobodyさん
07/09/25 03:43:51
>>87
Use of uninitialized value
が続かないなら、理由が分からない。
一度ourで宣言してみたらどうなる?
89:86
07/09/25 17:25:00 XOfpdsF8
試しに、最小限のコードを書いてみたら、
-----test_pm.pm-------
package test_pm;
use strict;
use warnings;
our $hoge = "test foo bar";
1;
-----main.pl---------
use strict;
use warnings;
use test_pm;
print $test_pm::test;
-------------------
> perl main.pl
Name "test_pm::test" used only once: possible typo at main.pl line 5.
Use of uninitialized value in print at main.pl line 5.
ちゃんと、Use of uninitialized value でて、実行不能でした orz
ourでも、myでも同じでした
>>86は、CGIなんですが、なんで、ちゃんと動いているんだろ・・・
もうちょっと解析してみます。
90:86
07/09/25 17:28:00 XOfpdsF8
x print $test_pm::test;
o print $test_pm::hoge;
スペルミス。
これでも同じ結果です。
91:nobodyさん
07/09/25 21:26:37 o7XeBw4v
先日このスレで
END{<STDIN>}
を教えてもらったものです。その節はありがとうございました。
ローカルチェックをする時に、ダブルクリックだけでいいという大変便利なものなのですが、
エラーが出てるときに一瞬で画面が閉じてしまうのです。
ちなみにその時のエラーはuse strictによるmy使え先刻でした。
途中でエラー中断してるのでEND{}まで行かないのは至極当然な話ですが、
エラーの時はエラー内容をSTDINに出力させりょうと思うと大変なことになりますか?
エラーにも色々あるので難しいかもしれませんが、用はコマンドプロンプト画面に出ることを
代わりにそのままSTDINに出力してもらえばいいわけなのですが。
92:nobodyさん
07/09/25 21:28:39
>>89
CGIってことはサバにあるわけだ。
つまり君がローカルで試してるファイルとは違うファイルが動いてる可能性もあるわけね。
93:nobodyさん
07/09/25 21:36:47
>>91
コンソールを開いておけない余程の事情でもあるの?
94:91
07/09/25 22:20:58 o7XeBw4v
>>93
いえ、単純にちょっとしたコードテストをしたいときにわざわざ
1.コマンドプロンプト画面を開いて
2.ファイルがあるフォルダを開いて
3.黒画面にファイルをD&Dしてenter
という手順を踏むのが面倒だといつも思っていたのです。
1.ファイルをダブルクリックする
これだけで済むなら最高です。
意外に大きな差かなって思いまして。
黒画面へのエラー内容出力ってどういう仕組みで行ってるんでしょうか?
きっとperlの方から出してるんだと思いますが、その出し先をSTDINに変えればできるのでは?
とか思ったり。
95:nobodyさん
07/09/25 22:46:42
>>94
同じファイル?ならコンソール開きっぱなしで1回目だけ「perl スクリプト名」で実行しておけば連続テストは↑+Enterで済む。
慣れにもよるけど多分ダブルクリックより速く操作できる
エラーはSTDERRに出力される。
誤解しているようだけどSTDINは標準入力であって出力ではない。標準出力はSTDOUT
96:91
07/09/26 00:17:27 zmZEFb0X
>>95
2回目以降は確かに楽なんですけど。
STDERRに出力されてるので、END{<STDIN>}で出る入力受付画面には出力されない?
STDOUTへの分はきちんと表示されますし。
STDERRの取得方法があるのでしょうか?
97:nobodyさん
07/09/26 00:27:31
>>89
これ、ActivePerl 5.8.8.822で普通にtest foo barと表示された
ダメ出しも無し
98:nobodyさん
07/09/26 00:37:06
>>96
ラクダ本より
>内部的に発生する例外によって終了する場合でも、ENDサブルーチンは呼び出される(ただし、シグナルによって撃沈された場合は除く)
とあるようにENDそのものが実行されない。自分で(できれば)トラップする必要がある。これはsigtrapを使えばよい。
…が、それくらいなら最初からコンソールから使うことを強く勧める。元々ダブルクリックで起動するようには設計されてないし。
99:nobodyさん
07/09/26 00:41:02
>>91
echo off
perl %0 %1 %2 %3 %4 %5 %6 %7 %8 %9
pause
みたいなバッチファイル作って、,plに関連付けして置くぐらいかなぁ。
統合型開発環境(みたいなエディタ)を使うと、その場で実行して、
その場で結果表示できたりするので、そういうの使うと便利だよ。
100:nobodyさん
07/09/26 00:56:23
しまった。
> perl %0 %1 %2 %3 %4 %5 %6 %7 %8 %9
は
> perl %1 %2 %3 %4 %5 %6 %7 %8 %9
だた。
101:101
07/09/26 02:22:27
型グロブというものについて
教科書を今日読んで理解したので
型グロブについて誰か質問してください。
説明します。
102:nobodyさん
07/09/26 05:15:12
型グロブをうまいこと使っているモジュールを列挙してください。
103:nobodyさん
07/09/26 13:38:32
>>99-100 perl %*
104:nobodyさん
07/09/26 17:01:12
>>101
ありがとうございます!
スカラー変数
配列変数
リスト
ハッシュ変数?
それらのリファレンスなど
上記との違いを説明してください。
そして何の為にグロブがあるのですか?
僕は素人なのでまだ使うべきところに出会っていません。
いや使えてたらもっと簡単につくれてたのかもしれません。
105:nobodyさん
07/09/26 18:35:06
ビウログってなんですか?
106:nobodyさん
07/09/27 02:15:46 rW8f5K4d
質問です。
if($Fm{'form'}){ 処理 } #フォームに何か入力されていれば処理
上記の場合
フォームに0と入力した場合もスルーされてしまいます。
認識させるにはどのような書き方になるのでしょうか。
if分の前に
$Fm{''form'}=sprintf( "%c", $Fm{''form'} );
のように文字列にするという方法を思いついたのですが、ちょっとスマートじゃないなと思っています。
よろしくおねがいします。
107:nobodyさん
07/09/27 02:23:35
if($Fm{'form'} ne ""){ 処理 }
108:nobodyさん
07/09/27 02:35:47
>>107
素早い回答ありがとうございます。
その手がありましたか。目からうろこでした。
ありがとうございます!
109:nobodyさん
07/09/27 03:41:52
length とかも
110:nobodyさん
07/09/27 06:29:35
1000:1234:abcd:2000::/120のような省略されたIPv6のアドレスを展開して
リストに格納したいのですが、プレフィックス長(=120)に応じて
展開する部分が一部不完全なので教えてください。
下のコードだと、下4桁の連番生成しかできない上に、プレフィックス長が4の倍数でない場合にうまくいきません。
これを4の倍数でなくても&下4桁以上もちゃんと展開できるようにしたいのですが…。
たとえば、1000:1234:abcd:2000::/127であれば、
1000:1234:abcd:2000:0000:0000:0000:0000
1000:1234:abcd:2000:0000:0000:0000:0001
の二つが出来てほしいのです。
できれば10進数で連番作ったものを16進数変換してる部分もなんとかしたいんですけど…。
sub _Gen{
my ($addr, $pref) = split(m|/|, $_[0]);
$addr = &_Format($addr); # ここで省略のない32桁の英数字を4桁ごとに:で区切ったものになる
$addr =~ s/://g;
if($pref % 4 != 0 || $pref < 112 || $pref > 128){
return;
}elsif($pref == 128){
1 while $addr =~ s/(\w+)(\w\w\w\w)/$1:$2/;
return $addr;
}
my $fixed = substr($addr, 0, $pref / 4);
my $keta = (128 - $pref) / 4;
my (@addrs, $tmp);
for(my $i=0; $i<16**$keta; $i++){
$tmp = sprintf("$fixed%0${keta}x", $i);
1 while $tmp =~ s/(\w+)(\w\w\w\w)/$1:$2/;
push(@addrs, $tmp);
}
return @addrs;
}
111:nobodyさん
07/09/27 06:34:39
defined 常考
112:101
07/09/27 09:02:14
型グロブについて。
スカラー変数
アレイ
ハッシュ(連想配列)
この3つを同時に
扱うために、型グロブは
生まれてきたのです。
113:101
07/09/27 09:04:34
例えば
$a ←これはスカラー変数
@a ←これはアレイ(配列)
%a ← これはハッシュ(連想配列)
aの左側についてる記号は
$だったり
@だったり
%だったりとそれぞれ違うが
記号の右側はaで全部統一されている。
このとき
あ
「aの型グロブ!」
と宣言すれば、
$a @a %a
この3つを全部同時に扱うことができる。
これが型グロブ。
114:nobodyさん
07/09/27 09:14:21
こいつはOmotiとかタクトくせぇ
115:101
07/09/27 09:59:46
つまり
4年1組と
4年2組と
4年3組が
いたとして、
「4年生全員集合!」
と言うと、4年生が全員集まってくるのです
これが型グロブです。
116:nobodyさん
07/09/27 11:04:43
全員集まってくることがどういうことか(メリットなど)
を語らないと通じないでしょ
肝心な部分が抜けてるポ^^
117:nobodyさん
07/09/27 13:26:43
どっちも4年生なら配列かハッシュ使えば済むでしょ
どっちかというと「全学年の1組集合」の方が近いのではないかと。
118:nobodyさん
07/09/27 13:32:25
その例なら多重配列使いたいからそれもちょっと…
119:118
07/09/27 13:33:29
ごめん勘違いしてた
120:nobodyさん
07/09/27 13:34:07
この聞いてjも居ないのに延々と騙ろうとするのはタクトに違いない。
121:nobodyさん
07/09/27 13:58:24
ねぇねぇ
なんでおじちゃんたち
DBが全部やってくれることを一生懸命書いてるの?
122:nobodyさん
07/09/27 14:53:03
DB使ってないしぃ
123:nobodyさん
07/09/27 15:13:12
DB使わない理由って やっぱサーバーにないから?
それとも手をつけたことがない?
後者なら絶対覚えたほうがいいよ。
生産効率が全然ちがうよ
124:nobodyさん
07/09/27 16:59:17
>>110
これじゃだめなん?
use Net::CIDR;
print join("\n", Net::CIDR::cidr2octets("1000:1234:abcd:2000::/127"));
125:nobodyさん
07/09/27 17:11:50
わざわざDB使うほどの事してないしぃ
ゴミ箱にごみを捨てるのは、わざわざ執事雇って呼んで捨てさせる程の事じゃないしぃ
126:nobodyさん
07/09/27 19:38:27
>>124
うああああ、助かった
こんな便利なものがあるなんて!
ありがとう〜!
127:nobodyさん
07/09/27 20:05:25 fs1IYXrA
色々なPerlがあるようですが、
rand ≠ rand(1)
となるものはあるのでしょうか?ちなみに自分のactiveperl fow win32 5.8は
rand == rand(1)
になっていると思います。
サバによって違うなら面倒でもrand(1)としといたほうが無難なのでしょうか?
それと演算子の優先順位をわかりやすい表にしてるところ知っていたら教えてくださいませm(__)m
last if 1-rand(1) <= 0.3;
こういうの書く時
last if ( (1-rand(1)) <= 0.3);
とすれば確実ですが、地味に面倒で意外と見づらいです。
128:nobodyさん
07/09/27 20:36:42
同じだよ
その手の仕様をプラットフォームによって違うようにする必要性がないし
129: ◆TWARamEjuA
07/09/27 20:40:25 BE:2178645-2BP(6825)
URLリンク(perldoc.perl.org)
とか。。。
130:127
07/09/27 20:54:10 fs1IYXrA
>>128
そうですよね。まあでも括弧を外すなら結局rand(1)としないとしつこく引数にとられてしまいますね。
>>129
英語のページですか・・・
僕の学力の低さを見透かしたような皮肉orz
バカにでもわかる一覧表的なページはないということでFA?
131:nobodyさん
07/09/27 21:18:44
unless (0 and 1){
print 1;
}
1と表示されます。unlessは条件式が偽を出してくる時にブロックを実行するのですよね?
0 and 1なら片方が真を出すのでブロック実行されないと思ったのですが。
複数の条件式が全て偽を出した時にだけブロック実行をさせたいのです。
回答宜しくお願いいたします。
132:131
07/09/27 21:22:38
ちなみにこれをifでやるとさらにおかしなことになります。
if (1 and 0){
print 1;
}
これです。何も表示されません。先ほどのunlessとの整合性がつきません。
ifによる条件式部分ではちゃんと二つ共が真の時だけ実行されるのに、
unlessの場合は片方が偽を出せば実行されます。
もしかして
真 and 偽
は最終的に偽扱いされるのですか?
133:nobodyさん
07/09/27 21:28:31
>>132
>もしかして
>真 and 偽
>は最終的に偽扱いされるのですか?
そう。当たり前。
134:nobodyさん
07/09/27 21:28:52
(0 and 1) は(「偽」かつ「真」)だからそんなの成り立たない
(「真」かつ「真」)なら結果「真」と評価できる
つまり、(0 and 1)は常に「偽」と評価される
だから unless (偽) は常にそのブロック内が実行される
135:131
07/09/27 21:46:53
なるほどです。
やはりちょっと違いますねunlessは。
ifのfalse版みたいに思うと微妙にやられますね。
全然関係ない話ですが、Perlには資格ってあるのですか?
書道3段とか簿記3級みたいに客観的にPerlにおけるプログラミング力を第3者に示すもの。
頑張って勉強してそのうちバイトでプログラムの仕事取ってみたいですが、
その時にそういう資格的なものがあるなら売り込みやすいなと思いまして。
本当に関係ない話ですいません。
136:nobodyさん
07/09/27 21:59:00
>>130
URLリンク(perldoc.jp)
137:127
07/09/27 22:08:14 fs1IYXrA
>>136
日本語のページありがとうございます。
見てきますm(__)m
138:nobodyさん
07/09/27 22:39:59
perlの仕事なんか無いよ
139:nobodyさん
07/09/27 22:51:34
>>135
記号論理をやれば当然のことで、それを理解していればifの否定版と考えて問題は起きない
140:nobodyさん
07/09/28 00:24:10
スカラー変数と配列変数をいっぺんに作りたいです。
my ($s1,$s2............$s20);
my (@r1,@r2............$r20);
全部書くのが面倒な時は簡単な方法はありますか?
141:nobodyさん
07/09/28 00:37:13
コードの先頭でまとめて宣言するってこと?
そんなことすんならuse strict使わない、宣言しないほうがよっぽどいい
142:140
07/09/28 00:42:26
>>141
# 初期化
というところでいっぺんに使う変数を宣言しています。
何故というより癖みたいなものですかね。
それで分析プログラムを作ってたら、やたらと記録や集計用の変数が必要になったんです。
一つ一つまともに名前を考えるのが非効率なのでそこだけ適当な名前にしています。
strcit使いながら賢く宣言できませんか?
無理ならあきらめます。
143:nobodyさん
07/09/28 01:00:34
変数をたくさん使いたいなら代わりにハッシュ使えば一つで済むじゃん
144:nobodyさん
07/09/28 01:01:15
なんだか意味が良くわからないけどハッシュにいれればいいじゃない
キー名を考えるのは同じだけど
145:nobodyさん
07/09/28 03:02:00
>>140
なんか、その変数名だと単に配列と二次元配列の初期化だけですむ気がすんだけど?
my ( @s, @r ) ;
# @s は、オマエさんの ( $s1, $s2, ..... ) を入れる配列
# @r は、オマエさんの ( [@r1], [@r2], .... ) を入れる配列
本当に別々の変数名が必要なのか?
本当に必要ならば上の人たちが言ってる通りハッシュorハッシュリファレンス
使え。
146:nobodyさん
07/09/28 03:04:18
for (1..20) { eval "my(\$s$_ , \@r$_)" }
147:140
07/09/28 06:42:10
>>143-145
ごもっともなんですけど、リファレンスにするとコードが汚くなるんですよね。
いちいちデリファレンスしながらのコードは読みにくいし。
ハッシュも同じです。単なるスカラーと配列変数以上に読みやすいものはないかと。
>>146
それってforブロックの中でローカル化されてませんか?
evalするとローカル化されないとか?
148:nobodyさん
07/09/28 06:53:34
>>147
そのevalに突っ込み入れられる実力があれば、
キミの望んだことは実現出来るよな?
まあ、自分の考えに固執しないで、他の人が普通に「hash使え」って
言ってる意味を考えた方が良いと思うけど。
=> perlでは143-145が普通の感覚だし、たかだか変数の
宣誓にevalなんぞ使ってたら「変態さんがいるわ&hearts」
と言われること受けあいだ。
そもそもそんなに個別の変数が必要か否かを考え直したほうがいい
んじゃね?
149:nobodyさん
07/09/28 08:03:45
> 書道3段とか簿記3級みたいに客観的にPerlにおけるプログラミング力を第3者に示すもの。
書道の段位なんて流派ごとに異なるので、客観性があることにできないんと思うよ。
日商簿記2級くらいまでなら試験対策する時間さえあれば能力関係なしにとれるから
持ってたからといってだから何?レベルだよね。
150:nobodyさん
07/09/28 08:31:35
URLリンク(d.hatena.ne.jp)
脳内では、コレが参考になるかもしらんが、
○自己判断のレベルが客観的判断のレベルと一致しない。
○レベル7と8との間にとても深くて暗い河がある。
プログラミングの技量の判断として有名なのはFizzBuzz問題
だが、有名になりすぎて知ってて当たり前。
151:nobodyさん
07/09/28 12:19:13
Lv8かなぁ?Lv9にはなってない気がする。
152:nobodyさん
07/09/28 14:28:43
>>150
ほんと、7と8の間の河が深すぎる。7.5がほしい。
俺はたぶん6か7だけど。
153:nobodyさん
07/09/28 15:13:33
use strictってどういう効果有るの?ググってもよく分からないや
とか思ってる他人のソース弄って何とかしている人がここに一人。
154:nobodyさん
07/09/28 15:43:49
strictやwarningsは融通が利かなくなるので嫌いでちゅわ
155:nobodyさん
07/09/28 15:58:21
いいね、初心者スレらしい。
156:nobodyさん
07/09/28 16:22:17
strictや-wを使って粋がってる自称玄人は笑えるww
157:nobodyさん
07/09/28 16:32:49
無理にstrictやwarings使って本末転倒になってる馬鹿はよく見る
158:nobodyさん
07/09/28 17:27:09
普段から常に使ってるがどういう場面で本末転倒になるんだろう
159:nobodyさん
07/09/28 17:36:03
その昔はグローバル変数をサブルーチンでいじり倒すようなコードがあったけど
スコープ区切って引数と戻り値のやりとりするほうが100万倍読みやすいよ
160:140
07/09/28 18:12:42
>>148
>そのevalに突っ込み入れられる実力があれば、
>キミの望んだことは実現出来るよな?
すいません。もう少し普通の会話がしたいです。
>そもそもそんなに個別の変数が必要か否かを考え直したほうがいい
んじゃね?
このよくある「答は一つ、綺麗でスマート」っていうのはどうにも好かない。
161:nobodyさん
07/09/28 20:40:06
>>160
じゃおまえの好きなようにすれば?
162:nobodyさん
07/09/28 21:25:32
>>140
「Perlはあなたが自分の首を締めるのに十分なロープを
提供しているのだ」てな忠告がラクダ本に載ってたな。
#--- Filter/Range.pm ---
package Filter::Range;
use strict;
use Filter::Simple sub {
s{
my \s* \( \s*
([\$\@%][A-Z_a-z][0-9A-Z_a-z]*?) ([0-9]+) \.\. ([0-9]+)
\s* \)
} {
'my(' . join(',', map "$1$_", $2 .. $3) . ')'
}egx;
}; 1;
__END__
#!/usr/local/bin/perl -w
use strict;
use Filter::Range;
my($s1..20) = (1..20);
print $s10;
__END__
163:nobodyさん
07/09/28 21:41:10
Damian Conway ぷろだくとか。
164:nobodyさん
07/09/28 22:27:42 3wKaaJqT
サブルーチンを10個くらい作ってあります。
同じディレクトリに5個くらい違うCGIファイルがあります。
5個のCGIファイル全てに、冒頭の10個のサブルーチンをコピペしてあります。
print routin(1,2);
5個のCGIふぁいるではこういう記述でサブルーチンが使えます。
どうもこれを外部ライブラリ化とかいうのすると
print パッケージ名::routin(1,2);
で使えるようになるとか。
でもパッケージ名を入れるとなると5個のCGIファイル全てを書き直すのが嫌です。
またパッケージ名が入って見た目がウザくなるのも嫌です。
外部ライブラリにしながらも、メインパッケージにあるのと同じごとくサブルーチンを使うにはどうすればいいでしょうか?
メインパッケージに初めに全部もらえばいけるんじゃないかとか妄想していますが。
165:nobodyさん
07/09/28 22:30:18
>>164
>>19読んで応用しろ。キーワードはexporter
166:nobodyさん
07/09/28 22:45:38 3wKaaJqT
orz
167:nobodyさん
07/09/28 23:42:41
べつにExporterなんかいらないだろ
全部plファイルにしてrequireでつなげろ
168:nobodyさん
07/09/28 23:57:57
おれだったらOOPが楽かな
169:nobodyさん
07/09/29 00:02:00
>>167
すげえまじで感動したw
つか、require '....pl' ってperl4時代のモンだと思って使ってもなかったよ。
これからも使わんけどw
もちろんstorableとか使用するときには必須>require
170:nobodyさん
07/09/29 00:04:52
があ、Data::Dumper の読み込み時だ。require 使うのorz...
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4893日前に更新/271 KB
担当:undef