Perlコーディング初心者質問スレ Part 56
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2007/09/16(日) 19:49:43ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ ttp://pc11.2ch.net/test/read.cgi/php/1180492441/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0071nobodyさん
2007/09/22(土) 17:15:55ID:???態度でかいぞ。
そんなやつには教えてやらん。
#! と /usr の間に半角スペースが入ってるのが問題とか言わん。
007369
2007/09/22(土) 19:54:58ID:???0075nobodyさん
2007/09/22(土) 22:09:17ID:VEv2R0s3http://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とかの文字列)だけでなく、オブジェクト構造みたいなのを組んで
メアドなども渡さないといけないようなんですが、どう書けばいいんでしょうか。
007675
2007/09/22(土) 22:43:31ID:???> SOAP::Liteでは今のところWSDL 1.1のサポートは限定されているが〔中略〕、
> 複雑な型(types)を記述に含まないサービスにはアクセス可能だ。
と書いてあるので、無理なのかもしれませんね・・・
007775
2007/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:???なぁーんてこった!
cgiファイルのパーミッションを
755にしたらそれで動いたぜ
そんなこと教科書には
どこにも一言も書いてなかった!
ローカルで動かす教科書だからかな?
サノバビーィーーーッチ!
それでパーミッションが500でも
動くのはなんでだ?
0079nobodyさん
2007/09/23(日) 05:27:46ID:???0080nobodyさん
2007/09/23(日) 06:45:28ID:???0081nobodyさん
2007/09/23(日) 06:53:38ID:???なんか、すごくレベルの高い質問が最近多すぎな気がする。俺のレベルが低いだけなんだろうけどw
Webprogなんだから、動けばいいじゃない的な考えがイクナイ?
0082nobodyさん
2007/09/23(日) 07:50:40ID:???って感じで書いて$mogeが展開されてくれないみたいなんだけど、
特別な書き方があるのかな。
ぐぐったけど正規表現ばかりで、変数をつかってる例が全然見つからなかったんだけど、
こういう記述方法自体があまり一般的じゃなくて、他の書き方があるのかな。
教えてちゃぶだい。
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:XOfpdsF8use 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:XOfpdsF8o 実は、html::copyright 以外にも used only once: possible typo が、数十個でていて、紛らわしいことこの上ないです。
used only once: possible typo・・・
は、意味は、わかっておりまして、
一度しか使ってないので、ミスじゃない?ってことなのですが、
実際には、ちゃんと、htmlモジュールで代入してから、mainで参照しているのに・・・ということです。
0088nobodyさん
2007/09/25(火) 03:43:51ID:???Use of uninitialized value
が続かないなら、理由が分からない。
一度ourで宣言してみたらどうなる?
008986
2007/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なんですが、なんで、ちゃんと動いているんだろ・・・
もうちょっと解析してみます。
009086
2007/09/25(火) 17:28:00ID:XOfpdsF8o print $test_pm::hoge;
スペルミス。
これでも同じ結果です。
0091nobodyさん
2007/09/25(火) 21:26:37ID:o7XeBw4vEND{<STDIN>}
を教えてもらったものです。その節はありがとうございました。
ローカルチェックをする時に、ダブルクリックだけでいいという大変便利なものなのですが、
エラーが出てるときに一瞬で画面が閉じてしまうのです。
ちなみにその時のエラーはuse strictによるmy使え先刻でした。
途中でエラー中断してるのでEND{}まで行かないのは至極当然な話ですが、
エラーの時はエラー内容をSTDINに出力させりょうと思うと大変なことになりますか?
エラーにも色々あるので難しいかもしれませんが、用はコマンドプロンプト画面に出ることを
代わりにそのままSTDINに出力してもらえばいいわけなのですが。
0092nobodyさん
2007/09/25(火) 21:28:39ID:???CGIってことはサバにあるわけだ。
つまり君がローカルで試してるファイルとは違うファイルが動いてる可能性もあるわけね。
009491
2007/09/25(火) 22:20:58ID:o7XeBw4vいえ、単純にちょっとしたコードテストをしたいときにわざわざ
1.コマンドプロンプト画面を開いて
2.ファイルがあるフォルダを開いて
3.黒画面にファイルをD&Dしてenter
という手順を踏むのが面倒だといつも思っていたのです。
1.ファイルをダブルクリックする
これだけで済むなら最高です。
意外に大きな差かなって思いまして。
黒画面へのエラー内容出力ってどういう仕組みで行ってるんでしょうか?
きっとperlの方から出してるんだと思いますが、その出し先をSTDINに変えればできるのでは?
とか思ったり。
0095nobodyさん
2007/09/25(火) 22:46:42ID:???同じファイル?ならコンソール開きっぱなしで1回目だけ「perl スクリプト名」で実行しておけば連続テストは↑+Enterで済む。
慣れにもよるけど多分ダブルクリックより速く操作できる
エラーはSTDERRに出力される。
誤解しているようだけどSTDINは標準入力であって出力ではない。標準出力はSTDOUT
009691
2007/09/26(水) 00:17:27ID:zmZEFb0X2回目以降は確かに楽なんですけど。
STDERRに出力されてるので、END{<STDIN>}で出る入力受付画面には出力されない?
STDOUTへの分はきちんと表示されますし。
STDERRの取得方法があるのでしょうか?
0098nobodyさん
2007/09/26(水) 00:37:06ID:???ラクダ本より
>内部的に発生する例外によって終了する場合でも、ENDサブルーチンは呼び出される(ただし、シグナルによって撃沈された場合は除く)
とあるようにENDそのものが実行されない。自分で(できれば)トラップする必要がある。これはsigtrapを使えばよい。
…が、それくらいなら最初からコンソールから使うことを強く勧める。元々ダブルクリックで起動するようには設計されてないし。
0099nobodyさん
2007/09/26(水) 00:41:02ID:???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
だた。
0101101
2007/09/26(水) 02:22:27ID:???教科書を今日読んで理解したので
型グロブについて誰か質問してください。
説明します。
0102nobodyさん
2007/09/26(水) 05:15:12ID:???0104nobodyさん
2007/09/26(水) 17:01:12ID:???ありがとうございます!
スカラー変数
配列変数
リスト
ハッシュ変数?
それらのリファレンスなど
上記との違いを説明してください。
そして何の為にグロブがあるのですか?
僕は素人なのでまだ使うべきところに出会っていません。
いや使えてたらもっと簡単につくれてたのかもしれません。
0105nobodyさん
2007/09/26(水) 18:35:06ID:???0106nobodyさん
2007/09/27(木) 02:15:46ID:rW8f5K4dif($Fm{'form'}){ 処理 } #フォームに何か入力されていれば処理
上記の場合
フォームに0と入力した場合もスルーされてしまいます。
認識させるにはどのような書き方になるのでしょうか。
if分の前に
$Fm{''form'}=sprintf( "%c", $Fm{''form'} );
のように文字列にするという方法を思いついたのですが、ちょっとスマートじゃないなと思っています。
よろしくおねがいします。
0107nobodyさん
2007/09/27(木) 02:23:35ID:???0109nobodyさん
2007/09/27(木) 03:41:52ID:???0110nobodyさん
2007/09/27(木) 06:29:35ID:???リストに格納したいのですが、プレフィックス長(=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:???0112101
2007/09/27(木) 09:02:14ID:???スカラー変数
アレイ
ハッシュ(連想配列)
この3つを同時に
扱うために、型グロブは
生まれてきたのです。
0113101
2007/09/27(木) 09:04:34ID:???$a ←これはスカラー変数
@a ←これはアレイ(配列)
%a ← これはハッシュ(連想配列)
aの左側についてる記号は
$だったり
@だったり
%だったりとそれぞれ違うが
記号の右側はaで全部統一されている。
このとき
あ
「aの型グロブ!」
と宣言すれば、
$a @a %a
この3つを全部同時に扱うことができる。
これが型グロブ。
0114nobodyさん
2007/09/27(木) 09:14:21ID:???0115101
2007/09/27(木) 09:59:46ID:???4年1組と
4年2組と
4年3組が
いたとして、
「4年生全員集合!」
と言うと、4年生が全員集まってくるのです
これが型グロブです。
0116nobodyさん
2007/09/27(木) 11:04:43ID:???を語らないと通じないでしょ
肝心な部分が抜けてるポ^^
0117nobodyさん
2007/09/27(木) 13:26:43ID:???どっちかというと「全学年の1組集合」の方が近いのではないかと。
0118nobodyさん
2007/09/27(木) 13:32:25ID:???0119118
2007/09/27(木) 13:33:29ID:???0120nobodyさん
2007/09/27(木) 13:34:07ID:???0121nobodyさん
2007/09/27(木) 13:58:24ID:???なんでおじちゃんたち
DBが全部やってくれることを一生懸命書いてるの?
0122nobodyさん
2007/09/27(木) 14:53:03ID:???0123nobodyさん
2007/09/27(木) 15:13:12ID:???それとも手をつけたことがない?
後者なら絶対覚えたほうがいいよ。
生産効率が全然ちがうよ
0124nobodyさん
2007/09/27(木) 16:59:17ID:???これじゃだめなん?
use Net::CIDR;
print join("\n", Net::CIDR::cidr2octets("1000:1234:abcd:2000::/127"));
0125nobodyさん
2007/09/27(木) 17:11:50ID:???ゴミ箱にごみを捨てるのは、わざわざ執事雇って呼んで捨てさせる程の事じゃないしぃ
0127nobodyさん
2007/09/27(木) 20:05:25ID:fs1IYXrArand ≠ 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);
とすれば確実ですが、地味に面倒で意外と見づらいです。
0128nobodyさん
2007/09/27(木) 20:36:42ID:???その手の仕様をプラットフォームによって違うようにする必要性がないし
0130127
2007/09/27(木) 20:54:10ID:fs1IYXrAそうですよね。まあでも括弧を外すなら結局rand(1)としないとしつこく引数にとられてしまいますね。
>>129
英語のページですか・・・
僕の学力の低さを見透かしたような皮肉orz
バカにでもわかる一覧表的なページはないということでFA?
0131nobodyさん
2007/09/27(木) 21:18:44ID:???print 1;
}
1と表示されます。unlessは条件式が偽を出してくる時にブロックを実行するのですよね?
0 and 1なら片方が真を出すのでブロック実行されないと思ったのですが。
複数の条件式が全て偽を出した時にだけブロック実行をさせたいのです。
回答宜しくお願いいたします。
0132131
2007/09/27(木) 21:22:38ID:???if (1 and 0){
print 1;
}
これです。何も表示されません。先ほどのunlessとの整合性がつきません。
ifによる条件式部分ではちゃんと二つ共が真の時だけ実行されるのに、
unlessの場合は片方が偽を出せば実行されます。
もしかして
真 and 偽
は最終的に偽扱いされるのですか?
0134nobodyさん
2007/09/27(木) 21:28:52ID:???(「真」かつ「真」)なら結果「真」と評価できる
つまり、(0 and 1)は常に「偽」と評価される
だから unless (偽) は常にそのブロック内が実行される
0135131
2007/09/27(木) 21:46:53ID:???やはりちょっと違いますねunlessは。
ifのfalse版みたいに思うと微妙にやられますね。
全然関係ない話ですが、Perlには資格ってあるのですか?
書道3段とか簿記3級みたいに客観的にPerlにおけるプログラミング力を第3者に示すもの。
頑張って勉強してそのうちバイトでプログラムの仕事取ってみたいですが、
その時にそういう資格的なものがあるなら売り込みやすいなと思いまして。
本当に関係ない話ですいません。
0136nobodyさん
2007/09/27(木) 21:59:00ID:???http://perldoc.jp/docs/perl/5.8.8/perlop.pod
0137127
2007/09/27(木) 22:08:14ID:fs1IYXrA日本語のページありがとうございます。
見てきますm(__)m
0138nobodyさん
2007/09/27(木) 22:39:59ID:???0140nobodyさん
2007/09/28(金) 00:24:10ID:???my ($s1,$s2............$s20);
my (@r1,@r2............$r20);
全部書くのが面倒な時は簡単な方法はありますか?
0141nobodyさん
2007/09/28(金) 00:37:13ID:???そんなことすんならuse strict使わない、宣言しないほうがよっぽどいい
0142140
2007/09/28(金) 00:42:26ID:???# 初期化
というところでいっぺんに使う変数を宣言しています。
何故というより癖みたいなものですかね。
それで分析プログラムを作ってたら、やたらと記録や集計用の変数が必要になったんです。
一つ一つまともに名前を考えるのが非効率なのでそこだけ適当な名前にしています。
strcit使いながら賢く宣言できませんか?
無理ならあきらめます。
0143nobodyさん
2007/09/28(金) 01:00:34ID:???0144nobodyさん
2007/09/28(金) 01:01:15ID:???キー名を考えるのは同じだけど
0145nobodyさん
2007/09/28(金) 03:02:00ID:???なんか、その変数名だと単に配列と二次元配列の初期化だけですむ気がすんだけど?
my ( @s, @r ) ;
# @s は、オマエさんの ( $s1, $s2, ..... ) を入れる配列
# @r は、オマエさんの ( [@r1], [@r2], .... ) を入れる配列
本当に別々の変数名が必要なのか?
本当に必要ならば上の人たちが言ってる通りハッシュorハッシュリファレンス
使え。
0146nobodyさん
2007/09/28(金) 03:04:18ID:???0147140
2007/09/28(金) 06:42:10ID:???ごもっともなんですけど、リファレンスにするとコードが汚くなるんですよね。
いちいちデリファレンスしながらのコードは読みにくいし。
ハッシュも同じです。単なるスカラーと配列変数以上に読みやすいものはないかと。
>>146
それってforブロックの中でローカル化されてませんか?
evalするとローカル化されないとか?
0148nobodyさん
2007/09/28(金) 06:53:34ID:???そのevalに突っ込み入れられる実力があれば、
キミの望んだことは実現出来るよな?
まあ、自分の考えに固執しないで、他の人が普通に「hash使え」って
言ってる意味を考えた方が良いと思うけど。
=> perlでは143-145が普通の感覚だし、たかだか変数の
宣誓にevalなんぞ使ってたら「変態さんがいるわ&hearts」
と言われること受けあいだ。
そもそもそんなに個別の変数が必要か否かを考え直したほうがいい
んじゃね?
0149nobodyさん
2007/09/28(金) 08:03:45ID:???書道の段位なんて流派ごとに異なるので、客観性があることにできないんと思うよ。
日商簿記2級くらいまでなら試験対策する時間さえあれば能力関係なしにとれるから
持ってたからといってだから何?レベルだよね。
0150nobodyさん
2007/09/28(金) 08:31:35ID:???脳内では、コレが参考になるかもしらんが、
○自己判断のレベルが客観的判断のレベルと一致しない。
○レベル7と8との間にとても深くて暗い河がある。
プログラミングの技量の判断として有名なのはFizzBuzz問題
だが、有名になりすぎて知ってて当たり前。
0151nobodyさん
2007/09/28(金) 12:19:13ID:???0153nobodyさん
2007/09/28(金) 15:13:33ID:???とか思ってる他人のソース弄って何とかしている人がここに一人。
0154nobodyさん
2007/09/28(金) 15:43:49ID:???0155nobodyさん
2007/09/28(金) 15:58:21ID:???0156nobodyさん
2007/09/28(金) 16:22:17ID:???0157nobodyさん
2007/09/28(金) 16:32:49ID:???0158nobodyさん
2007/09/28(金) 17:27:09ID:???0159nobodyさん
2007/09/28(金) 17:36:03ID:???スコープ区切って引数と戻り値のやりとりするほうが100万倍読みやすいよ
0160140
2007/09/28(金) 18:12:42ID:???>そのevalに突っ込み入れられる実力があれば、
>キミの望んだことは実現出来るよな?
すいません。もう少し普通の会話がしたいです。
>そもそもそんなに個別の変数が必要か否かを考え直したほうがいい
んじゃね?
このよくある「答は一つ、綺麗でスマート」っていうのはどうにも好かない。
0162nobodyさん
2007/09/28(金) 21:25:32ID:???「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__
0163nobodyさん
2007/09/28(金) 21:41:10ID:???0164nobodyさん
2007/09/28(金) 22:27:42ID:3wKaaJqT同じディレクトリに5個くらい違うCGIファイルがあります。
5個のCGIファイル全てに、冒頭の10個のサブルーチンをコピペしてあります。
print routin(1,2);
5個のCGIふぁいるではこういう記述でサブルーチンが使えます。
どうもこれを外部ライブラリ化とかいうのすると
print パッケージ名::routin(1,2);
で使えるようになるとか。
でもパッケージ名を入れるとなると5個のCGIファイル全てを書き直すのが嫌です。
またパッケージ名が入って見た目がウザくなるのも嫌です。
外部ライブラリにしながらも、メインパッケージにあるのと同じごとくサブルーチンを使うにはどうすればいいでしょうか?
メインパッケージに初めに全部もらえばいけるんじゃないかとか妄想していますが。
0166nobodyさん
2007/09/28(金) 22:45:38ID:3wKaaJqT0167nobodyさん
2007/09/28(金) 23:42:41ID:???全部plファイルにしてrequireでつなげろ
0168nobodyさん
2007/09/28(金) 23:57:57ID:???0169nobodyさん
2007/09/29(土) 00:02:00ID:???すげえまじで感動したw
つか、require '....pl' ってperl4時代のモンだと思って使ってもなかったよ。
これからも使わんけどw
もちろんstorableとか使用するときには必須>require
0170nobodyさん
2007/09/29(土) 00:04:52ID:???■ このスレッドは過去ログ倉庫に格納されています