トップページ⇒tech
1001コメント344KB

Perlについての質問箱 28箱目

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさん2006/10/31(火) 14:52:21
"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。

CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 http://pc8.2ch.net/php/ )

CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。

http://www.perl.org/get.html
● 2006/10/31現在の最新版: 5.8.8
● 2006/10/31現在の開発版: 5.9.3

前スレ
Perlについての質問箱 27箱目
http://pc8.2ch.net/test/read.cgi/tech/1157874614/

リンク集は>>2-3
過去スレは>>4
0809デフォルトの名無しさん2006/12/14(木) 22:16:35
$mon[$i - 1]
08108062006/12/14(木) 22:19:49
>>809
出来ました!
でも、この-は何なのでしょうか?
0811デフォルトの名無しさん2006/12/14(木) 22:25:47
インデックス番号は0から始まる
知らないで配列扱うとは・・・
0812デフォルトの名無しさん2006/12/14(木) 22:51:01
そんな君には $[ = 1; がオススメ
0813デフォルトの名無しさん2006/12/14(木) 23:06:09
>812
そんな余計なこと教えるなよ
0814デフォルトの名無しさん2006/12/14(木) 23:30:23
>>808
こんなんでわかるか?

print "$mon[0]\n";
print "$mon[1]\n";
print "$mon[2]\n";
print "$mon[9]\n";
0815デフォルトの名無しさん2006/12/15(金) 09:39:41
Devel::Sizeでアレイやハッシュが使用するメモリのサイズとか確認できますが
Devel::Sizeモジュールをインストールせず、同様のことは可能でしょうか?
自由にモジュールインストールできない環境なので、何か方法あれば教えてください
0816デフォルトの名無しさん2006/12/15(金) 09:54:12
>>815
内部APIを使わないなら無理。B::*使えば出来るかも知れんが、無謀だな。

そもそも何故メモリサイズを知ることが必要?
0817デフォルトの名無しさん2006/12/15(金) 10:19:16
>>816
簡単に言うと仕事で頼まれたからw
私もあまり意味はないと思うんですが、動作が遅いプログラムがあってその調査の一環
プログラム内部で、階層構造のリファレンスハッシュで画面出力用にデータを編集しているところが
かなりメモリを食ってるみたいで、具体的にどれくらいか調べたいと思いました
psで確認するとプログラムの使用メモリが多いけど、遅い原因はDBアクセス等の効率が悪いだけだと思ってます

Devel::Sizeを使用しないと非常に難しいと言うことはわかりました
ありがとうございます
0818デフォルトの名無しさん2006/12/15(金) 10:22:55
>>817
プログラム速度の測定なら、メモリ消費量を調べるよりDevel::DprofやDevel::Profile(標準じゃないがPurePerlだから使うのは簡単)で調べた方がいいと思うが。
0819デフォルトの名無しさん2006/12/15(金) 10:40:46
>>817
スクリプトが原因でスラッシングしているなら遅くはなるだろうけど
スラッシングしていないなら、メモリ使用量と動作が遅いはあんまり関係ないでしょ。
#少ないには越したことないけど;p

psはtelnetかsshでログインして確認したのですか?
サーバ上でシェルが使えるならコンパイラ使えればroot権限なくても
モジュールをコンパイルして使えますよ。
Devel::DprofやDevel::ProfileでプロファイルをとるかBenchmark, Time::HiResを使って
ボトルネックを探すほうがいいと重いますよ。
0820デフォルトの名無しさん2006/12/15(金) 21:27:34
>>815
かかる手間を考えると趣味専用になるが、移植性を無視すれば可能。
・リファレンスを文字列評価すればスカラーヘッダ構造体のアドレスがわかる
・unpackのPは特定アドレスからメモリの中身を読み出す事ができる
からね。
これ(PurePerlによる変数dumper)を書く事でPerlの変数に対する理解はすすむので、
話のネタとしては面白いかもしれない。
0821デフォルトの名無しさん2006/12/16(土) 08:57:16
>>820
こりゃおもしろいなあ。何か他に使い途ないかな?
0822デフォルトの名無しさん2006/12/16(土) 09:46:46
C言語でいう__func__や__LINE__などのマクロはありませんでしょうか
デバッグログに使用したいと思っております。
0823デフォルトの名無しさん2006/12/16(土) 10:36:21
すみません、質問宜しいでしょうか
宛先が自分のIP以外のUDPパケットを受信したいのですが、どうすれば良いのでしょうか
もしモジュールを使用する場合は標準モジュールの範囲内でお願いします
0824デフォルトの名無しさん2006/12/16(土) 10:53:20
ソケットをrowモードでひらけばいいじゃん
0825デフォルトの名無しさん2006/12/16(土) 10:54:14
>>820
アドレス欲しいなら数値評価のほうがよくね?
08268222006/12/16(土) 15:25:28
ググりました。以下のものはありましたね・・・

__LINE__
__FILE__
__PACKAGE__
__END__
__DATA__


__FUNC__は無い認識でよろしいでしょうかorz
0827デフォルトの名無しさん2006/12/16(土) 16:13:58
>>826
なければ書いたらいいじゃない。
0828デフォルトの名無しさん2006/12/16(土) 22:20:08
perlに触れて2日目です。。かない痛いミスしてるかもしれませんが、何方か教えてください。

Flashからcgiへ変数$nameを渡す実験をしているのですが、$nameを日本語にすると
すべて文字化けしてしまいます。手元にある入門書を参照したところ、jcode.plを使えばよいとあったので、

require 'cgi-lib.pl';
require 'jcode.pl';
&ReadParse(*name);
&jcode::convert(*name,'sjis');
print "$name";

としたのですが、まだ文字化けします。sjisにしてもeucにしても同じ結果です。
どうすればよいでしょうか。jcode.plが存在するディレクトリは確認しました。
0829デフォルトの名無しさん2006/12/16(土) 22:37:14
>>828

>>1 を読んで、WebProg板へどうぞ。
ちなみに cgi-lib.pl も jcode.pl も、もう古いです。入門書を変えましょう。
08308202006/12/16(土) 22:39:08
>>825
何となく、数値評価だとdoubleとかintが面倒な気がして文字列から。
現行の5.8.8あたりならまだしも5.6とかになると、ちょっと迷わない?
(一応 5.6.0でも pack('I',$ref) だとdouble評価を経由しないけど)
0831デフォルトの名無しさん2006/12/17(日) 04:18:03
変数$iがオーバーフローしたかどうかってどうやって判断するんですか?
0832デフォルトの名無しさん2006/12/17(日) 17:21:31
perl -e "$i= 2; while ($i > 0) {$i **= 2; print $i, qq{\n};last if $i eq '1.#INF'}"
0833デフォルトの名無しさん2006/12/18(月) 00:49:22
>>826
caller()
0834デフォルトの名無しさん2006/12/18(月) 02:42:35
perl -e '$_="000aaa111aaa222";/(\d{3})/;print "$1\n"'
これで表示を
222
とするにはどうすればいいでしょうか?
0835デフォルトの名無しさん2006/12/18(月) 02:59:58
>>834
ちゃんと基準を日本語で言ってくれないと意味違うの答えが複数ある。
文字列の一番最後なのか三番目なのか。$1に入れないといけないのか取り出せればいいのか。

とりあえずそのデータに対して動けばいいなら/(\d{3})$/とでもしとけ
0836デフォルトの名無しさん2006/12/18(月) 03:25:33
>>835
最後のものにマッチさせて、それを取り出したいってことです。
0837デフォルトの名無しさん2006/12/18(月) 03:27:13
perl -e '$_="000aaa111aaa222";@nums=/(\d{3})/g;print pop @nums'
こういう動作を一度にやりたいです。
0838デフォルトの名無しさん2006/12/18(月) 03:50:58
perl -e '$_="000aaa111aaa222";/.*(\d{3})/;print "$1\n"'
0839デフォルトの名無しさん2006/12/18(月) 08:19:06
>>837
perl -le 'print + ( split /aaa/, "000aaa111aaa222")[0] '
perl -le 'print + ( "000aaa111aaa222" =~ /(\d{3})/ )'
perl -le 'print + ( unpack "A3", "000aaa111aaa222" ) '
perl -le 'print + ( substr "000aaa111aaa222" , 0, 3 )'
0840デフォルトの名無しさん2006/12/18(月) 09:37:48
>>839
つ perldoc -f pop
0841デフォルトの名無しさん2006/12/18(月) 11:14:25
リストファイルからの検索方法に付いて

例えば変換対象の内容をリストファイルと照らし合わせ
リストファイルの内容と一致した場合にファイルへ出力るすには
どうしたら良いでしょうか?

例えばリストファイルが
aaa
bbb
ccc
として、変換対象のファイルが
aaa test1
abc test2
bbb test3
だった場合は

aaa test1とbbb test3の抽出をしたいです。

openや関数を使ってみたけどうまくいかないので誰か教えてください。
0842デフォルトの名無しさん2006/12/18(月) 11:34:56
リストを存在確認用の連想配列に入れて
対象を1行ずつsplitして
0番目が連想配列に存在したら吐き出す
0843デフォルトの名無しさん2006/12/18(月) 12:02:34
素で shift と間違えたorz...
>>837 訂正だ。
perl -le 'print + ( split /aaa/, "000aaa111aaa222")[-1] '
perl -le 'print + ( "000aaa111aaa222" =~ /.*(\d{3})$/ )'
perl -le 'print + ( unpack "A3" x 5, "000aaa111aaa222" )[-1] '
perl -le 'print + ( unpack "@*X3A3", "000aaa111aaa222" ) '
perl -le 'print + ( substr "000aaa111aaa222" , -3 )'
0844デフォルトの名無しさん2006/12/18(月) 12:19:13
>>843 みたいに + を誤爆回避の為に ( ) に付けるとき、 + と ( ) の間を空けられると、
func + (123) で func の返り値と123を加算してるのか、それとも func を 123 で呼び出してるのか
一瞬迷うのは僕だけですか><
0845デフォルトの名無しさん2006/12/18(月) 13:51:07
参考書を買って、参考書通りのに書いたのですが19行目でエラーが・・・
HTMLファイルからフォームで送られたデータを表示させるCGIです

require './cgi-lib.pl';
&ReadParse;

print <<'EOD1';
Content-type:text/html

<html>〜省略〜<table border=1>
EOD1

print "<tr><td>会社/自宅</td><td>$in{'addr'}</td></tr>\n";
〜FORMからのデータ表示繰り返し〜
print "<tr><td>メール配信</td><td>$in{'mailreq'}</td></tr>\n";

print <<'EOD2'; ←19行目。ここでエラーが出てる
</table><form action="register.cgi"><input type=submit value="登 録"></form></center></body></html>
EOD2

二回目の「print <<」を止めてprint文にすると上手くいくのですが、「print <<」が二回使えないという記述がないですし
参考書が間違ってるということにもなります。 すいませんが何が駄目なのか教えて頂けないでしょうか
0846デフォルトの名無しさん2006/12/18(月) 13:53:41
>>845
とりあえずエラー文を見せるんだ
0847デフォルトの名無しさん2006/12/18(月) 14:01:57
>>846
「絶対できる!自宅PCでCGIの実行環境を構築」というHPを参考に自分のPCでCGIを試せる様にしてます
でコマンドプロンプトで実行してみると下記のエラー文がでます。翻訳サイトで見ても意味が分りませんでした

D:\cgi>perl entry.cgi
Can't find string terminator "EOD2" anywhere before EOF at entry.cgi line 19.
0848デフォルトの名無しさん2006/12/18(月) 14:04:31
ヒアドキュメントの識別子の後ろには改行必須
0849デフォルトの名無しさん2006/12/18(月) 14:10:27
すいません。文を短くするために書き込みの際に改行を少しいじりました
実際は全部に改行を入れています。問題の部分を正確にせずすいませんでした

print <<'EOD2';
</table>
<form action="register.cgi">
<input type=submit value="登 録">
</form>
</center>
</body>
</html>
EOD2
0850デフォルトの名無しさん2006/12/18(月) 14:17:35
>>848
あ、わかりました。識別子のことをよく理解してなかったみたいです
EOD2の後に改行を入れろ ということですね
ありがとうございます
0851デフォルトの名無しさん2006/12/18(月) 16:51:46
正規表現で使った変数$1を削除することは出来ますか?
undef $1;としてみたんですが動きません……
0852デフォルトの名無しさん2006/12/18(月) 16:57:08
削除する理由は?
0853デフォルトの名無しさん2006/12/18(月) 17:00:25
できるかできないかを答えてくださると嬉しいです。
できれば質問に質問を返すのは控えてください。
0854デフォルトの名無しさん2006/12/18(月) 17:04:09
なにこれ
0855デフォルトの名無しさん2006/12/18(月) 17:06:05
>>853
おまえには出来ない。
終了。
0856デフォルトの名無しさん2006/12/18(月) 17:11:46
たまにいるんだよな、こういうの・・・
どんな脳みそしてんだかさっぱりわかんねw
0857デフォルトの名無しさん2006/12/18(月) 17:16:41
>>855
人の属性について訊いているのではなく、Perlのできる・できないを訊いているのです。

もしかして、回答する知識がないのにしゃしゃり出ているのですか?
0858デフォルトの名無しさん2006/12/18(月) 17:19:32
>>856
同意ですね。
質問に質問を返す意味がさっぱりわかりません。
そして、その当然の「おかしさ」を指摘されてヒスを起こすのも更にわかりませんよね。
(回答者は理不尽に振る舞ってもいい、その理不尽を質問者は指摘せず享受せよ、
とでも勘違いしているのかもしれませんね。
でも回答者ですらないのですから、その発想は二重にナンセンスというべきでしょう)
0859デフォルトの名無しさん2006/12/18(月) 17:24:27
>>853>>857>>858
頭悪すぎるみたいだから説明してやる
>>856はおまえに言ってんだよ
質問する=教えを請う
質問者が理不尽なのに答える義理は無い
しね                                                    でおk?
0860デフォルトの名無しさん2006/12/18(月) 17:31:07
>>859
> >>856はおまえに言ってんだよ
でしょうねえ。
(それがわかっているから、色々と言葉を乗っけて
「それに該当するのはあっちだよ」と教えてあげているわけです)。

> 質問者が理不尽なのに
まったく理不尽ではないですね。どう理不尽だと思い込んでいるのでしょうか?
質問に質問を返してきた人間に「質問に質問を返されては困る」旨を伝えたことですか?
でも、質問に質問を返してきた人間は「回答者」ではないですから、
「質問者として回答者にどういう態度をとるべきか」というテーマで仮にあなたが
粘着したいのだとしても、>>852と>>853の関係にはまったく当てはまっていません。
なぜならこの2つのレスは、質問者と回答者の関係ではないからです。
0861デフォルトの名無しさん2006/12/18(月) 17:38:11
イタイ人が出てきちゃった。スルーで。
0862デフォルトの名無しさん2006/12/18(月) 17:40:25
そうですね、イタイ人はスルーするのが良いと思います。
今回はちょっと時間があったので、どこがイタイのか丁寧に教えてあげましたが、
こんなことをする義理は無いですからねえ。
0863デフォルトの名無しさん2006/12/18(月) 17:42:12
ここには質問者も回答者もいません。みんな平等です。
さようなら。
0864デフォルトの名無しさん2006/12/18(月) 17:42:46
なにしに来たのかわからんなぁ。

最初に答えた人も、$1を削除する以外の方法を提案するためだろうし
機能についてききたいだけならperldocで十分だし。
0865デフォルトの名無しさん2006/12/18(月) 17:43:40
>>859さん、ここではみんな平等だそうですよ。
質問者の態度ばかり注文つけるのはおかしいようです。次から気をつけて下さい。
0866デフォルトの名無しさん2006/12/18(月) 17:49:44
>>864
一連の「回答者でもないのに質問者に尊大な態度を取る人」がそんな感じですね。
回答するだけなら「できる・できない」で十分なのに、
その何倍もの文章を何のために書きに来たのかが「わからんなぁ」です。

答を知らない人=回答者になりようもない人、が、あたかも回答者候補であるかのように
装って「ただ尊大な態度を取りにきた」なら納得ですが。
0867デフォルトの名無しさん2006/12/18(月) 17:53:08
正解はperlvar読め。

$<digits>
Contains the subpattern from the corresponding set of capturing
parentheses from the last pattern match, not counting patterns
matched in nested blocks that have been exited already.
(Mnemonic: like \digits.) These variables are all read-only
and dynamically scoped to the current BLOCK.

読み取り専用なので値は(パターンマッチの副作用以外では)勝手に変えられない。
当然undefで未定義値を設定することもできない。

無理にやろうとすると

Can't modify constant item in scalar assignment at ほげほげ

というエラーになるはずなので、エラーメッセージをperldiagで調べてもよい。
0868デフォルトの名無しさん2006/12/18(月) 17:54:46
>>867
どうもありがとうございます。
こんなに丁寧に教えて下さって恐縮です。
これを足場に、他にも頑張って色々調べてみますね。
0869デフォルトの名無しさん2006/12/18(月) 17:57:16
いるんだよなぁ。はっきりレス番指して言われないと自分だと認めない人が。
0870デフォルトの名無しさん2006/12/18(月) 17:58:16
>>865
全くおかしくない
礼儀のないってない奴に答える義務はない
ここに居る人間は回答者ではなく、回答者になる可能性のある人たち
あるいは質問者になる可能性のある人たち
>できれば質問に質問を返すのは控えてください。
などという一文は回答してくれるかもしれない人に対して横柄に過ぎる
平等ではない
建前であっても立場をわきまえろ

>>867
答えるべきじゃないだろ・・・常識的に考えて・・・
0871デフォルトの名無しさん2006/12/18(月) 18:07:02
>>869
レス番の有無はあまり関係ないと思いますよ。
「誰にともなく言っているかのような」気持ちの悪い書き方を選んでいるレスには、
今回のように「ああ、あの人はそうですよね」という書き方で「本当にそれが当てはまる人」
のことに触れる――つまり「気持ち悪さが当人に跳ね返る」因果応報を狙うわけですが
(レス番を書かない人は往々にして、こちらが「対象をきっちりわかってあげる」と
「なんだ、自覚あるんだw」とか「被害妄想乙」という風に、スレをベトベトさせる方向に
頑張り出すので、スレのためにも「お前に言ってるんだよ」と言わせるよう「焙り出す」必要が
あるわけです)
もしレス番を指定してストレートに何かを言ってきたとしても、同じ内容を
「いいえ、それは○○のほうですね」というフォーマットで返すだけのことなわけですから、
認めるとか認めないとか、そういうのにはまるで関わってこないのではないでしょうか。
0872デフォルトの名無しさん2006/12/18(月) 18:09:52
一応の回答は得られて満足しているならそれでもいいのだが、
できないということを知っただけではやりたかったことを
実現する助けにはならない。852の言うことに耳を貸して
こういうことがやりたいんだけどというのを説明していれば
より的確な助言が得られたかもしれないんだけどね。
0873デフォルトの名無しさん2006/12/18(月) 18:10:36
いるよね、自分がキモイって気づかないキモイ人・・・
0874デフォルトの名無しさん2006/12/18(月) 18:10:49
>>870
> 回答者になる可能性のある人たち
すべてが終わってから「可能性があったのだ」と言い張るのは実に便利だから
そのやり方に飛びつく気持ちはわかりますが、
「質問に質問を返す人」や、「質問に質問を返すのはいかがか」という意思表示を
自分が侮辱されたように思ってしまう「自分を質問に質問を返す人の同類に位置づけていて」
且つ「正論を言われるとムカついちゃう、ちょっと変な人」に、その可能性があるとは
思えませんね。そもそもちっとも横柄ではありませんし。
0875デフォルトの名無しさん2006/12/18(月) 18:12:00
>>873
そういう人って困りますよね。
0876デフォルトの名無しさん2006/12/18(月) 18:19:32
粘着しちゃったよ。だからスルーしろと
0877デフォルトの名無しさん2006/12/18(月) 18:24:28
ここでレスしないと負けた気になるのが悔しいが
常識のある一社会人としてはこれ以上荒しにつきあうわけにもいかない
続きはVIPで。
0878VIPPER2006/12/18(月) 18:31:14
>>質問者
質問に質問で返されてブチ切れる理由が分かりません。
>>864,872のレスにもあるように、それは解決への良い手段だと思いますよ。
0879デフォルトの名無しさん2006/12/18(月) 18:38:41
自分の質問への回答だけが書かれるわけじゃないんだから、
自分の質問への回答だけが欲しいんなら他のはスルーしろよ。
0880デフォルトの名無しさん2006/12/18(月) 18:40:12
もうこの件は飽きた。新しい質問マダー?
0881デフォルトの名無しさん2006/12/18(月) 19:00:05
もまえらどうでもいいことでヒートアップしすぎもちつけ!
スレの主旨と違う議論は他でやるなりスルーしろ。
0882デフォルトの名無しさん2006/12/18(月) 19:30:07
>>878
誰もブチ切れちゃいないと思うぞ
0883デフォルトの名無しさん2006/12/18(月) 20:12:37
質問文に対し質問文で答えるとテスト0点なの知ってたか?マヌケ

ってのを延々と慇懃無礼に続けてたわけね。
単純に興味があったから何でそんなことするのと聞いただけだろうに。
0884デフォルトの名無しさん2006/12/18(月) 20:17:53
興味じゃなくてアドバイスの1歩目じゃね?
0885デフォルトの名無しさん2006/12/18(月) 20:52:53
バカ相手すんのはいい加減疲れるね
質問の意味がわかれば、モアベターなアドバイスも出来るだろう?
まあ質問する側として礼儀もわきまえないような他力本願のカスに教えることなんぞない
0886デフォルトの名無しさん2006/12/18(月) 21:08:47
換気換気

>>834を見て思ったのだけれど、
マッチ対象がもっと複雑なパターンだった場合は良い方法ある?

例えば
HOGE1a2bFUGA3c4d5!PIYO
こんな文字列があったときに、一番最後の
(?:[[:digit:]][[:alpha:]])+
な部分(上の文字列では3c4d)を取り出したいと言う場合とか。
.*で食わせるだけだと3cが引っかからなくなるし、後の部分を
[^[:digit:]]*$
のようにそれ以外の文字に限定することもできない気がする。

/gでマッチしてから最後を取り出すしかないかな
0887デフォルトの名無しさん2006/12/18(月) 21:39:02
>>886
こんなのはいかが?
/((?:[0-9][a-zA-Z])+)(?!.*[0-9][a-zA-Z])/
0888デフォルトの名無しさん2006/12/18(月) 22:15:03
>>887
おお、なるほど
否定先読みでそれ以降にそのパターンを含んでいなければ、とするのね。
これなら確かに大抵のパターンは/($regex)(?!.*$regex)/でできますね。
実際に書くときに使うかどうかは別問題だけれど勉強になりました。�d
08898222006/12/19(火) 01:25:09
#規制くらってました・・・

>>833
おお!こんなものがあったのですか!ありがとうございます

>>827
>なければ書いたらいいじゃない。
呼び元のサブルーチン名or現在のサブルーチン名を
取得する方法ってあるのでしょうか
もしありましたら教えてくださいm(_ _)m
0890デフォルトの名無しさん2006/12/19(火) 01:42:12
>>889
> 呼び元のサブルーチン名or現在のサブルーチン名を
> 取得する方法ってあるのでしょうか
(゚д゚)

だからcallerだって
sub __func__() { return +(caller(1))[3] }
08918222006/12/19(火) 02:26:24
callerに引数を与えると、与えないとき以上の情報が得られるのですね
教えてくださいましてありがとうございました

自分乙 o...rz
0892デフォルトの名無しさん2006/12/19(火) 02:55:51
perlで条件判断でnorやnandを使う時は
norの時は!( $boolean1 || $boolean2 )、
nandの時は!( $boolean1 && $boolean2 )と書かないといけないのでしょうか。
0893デフォルトの名無しさん2006/12/19(火) 03:07:35
mainパッケージにあるグローバル変数を
修飾なしで他のファイルで使う方法はありませんか?

#コード
ファイル1 ourtest.pl

#start
use strict;
use b1;
package a;
our $x;
$x = 10;
#package b;
#print $x, "\n"; # パッケージaの$x
#同一ファイル内なら表示可能
b1::printit();
#end

ファイル2 b1.pm #実行時エラー
#start
package b1;
use strict;

sub printit {
print $x, "\n"; # パッケージaの$x
# print $main::x , "\n";なら表示可能

}
1;
#end
0894デフォルトの名無しさん2006/12/19(火) 03:10:50
すいません、間違えました。
メインパッケージの変数を他ファイルで使いたいのです
#コード
ファイル1 ourtest.pl

#start
use strict;
use b1;
our $x;
$x = 10;
#package b;
#print $x, "\n"; # パッケージmainの$x
#同一ファイル内なら表示可能
b1::printit();
#end

ファイル2 b1.pm #実行時エラー
#start
package b1;
use strict;

sub printit {
print $x, "\n"; #mainパッケージの$xを表示したい
# print $main::x , "\n";なら表示可能

}
1;
#end

0895デフォルトの名無しさん2006/12/19(火) 03:27:17
>>892
ド・モルガンの法則って知ってる?

!( $boolean1 || $boolean2 )は( !$boolean1 && !$boolean2 )と等価
!( $boolean1 && $boolean2 )は( !$boolean1 || !$boolean2 )と等価

まあ、「NOR演算子」や「NAND演算子」は用意されてない。
if文に関しての話ならばunlessを使うこともできる。
unless ( $boolean1 || $boolean2 )
unless ( $boolean1 && $boolean2 )

>>893-894
望む効果範囲はどこまでなの?
真のグローバル変数(=mainに細工をすると全てのパッケージから見える)にするのか
特定のモジュール(のour変数。以下同)とmainの変数を共有したいのか
特定のモジュールの特定の変数のみを共有したいのか

それだけ聞いた限りでは凄く変なことをしようとしているように見えるので、
もう一歩引いて何を目的としてそういうことをしようとしてるのか
説明したほうが良い答えが返ってくるかもしれないよ
08968932006/12/19(火) 03:38:55
>真のグローバル変数(=mainに細工をすると全てのパッケージから見える)にするのか
まさにこれです。
mainパッケージの変数を各種モジュールから自由に読み書きしたいのです。
>それだけ聞いた限りでは凄く変なことをしようとしているように見えるので、
>もう一歩引いて何を目的としてそういうことをしようとしてるのか
>説明したほうが良い答えが返ってくるかもしれないよ
元々一つの巨大なファイルのプログラムを分割したいと考えています。
module内からmainパッケージの変数にアクセスするときはmain::として書きたいのですが
元々のファイルが膨大な量なので、全てを変更する事は避けたいです。
08978932006/12/19(火) 03:43:44
シンボルテーブルをモジュールごとにインポートすれば
mainパッケージの変数を表示できるようになったのですが
簡単な方法が知りたいです。

#ファイル1
use strict;
use b1;

our $x = 10;
b1::printit();

#ファイル2
package b1;
use strict;

*x = *::x;
our $x;
sub printit {
print $x, "\n";
}
1;
0898デフォルトの名無しさん2006/12/19(火) 06:45:37
>>896
。oO(それモジュールにする意味あるのかな…) まあそれは置いておいて

とりあえず、Perlには元来グローバル変数は存在しない。
一箇所に仕掛けをしただけでグローバル変数を作るのは、
Perlはdirty hackが色々できる言語だから不可能とまでは言わないが、
かなり邪道な方法になると思う。
擬似グローバル変数を持つ専用のモジュールを作って、
必要な全てのモジュールからimportするってところでどうよ。
## GlobalVariables.pm
package GlobalVariables;
use base Exporter;
our @EXPORT = qw($x);
1;

## main.pl
use GlobalVariables;
use b1;
$x = 10;
b1::printit();

## b1.pm
package b1;
use GlobalVariables;
sub printit { print $x, "\n"; }
1;

こんなモジュールもあった。
http://search.cpan.org/~polettix/vars-global-v0.0.1/lib/vars/global.pm
0899デフォルトの名無しさん2006/12/19(火) 10:49:59
デバイスファイルなど、読み書きするためのオープン方法がよくわからないです。
0900デフォルトの名無しさん2006/12/19(火) 11:14:40
で?っていう
0901デフォルトの名無しさん2006/12/19(火) 11:15:09
E*trade証券のポートフォリオにperlで証券番号を登録するスクリプトを作りました。
しかし、該当ページの tmp_web_sec_code に 証券コードを代入し、一件づつしか
登録できない。(どうやっていいのか良くわからない)

このページは、画面を見る限りでは、
10件づつ登録できるはずなんだけど、
どうしたらよいのかな?

全銘柄の約4000件登録するのに2時間30分かかりました。
並列処理にして、半分以下の時間に短縮できたけど、効率化できそうなので。。。

perlで使用しているモジュール
use Crypt::SSLeay;
use LWP::UserAgent;
use WWW::Mechanize;

以下の部分を効率化できる?
$class->submit_form(
form_name=> 'FORM',
fields=>{
'tmp_web_sec_code' => $stock_number,
},
button=> 'ACT_insertPfList',
);
0902デフォルトの名無しさん2006/12/19(火) 11:31:55
>>901
>>1
0903デフォルトの名無しさん2006/12/19(火) 11:42:27
>>901
それはその何とか証券側のインタフェース仕様がわからないという話なので、こっち側の
プログラムを何で書いたかにはよらない話だからスレ違い。
09048992006/12/19(火) 11:42:35
>>900
open( FH, "+</dev/ttyS0" ); を使え、 とか
そういう回答を期待してんだよボケ。市ね。
0905デフォルトの名無しさん2006/12/19(火) 11:58:41
またか・・・
学生は冬休みか。
0906デフォルトの名無しさん2006/12/19(火) 12:43:00
>>895
どうも。
演算子はないんすね。
そっちの法則の方も学校でやったような気はするんですが身についてなかったです。
ありがとうございました。
0907デフォルトの名無しさん2006/12/19(火) 14:36:18
今の時期に休みなのは、あったとしてもせいぜい北海道の小中学生くらいじゃないかしら?
0908デフォルトの名無しさん2006/12/19(火) 17:24:27
MIME::Parserを使って、メールの本文と添付ファイルを取得するプログラムをPERLで作っているのですが、
ソフトバンクの3D携帯からのメールが来た時、

$MTBody = unmime( $$mail->parts(0)->bodyhandle->as_string )

の所で、

Can't call method "as_string" on an undefined value at 〜

なエラーが出ます。解決方法を教えてください。宜しくお願いします。
レス数が900を超えています。1000を超えると表示できなくなるよ。