トップページphp
1001コメント338KB

Perlコーディング初心者質問スレ Part 56

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2007/09/16(日) 19:49:43ID:???
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >2 以降

前スレ ttp://pc11.2ch.net/test/read.cgi/php/1180492441/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0015nobodyさん2007/09/17(月) 00:17:12ID:???
>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
0016nobodyさん2007/09/17(月) 00:32:28ID:???
>>11
どっちも16になるぜよ
0017nobodyさん2007/09/17(月) 00:44:08ID:???
>>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の方がバージョン変わってるとか?
0018nobodyさん2007/09/17(月) 06:36:57ID:???
>>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
効能が分るだろ。


0019nobodyさん2007/09/17(月) 07:36:15ID:???
前スレ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'

ってか朝っぱらから何やってんだろ俺。
0020nobodyさん2007/09/17(月) 07:37:27ID:???
ああ、いらんモジュール use しとるし orz...
0021nobodyさん2007/09/17(月) 11:15:49ID:???
-wスイッチを使うと警告を出すというんですが、これは一体どういう意味の警告なんですか?
-cは確か構文チェックをしてくれるわけですよね。
0022nobodyさん2007/09/17(月) 11:37:55ID:???
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ですか?
0023nobodyさん2007/09/17(月) 11:46:15ID:???
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 }
と保険?を掛けておくのが推奨されるコーディングなのでしょうか?
0024nobodyさん2007/09/17(月) 11:56:26ID:???
>>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の中の人がどっちの機能
を求めているのか判断出来ない。=> エラー出して保留
∴まともに機能してないよ
0025222007/09/17(月) 12:16:00ID:???
>>24
while( <> ){
 print if ( /^\s+/ .. /^$/ ) ;
}

読めないorz
正規表現の部分は「先頭から空白文字が1個以上あるか」「中身が空であるか」の二つですね。
で、..この範囲演算子はどういう意味でしょう?
ついでにwhileの評価式自体が皆目検討がつきません。
0026nobodyさん2007/09/17(月) 12:24:45ID:???
>>25
例だからあまり意味のないものを書いたんで。。。
 「先頭から空白文字が1個以上ある行」から
 「中身が空であるか」まで
 を出力せよ。
と言う意味になります。ホントは/^\S+/ のつもりだったのよw
後は、、、ぐぐれ。
0027212007/09/17(月) 12:26:13ID:???
すいません。試してるんですが。

Use of uninitialized value in addition (+) at 行数

こういうのやsubtractionとかがちょくちょく出てくるんです。
「初期化されてない値を使ってる」みたいな意味だと思いますが、
具体的にどういうエラーなのかわからず再現ができないでいます。
0028222007/09/17(月) 12:32:34ID:???
>>26
う〜んどうしてそうやって動くのでしょうか?
一旦中身が空である行を迎えたら自動でループはlastされるのですか?
ifに掛けられるのは1行ずつですよね。
う〜ん・・・
0029nobodyさん2007/09/17(月) 12:37:27ID:???
>>28
左の正規表現が真 => スイッチオン
右の正規表現が真 => スイッチオフ
for( 1..1000){
 print $_ if $_ == 10 .. $_ == 100 ;
}
つかまじでググってくれ。
21氏は質問の意味自体が理解不能だ。

俺は消えるので、相手してくれる人はいなくなるかもしらんが
頑張れ
0030212007/09/17(月) 12:38:16ID:???
my $pl = undef;
my $ze = $pl + 1;
my $we = $pl - 1;

レスこないのでガンばてたら、これでadditionとsubtractionエラーが再現できました。
この二つのエラーが出たら未定義値が格納されてる変数が計算に使われてるって思っておけばいいですよね。
でも一応スクリプト自体は動くんですが、-wはuse strict程度の感覚なのですか?
0031nobodyさん2007/09/17(月) 14:45:52ID:???
>>26
それ範囲演算子じゃないから。普通は使いません、ていうか使うな。
明らかに不適切な例を唐突に持ち出して何がしたいんだか。
0032nobodyさん2007/09/17(月) 15:07:46ID:???
>>31
ぐぐっても分らなかったのかw
0033222007/09/17(月) 16:17:24ID:???
>>32
確かにまだ理解できていませんが、>>31は僕ではないです。
回答してくれる方にそんな不遜な態度は取りません。
0034nobodyさん2007/09/17(月) 16:27:17ID:???
仕事押しつけられて、戻って来たらなんかオレ煽られてんなあ。
31=21 か?
Programming Perl の P135 の範囲演算子の項を読んだ後に
まともに煽ってくれ。つか突っ込みどころは他にもあるんだから。
0035nobodyさん2007/09/17(月) 18:09:34ID:???
> Programming Perl の P135 の範囲演算子の項を読んだ後に
> まともに煽ってくれ。つか突っ込みどころは他にもあるんだから。

