Perlについての質問箱 ..
413:デフォルトの名無しさん
08/08/30 00:52:02
>>411
どこのサブルーチンの中にサブルーチンが書いてあるの?
414:デフォルトの名無しさん
08/08/30 00:56:15
>>413
いやだから、
自分でこれから、そういうコードを書いても
いいのかなあ?って。
415:デフォルトの名無しさん
08/08/30 00:59:19
fuga.txtがあるかどうかを調べ、もしあるならあると言い、なければないと言い、ない場合はわざわざ作成してあげて、
作成したと言い、ある場合は、ファイルサイズを調べてレポートするプログラム。↓
binmode STDIN => ":encoding(cp932)";
binmode STDOUT => ":encoding(cp932)";
binmode STDERR => ":encoding(cp932)";
use Encode;
use feature qw( :5.10 );
system q|cls|;
#----------------------------------
my $bar = 'fuga.txt';
my $a=&file;
sub file{
if (-f $bar) {
print "ファイル".$bar."が存在します。\n";
return 1;
}
else {
print"ファイル". $bar."が存在しません。\n";
return 0;
}
}
given($a){
when (1){
my $file_size;
$file_size = (stat'./fuga.txt')[7];
say $bar."のファイルサイズは、".$file_size."バイトです"; }
when (0){
open FH, ">fuga.txt";
say "ファイル". $bar."を作成しました。";
}
}
416:デフォルトの名無しさん
08/08/30 01:01:09
use utf8;
use open IO => ":encoding(cp932)";
↑先頭の2行にこれを忘れていた。入れてください。
417:デフォルトの名無しさん
08/08/30 01:08:23
>>415
-f してから open するまでの間に誰かが fuga.txt を作っていた場合、
何もかも台無しになるという点で >>403 より性質が悪化してるんだが
それはいいのか。
418:デフォルトの名無しさん
08/08/30 01:08:30
ねーねーこれ↓って、実行されちゃうよね?
&で明示的に実行を指示したときだけ
サブルーチンを実行したいんだけど、
これだと、処理の流れがそこまできたときに、
なしくずし的に実行されてしまうんだけど、
それって正常な動作なの?
sub a;
{
print "a";
}
419:デフォルトの名無しさん
08/08/30 01:10:23
ようは、&aってしたときだけ、そのサブルーチンが実行されて
ほしいのに、ソースコードの一番下にそのサブルーチンの定義部を
置いておくと、そこまできたときに、勝手に実行されてしまうのが
困るといっているんです。
420:デフォルトの名無しさん
08/08/30 01:14:20
>>418-419
は自己解決したごめん
もう一回ためしたら実行されなかった。
;(セミコロン)が余計に入っていた。
421:デフォルトの名無しさん
08/08/30 03:14:54
mapの場合はゆっくり出力するってできないのかな?
foreachの場合は、sleepかませて
1行づつゆっくり出力するってできるけど、
mapだと、一度に一気に配列に全部入ってしまうから、
一個づつゆっくり出すとか無理だよね?
422:デフォルトの名無しさん
08/08/30 03:16:31
久しぶりに来たけど激しくゆとり臭くなったな
423:デフォルトの名無しさん
08/08/30 03:17:30
map {print $_, $/; sleep 1;} 0..100;
なにが不満なの?
424:デフォルトの名無しさん
08/08/30 03:19:54
sleepかませ
425:デフォルトの名無しさん
08/08/30 03:24:09
system q|cls|;
map {
system q|cls|;
print $_, $/;
# sleep 1;
}
0..100000;
こりゃーすげー
426:デフォルトの名無しさん
08/08/30 06:55:02
>>422
明日まで我慢。
あさってには居なくなるから。
427:デフォルトの名無しさん
08/08/30 14:38:11
mod_perl2導入の途中でmod_perl.soを配置するApache2\modulesの指定をしくじりました
mod_perl.soが配置されないままmod_perl2がインストールされてしまいやり直そうにも
"Package 'mod_perl' is already installed."と表示されてやり直しも利きません
どうにか導入する方法は無いでしょうか?
428:デフォルトの名無しさん
08/08/30 17:03:51
my $a;
ってファイルの上のほうで宣言して、
5,000行下でも、その$aにアクセスできるよね。
でもこれって「グローバル変数」とは呼ばないんだよね。
429:デフォルトの名無しさん
08/08/30 17:05:45
a.plと
b.plとあって、
requireで呼び出して使う状況で、
両方とも、$aって変数をつかってても、
myでプライベート化してれば、問題ないのかな?
逆に、myを使ってないで
グローバル変数として使っていたら、
a.plとb.plで同じ$aがあったら、
それは同じ変数として扱われてしまうの?
つまり、複数人で作業するときに、どつぼにはまる
可能性が高い?
430:デフォルトの名無しさん
08/08/30 17:26:47
参考までにどうぞ。
URLリンク(www.rwds.net)
URLリンク(d.hatena.ne.jp)
431:デフォルトの名無しさん
08/08/30 19:39:18
>>427
よく知らんけど mod_perl 無しの状態にロールバックしてやり直せない状態だとしたら、初手から構築し直すのが安全じゃないかな。
432:デフォルトの名無しさん
08/08/30 22:56:41
a.plで、
require b.pl
print "$a";
にして、b.plで、
my $a=1;
にしたら、a.plを実行したときに、
1って表示されないんだけど、
別ファイルでrequireされることがわかっているときは、
変数はmy化したらだめで、グローバル変数にしておかないとだめなの?
433:デフォルトの名無しさん
08/08/30 22:58:11
b.plがrequireされるファイルで、その中でなんかの処理をして、
その処理の結果をa.plに渡す、ってときに、通常
どんな手段で渡しているのかなー?って。
とりあえず、その変数をmy化したら渡せないってのはわかった。
グローバル変数だったら渡せるというのもわかったが、
それって普通の方法なのかな?
434:デフォルトの名無しさん
08/08/31 02:51:00
length q eq ge and print chr ord q each le
このコードの意味わかる?
漏れはわからない。
435:デフォルトの名無しさん
08/08/31 03:11:47
B::Deparseに食わせろ
436:デフォルトの名無しさん
08/08/31 03:59:39
>>434
qがquote-like operatorだということに注意すればそんなに難しくはない。
437:デフォルトの名無しさん
08/08/31 07:42:52
>432-433
2000〜3000円くらいの安い入門書を買うことをすすめる。
サブルーチンの項目あたりに書いてるはず。
ぶっちゃけ、Perlというか、
プログラミングにおける基本的な考え方の1つなので、そこから勉強するべき。
あと>430は無視なのかい?
438:デフォルトの名無しさん
08/08/31 11:38:11
http.confにLoadModule perl_module modules/mod_perl.soって書くと起動出来ない…
これはバージョンの相性が良くないってことなんでしょうか。Apache自体が起動しないです
439:デフォルトの名無しさん
08/08/31 13:26:43
>>438
ログにエラーが出ていませんか?
出ていればそれを手がかりに調べてください。
440:デフォルトの名無しさん
08/08/31 14:46:33
>>438
どうにか解決しました
どうもです
441:デフォルトの名無しさん
08/08/31 15:28:31
サブルーチンの説明は書いてあっても、
requireとからめた使い方が書いてないんだよっ!
で、requireでインクルード?したファイルの中の
変数を使いたいときって、どうすればいいの?
442:デフォルトの名無しさん
08/08/31 15:31:56
a.plがあったとして、そのa.plの中で、一生懸命に計算なり
処理なりをするよね。そんで、なんかの結果が出てきて、
それを$aに代入したとする。
そんで、b.plを作って、b.plの中で、
require a.pl
ってやって、さっきの$aの結果を利用しようとしたときに、
a.plの中で、
my $a
ってmy化されていたら、b.plから利用できないじゃん。
もちろん、ourでグローバル化しておけば利用できるのは知ってるけど、
やたらとグローバル変数を使うのはバグの元だからやめろって教科書に書いてあるし。
つまり、a.plの中でサブルーチンを作って、
return渡しをすればいいのか?
443:デフォルトの名無しさん
08/08/31 15:37:43
>>441
答えは”モジュール”にあると思う
444:デフォルトの名無しさん
08/08/31 16:26:09
length q pop and print chr oct oct ord q local
このコードの意味がわからん
445:デフォルトの名無しさん
08/08/31 16:37:55
>>444
きみ、Perl に向いてない。
446:デフォルトの名無しさん
08/08/31 17:06:15
use warnings;
use strict;
use diagnostics;
print "a"
↑これでなんのエラーもでないんだが、
もしかして、ワンライナーの場合は
セミコロンは必須ではないのか?
447:デフォルトの名無しさん
08/08/31 17:07:47
つまりセミコロンがついてないのに
なんで実行できてしまうんかと。
448:デフォルトの名無しさん
08/08/31 17:46:06
>>446
ありがちっちゃありがちだけどもな、
Perl の文法をいい加減に覚えていると、そういう疑問を持ってしまう。
perl は文の区切りとして ; を要求するのであって、
文の終端として、ではないのだ。
ブロック内の最後の行で ; を省略できるのも、
ブロック生成子としての {} が文を区切ってしまうためなのだ。
基礎からやり直しつつ1年ほどROMれ。
449:デフォルトの名無しさん
08/08/31 18:57:27
>442
一番最後の行で答えが出てるじゃないか。
>444
まさにPerlの美学であると同時にデメリットだよなあ。
自分なら適当に区切るか括弧をつける。
>448
でもまあ、付けるけどな、俺。
450:448
08/08/31 19:33:07
>>449
>>444 にあるコードは読み手を混乱させるのが目的なので、あえてそのように書いているのはお分かりかと思います。従って可読性を上げては意味がありません。
ただ今回のコードはまったくややこしくない、いわば子供だましの類なので、読めないとちょっとアレなのは確かですが。
>>448
もちろんそれがよいでしょう。理由は…、言うまでもありませんな。
451:デフォルトの名無しさん
08/08/31 19:51:31
>>444
ppencode の出力の一部じゃないのか? ppencode が何者かはぐぐればわかる。
452:デフォルトの名無しさん
08/08/31 20:28:16
print q pop
これでoって出るのがすげーわらえる
453:デフォルトの名無しさん
08/08/31 20:53:40
はいはいわろすわろす
454:デフォルトの名無しさん
08/08/31 21:45:17
>>444って要するに、"q"の意味がわかれば簡単だよね?
455:デフォルトの名無しさん
08/08/31 21:47:55
>>444
それぞれ一つ一つの意味は分かっても、こうやって並ばれると分からないです><
456:デフォルトの名無しさん
08/08/31 21:54:00
残念ながらそれは、知らないと ハァ? なレベルの知識だ。
457:デフォルトの名無しさん
08/08/31 22:08:19
ハァ?
458:デフォルトの名無しさん
08/08/31 23:02:46
今日からPerlを始めたいと思ってます。
Active Perlというものは今でも無料で入手できるのでしょうか。。。
Windowsで使いたいのです。
459:デフォルトの名無しさん
08/08/31 23:11:26
なぜ実際に自分で試そうとしない?
460:デフォルトの名無しさん
08/08/31 23:11:48
>>458
ActivePerl そのものは現在も無料です。楽しんでね。
461:デフォルトの名無しさん
08/08/31 23:40:46
なるほど、ここで生成されたものか
ppencode - JavaScript demo
URLリンク(namazu.org)
462:デフォルトの名無しさん
08/09/01 00:49:55
>>458
ActivePerlは無料です。
でもダウンロードのリンクは
IQ150以上でないと
探せないようになっております。
463:デフォルトの名無しさん
08/09/01 00:51:06
ちなみに最新バージョンは
5.10です。
ごーてんいち、でなくて
ごーてんじゅう、です。
464:デフォルトの名無しさん
08/09/01 00:51:58
ダウンロードしてきたファイルは、
msiファイルを右クリで、インストールを
選べばインストールできます。
ダブクリではインストできないこともあります。
465:デフォルトの名無しさん
08/09/01 00:52:45
ちなみに、VISUALPerlというものは
開発中止になった模様です。
466:デフォルトの名無しさん
08/09/01 01:59:27
レンタルサーバのLWPでhttpsなサイトにアクセスしようとしたら、
Protocol scheme 'https' is not supported (Crypt::SSLeay not installed)
と怒られました。
telnetやsshでログインできないサーバなのですが、httpsなサイトにアクセスできるように出来ないでしょうか?
467:デフォルトの名無しさん
08/09/01 02:03:33
できません
468:デフォルトの名無しさん
08/09/01 02:50:24
鯖缶にモヅル入れろと頼めば突っ込んでくれるとこもある
469:デフォルトの名無しさん
08/09/01 02:52:58
use Term::ANSIColor qw(:constants);
my @colors = qw(RED GREEN BLUE);
for (@colors) {
print $_, "$_", "\n";
}
みたいな事をやって、ループ内の動きが以下と等価になるようにしたいです。
print RED, 'RED', "\n";
print GREEN, 'GREEN', "\n";
print BLUE, 'BLUE', "\n";
現状はループ内の print の第一引数に文字列がそのままわたっているだけなので、
希望通りの動作をしませんが、希望通りに動かすにはどうしたら良いのでしょうか?
よろしくお願いします。
470:デフォルトの名無しさん
08/09/01 03:18:17
>>469
print eval($_), $_, "\n" for @{$Term::ANSIColor::EXPORT_TAGS{constants}};
471:デフォルトの名無しさん
08/09/01 03:23:24
>>470
なるほど、evalで文字列を評価してやれば良い訳ですね。
リファレンス当たりをごにょごにょするのかなーと漠然と思っていたのですが、
そういう考え方には至りませんでした。
ありがとうございます。
472:470
08/09/01 03:29:30
>>471
eval も一法というだけ。
@colors への代入時に解決してやる手もある。
というかそちらのほうが素直。
my @colors = RED, GREEN, BLUE;
473:デフォルトの名無しさん
08/09/01 03:41:11
>>472
はじめはそのような方法を考えてみたのですが、
代入時に評価してしまった場合、その後どうやって文字列として取得するかがわからず、
先ほどのようなコードになりました。
もしよろしければ、文字列として取得する方法も教えて頂けますか?
474:デフォルトの名無しさん
08/09/01 03:56:10
my @colors = qw(RED GREEN BLUE);
for (@colors) {
print $Term::ANSIColor::{$_}->($_), "\n";
}
475:デフォルトの名無しさん
08/09/01 04:00:33
my @colors = qw(RED GREEN BLUE);
for (@colors) {
no strict 'refs';
print $_->(), $_, "\n";
}
476:458
08/09/01 08:33:05
>>460 >>462
先ほど無事インストールし、[Hello World!!]を表示できました。
いろいろありがとうございました。。。 (´・ω・`)
477:466
08/09/01 10:50:02
>>467,468
サーバの管理者へインストールをお願いしてみます。
478:デフォルトの名無しさん
08/09/01 20:26:36
「1.pl」の内容
use feature qw( :5.10 );
sub a {
my $a=1;
return $a;
}
1;
------------------
「2.plの内容」
use feature qw( :5.10 );
require q|1.pl|;
say &a;
----------------------
これで、「2.pl」を実行すると、「1」と表示されるが、
本当にこれでいいのか?
つまり、1.plの変数の内容を、2.plで、requireで呼び出して使うとき、
サブルーチン渡しでいいのか?
それとも、モジュール渡しをするのが普通なのか?
our渡しは、できるけれども、教科書に「やるな」と書いてあるので
排除の方向で。
それとも、ほかの何かがあるのか?
479:デフォルトの名無しさん
08/09/01 20:27:24
1.plで変数があって、
それを
requireで、
2.plからその変数を利用したいときに、
どうやって変数を渡すのか、という
問題です。
480:デフォルトの名無しさん
08/09/01 20:38:24
q| | って書く頭わるいの前からいるけど同一人物だよな。
夏休みいつまでなの?
481:デフォルトの名無しさん
08/09/01 20:43:36
毎日がエブリデイなんじゃないかな。
482:デフォルトの名無しさん
08/09/01 21:56:53
>>476
おめでとさん。Perl の泥沼へようこそ。
泥んこ遊びは楽しいYO!
483:デフォルトの名無しさん
08/09/01 22:22:05
もうPerlなんてみたくもさわりたくもないと思いながら、早2年。
毎日のように#!/usr/bin/perl -wと書いています。
484:デフォルトの名無しさん
08/09/01 23:41:22
>>483
> 毎日のように#!/usr/bin/perl -wと書いています。
これを自分で書く奴は相当のバカ
485:デフォルトの名無しさん
08/09/02 00:32:56
晒しage
486:デフォルトの名無しさん
08/09/02 00:42:38
URLリンク(drop.io)
URLリンク(jbbs.livedoor.jp)
これおかしなプログラムとか組み込まれてませんか?
487:デフォルトの名無しさん
08/09/02 00:45:18
板違いです
488:デフォルトの名無しさん
08/09/02 01:21:12
ファイルをまたいだ引数の渡し方について
マジでおしえてくんないかなー?
requireでなくてuseを使うの?
489:デフォルトの名無しさん
08/09/02 01:44:08
うるせーよだまってろ
490:デフォルトの名無しさん
08/09/02 02:07:54
ここはひどいインターネッツですね
491:デフォルトの名無しさん
08/09/02 02:34:26
URLリンク(drop.io)
URLリンク(jbbs.livedoor.jp)
これおかしなPerlとか組み込まれてませんか?
Perlで組まれてるらしいでつ
492:デフォルトの名無しさん
08/09/02 02:37:29
板違いです
493:デフォルトの名無しさん
08/09/02 03:45:53
なんだ・・・解析できないのか・・・はぁ・・・
494:デフォルトの名無しさん
08/09/02 04:13:48
もしかして、パッケージを一致させればいいのか?
495:デフォルトの名無しさん
08/09/02 04:18:31
もしかして、モジュールとパッケージとrequireについて
調べればいいのか?
それで、読むべき教科書は
URLリンク(www.rfs.jp)
ここであってる?
496:デフォルトの名無しさん
08/09/02 05:21:19
>495
結論が出てるのに何が疑問なのかが分からない。
それと多分、誠意が足りてない。
497:デフォルトの名無しさん
08/09/02 08:07:27
>>496 を読んだ >>494
「なんだよ、あってるならあってるってとっとと言えばいいのに」
「誠意とか意味わかんないし関係ないじゃん」
「まあいいや。誰かも煽りはスルーって言ってたし。バカには言わせとけばいいんだ」
498:デフォルトの名無しさん
08/09/02 11:41:23
質問です。
my @aaa = ("A" , "B" , "C" , "D");
foreach(@aaa){
@aaaの中を一つ飛ばす。
printf("%s\n",$_);
}
とし、結果を
B
D
としたいのですが、どのようにしたら簡単に出来ますでしょうか。
for()で$iを途中インクリする方法を考えたけど、いまいち複雑になったので。
499:デフォルトの名無しさん
08/09/02 11:58:28
next;
500:デフォルトの名無しさん
08/09/02 12:05:45
splice
501:デフォルトの名無しさん
08/09/02 12:06:44
my @aaa = qw(A B C D);
for my $i (0 .. $#aaa) {
next if $i % 2 == 0;
print $aaa[$i], "\n";
}
502:デフォルトの名無しさん
08/09/02 12:10:17
ヒアドキュメント内でループ処理したいのですが
コンボボックスをループで動的に生成したいのです。
どうやってやればいいのですか
503:デフォルトの名無しさん
08/09/02 12:21:31
>>502
@{[ 任意の式 ]} を埋め込めばいいだろ。式としてdo BLOCKをつかえばおよそ何でも書ける。
Template Toolkitとか使った方が幸せになれそうだけどな。
504:デフォルトの名無しさん
08/09/02 12:29:08
mapでおk
505:デフォルトの名無しさん
08/09/02 14:53:09
リャマ本の133ページ(手元にあるのは11版です)の「8.5.1 優先順位の例」にある
このパターンは、文字列先頭にあるfredにマッチするか、あるいは末尾にあるbarにマッチします
の部分ですけれど、これって
このパターンは、文字列先頭にあるfredにマッチするか、あるいは末尾にあるbarneyにマッチします
の誤りじゃないんですか?オライリーのエラッタには載ってないみたいなんですが。
506:デフォルトの名無しさん
08/09/02 14:54:56
途中で送信してしまった…
/^fred|barney$/ だとそうなるような気がするんスが。
507:498
08/09/02 14:54:57
>>499-501
サンクス。
確認できますた。
508:デフォルトの名無しさん
08/09/02 15:03:51
>>505
最初/^foo|bar$/ってなってたのを書き直したんだろうなw
509:デフォルトの名無しさん
08/09/02 16:05:42
>508
なんだか急に親近感がwww
510:デフォルトの名無しさん
08/09/02 17:04:03
そして11版まで行って誰も指摘してないのかよこれww
511:デフォルトの名無しさん
08/09/02 17:32:56
指摘しちゃだめだろjk
512:デフォルトの名無しさん
08/09/02 18:13:41
Perlを勉強する分には、Win上でActive Perlを使うのでも支障は無いでしょうか?
UNIX上とはかなり差があるような気がして…
513:デフォルトの名無しさん
08/09/02 18:17:08
Perl自体にWindowsもUNIXも組み込みも関係ない
514:デフォルトの名無しさん
08/09/02 20:11:06
>>512
コマンドプロンプトの操作性やパスの設定、文字コードを考えると、
Unix系のOSでperl使った方がましだと思う。
Cygwinでもいいんだけどさ。
515:デフォルトの名無しさん
08/09/02 20:33:34
>>512
perlを1ヶ月学んできづいたことは、
CPANからモジュールとってくる、ってときに、
WinのActivePerlだと、PPMっていうソフトで
新しいモジュールをインストールするんだけど、
そこのPPMのメニューにすでに登録されている
モジュールしかインストールできない。
厳密に言えば6段階くらい複雑な手順をふめば
PPMを使わないで手動でインストールできるらしいんだが
初心者にはおすすめできない。
つまり、CPANから○○をダウンロードして使え、だとか
言われたりしたときとか、あるいは自分でグーグルで検索して
よさそうなモジュールみつけたときでも、それをかんたんには
入れられないケースが発生することがある。
自分がはまってるのは、mp3を鳴らすなんとか、ってモジュールを
入れたいんだが、PPMにのってないので困っている。
516:デフォルトの名無しさん
08/09/02 20:35:12
2番目は、文字コードの問題。
DOSプロンプトで勉強するときに、必ず
use utf8;
use open IO => ":encoding(cp932)";
binmode STDIN => ":encoding(cp932)";
binmode STDOUT => ":encoding(cp932)";
binmode STDERR => ":encoding(cp932)"; # ※1
use Encode;
と書かないといけない。
517:デフォルトの名無しさん
08/09/02 21:08:44
>>512
coLinux+debian sidオススメ。
無駄にハイクオリティーなことをすると楽しい。
518:デフォルトの名無しさん
08/09/02 21:46:20
$file = 'C:/なんたら/かんたら.txt';
open my $fh, '<', encode("cp932", $file) or die $! ; # ※2
print <$fh>;
# 以上の内容は、日本語処理が解らない人でも、とりあえず日本語処理ができてしまう
# おまじないです。条件が異なる場合の対処方法は、ご自分で勉強して下さい。
# 【注】※1.の行を入れると、DOS窓への日本語出力は簡便になりますが、
# ソースファイル名に非ANSI文字が含まれる場合にdie 文の出力が失敗します。
# ※2.OSに渡す文字列(ファイル名,dosコマンドのオプションなど)は、
# この例のようにcp932でエンコードする必要があります。
-----------------------------------------------------
↑これの説明がよくわからないんだが、ファイル名が日本語の場合、
上記の措置が必要という意味なの?
それとも、ファイル名がアルファベットでも、
そのファイルの中味に日本語が書いてあったら、
上記の措置が必要という意味なの?
で、あれば、ファイル名が英語で、なおかつ
ファイルの中味が全部英語なら、上記の措置は
必要ないってことなの?
519:デフォルトの名無しさん
08/09/02 21:55:57
どっちが主流ですか?
1. $obj = new X;
2. $obj = X->new;
1. call_sub();
2. &call_sub;
520:デフォルトの名無しさん
08/09/02 22:02:39
$file = 'C:/なんたら/かんたら.txt';
open my $fh, '<', encode("cp932", $file) or die $! ; # ※2
print <$fh>;
-------------------------
↑これってmy $fhって、なんなの?
ファイルハンドルなの?
521:デフォルトの名無しさん
08/09/02 22:09:10
open(IN, "1.txt");
while (<IN>) { print; }
close(IN);
-------------------
別に、>>4に書いてあるようにcp932ってしなくても、
上記で日本語を含むファイルを開けるのですが、
これでいいの?
522:デフォルトの名無しさん
08/09/02 23:30:15
>>515
こんなんもあるYO
Strawberry Perl
URLリンク(www.moongift.jp)
523:デフォルトの名無しさん
08/09/02 23:37:16
別ファイルに変数を渡す問題だが、
サブルーチン渡しにしたら問題が解決したと書いたが、
参考書で調べたところ、
「サブルーチンは宣言すると、すべて自動的にグローバルになる」
と書いてある。
つまり、ourでグローバル渡しをしているのと
実質的にまったく同じことなので、意味がないのだ。
ここはやはり、モジュールとかパッケージの勉強を
するべきなのか?
本当はどうやって渡すの?
524:デフォルトの名無しさん
08/09/03 01:37:40
use utf8;
use open IO => ":encoding(cp932)";
binmode STDIN => ":encoding(cp932)";
binmode STDOUT => ":encoding(cp932)";
binmode STDERR => ":encoding(cp932)"; # ※1
use Encode;
525:デフォルトの名無しさん
08/09/03 01:38:28
$file = 'C:/なんたら/かんたら.txt';
open my $fh, '<', encode("cp932", $file) or die $! ; # ※2
print <$fh>;
526:デフォルトの名無しさん
08/09/03 01:39:15
>>524をファイルの先頭に書けば、
>>525は必要ないの?
実際、>>524だけで、
>>525なしでも、動いたんだけど。
527:デフォルトの名無しさん
08/09/03 01:46:07
何もせずにそのままコピーするだけならエンコーディング無視のバイト列で
扱ってもいいけど、普通は中身みて加工とか集計とかするわけで、そういう
ときに違いが出るんだな。
528:デフォルトの名無しさん
08/09/03 02:10:24
$fhってのはファイルハンドルなの?
普通は出てくるはずの
<IN>とかの文字が見えないので不安なんですけど。
529:デフォルトの名無しさん
08/09/03 02:13:03
他ファイルのmy化された変数を別ファイルで読み込んで
使うのって、結局ourでグローバル変数化しておくか、あるいは
サブルーチンに入れて、return渡しするしかないの?
サブルーチンにいれるのは、すべてのサブルーチンは
宣言すると自動的にグローバル化されるのだから、
他ファイルに渡せるのはあたりまえなんですよね。
結局ourでグローバル化してるのと本質的には同じだし。
パッケージとモジュールの勉強をしてみましたが、
それでも結局グローバル化されてる変数は読み込めましたが、
my化されてる変数は読み込めませんでした。
530:デフォルトの名無しさん
08/09/03 02:46:49
自分で何回もためしてみたけど、やっぱりモジュールファイルの中で
my化してるとだめなんだ〜
他ファイルで使って欲しい変数はグローバル化してないと
だめなんだね。
531:デフォルトの名無しさん
08/09/03 02:48:43
>529
相変わらず質問の意図が分かりかねるのだが、それはさておき。
>他ファイルのmy化された変数を別ファイルで読み込んで
>使うのって、結局ourでグローバル変数化しておくか、あるいは
>サブルーチンに入れて、return渡しするしかないの?
やり方が分かってるなら、そうすればいい。
>それでも結局グローバル化されてる変数は読み込めましたが、
>my化されてる変数は読み込めませんでした。
myで宣言されてる変数が他から読めたら、myの意味が無いっしょ。
例えばグローバル変数にはメリットとデメリットがある。
特に理由が無ければデメリットの少ないローカルな変数を使って、サブルーチン間を渡せばいい。
ただし、メリットとデメリットを理解している人間が、的確な場所に使う分には何も問題がない。
グローバル変数を使うのも使わないのも、両方とも正解だ。
その「的確な場所」が分からないのなら、まだ使うべきではないということだ。
532:デフォルトの名無しさん
08/09/03 02:50:26
Wikipediaの「名前空間」の項目が、少しは疑問を解決してくれるかも。
Wikipedia項目リンク
533:デフォルトの名無しさん
08/09/03 02:56:37
だーかーらー。
たとえば、モンスターの設定ファイルで、
スライムの体力=1とかって設定するとするでしょ。
ファイル名「a.pm」
package 1;
my $a=1;
1;
---------------
このmy $aを
他のファイルから読みたかったの。
でも無理だとわかったの。
この理解であってる?
534:デフォルトの名無しさん
08/09/03 03:03:42
>>533
いい加減しつこい。とりあえず以下のドキュメント読んどけ。読み終わるまで戻ってくんな。
> perlboot - Perl OO tutorial for beginners
> perltoot - Perl OO tutorial, part 1
> perltooc - Perl OO tutorial, part 2
> perlbot - Perl OO tricks and examples
535:533
08/09/03 03:05:01
読み終わりましたー
536:デフォルトの名無しさん
08/09/03 03:08:03
だってグローバル変数絶対使うなみたいなことよく
書いてあるじゃん。
だから絶対使ったらダメなのかと思ったし。
でも外部から読み込まれることを前提に設計されてる
モジュールの場合は、外部に渡す変数はグローバル宣言なのね。
最初からそう言ってくれればいいのに。
入門書にも書いてないしー
537:デフォルトの名無しさん
08/09/03 03:50:29
>>536
・Perlについてくるマニュアルに書いてある
・標準モジュールやユーティリティのソースで実例が見られる
・Webを検索すれば割とすぐに見つかる
・それについて書いてある本がいくつもある
そういうアレな質問に回答を返す病的に親切な人が出てきても、
「聞きたいのはそれじゃない」だったり、完全スルーだったり。
回答者が寄り付かないように工夫しているとしか思えないです。
あなたの好みと水準にぴったり合わせた答えを提供する義務は
誰にもありません。その点は忘れないで下さい。
538:デフォルトの名無しさん
08/09/03 03:51:14
>>533
だーかーらーそれが勇者の設定ファイルなら読めるわ
539:デフォルトの名無しさん
08/09/03 03:59:50
病的に親切な人と、叩こうとする=構おうとする人がなぁ。
540:デフォルトの名無しさん
08/09/03 04:00:02
>533
それであってると言う主旨の回答を3回くらい見かけてるわけだが
541:デフォルトの名無しさん
08/09/03 11:02:26
下でエラーが出るのは何故ですか?
--a.pl----------------
our $a = "hoge";
---------------------
--b.pl----------------
use strict;
require "a.pl";
print $a;
---------------------
C:\>perl b.pl
hoge
_____________________________________________________________________________
--a.pl----------------
our $aa = "hoge";
---------------------
--b.pl----------------
use strict;
require "a.pl";
print $aa;
---------------------
C:\>perl b.pl
Global symbol "$aa" requires explicit package name at b.pl line 3.
Execution of b.pl aborted due to compilation errors.
542:デフォルトの名無しさん
08/09/03 11:02:59
perl -wで動かすと、
Use of implicit split to @_ is deprecated
というものが表示されるのですが、これはどういう意味でしょうか?
-wをつけなければ表示されません
543:デフォルトの名無しさん
08/09/03 11:14:13
>>542
splitをスカラーコンテキストで使うとばらした内容を@_に入れるという
仕様なんだが、サブルーチンの引数渡しに使われる@_を壊すので
よろしくないということになっている。
perldiag(1)の説明によればコンパイラに負担がかかるらしい。
Use of implicit split to @_ is deprecated
(D deprecated) It makes a lot of work for the compiler when you
clobber a subroutine's argument list, so it's better if you assign
the results of a split() explicitly to an array (or list).
古いプログラムはしょうがないが新しく書くプログラムでは避けた
方がいいと思われ。
544:542
08/09/03 13:01:45
ありがとうございます
my $tab = split( /\t/, $_);
こう書いているのですが、どのように修正すればいいのでしょうか?
545:デフォルトの名無しさん
08/09/03 13:07:07
>>544
$_ には何が入っていて、$tab には何を入れたいの?
もしかして @tab と書くべきところだったってオチか?
546:デフォルトの名無しさん
08/09/03 13:33:32
ダミーの変数を用意して:
my $tab = my @dummy = split( /\t/, $_ );
が楽だし確実だな。
でも実はタブを数えたかったのなら、タブによって分割された
項目数を数えるより直接タブを数える
my $tab2 = tr/\t//;
の方が効率的なのでおぼえておくといい。
ただしsplitは(第3引数に負の数を与えなければ)末尾の空フィールドは
捨てるので、この動作を利用してなんかしている場合はtrで数える手は
使えない。
547:542
08/09/03 14:07:31
>>545
ありがとうございます。
$_には、
foo\tbar\tbaz
や
\t
のような値が入っています。
$tabには配列の数を入れたかったです。(1行目なら32行目なら0
>>546
ありがとうざいます。
頂いたとおりに修正することで、-wをつけても何も表示されなくなりました。
548:デフォルトの名無しさん
08/09/03 14:58:36
Perlを始めてみたのですが、
UNIXだとファイルの最初に[ #! /usr/local/bin/perl ]などとフルパスを書くと
コマンドだけで実行できるようですが、Active PerlをWindowsで使ってる場合は、
こういうやり方は無理なのでしょうか?
今は、ファイルを保存したディレクトリ内で、[ perl <ファイル名.pl> ]を打ち込んで実行しています。
549:デフォルトの名無しさん
08/09/03 15:54:33
>>548
ちゃんとインストーラでインストールした?
解凍してコピーしただけじゃOSの設定はされないよ。
ちゃんとインストールすれば、ほげ.pl をマウスでクリックするだけで動いてくれるよ。
#! /usr/local/bin/perl
が必要なのは、UNIXというOS固有の問題だから Windows には関係ない。
# で始まってるのでタダのコメント文として無視される。
550:デフォルトの名無しさん
08/09/03 15:56:48
ActivePerlなら、インストール時に(デフォルト設定でインストしてれば)*.plの拡張子に関連付けられてるハズだから、
.plの拡張子を持つファイルなら、コマンドプロンプトから、C:\> 〜〜.plでも実行できる。
(頭の#!〜〜はまず気にしなくてよし。#!/usr/bin/speedy とか書いてる時はエラー出るけど・・)
つうか、拡張子が関連付けられてたら、エクスプローラーからダブルクリックでも実行できる。
けど、前にもココだったか、Webprog板の方だったかにいたけど、
「コマンドプロンプトが一瞬で消えてしまい、出力が読めません。」とか言わないでね。
551:デフォルトの名無しさん
08/09/03 16:20:47
自分は「Perlをはじめよう」ってソフトを使ってる。
便利。
552:デフォルトの名無しさん
08/09/03 16:22:38
sleep 100;
553:デフォルトの名無しさん
08/09/03 16:26:34
質問。
>>525との組み合わせなのですが、
教科書や解説ページを見ると、よく
open FH, ">filename.txt";
---------------
$FH = "filename.txt";
open FH;
------------------
open(FH,"<data.dat"); # 入力モードでオープン
--------------------
$line = <FH>; # 1行読み込み
----------------------
open(FH, $datafile);
@list = <FH>;
-------------------
foreach $data_line( @list ) {
print $data_line;
}
---------------
open(IN, $datafile);
while ( $line = <IN >) {
print $line;
}
--------------
↑このような例がでてくるのですが、いずれもファイルハンドルとして
INとかFHとか大文字がでてくるのですが、>>525だと
そのような文字が見当たりません。
できれば我々初心者が見慣れた例で書き直した
サンプルをいただきたいのですが。
554:デフォルトの名無しさん
08/09/03 16:43:21
そういう古いのは使っちゃだめ。覚え直せ
open my $fh, ">", "filename.txt";
------------------
open my $fh, "<", "data.dat";
--------------------
$line = <$fh>;
----------------------
open my $fh, "<", $datafile;
my @list = <$fh>;
-------------------
foreach my $data_line (@list) {
print $data_line;
}
---------------
opem my $in, "<", $datafile;
while (my $line = <$in>) {
print $line;
}
555:デフォルトの名無しさん
08/09/03 16:59:55
>>549-550
ありがとうございました。
拡張子つけないでファイル名だけでできるかなと思ったわけです。
>>551
それインストールしてみました。イイ情報をありがとうございました。
556:デフォルトの名無しさん
08/09/03 17:05:56
>>553
君の大嫌いなグローバルな変数(ファイルハンドル)を使っていいのかい?
557:デフォルトの名無しさん
08/09/03 19:44:37
>>554,556
まじで?
また古い本を読んでしまったのかな、、、
558:デフォルトの名無しさん
08/09/03 19:45:30
つまりファイルハンドルも実は変数の一つにすぎないと?
それで、プライベートなファイルハンドルと、
グローバルなファイルハンドルが存在すると??
559:デフォルトの名無しさん
08/09/03 19:59:17
<IN>の実体は型グロブ*IN
560:デフォルトの名無しさん
08/09/03 20:31:44
URLリンク(ja.wikibooks.org)変数、データ構造
561:デフォルトの名無しさん
08/09/03 20:54:24
>556
たぶん別人。もしくは壮大な釣り
562:デフォルトの名無しさん
08/09/03 22:42:54
>>541
> 下でエラーが出るのは何故ですか?
perldoc strict
の "strict vars" の項を読んでみてください。
# そして、上の例でなぜエラーが出ないかについては:
# perldoc -f sort
563:デフォルトの名無しさん
08/09/03 23:04:43
>>562
サンクス
パッケージ名を明記しなくちゃいけないんですね。
でも、$aと$bは、自動的にパッケージ名をつけてくれると。
564:デフォルトの名無しさん
08/09/04 01:10:57
ファイルハンドルを変数に格納するやり方は
「間接ファイルハンドル」
という名前がついていることはつきとめました。
マッキンゼーに2,000万払って調べてもらいました。
で、古いやり方はやめて
間接ファイルハンドルを使え、と
書いてあるWEBページはどこにあるのでしょうか?
565:デフォルトの名無しさん
08/09/04 01:48:34
>564
ここのスレだってウェブサイトの1つってことでいいよね?
566:デフォルトの名無しさん
08/09/04 02:01:01
スレがやけに加速してると思ったらほとんど同一人物ぽいな。
低レベルなレスでスレ汚すなよ。中学生だろ、おまえ。
ま、おれもヒトのこと以遠が。。。でも俺よりは年下だな。
ひとつだけ教えといてやろう。
パッケージ変数はサブルーチンでアクセスしろって、PBPに書いてあった。
Class::Data::Inheritableとか使ってもいいだろう。
だから、もうこの関連で書き込みすんなよ。
567:デフォルトの名無しさん
08/09/04 02:02:32
あ、ちなみに俺、中学生じゃないです。その上だから。
568:デフォルトの名無しさん
08/09/04 02:04:39
>>565
いまボストンコンサルティングに1、500万払って
調べてももらってますが、
「古いファイルハンドルの指定の仕方(FILEとか)でなくて、
新しいやり方、間接ファイルハンドルを使え」
と明確に書いてあるWEBページは、
なかなか見つかんないですよ。
たぶんメリットがないんじゃないですか?
569:デフォルトの名無しさん
08/09/04 02:06:19
>>566-567
高校生でperlできるんだーすごいねー
偏差値68以上の学校?
570:デフォルトの名無しさん
08/09/04 02:09:48
>>568
頭が悪いのにも限度があると思うんだ。
571:デフォルトの名無しさん
08/09/04 02:13:39
>>569
年なんか関係ないだろ。黙って勉強しとけよ、青二才。
上では余計なこと書いた。今は反省している。
572:デフォルトの名無しさん
08/09/04 02:16:28
>>571
進学校?数学得意?プログラミングをはじめたのは何才から?
573:デフォルトの名無しさん
08/09/04 06:56:17
スレリンク(php板:981番)
PHPの連中は本当にキモイなぁ
574:デフォルトの名無しさん
08/09/04 08:46:42
perlの連中もきめえよ
575:デフォルトの名無しさん
08/09/04 08:51:19
五十歩ひゃっほー
576:デフォルトの名無しさん
08/09/04 10:18:13
五十歩ヒャッハァーあの村の井戸を奪えー!
この場合は my $well か?
577:デフォルトの名無しさん
08/09/04 12:22:57
この流れワロタ
578:デフォルトの名無しさん
08/09/04 16:00:43
汚物は消毒だーっ!
579:デフォルトの名無しさん
08/09/04 16:55:06
任意の数の配列 @minshu 全てをチェックし、もし obutu であれば値を kasizumi にするソースコードを書け。
ただし @minshu の中に値 kenshiro があった場合は直ちに処理を中止するものとする。
580:デフォルトの名無しさん
08/09/04 17:07:21
自分で書け
581:デフォルトの名無しさん
08/09/04 17:29:48
>579
keshizumi じゃないのか?
582:デフォルトの名無しさん
08/09/04 17:30:41
どこの宿題だよ
583:デフォルトの名無しさん
08/09/04 17:32:56
断る
584:デフォルトの名無しさん
08/09/04 17:52:46
ワンライナー自重
585:デフォルトの名無しさん
08/09/04 17:56:49
ActivePerl 5.10 で、Gmail に Mail::IMAPClient で接続、
メールの添付ファイルを取ってくるスクリプトを書いています。
ログインしてメールの本文などを取得することはできたのですが、
MIME::Parser で parse した時点で、破損したファイル(最後までデータが出ていない)が
出力されてしまいます(output_to_core(1)を消して試してみました)。
この場合、原因として考えられるのは何でしょうか? ここで詰まってしまってます……。
586:デフォルトの名無しさん
08/09/04 19:37:19
どんなスクリプト書いたの?
587:デフォルトの名無しさん
08/09/04 19:49:08
>>586
すいません、最初から書けばよかった。ちょっとはしょってますが、こんな感じです。
use strict;
use MIME::Parser;
use Mail::IMAPClient;
use IO::Socket::SSL;
my $parser = new MIME::Parser;
$parser->output_to_core(1);
my $socket = IO::Socket::SSL->new( PeerAddr => 'imap.gmail.com', PeerPort => 993 ) or die "socket(): $@";
my $client = Mail::IMAPClient->new( Socket => $socket, User => 'hogehogehoogehoge@gmail.com' ) or die "new(): $@";
if ( $client->IsAuthenticated() ){
$client->select('INBOX');
my @uid = $client->unseen;
foreach my $id (@uid) {
my $message = $client->message_string($id) or warn "Timeout!";
my $entity = $parser->parse_data($message);
my $header = $entity->head;
if ( $entity->is_multipart ){
my $parts_count = $entity->parts;
for (my $i = 1; $i < $parts_count; $i++) {
my $part_entity = $entity->parts($i);
my $filename = $part_entity->head->recommended_filename;
my $filebody = $part_entity->bodyhandle->as_string;
open(FILE, ">$filename");
print FILE $filebody;
close(FILE);
}
}
}
}
588:デフォルトの名無しさん
08/09/04 21:11:33
もしかして、他ファイルに定義された変数を
別ファイルから読みたいときは、
「Perlのオブジェクト指向」
を使えばいいんじゃないかな??
あってる?ちがう?
589:デフォルトの名無しさん
08/09/04 21:59:34
>588
誰にレスしてるんだ?
590:デフォルトの名無しさん
08/09/04 22:07:34
オブジェクト指向を使えば、
他ファイルにかかれているmy化された
変数も読めるんじゃないか?
と質問をしてるわけです。
591:デフォルトの名無しさん
08/09/04 22:16:38
今日の発見。
use feature qw( :5.10 );
say 2 ** 50;
これを実行すると
1.12589990684262e+015
とでてくるが、
use bigint;
use feature qw( :5.10 );
say 2 ** 50;
とすると
1125899906842624
と出てくる。
いくつの桁まで表示できるか、
今からちょっと実験してみる。
592:デフォルトの名無しさん
08/09/04 22:17:32
>591
質問は?
593:デフォルトの名無しさん
08/09/04 22:20:03
そういえば、ちょっと前のCGIゲームで、
数値の表記が、3桁づつ、、(カンマ)で
区切られて表示されないのがあって、
これを、3桁づつカンマで区切って表示するように
改造したい、と思ったんだが、これって難しいの?
例
1234567円→1、234、567円
594:デフォルトの名無しさん
08/09/04 22:24:31
printfって知ってるかい?
595:デフォルトの名無しさん
08/09/04 22:27:18
use bigint;
system q|cls|;
use Win32::Sound;
use feature qw( :5.10 );
say 2 ** 55555;
Win32::Sound::Play("file.wav");
↑これすごいよ。
2の55555乗を計算して
画面に出力するんだけど、
DOS窓が全部数字で埋め尽くされてしまって
もはや何桁あるかなんで数え切れないよ。
CPUが計算するのに5秒もかかるし。(ウチのパソコンでは)
596:デフォルトの名無しさん
08/09/04 22:35:28
>>593
1 while s/^([-+]?\d+)(\d\d\d)/$1,$2/;
597:デフォルトの名無しさん
08/09/04 22:54:46
use utf8;
use open IO => ":encoding(cp932)";
binmode STDIN => ":encoding(cp932)";
binmode STDOUT => ":encoding(cp932)";
binmode STDERR => ":encoding(cp932)";
use Encode;
use bigint;
use feature qw( :5.10 );
use Time::HiRes 'sleep';
system q|cls|;
$|=1;
#----------------------------------
use Win32::Sound;
use feature qw( :5.10 );
say "2を1000回、掛けてみますですよ...";
my $a=2;
say "結果が出ましたですよ...\n".&aaa."ですよ...";
say "あと、結果の出力を画面の真ん中に出すやり方をおしえてくだしあ";
sub aaa{
for (my $b=1;$b<=499;$b=$b+1){
$a=$a*2;
say "2を500回、掛けてみますですよ...";
say "今、第".$b."回目の計算中ですよ...";
say $a;
system q|cls|;
}
return $a
}
Win32::Sound::Play("file.wav");
598:デフォルトの名無しさん
08/09/04 23:02:07
ファイルアップロードしようとして
同じものがあったらエラーって処理をしたいのですが
URLリンク(www.ss.iij4u.or.jp)
ここの改良版の方に
opendir(DIR , $logfiles);
@filelist = readdir(DIR)
closedir(DIR)
foreach (@filelist){
next if $file =~ /^\.{1,2}$/;
if(compare( $fh , $_){
error処理;
}
}
みたいな感じでやっているのですが
上手くいかんのです
たすけてくだしあ
599:デフォルトの名無しさん
08/09/04 23:17:18
-fとかでいいだろ
600:デフォルトの名無しさん
08/09/04 23:19:54
名前を変えてるのでcompareで比較がしたいのです
助けて下しア
601:デフォルトの名無しさん
08/09/04 23:21:56
compareって何だよ
602:デフォルトの名無しさん
08/09/04 23:22:18
>>598
webprog板池よ
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4395日前に更新/239 KB
担当:undef