とりあえず、該当箇所をスキャンしてうp汁。
0036nobodyさん2007/09/17(月) 18:24:44ID:???
>>35
http://perldoc.jp/docs/perl/5.6.1/perlop.pod
の範囲演算子の項はほぼ上述書物と同じだ。
0037222007/09/17(月) 19:13:34ID:???
とにかく仲良くして下さい。
0038nobodyさん2007/09/17(月) 19:21:59ID:???
scalar って書いてあるから、スカラコンテキストで評価するか。

> スカラの ".." の被演算子が定数表現であるときは、
> その被演算子は暗黙に、変数 $. と比較されることになります。

ちょっくら$.と比較するか。

$.にundef入ってるし。

Use of uninitialized value
0039nobodyさん2007/09/17(月) 20:57:51ID:???
やっぱりどうもプログラム系のスレの住人って人とのコミニュケーションが下手っぽいよね。
変な皮肉を言ったり、あえて言葉足らずにしてみたり。
そういう悪い癖に自分で気付いてるんだろうか。

こういうところが、「キモイ」イメージが付いてしまう原因なんだろうな。
0040nobodyさん2007/09/17(月) 21:44:30ID:???
変な分析したがりが一番キモい
0041nobodyさん2007/09/17(月) 23:15:28ID:???
つまりここにいる奴は全員キモイってことだな。
0042nobodyさん2007/09/18(火) 01:53:41ID:???
ま、いくら挑発しても答えてやらないけどな
0043nobodyさん2007/09/19(水) 19:41:21ID:uZuxrlKv
Perl の CGI::Application モジュールを使ってアプリを作成しているのですが、
デバッグの仕方でつまづいています。

というのも CGI::Application の場合 ランモードのそれぞれのメソッドからブラウザに表示させたい
htmlを return しますよね?

で、その途中で 勝手に「 print $hensu; 」みたいにやっても画面上には表示されません。。。
もちろん「 return $hensu; 」とやればその変数の内容は表示されるのですが、複数の変数の値を
一度に表示させたいのですーー。

こんな時みなさんどうしてるのでしょう???
0044nobodyさん2007/09/19(水) 19:47:18ID:???
V に TT とか使えばいいんじゃね?
0045nobodyさん2007/09/19(水) 20:52:24ID:???
ヘッダを出力する前にprintしてもブラウザには表示されないよ

CGI::App::Plugin::DebugScreenとかLogDispatchとか使ってたっけかな
手っ取り早いのはData::DumperとかYAML使ってwarnでダンプとか
httpdのエラーログにね
0046nobodyさん2007/09/19(水) 23:34:44ID:???
CGI::Application ってテストサーバないのか。ダサいな。
0047nobodyさん2007/09/19(水) 23:44:49ID:????PLT(15017)
あるよ

http://search.cpan.org/perldoc?CGI::Application::Server
http://search.cpan.org/perldoc?CGI::Application::Dispatch::Server
0048nobodyさん2007/09/20(木) 00:36:25ID:FmGzC+A0
DBIを使用してDB処理をした場合、sqlのログってどうしてます?

プリペアードステートメント使っていますが、肝心の値の部分が「?」なので、実際に流れるクエリが分かりません。
0049nobodyさん2007/09/20(木) 09:16:22ID:???
モジュールの質問ならpodくらい見てからしろよ

http://search.cpan.org/~timb/DBI-1.59/DBI.pm#trace
>DBI->trace($trace_setting)
>DBI->trace($trace_setting, $trace_filename)
>DBI->trace($trace_setting, $trace_filehandle)
>$trace_setting = DBI->trace;
0050nobodyさん2007/09/20(木) 12:35:47ID:yNzQPcIL
>>44
>>45

43です。レスありがとうございます。
なるほど、簡単にはいかないんですね。。CGI::Applicationしょぼ!

結局グローバルな変数(ハッシュ)に変数の値を保存していって

cgiapp_prerun (メソッド名間違ってたらスマソ)でその変数に
値が入っていればブラウザに表示するという方法でいきます。

ていうかこれぐらいのこともできないのかよ。CGI::Application

0051nobodyさん2007/09/20(木) 13:40:05ID:???
ヘッダの送る前にprintしてもブラウザに出力されないのは当たり前だろ・・・
自分の無知を認識しろよ
0052nobodyさん2007/09/20(木) 13:45:10ID:???
だからwebprogは揶揄される
0053nobodyさん2007/09/20(木) 14:21:55ID:???
今時 CGI::Application なんか使うなよ…
0054nobodyさん2007/09/20(木) 19:18:46ID:???
じゃあ何使えって言うんだよ。
どこのレンタルサーバでも使えるような方法で頼む。
0055nobodyさん2007/09/20(木) 21:46:49ID:???
if文ダラダラ使えってことじゃね
0056nobodyさん2007/09/20(木) 21:49:39ID:???
あるいはR信者が言語批判したかっただけとか
0057nobodyさん2007/09/20(木) 21:50:20ID:???
yukiwiki 的にサブルーチン呼べば?
値は PATH_INFO とかでとればよい。
0058nobodyさん2007/09/21(金) 04:57:02ID:9/Wk3rtw
質問です。

ネットに落ちてるサンプルを見ながら、アクセス解析や掲示板などを書いて
練習しているのですが、データを書き込んでいく空ファイルは
どこのサンプルでも自前で事前に用意しています。

これを、日時ごとに070921.dat、070922.dat…のように自動生成させたいのですが、そのようなことは出来ないのでしょうか?

よろしくお願いします。
0059nobodyさん2007/09/21(金) 05:11:32ID:???
問題なく出来ると思う。
0060nobodyさん2007/09/21(金) 05:15:49ID:???
テキスト表示のアクセスカウンタを作っているのですが、<img>タグで呼び出すとテキストを返せません。

SSIが使えないならば、直接CGIにアクセスさせるしかないんでしょうか??
0061nobodyさん2007/09/21(金) 09:28:25ID:???
質問させてください。

GDでファイルを生成→表示というスクリプトを組んでいますが
どうやら生成されるまえに表示する処理が実行されてしまい。うまくいきません。
リロードすれば表示されるようにはなるのですが・・・

生成されるまで待つ→表示処理実行

という事を考えて生成→slepp 2とか10;→次を実行

と、してみましたがうまくいきません。
生成完了するまでウェイトをかける方法を教えていただければありがたいです。
よろしくお願いします。
0062612007/09/21(金) 09:35:31ID:EZVVl+6I
自己解決しました。

sleepでOKでした。

よくみると

コメントアウトしてましたw
0063nobodyさん2007/09/21(金) 14:07:32ID:???
>>60
scriptタグのsrcでアクセスさせる。JavaScript。
0064nobodyさん2007/09/21(金) 20:24:02ID:yGE03KVM
winXPsp2とactive perlでローカルテストをする時の質問なのですが、
例えば print 1; という命令のあるplファイルをダブルクリックしても1が表示されません。
いや正確には一瞬何かが出てきてるっぽいんですが、閉じるの早すぎです。

コマンドプロンプトから実効命令をするとprint先がコマンドプロンプトに来るので、
勝手に閉じることはないようですが。
いちいちコマンドプロンプトやらずに簡単なコードテストの時はダブルクリックで済ませたいのですが
方法ありましたら教えてください。
0065nobodyさん2007/09/21(金) 20:46:57ID:???
>>64
END{<STDIN>}
とか書いとけば。
0066642007/09/21(金) 21:00:38ID:yGE03KVM
>>65
ありがとうございます。
うまく出ました^^
endって一体なんなのですか?

perlの説明サイトとかで関数調べてendありませんし。
最後にやるってことですか?
となると<STDIN>が閉じさせない命令の本体になるんでしょうか?
どういう理屈なんでしょうjか。
0067nobodyさん2007/09/21(金) 22:37:24ID:???
>>66
http://perldoc.jp/docs/perl/5.8.8/perlmod.pod
perlmodのBEGIN, CHECK, INIT and END BEGIN CHECK INIT ENDのところ。

プログラムの終了するところで、
<STDIN>で、コンソールの入力待ちをしてる。
0068642007/09/21(金) 23:02:02ID:yGE03KVM
>>67
コンソール???あの黒い画面のことかな。
で、試しに適当に打ち込んだら本当に入力できました。
最後にenterを押したら画面が消えました。
perlの方にはしっかりとその内容が送られてるんですかね?

試しに
my @array = <STDIN>;
print $array[0];

としてみましたが、今度はenterを何度押しても画面が閉じません。
配列に入れてるから無限に取るっぽいですね。
my $scalar = <STDIN>;
print $scalar;
END{<STDIN>}
としたらうまくいきました。

任意の内容を入力してenterした瞬間に制御が一瞬コードに行ってprint $scalar;が実行されました。
ローカルでやるときはこうやって引数を取るというのも面白いですね。
物凄い面白いことを教えていただいて感謝です。
0069nobodyさん2007/09/22(土) 13:27:49ID:???
質問です。
Class::DBI使ってDB操作する場合、二つのレコード間で主キー以外のデータを交換するには
どのように書いたらいいですか?
0070nobodyさん2007/09/22(土) 15:58:05ID:???
#! /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になる。
ただしレンタルサーバー上ではエラーだが、
自分のパソコンでやったらちゃんと表示される。

ソースにもし間違いがあったら
場所と対処法を具体的に指摘しろ。
0071nobodyさん2007/09/22(土) 17:15:55ID:???
>>70
態度でかいぞ。
そんなやつには教えてやらん。



#! と /usr の間に半角スペースが入ってるのが問題とか言わん。
0072nobodyさん2007/09/22(土) 17:44:10ID:???
>>68
和んだ、俺も10年くらい前Cやった時そんなだった。
0073692007/09/22(土) 19:54:58ID:???
すみません。解決しました。
0074nobodyさん2007/09/22(土) 21:34:17ID:???
>>70
パーミッションはちゃんとやってあるのか?
とりあえず雑魚が粋がるのはやめておけ。
0075nobodyさん2007/09/22(土) 22:09:17ID:VEv2R0s3
http://pc11.2ch.net/test/read.cgi/php/1158647441/369-372 から来ました。

http://ws.strikeiron.com/SwanandMokashi/StockQuotes2?WSDL
このサービスを SOAP::Lite から使いたいんですが、ドキュメントのWSDL関連部分を読んでも
  use SOAP::Lite;
  print SOAP::Lite
    -> service('http://www.xmethods.net/sd/StockQuoteService.wsdl')
    -> getQuote('MSFT');
としか書いてません。
WSDLを見てみると、GetStockQuotesメソッド(オペレーション?)のパラメタとして
QuoteTicker(MSFTとかの文字列)だけでなく、オブジェクト構造みたいなのを組んで
メアドなども渡さないといけないようなんですが、どう書けばいいんでしょうか。
0076752007/09/22(土) 22:43:31ID:???
http://guide.soaplite.com/#access%20with%20service%20description%20(wsdl)
> SOAP::Liteでは今のところWSDL 1.1のサポートは限定されているが〔中略〕、
> 複雑な型(types)を記述に含まないサービスにはアクセス可能だ。

と書いてあるので、無理なのかもしれませんね・・・
0077752007/09/23(日) 03:01:09ID:???
やっと自己解決・・・
http://wsparam.strikeiron.com/BasicRealTimeQuotes?WSDL
という、もっと単純なWSDLを使用。
http://www.strikeiron.com/authentication/
ここの下のほうにPerlのサンプルが(も)置いてあるので、それを改造。
わかりやすいのでSOAP初心者にはおすすめかも。
0078nobodyさん2007/09/23(日) 03:53:09ID:???
>>74
なぁーんてこった!
cgiファイルのパーミッションを
755にしたらそれで動いたぜ
そんなこと教科書には
どこにも一言も書いてなかった!
ローカルで動かす教科書だからかな?
サノバビーィーーーッチ!

それでパーミッションが500でも
動くのはなんでだ?
0079nobodyさん2007/09/23(日) 05:27:46ID:???
それくらいググれカス
0080nobodyさん2007/09/23(日) 06:45:28ID:???
やはりWebProg板はレベルが低いな。最高。
0081nobodyさん2007/09/23(日) 06:53:38ID:???
だって初心者スレだもん。いいじゃない。

なんか、すごくレベルの高い質問が最近多すぎな気がする。俺のレベルが低いだけなんだろうけどw
Webprogなんだから、動けばいいじゃない的な考えがイクナイ?
0082nobodyさん2007/09/23(日) 07:50:40ID:???
if ( $hoge =~ /$moge/ ){ print "もげら" }
って感じで書いて$mogeが展開されてくれないみたいなんだけど、
特別な書き方があるのかな。
ぐぐったけど正規表現ばかりで、変数をつかってる例が全然見つからなかったんだけど、
こういう記述方法自体があまり一般的じゃなくて、他の書き方があるのかな。

教えてちゃぶだい。
0083nobodyさん2007/09/23(日) 08:00:28ID:???
>>82
$mogeの中には何が入ってるの?
2バイト文字関係とか、文字コードでこけてる可能性もありそう。
0084nobodyさん2007/09/23(日) 11:07:04ID:???
>>82
変数使うときはquotemeta()くらいはかましときなはれ。
0085nobodyさん2007/09/23(日) 14:57:13ID:???
サンクス!
quotemetaでいけたよ。

1)index($hoge, $moge) でもやったけどダメ
2)auotemeta() してみた
3)$hoge =~ /$moge/ で成功!
4)でもなぜかそれ+ index($hoge, $moge) じゃダメ

って感じだった。
中に入ってるのはどちらもEUCの2バイト文字列なんだけど、
なぜか$mogeが空の文字列として扱われてしまってるっぽい動作だった。
print $hoge.$moge;とかで出力するとちゃんと出力されるんだけどね。
良く分からないけどとりあえず解決はしてよかった。
ありがとう。
0086nobodyさん2007/09/25(火) 00:47:19ID: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をつぶしたいのですが、何とかする方法はないでしょうか?
0087nobodyさん2007/09/25(火) 00:49:11ID:XOfpdsF8
x 実は、html::copyright 以外にも数十個でていて、紛らわしいことこの上ないです。
o 実は、html::copyright 以外にも used only once: possible typo が、数十個でていて、紛らわしいことこの上ないです。

used only once: possible typo・・・
は、意味は、わかっておりまして、
一度しか使ってないので、ミスじゃない?ってことなのですが、
実際には、ちゃんと、htmlモジュールで代入してから、mainで参照しているのに・・・ということです。
0088nobodyさん2007/09/25(火) 03:43:51ID:???
>>87
Use of uninitialized value
が続かないなら、理由が分からない。
一度ourで宣言してみたらどうなる?
0089862007/09/25(火) 17:25:00ID: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なんですが、なんで、ちゃんと動いているんだろ・・・
もうちょっと解析してみます。
0090862007/09/25(火) 17:28:00ID:XOfpdsF8
x print $test_pm::test;
o print $test_pm::hoge;

スペルミス。
これでも同じ結果です。
0091nobodyさん2007/09/25(火) 21:26:37ID:o7XeBw4v
先日このスレで
END{<STDIN>}
を教えてもらったものです。その節はありがとうございました。

ローカルチェックをする時に、ダブルクリックだけでいいという大変便利なものなのですが、
エラーが出てるときに一瞬で画面が閉じてしまうのです。

ちなみにその時のエラーはuse strictによるmy使え先刻でした。
途中でエラー中断してるのでEND{}まで行かないのは至極当然な話ですが、
エラーの時はエラー内容をSTDINに出力させりょうと思うと大変なことになりますか?

エラーにも色々あるので難しいかもしれませんが、用はコマンドプロンプト画面に出ることを
代わりにそのままSTDINに出力してもらえばいいわけなのですが。
0092nobodyさん2007/09/25(火) 21:28:39ID:???
>>89
CGIってことはサバにあるわけだ。
つまり君がローカルで試してるファイルとは違うファイルが動いてる可能性もあるわけね。
0093nobodyさん2007/09/25(火) 21:36:47ID:???
>>91
コンソールを開いておけない余程の事情でもあるの?
0094912007/09/25(火) 22:20:58ID:o7XeBw4v
>>93
いえ、単純にちょっとしたコードテストをしたいときにわざわざ
1.コマンドプロンプト画面を開いて
2.ファイルがあるフォルダを開いて
3.黒画面にファイルをD&Dしてenter

という手順を踏むのが面倒だといつも思っていたのです。
1.ファイルをダブルクリックする
これだけで済むなら最高です。

意外に大きな差かなって思いまして。
黒画面へのエラー内容出力ってどういう仕組みで行ってるんでしょうか?
きっとperlの方から出してるんだと思いますが、その出し先をSTDINに変えればできるのでは?
とか思ったり。
0095nobodyさん2007/09/25(火) 22:46:42ID:???
>>94
同じファイル?ならコンソール開きっぱなしで1回目だけ「perl スクリプト名」で実行しておけば連続テストは↑+Enterで済む。
慣れにもよるけど多分ダブルクリックより速く操作できる

エラーはSTDERRに出力される。
誤解しているようだけどSTDINは標準入力であって出力ではない。標準出力はSTDOUT
0096912007/09/26(水) 00:17:27ID:zmZEFb0X
>>95
2回目以降は確かに楽なんですけど。
STDERRに出力されてるので、END{<STDIN>}で出る入力受付画面には出力されない?
STDOUTへの分はきちんと表示されますし。

STDERRの取得方法があるのでしょうか?
0097nobodyさん2007/09/26(水) 00:27:31ID:???
>>89
これ、ActivePerl 5.8.8.822で普通にtest foo barと表示された
ダメ出しも無し
0098nobodyさん2007/09/26(水) 00:37:06ID:???
>>96
ラクダ本より
>内部的に発生する例外によって終了する場合でも、ENDサブルーチンは呼び出される(ただし、シグナルによって撃沈された場合は除く)
とあるようにENDそのものが実行されない。自分で(できれば)トラップする必要がある。これはsigtrapを使えばよい。

…が、それくらいなら最初からコンソールから使うことを強く勧める。元々ダブルクリックで起動するようには設計されてないし。
0099nobodyさん2007/09/26(水) 00:41:02ID:???
>>91
echo off
perl %0 %1 %2 %3 %4 %5 %6 %7 %8 %9
pause

みたいなバッチファイル作って、,plに関連付けして置くぐらいかなぁ。

統合型開発環境(みたいなエディタ)を使うと、その場で実行して、
その場で結果表示できたりするので、そういうの使うと便利だよ。
0100nobodyさん2007/09/26(水) 00:56:23ID:???
しまった。
> perl %0 %1 %2 %3 %4 %5 %6 %7 %8 %9

> perl %1 %2 %3 %4 %5 %6 %7 %8 %9
だた。
01011012007/09/26(水) 02:22:27ID:???
型グロブというものについて
教科書を今日読んで理解したので
型グロブについて誰か質問してください。
説明します。
0102nobodyさん2007/09/26(水) 05:15:12ID:???
型グロブをうまいこと使っているモジュールを列挙してください。
0103nobodyさん2007/09/26(水) 13:38:32ID:???
>>99-100 perl %*
0104nobodyさん2007/09/26(水) 17:01:12ID:???
>>101
ありがとうございます!
スカラー変数
配列変数
リスト
ハッシュ変数?
それらのリファレンスなど

上記との違いを説明してください。
そして何の為にグロブがあるのですか?
僕は素人なのでまだ使うべきところに出会っていません。
いや使えてたらもっと簡単につくれてたのかもしれません。
0105nobodyさん2007/09/26(水) 18:35:06ID:???
ビウログってなんですか?
0106nobodyさん2007/09/27(木) 02:15:46ID:rW8f5K4d
質問です。

if($Fm{'form'}){  処理  } #フォームに何か入力されていれば処理

上記の場合
フォームに0と入力した場合もスルーされてしまいます。
認識させるにはどのような書き方になるのでしょうか。

if分の前に
$Fm{''form'}=sprintf( "%c", $Fm{''form'} );
のように文字列にするという方法を思いついたのですが、ちょっとスマートじゃないなと思っています。
よろしくおねがいします。
0107nobodyさん2007/09/27(木) 02:23:35ID:???
if($Fm{'form'} ne ""){  処理  }
0108nobodyさん2007/09/27(木) 02:35:47ID:???
>>107
素早い回答ありがとうございます。
その手がありましたか。目からうろこでした。
ありがとうございます!
0109nobodyさん2007/09/27(木) 03:41:52ID:???
length とかも
0110nobodyさん2007/09/27(木) 06:29:35ID:???
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;
}
0111nobodyさん2007/09/27(木) 06:34:39ID:???
defined 常考
01121012007/09/27(木) 09:02:14ID:???
型グロブについて。

スカラー変数
アレイ
ハッシュ(連想配列)

この3つを同時に
扱うために、型グロブは
生まれてきたのです。
01131012007/09/27(木) 09:04:34ID:???
例えば

$a ←これはスカラー変数
@a ←これはアレイ(配列)
%a ← これはハッシュ(連想配列)

aの左側についてる記号は
$だったり
@だったり
%だったりとそれぞれ違うが
記号の右側はaで全部統一されている。

このとき

「aの型グロブ!」
と宣言すれば、

$a @a %a

この3つを全部同時に扱うことができる。
これが型グロブ。
0114nobodyさん2007/09/27(木) 09:14:21ID:???
こいつはOmotiとかタクトくせぇ
■ このスレッドは過去ログ倉庫に格納されています