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

このエントリーをはてなブックマークに追加
"The duct tape of the Internet"こと、
Perlについての質問箱です
"There's more than one way to do it"ということで
Perlの奥深さについて皆で語り合い、追求してまいりましょう。

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

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

過去ログは>>2-4あたり
3get

[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www5a.biglobe.ne.jp/~n_rieko/perl/

[本]
リャマ: http://www.oreilly.co.jp/BOOK/lperl3/
駱駝: http://www.oreilly.co.jp/BOOK/pperl3v1/
Effective Perl: http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: http://www.oreilly.co.jp/BOOK/pcook/

[オンラインマニュアル]
Perldoc.com: http://www.perldoc.com/
perldoc.jp: http://www.perldoc.jp/
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/%7ekbk/perl5.005/

[モジュール]
CPAN.com: http://search.cpan.org/
河馬屋二千年堂: http://member.nifty.ne.jp/hippo2000/

[テクニック]
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: http://homepage1.nifty.com/nomenclator/perl/
4デフォルトの名無しさん:04/05/26 18:52
4get
search.cpan.jpにリンクがないのはなじぇ?
6デフォルトの名無しさん:04/05/28 02:34
本スレage!
7デフォルトの名無しさん:04/05/28 12:39
PERLってJAVAみたいにバックグラウンドでリアルタイム処理ってできますか?
ブラウザでページを表示したときにしか動作しないんですか?
8デフォルトの名無しさん:04/05/28 13:04
>>7
Unix 系だったら fork
Windows系だったらMT(マルチスッドレ)Perlがええんでネーノ

と、やりたいことを具体的に訊かずにカキコ
すいません。
perlでタイムスタンプの情報を知りたいのですが
取得する方法あるのでしょうか?

やっぱり$kekka = `ls -l file_hoge`;
とやってその結果を解析するしかないのでしょうか?
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks) = stat($filename);

0 dev device number of filesystem
1 ino inode number
2 mode file mode (type and permissions)
3 nlink number of (hard) links to the file
4 uid numeric user ID of file's owner
5 gid numeric group ID of file's owner
6 rdev the device identifier (special files only)
7 size total size of file, in bytes
8 atime last access time in seconds since the epoch
9 mtime last modify time in seconds since the epoch
10 ctime inode change time in seconds since the epoch (*)
11 blksize preferred block size for file system I/O
12 blocks actual number of blocks allocated
1210:04/05/28 16:05
おおおおっ
statという関数あったのですね。
ありがとーございます。

使用してみますです。
13デフォルトの名無しさん:04/05/28 22:58
>>1
スレ立て乙。
そしてPerlスレ10箱達成おめ。
14デフォルトの名無しさん:04/05/29 05:01
かなり悩んでます、お願います

htmlからform のpostでcgiにデータを渡すのですが、

form method=post action=cgi
input type=checkbox name=mail_to value=a
input type=checkbox name=mail_to value=b
/form

で、タイプをチェックボックスとして、cgiに渡します。
この場合、cgiで受け取るデータはどの様な形式で入ってくるのでしょうか?
name が同一の名前なので、 配列 $mail_to[0] $mail_to[1]
かと思ったのですが、違うようですし、 データの内容がカンマで区切られて入ってくるでもないようですし・・

尾永井します

CGIの話は受けつけておりませぬ。
でも、環境変数とか調べたらきっと答えは出てきます。
>>14
WebProg板の

Perl コーディング初心者質問コーナー Part35
ttp://pc5.2ch.net/test/read.cgi/php/1085557731/l50

あたりに行った方がいいと思うよん。移動ついでに
どういうプログラム書いたか要点を明らかにすること。
最低どのcgiライブラリ使ってるかぐらいは言わないと
誰も答えられないと思われる。
1714:04/05/29 14:06
>>15
>>16
スレ違いでしたが・・・サンクス

俺のperlプロセス君が、10秒以上処理が長引いたら
どんな状態だろうと自殺したいと言っています。

さて、飼い主として俺はどーしてやったらいいもんかね?
fork しまくるとか
1,ファイルから一行づつ読み込む
2,if(空行なら) {
3, 配列xをソートして出力;
4, 配列xは初期化;
5,} else {
6, 読み込んだ行を配列xに追加;
7,}
というのが作りたいんですが、なかなかうまく逝きません。
とりあえず中間的に
@xx = ();
while(<>) {
push(@xx, <>);
}
print $xx[2];
と書いてみて、二行目を出力するかどうか試したんですが、駄目です。
どなたかお助けください。
while (<FILE>) {  # ファイルハンドルを使う
push @xx, $_;   # $_ に入ってるから
my @buffer;
while (<>) {
push @buffer, $_ if $_;
print splice @buffer, 0;
}

こんなかんじ?
>>22
あかんやん。
my @buffer;
while (<>) {
push @buffer, $_ and next if $_ ne "\n";
print sort @buffer;
@buffer = ();
}
あかんわ。。。鬱
>>20
そのまま書くんじゃダメなの?
my @x;
while(<>){ #    1,ファイルから一行づつ読み込む
if($_ eq "\n"){ #  2,if(空行なら) {
print sort @x; #  3, 配列xをソートして出力;
@x = ''; #      4, 配列xは初期化;
} else { #      5,} else {
push @x, $_; #   6, 読み込んだ行を配列xに追加;
} #          7,}
}
@x = (); #      4, 配列xは初期化;
だね。すっかり忘れてる^^;
>>20
while(<>)内でもう一度<>を使っちゃだめ。

while(<>) {      #ファイルのn行目が$_にセットされる。
push(@xx, <>);    #ファイルのn+1行目@xxにpushされる。
}
とゆーわけで、読み込んだファイルの奇数行は処理されなくなる。

あとロジックもちょっと変。もし読み込むファイルの最終行が
空白じゃなかったらどうなる?空白行が連続してたくさん続くような
ファイルを読み込ませたら?

ファイルの空白行を飛ばして出力するスクリプトだったら
こういう書き方もできる。

while(<>){print if !/^\n$/;}
2726:04/05/30 23:32
s/奇数行目/偶数行目/
2827:04/05/30 23:36
s/偶数行目/奇数行目/
ゴメン アッテタ
while(<>){# 一行読み込む
push(@xx, <>); # @xxに<>の残りの全ての行を追加する。――ダイヤモンド演算子はリストコンテキストでは残り全てを読み出すため。
}
さて、以下の命令文はどんな効果を得ることができるでしょうか?

<>;
31デフォルトの名無しさん:04/05/31 08:06
心が安らぐ。
 <>;

(^<>^;)
32デフォルトの名無しさん:04/05/31 11:51
すみません、お教えください。
UNIXでCPANモジュールのアンインストールって
コマンドか何かでできるのでしょうか?

それともモジュールをファイル削除するしかないのでしょうか。。。
>>30
1行捨てる
34デフォルトの名無しさん:04/05/31 13:01
たおれたキャンチョメ
35デフォルトの名無しさん:04/05/31 13:04
元は糞スレだったのか。
>>31
$ perl foo.pl
syntax error at b.pl line 1, near "(^"
Execution of foo.pl aborted due to compilation errors.

ゴルァ(゚Д゚)




以下おまけ。有名なネタ。要 Windows2000以上。

C:\>(;´Д`)ハァハァ
ハァハァ の使い方が誤っています。
37デフォルトの名無しさん:04/06/01 03:20
ymdhis形式の時刻をunixtimeに変換する関数とかどこかにありませんか?
要するに2つの時刻の差を知りたいわけですが。
ただしCPANは使えない状況です。
Time::Local
40デフォルトの名無しさん:04/06/01 04:58
>>39
ありがとうございました。
>>31
死ね
42デフォルトの名無しさん:04/06/01 05:14
thanks!
「初めてのPerl(3版)」で勉強しています。

P69にて
“サブルーチンの中で最後に行われた計算の結果が、自動的に戻り値になる”
と書かれていますが、以下のような処理を行っても値が戻りません。

sub max {
my($max_so_far) = shift @_;
foreach (@_) {
if ($_ > $max_so_far) { $max_so_far = $_; }
$max_so_far; # ここだと値が返らない。
}
# $max_so_far; # ここだと値が返る。
}
$maximum = &max(1,2);
print "maximum number : $maximum";

sub maxで、最後に行われる計算は、
コメントアウトしていない$max_so_far;だと思うのですが、
間違っていますでしょうか?
最後が for (@_) になるからでは?
perl -d とかして、step 実行するとよくわかるよ。
4543:04/06/01 13:53
>>44
レスありがとうございます。

ステップ実行を行ってみましたが、
やはり、print出力の前の動作(sub maxの最後の動作)は、
$max_so_far; # ここだと値が返らない。
のようです。

コメントアウトしている
# $max_so_far; # ここだと値が返る。
と入れ替えて、ステップ実行してみた結果も同じ動作でした。

おそらく僕が致命的な勘違いをしているような気がするのですが、
なにぶん未熟なせいか、分からずにいます。
もう少し頑張って調べてみます。

>>44さん、ステップ実行自体まだ知らなかったので大変参考になりました。
ありがとうございました。
main::max(_.pl:4): if ($_ > $max_so_far) { $max_so_far = $_; }
DB<1> s
main::max(_.pl:5): $max_so_far; # ここだと値が返らない。
DB<1> s
main::max(_.pl:3): foreach (@_) {
DB<1> s
main::(_.pl:10): print "maximum number : $maximum\n";

ほら、foreach (@_) が最後じゃん
おお。コレは知らなかった。
つかこういう記述しないし。

>>43の場合
for(@_){
  ...
}
でforを抜ける"}"が最後だっつー事やね。

return(...)をつけとくほうが確実か。
sub max {
  my($max_so_far) = shift @_;
  foreach (@_){
    if ($_ > $max_so_far){
      $max_so_far = $_;
    }
    return($max_so_far); # ここだと値が返らない。
  }
  # return($max_so_far); # ここだと値が返る。
}



4847:04/06/01 15:15
forじゃねぇや。
foreachだった。
ちうか、おかしなプログラムだな
返らない原因を指摘したまで。
そのプログラムがおかしいとか、
普通そうは書かねぇよなどは
また別の問題かと。
Perlでリストの最大値取得するもっとも速い方法はどんなの?
>>51
sortじゃだめなん?
@sorted = sort @_;
$sorted[0]; # 最小値
$sorted[-1] # 最大値
53デフォルトの名無しさん:04/06/01 16:13
手っ取り早くファイルの行数を調べたいときはどのようにすればいいですか?
調べるファイルはかなり巨大で、ン拾萬行に及びます。
5443:04/06/01 16:23
いろいろ調べたりしてたらスレが進んでる…

>>46
たぶんというか間違いなく、>>46さんの言ってることが正しいとは思うのですが、
Windows環境のせいなのか、僕がくだらんミスしてるのか分かりませんが、
>>46のように出力してくれません…
しばらく試行錯誤してみます。

>>49
まだサンプルソース見ながら、基礎を理解してる最中なんで、
記述スタイル(スタイルも何もまだ無いけど)とかは勘弁してください…
>>53
`wc -l $file`
>>52
sortはたいていO(n×log n)ぐらいはかかるので、nが大きくなると
まずいだろう。素直に書くなら

$max = @_[0];
foreach (@_) {
$max = $_ if $_ > $max;
}

あたりじゃない? 要素数が少ないとsortの方が速いかもしれないけど。
ただしsortを使うとしてもいったん変数に入れないほうが速いと思った。

(sort {$a<=>$b} @_)[-1];
5753:04/06/01 16:53
>>55
環境を申し遅れました。Windowsです。
>>57
Cygwinでperl使えばよろし
59デフォルトの名無しさん:04/06/01 17:01
CygwinでPerlを使えたかな・・・
>>59
使ってますが何か?
$l=0;open i,$file;while(<i>){$l++;} close i;print "$l\n";
open IN, $file;
1 while <IN>;
close IN;
print "$.\n";
close IN;は陽にクローズしてるだろ
$.はハンドルをクローズしたらリセットされまつ
>>51>>56
検証せずにカキコ。
たぶんほとんどのケースで sort がいちばん速いが、Perlのソートは
Quick sort だし、要素の並び替えが発生するので
要素がヴァカでかく、ほぼ順列/逆列のときはかな〜りペナルティが
発生するハズ。ていうか先にPerlインタプリタが長い時間黙りこくるだろう。

短い行数でやるんだったら>>56が正解だとおもうけど、
ホントに「速い」方法は、データの持ち方、データの取り込み方と関係してくる。

結論: 設計が肝心だが、Perlでは手抜き上等!

>>53
効率的ではないが手っ取り早く最短な方法(FDはオプーソするんだぞ)
scalar(@dummy_no_namaedakara_mijikaku_shiru = <FD>)

手っ取り早くなく(効率的に)やるんだったら、とにかく設計が肝心だ!!!
テキストファイルは、長大なデータ扱うのに適してないんだyp!
>効率的ではないが手っ取り早く最短な方法(FDはオプーソするんだぞ)
>scalar(@dummy_no_namaedakara_mijikaku_shiru = <FD>)
っていうかバッファが無駄すぎだろ。もすこし考えろ
>>66
こーゆーときに深く考えないのがPerlだろ?!
走らせてから>>65は悩むんだろ。
6865:04/06/01 18:54
Xeon2.8x2 絶賛運用中しかもJVM走ってる箱
Perl 5.8.0, Linux-2.4.20 にて計測
たったの 1468778 lines, 262,261,974 bytes

$ wc -l
real 0m0.351s
user 0m0.140s
sys 0m0.190s

$ perl -e '1while(<>);print"$.\n";'
real 0m1.574s
user 0m1.430s
sys 0m0.150s

$ perl -e '$n++while(<>);print"$n\n";'
real 0m1.641s
user 0m1.470s
sys 0m0.170s

$ perl -e 'print scalar(@d=<>),"\n";'
real 0m4.643s
user 0m3.230s
sys 0m1.380s

遅いな(ワラ
>>66の云うとおり、もちっと考えるようにするわ
Windowsにwcみたいなものって入ってないの?
>>51
use List::Util qw(max);
$max = max(@list);

実行速度は知らんが、(色々と)早いぞ
軽くベンチしてみた。やはりList::Util速いわ。
use Benchmark;
use List::Util qw(max);
my @list;
foreach (1..$ARGV[0]) {push @list, rand}

timethese(-1, {
    sort => sub {
      my @sorted = sort {$a <=> $b} @list;
      return $sorted[-1];
    },
    sort2 => sub {
      return (sort {$a <=> $b} @list)[-1];
    },
    foreach => sub {
      my $max = $list[0];
      foreach (@list) { $max = $_ if $_ > $max; }
      return $max;
    },
    map => sub {
      my $max = $list[0];
      map { $max = $_ if $_ > $max } @list;
      return $max;
    },
    max => sub {
      return max(@list);
    },
  });
>>71の結果。List::Utilは別格に速い。sortとforeachは要素数が増えると逆転。

% perl max.pl 10
Benchmark: running foreach, map, max, sort, sort2 for at least 1 CPU seconds...
foreach: 2 wallclock secs ( 1.03 usr + 0.00 sys = 1.03 CPU) @ 104388.35/s (n=107520)
map: 2 wallclock secs ( 1.06 usr + 0.00 sys = 1.06 CPU) @ 147539.62/s (n=156392)
max: 1 wallclock secs ( 1.02 usr + 0.00 sys = 1.02 CPU) @ 562195.10/s (n=573439)
sort: 1 wallclock secs ( 1.03 usr + 0.00 sys = 1.03 CPU) @ 55672.82/s (n=57343)
sort2: 2 wallclock secs ( 1.01 usr + 0.00 sys = 1.01 CPU) @ 227103.96/s (n=229375)
% perl max.pl 100
Benchmark: running foreach, map, max, sort, sort2 for at least 1 CPU seconds...
foreach: 1 wallclock secs ( 1.05 usr + 0.00 sys = 1.05 CPU) @ 21557.14/s (n=22635)
map: 1 wallclock secs ( 1.05 usr + 0.00 sys = 1.05 CPU) @ 24093.33/s (n=25298)
max: 1 wallclock secs ( 1.06 usr + 0.00 sys = 1.06 CPU) @ 115923.58/s (n=122879)
sort: 1 wallclock secs ( 1.06 usr + 0.00 sys = 1.06 CPU) @ 6338.68/s (n=6719)
sort2: 2 wallclock secs ( 1.04 usr + 0.00 sys = 1.04 CPU) @ 20675.96/s (n=21503)
% perl max.pl 1000
Benchmark: running foreach, map, max, sort, sort2 for at least 1 CPU seconds...
foreach: 1 wallclock secs ( 1.08 usr + 0.00 sys = 1.08 CPU) @ 2370.37/s (n=2560)
map: 2 wallclock secs ( 1.06 usr + 0.00 sys = 1.06 CPU) @ 2534.91/s (n=2687)
max: 1 wallclock secs ( 1.09 usr + 0.00 sys = 1.09 CPU) @ 13151.38/s (n=14335)
sort: 1 wallclock secs ( 1.08 usr + 0.00 sys = 1.08 CPU) @ 517.59/s (n=559)
sort2: 1 wallclock secs ( 1.05 usr + 0.00 sys = 1.05 CPU) @ 1421.90/s (n=1493)
実装で 悩む前に まずCPAN

おそまつでした。
List::Utilの中身だけど、これのどこにそんなに速くなる要素があるの?

sub reduce (&@) {
my $code = shift;

return shift unless @_ > 1;

my $caller = caller;
local(*{$caller."::a"}) = \my $a;
local(*{$caller."::b"}) = \my $b;

$a = shift;
foreach (@_) {
$b = $_;
$a = &{$code}();
}

$a;
}
sub max (@) { reduce { $a > $b ? $a : $b } @_ }
>>74
頭のほうからよく読め。それはXS版のダイナミックロードを
試みてうまくいかなかった時用のコードだ。
>>75
/usr/lib/perl5/5.8.4/i686-linux-thread-multi/auto/List/Util/Util.so
これがありました。Perlのライブラリはコンパイルされてるんですね。初めて知りました。
通りで速いわけだ。ということはライブラリは積極的に使わないともったいないですね。
やあみんな(´・ω・`)

この正規表現をもっとスマートにできないかな?
 /^D(a(m(n(A(ss?)?)?)?)?)?/i
つまり文字列の先頭から、
 D もしくは Da もしくは Dam もしくは Damn もしくは (以下略)
にマッチするかどうかを、大文字小文字を区別せずにテストしたい。
実行速度と可読性の両方があればベストなんだけど、どちらかというと
実行速度の方が嬉しい。何度も何度も何度も何度も呼び出されるんだ。

Cなら正規表現すら使わずに簡単に高速なルーチンが書けるのに
テキスト処理が得意なはずのPerlだと悩んじゃうのは、意外だね。

あ、このバーボンは僕のおごりだ。
$data に任意のデータがあるとして。
my $arry = 'DamnASS';
$arry =~ m/^$data/i;
>>78
うわっ、これは強烈に Koo000L なコードだね。
逆転の発想とはこの事さ。コペルニクスの再来だ。
脳みその未使用の部分が一気に活性化した気分だ。
ありがとう。お礼に蜂蜜酒をごちそうさせてくれ (´・ω・`)ノ∀
>>77
なぜ $data =~ /^D/i じゃダメなの?
それとも /^D(a(m(n(A(ss?)?)?)?)?)?\z/i の間違い?

>>78-79
$data が 'DamnASS!' だと $arry =~ /^$data/i はマッチ
しないけどいいの?
>>80
やあ(´・ω・`)こんな夜中(早朝?)にナイスツッコミだ。
実は>>78のアイデアがうまくいかなくて,10分くらい悩んだ。
原因は,つまり君のツッコミそのものだった。

> /^D(a(m(n(A(ss?)?)?)?)?)?\z/i の間違い?
> $data が 'DamnASS!' だと $arry =~ /^$data/i はマッチ
> しないけどいいの?

鋭いね。実は僕の質問に間違いがあったんだ。ごめん。
結局僕は
 $data =~ /^D(a(m(n(A(s(s.*)?)?)?)?)?)?\z/i
という正規表現のスマート化をしたかったんだね。
 my $arry = 'DamnAss';
 my $subdata = substr($data, 0, length($arry));
 if ($arry =~ /^\Q$subdata\E/i) { ...
として解決したよ。
>>81
if (0 == index 'damnass', lc $data) {
83デフォルトの名無しさん:04/06/03 16:18
splitで "="または"," という指定は出来ないでしょうか?
"aaa=bbb,ccc,ddd" → ("aaa","bbb","ccc","ddd")
という感じにする方法があるのでしょうか?
型グロブを利用して定数を宣言しようと思ったのですが、
use strictを使っているとエラーになってしまいます。

*MAX = \100;
print $MAX."\n";

はOKだけど、

use strict
*MAX = \100;
print $MAX."\n";

はエラーになるということです。

型グロブを使う前に
my $MAX
を入れるとエラーは出なくなりますが、数値は未定義のままになっています。
なぜなのでしょうか?
関数を使うなど、他の方法にするしかないですか?
>>81>>82 に感謝しないのか・・・
>>83 split /[=,]/ ではだめか?
>>86
あ、ありがとうございます。パターンマッチが使えたんですね(汗
>>84
>型グロブを利用して定数を宣言しようと思ったのですが、
まず、そのやりかたは宣言って言わない。
myはシンボルテーブルに含まれない。
strictはグローバル宣言するかパッケージ名を省略せずに書けばいい。
our $MAX;
$main::MAX;

普通は定数はコンパイル時に畳みこませる。
sub MAX () {100}
ちなみに、これは名前空間はサブルーチンだけど、実質上はサブルーチンでも関数でもないから。
sub MAX(){100}
これだと"$MAX"みたいにしたときに展開されないよね?
9084:04/06/03 17:25
>>88
早速答えていただいてありがとうございます。

> >型グロブを利用して定数を宣言しようと思ったのですが、
> まず、そのやりかたは宣言って言わない。
> myはシンボルテーブルに含まれない。
> strictはグローバル宣言するかパッケージ名を省略せずに書けばいい。

ちゃんと理解できてなくてすみません。
なんとなくperlでプログラムを書き始めてしまったので、やはり基礎から勉強します。

> 普通は定数はコンパイル時に畳みこませる。
> sub MAX () {100}
> ちなみに、これは名前空間はサブルーチンだけど、実質上はサブルーチンでも関数でもないから。

関数じゃないんですね。
コンパイル時にMAX=100として扱われるようになるということでしょうか。
この方法で書くことにします。

ありがとうございました。
9184=90:04/06/03 17:30
たびたび失礼します。
書き込む直前にリロードするのを忘れてました。

>>89

sub MAX () {100}
print MAX."\n";

で100と表示されたのですが、これは展開されたとは言わないのでしょうか?
$つきでないと困る場合はありますか?
>>91
sub MAX(){100} #これと
$MAX #これは
なんの関連性もないから気にしなくていいよ。

"MAX\n";
って書いても展開しないってことを言いたいんだと思う。
名前空間はサブルーチンを使ってて、サブルーチン名はダブルクウォート内で展開されないってこと。
9391:04/06/03 17:58
>>92
あ、なるほど。
ダブルクウォートで囲むのはいつも最小限にしてるので、勝手に読み替えちゃってました。
ありがとうございました。
○厨房注意報。
474 :login:Penguin :04/06/02 22:07 ID:TlXNt6aW
駱駝本はジャンプ一週間分程度

476 :login:Penguin :04/06/03 16:40 ID:rUJxlzG4
駱駝本<<<<スーパーテキスト類

479 :login:Penguin :04/06/03 17:09 ID:rUJxlzG4
駱駝本も分かりにくさっつーか余分な文の多さでは同レベ


http://pc5.2ch.net/test/read.cgi/linux/1079263303/l50
今まで Perl 5.005 までしかいじったことがなくて、
初めて Perl 5.8 をいじったら、UTF-8 の出力で怒られたりする羽目に陥りました。

こういった 5.8 あたりからの非互換性にまつわる注意点などがまとまった
サイトやドキュメントでおすすめはありますか?
>>95
perldelta
>>96
うぅ、すいません、もしかしてマイナーバージョンまで言うべきだったでしょうか。
私の使っている Perl 5.8.4 で perldoc perldelta したら、
5.8.3 との差分しか記述されてないのですが、
できれば、5.005 から 5.8.4 での差分が説明されているとありがたいです。
特に encoding 周りの変更点が知りたいです。
あ、余談ですが、 delta って何かと思ったんですが、微分のことですかね?
差分
増分じゃね?
変化率じゃなかった?
+であれ−であれ
定数を宣言するだけなら use constant したらどうだろ。
見た目にもわかりやすい。
結局は >88 みたいに実装されてるみたいだけど。
105デフォルトの名無しさん:04/06/04 07:14
文字列中の全ての\を\\に置換する式を教えてください!
s/\\/\\\\/g;
だろ?
107デフォルトの名無しさん:04/06/04 12:22
Perlのcall-by-nameについて解説してるドキュメントはありますか?
ラクダ本のハッシュについて書かれている2.3.5のところのサンプルコードの
意味がよく分りません。
>>102, >>103
ありがとうございます。参考になります。
>>107
オレのラクダ本(3版の日本語訳)には2.3.5は存在しないのだが、
何版?
オレの第2版にはある。
111デフォルトの名無しさん:04/06/04 15:06
>>109
2版のP57です。

また、複雑な関数を起動する際に、
名前呼び(call-by-name)のパラメータを渡すのにも使える:
$field = $query->$radio_group(
NAME => 'group_name',
VALUES => ['eenie','meenie','minie'],
DEFAULT => 'meenie',
LINEBREAK => 'true',
LABELS => \%labels,
);

というコードがあるんですが、これの意味がよく分りません。
>>111

hoge( foo => 1, bar => 2);

sub hoge(){
 my %hash = @_;
 my $foo = $hash{'foo'};
 my $bar = $hash{'bar'};
 ....
}

いったんハッシュに入れてから要素を取り出すので引数の順番を考慮しなくていいし
順序とは関係なく指定しない事も可能

=> は , の同義語。ただ引数を列挙してるだけ

それとも -> やら [ ] やら \% が分らないのだろうか?
>sub hoge(){
> my %hash = @_;
なるほど。そういうことですか。ありがとうございます。
>>113 激しくはずしてるな
ついでですが、「名前呼び(call-by-name)」ってプログラミング
言語関係では別のことを表す用語なので、3版の2.9ハッシュ
では「名前付きのパラメータを〜」っていう風に修正されて
ますね。
117113:04/06/04 15:52
いやいや、「列挙してるだけ」って言えば”名前呼び(call-by-name)のパラメータを渡すのにも使える”
という一文に惑わされるこのもないだろうと思ってね



( ´゚,_」゚)ヒッシダナ
package HOGE;
sub new {
shift;
local *GLOB;
$GLOB = 'hogehoge';
bless \*GLOB;
}
package main;
my $hoge = new HOGE;
local *HOG = *$hoge;
print $HOG;

のように型グロブのリファレンスをblessしましたが、$GLOBに入れた'hogehoge'を取り出す事が出来ません。
sub new の中の local *GLOB を消すとうまく取り出せますがオブジェクトHOGEを2つ以上用意できない気がします。
(用意できないかどうかは試していません。)

また、他に終了時に必ず実行してほしい sub DESTROY を用意してありますが、

package HOGE;
sub DESTROY {
warn "DESTROY!!"
#とりあえずまだこれだけ。
}
my $hogehoge -> new HOGE;
# ...
$hogehoge->DESTROY;
exit;

のように終了直前にちゃんと呼び出してあげないと実行してくれません。
sub DESTROY は用意しておくだけでは自動で実行してくれないのでしょうか?
また sub DESTROY はどのような時に自動で実行されるのでしょうか?
>>118
上:しらね
下:newサブルーチンの中身見せれ
gensym?
121118:04/06/04 23:31
>>119
newは>>118に書いた sub new です。

>>120
やっぱり、他とバッティングしないような文字列を毎回作るようにしないとだめですか?
>>118
localって今のグローバル変数の値をよろしく
どこぞに退避して値を代入しなおし、あとで
ブロックを抜けるときに自動的にもとに戻す
ようなものだから、あとで$HOGをアクセス
したときには元に戻っているんではないだろ
うか?

package main;の次に$HOGE::GLOB="HOGEHOGE";
と加えるとHOGEHOGEがprintされるよね。
>>118
後半はGLOB自体が消滅することはないのでDESTROY呼ばれる
こともないとかそういうオチのような気がします。
そもそも>>118は何がしたいんだろう
125118:04/06/05 01:13
>>124
型グロブをオブジェクトとすればインスタンス変数?として
スカラーも配列もハッシュも使えるかなと思ったんですけど、
型グロブのリファレンスをデリファレンスして別の型グロブに代入しても
スカラーと配列とハッシュまで(リファレンスを)同じにしてくれるわけではないんですね。
欲張ってもPerlはそうは卸さないということで、オブジェクトは素直にハッシュか配列かスカラーのリファレンスから作ります。
>>119-124の答えてくださった皆さんどうもありがとうございました。
似たことしてるIO::Handleから。

sub new {
my $class = ref($_[0]) || $_[0] || "IO::Handle";
@_ == 1 or croak "usage: new $class";
my $io = gensym;
bless $io, $class;
}

コレが正解。
うん?

package Foo;
sub new {
my $class = shift;
my($arg) = @_;
bless \$arg, $class;
}

package main;
my $foo = Foo->new(\"foo");
my $bar = Foo->new(["bar"]);
my $baz = Foo->new({foo => "bar"};

__END__

みたいなことがしたいの?

128デフォルトの名無しさん:04/06/05 17:15
駱駝本読み終わるのに何日掛かりましたか・・・?
単にフンフンと言いつつ読むだけなら、
寝ながら読んだりしてたし直ぐ終わった記憶があるけど。

全部を理解し終えるにはって意味なら、
何日とは言わず何ヶ月も掛かったなあ自分は……。

#とはいえまだ理解し切ってるわけでは無い
ラクダ本にちょこちょこ埋め込まれてるUNIX的な知識を
ちゃんと理解しようと思うと大変。
あとPerlはUNIX的なツールから沢山影響受けてるから
本当はそれらもある程度理解しないと、Perlの良さも分らないポ。
ソースコード読んで理解するまえに、やることは沢山あるぽ。
少々お知恵を拝借したくて。。。

FreeBSD5.2.1(ia64) にて、 Socket には AF_INET は未定義になっているのでしょうか?
といいますのも、
connect HTTP, pack 'S n a4 x8', AF_INET, $port, $inad or die "ERROR! at connect:$!\n";
という文を実行してみたところ、
ERROR! at connect:Address family not supported by protocol family
と返ってきたものでして。

FreeBSD5.2.1(i386) および、 VineLinux 2.6(i686) [ともに自宅鯖]では上記の鰓はでませんでした。
FreeBSD5.2.1(ia64) へはログインできる権限がないので詳細がわからないものでして。

何か情報や文献などのリンクがありましたらお教えいただけるとありがたいです。

ちなみに前述の文を、
connect HTTP, pack_sockaddr_in($port, $inad) or die "ERROR! at connect:$!\n";
に変更することで die しなくなりました。(正常動作)
perl用の定数定義は perlが入ってる下にある *.ph にあると思うけど、どうよ?
あれはperlインストール時にシステムのinclude/*.h から生成されるもんだが、
portsな世界だと何かあるのかもしれん。
13381:04/06/06 02:41
やあみんな (´・ω・`) 今日もゴキゲンなお酒でキメてるかい?
hard な stuff はだめだ。大事な脳細胞が壊れちゃうよ!
肝細胞は,殺しても殺しても復活するけどね。ha-ha-ha!

>>82
Thanks! 正規表現より,index の方が速度を期待できるね。
応用のきく頭脳を持つなんて,うらやましくも,素晴らしい事だ。
「素晴らしい」以外の賛辞を知らない僕を煽ってくれてもいい程さ。

レスが遅くなって悪いね。言い訳はしないよ (´・ω・`)ノ∀
Winでスクリプト(plファイル)をダブルクリック等で起動すると、
カレントディレクトリが上手く取れずに困っています。

例えば opendir() で '.' を開くとスクリプトがあるディレクトリになりますが、
open() で './' を開くとルートディレクトリ(C:\)になってしまいます。

スクリプト自身が存在する場所を常にカレントとするにはどうすれば良いのでしょうか。
スクリプトの場所を動かすたびに chdir() の引数を書き直すのは面倒ですし……。
>>134
open でディレクトリ開いて何がしたいんだ?
>>131
'S n a4 x8'を'S! n a4 x8'にしたらどうなります?

↓これ動かしてもらえると嬉しいです。
use Config;
foreach(qw(shortsize intsize longsize longlongsize)){
print "$_ = $Config{$_} \n";
}
>134 File::Spec や Cwd::abs_path() を利用するかソースから目的の部分を拾ってくるといい
>>134 これでどうかな
chdir (($0 =~ /(.*)\\[^\\]+$/)[0]);

open opendir 限らず、スタートメニューとかのランチャーでplファイルを指定して
実行させたらカレントが変なところになるなー
>>131sa
AF_INETが未定義かどうかを疑っているのなら、そんな複雑な
操作じゃなくて素直にprint AF_INETとかした方がはっきりする
と思うがな。

とはいえ、いまどきはpack_sockaddr_inとか使う方がいいと
思われ。古い本には'S n a4 x8'でpackする例しか書いてない
んだけど、sockaddr_inが必ずしもそうなってないOSもあるし。
たとえばlinuxでは最初のフィールドはunsigned short intの
sa_familyなのでSで妥当だけれども、FreeBSDではその部分は
unsignd charのsa_lenとunsigned charのsa_familyなので全然
違う。

それでも昔はそこら辺の値はノーチェックだったのでなんと
なく動いてたんだけど、IPv6が入った頃にsa_familyを見る
ようになって問題が表面化したんだよな。


>>132
>>136
>>139
いろいろな情報、ほんにありがとうです。m(_ _)m
当方でひとつひとつ確証するのが一番の解決策なのですがなかなかそうはいかないものでして(苦笑)
また機会があればみなさん情報を元にいろいろとやってみますです。
141136:04/06/06 09:18
あ、FreeBSDは'xCna4x8'でしたね。
# あれ、FreeBSD5.2(i386)で'Sna4x8'使って動かなかった記憶が。。

AF_INET定数を使えるということは、use Socket;できてるということなので、
pack_sockaddr_in()使うのが妥当でしょうね。
142デフォルトの名無しさん:04/06/07 16:40
駱駝本の3.1の、
「リスト演算子は、演算子の左右どちら側に注目するかによって(以下略)」
この、演算子の左右≠チて何ですか?
意味和漢ネ。
143デフォルトの名無しさん:04/06/07 17:56
今日、ftp.cpan.jpが死んでるっぽいですが、お前ら使えていますか?
>>142
3版持ってねぇ
以下略が気になる

>>142
文字通り、演算子の左側と右側の事だが。

まぁ誰でも直感的に分かる事を言葉で説明しようとして
ややこしい言い回しになってるだけだから、それ以降の
例が理解できればこだわる必要の無い文だよ。

>>144
2版 (改訂版) では 2.5.1 。
http://www.oreilly.co.jp/BOOK/pperl3v1/contents.htm
perldoc だと perlop 。
http://perldoc.com/perl5.8.4/pod/perlop.html#Terms-and-List-Operators-(Leftward)
>>144
赤ラクダだと 3.2.1
147デフォルトの名無しさん:04/06/08 10:05
for (my $i = 0; $i < 10; $i++){
    sleep 1;
    print " i = $i\n";
}

こんなのを実行すると、

 i = 0
 i = 1
 i = 2
 i = 3
 i = 4
 i = 5
 i = 6
 i = 7
 i = 8
 i = 9

 こんなふうに10行出力されますが、これを1行で "i =" のところは
 変わらずに、数字のとこだけ変わっていくというような表示をさせたいのですが、
 (topコマンドを実行したときのCPU statesの数値だけがリアルタイムで変化してくような感じ)
 端末をクリアしてまたprintして、というのは無しで
 どのようにしたらよいのでしょうか?
>>147
プラットフォーム依存だが

$| = 0; # STDOUT へのバッファリング停止(いらんかも)

print "i = $i\r"; # \r(0x0D)は、UnixでもWinでも、復帰

を試してみれ。念のためゆーとくが、sleep(1)と挿入したことで
ぴったり秒数を数えてるのではなく、計時誤差が微量に出ることは
納得できるな?

これでうまく逝かなかったら、プラットフォームを書け。

ちなみに top は、ncurses とか使ってたハズ。
for (my $i = 0; $i < 10; $i++){
sleep 1;
print "\x1b[A" if $i;
print " i = $i\n";
}
150147:04/06/08 12:53
>>148, 149

レスありがとうございます。
148さんのではできませんでした。FreeBSD 4.10です。
Curses.pmでも使おうかなと思っていたら、
149さんので思ったとおりにできました。& "\x1b"でググってみると
いろいろと面白い事がわかりました。感謝です。
>>135
いえ、./ は例えで、要は readdir() だとカレントがスクリプトのある位置を基準とできるのに、
open() だと(自分には)出来ないからどうしたら良いのかという話でした。

>>137-138
ありがとうございます、後程やってみます。
>for (my $i = 0; $i < 10; $i++){
perlなら
for (0..9)
とした方が分り易いんですがこれだと何か問題あるんでしょうか。
問題があるわけでなく知らないだけかと。
ゲンミツに言えば上限が式でループ中に値が変化するときなどは
違いがあるわけだが、

% perl -e '@a=(1,2); for $i (0..$#a) { print $i, "\n"; $a[2] = 1;}'
0
1
% perl -e '@a=(1,2); for ($i = 0; $i<= $#a; $i++) { print $i, "\n"; $a[2] = 1;}'
0
1
2

行儀悪いので良い子は真似しないほうがいいと思うよ。
155デフォルトの名無しさん:04/06/08 14:23
メール配信についてアドバイスをお願いします。

400人くらいの会員にメールを1週間おきに配信したいのですが
CCで送信するのと、400回繰り返し送信するのとはサーバーに
かかる負荷は違うのでしょうか?それとも同じでしょうか?

データファイルから順々に送信するCGIをつくりまして
サーバに負荷をあまりかけないようにするため100人終わったら、
また100人、のように送信していたのですが、もしCCで負荷が
少なくて済むならなと思いまして。
よろしくお願いします。
156155:04/06/08 14:25
すみません、>>155はCGIについての質問ですよね。
すみません、該当スレを探してきますのでご容赦下さい。
157デフォルトの名無しさん:04/06/08 14:25
-----------------------------------------------------------------------

↓Perlの質問をどうぞ。
>>155
CCよりはBCC
何かとうるさい世の中だしな
>>158
Bccよりは個別To


世知辛い世の中になったものだ
160デフォルトの名無しさん:04/06/08 20:23
3 x nのデータをファイルに保存したいです。
その場合、
(a1,b1,c1)
(a2,b2,c2)
(a3,b3,c3)
と保存して
while(<FH>){my @a;eval{@a=$_};...
するのと
a1,b1,c1
a2,b2,c2
a3,b3,c3
と保存して
while(<FH>){my @a=split ',';...
とするのでは、どっちが一般的な処理方法だと思われますか?
>>160
ふつーsplitだろ
>>161
なるほど。そうですか。
while(<FH>){my @a=eval($_);...
あと上のプログラムはこうでしたね。。。
>>160

#--- data.txt ---
[
  [ 'a1', 'b1', 'c1' ],
  [ 'a2', 'b2', 'c2' ],
  [ 'a3', 'b3', 'c3' ],
];

#--- script ---
my $array = do './data.txt';
print $array->[1][2]; # c2
「保存する」ならStorableってーのもアリかな。。。
perlからしか読み書きしないつもりならそれもアリかな。
むしろLispから読み書きできるように、トークンはスペースにしておこう。
言語非依存にするなら YAML とか。
既にM$の変換規則で変換されたunicodeのファイルを読んで処理したい
んだけど送り出す先のSOAPインタフェースがJISな変換規則のunicode
を期待しています。こういう場合の変換に使えるよさげなライブラリってある?
しょぼい質問ですみません。
ある変数にあるファイルの内容全体を格納するのにはどうするのがいいでしょうか?
定石というか定番イディオムみたいのがあるでしょうか?
私は今こうしています。
open(FILE, "hoge.dat");
my $data = join('', <FILE>);
close(FILE);
>>169
それでもいいし以下のようにもできる。

{
  local $/ = undef;
  my $data = <FILE>;
}

read FILE, my $data, -s $file;
>>170
readって必ずその長さまで読んでくれることは保証されるんでしょうか?
なんとなく不安なのでついこんな感じにしちゃうのですけど。

my $data;
my $r;
while ($r = read FILE, $data, 適当に大きな数, length($data)) {}
defined $r or die "error reading FILE: $!";
ん?だから -s $file してるんじゃねの?
173デフォルトの名無しさん:04/06/10 20:02
Active Perlをインストールしようとすると

There is a problem with this Windows Installer package. A program run as part of the setup did not finish as expected. Contact your support personnel or package vendor.

と表示されてしまい、インストールできないのですが何が原因なのかわかる方いらっしゃいますでしょうか?
>>173
MSインストーラが入ってないんじゃないだろうか
175デフォルトの名無しさん:04/06/10 22:30
最近購入したばかりのパソコンなんですけど…

その可能性大でしょうか?
>>175
ダウンロードし直してやってみる。
177デフォルトの名無しさん:04/06/11 02:27
16進数の場合、
print "\xFF";
って感じで逝けるんですが、二進数の場合どうすればいいでしょう?
178デフォルトの名無しさん:04/06/11 02:29
>>177
0b11111111
print "\1";
ってどういう意味なのですか??
>>179
\[1-9] は後方参照。
その使い方って正しいのか・・・?
表示されるのか?
1が表示されるだけ違うのか?
普通は、$1じゃないのか・・・?
よくわかんねーや。
>>175
OSの種類くらい書けよ、アホかおめー
>>179
\001 と同意
183169:04/06/11 13:01
>>170
ありがとうございます。
Ruby の read だと、長さ指定しないと全部読むんですが、そゆのないんですかね。
-s $file でサイズ取得は思いつきませんでした。なるほど。
ただ、 DATA を read する場合とかには使えないのがちょっと惜しい・・・
184デフォルトの名無しさん:04/06/11 13:05
>>183
>>170のこれは無視か

{
  local $/ = undef;
  my $data = <FILE>;
}
理解できないのは虫、これ世の常
いま必死で $/ 勉強しているヨカン
$/の項を久しぶりに読み直したら、整数のリファレンスいれると
そのサイズずつ読むなんてこともできるのね。知らんかった...
188169:04/06/11 13:47
>>184
いえ、無視じゃないです。
ただ、 $/ みたいな状態を変更するような特殊変数を設定し直さないといけないのは、
いまいちスマートじゃないような気がしなくもないかな、と思わなくもないかな、と。
Perl ではこういうのが定石なのであれば、郷に従うのもやぶさかではありませんけど。
無視、、無視してたよ!
>>188
"There's more than one way to do it"だから好きな方でいいと思う。
オレはいちいち長さ調べなくていい$/の方が好きだけどな。
ちなみに170の書き方はラクダ本の$/の説明に使われてる。
ごく一般的な使い方。
>>183
まぁ同じ事だが。

sub MY_DATA_SIZE() {
  open MYSELF, '<' . $0 or die $!;
  binmode MYSELF;
  local $/ = "__DATA_\x5F\x0D\x0A"; # 適宜変更
  <MYSELF>;
  (-s MYSELF) - tell MYSELF;
}

read DATA, my $data, MY_DATA_SIZE;
>>188
>ただ、 $/ みたいな状態を変更するような特殊変数を設定し直さないといけないのは、
そのための local なんだがな・・・
myじゃだめなの?
195179じゃないですが:04/06/11 14:35
\001 ってどういう意味ですか??
196デフォルトの名無しさん:04/06/11 14:42
$awk '{print $1}' filename
みたいなのをPerlでやるとどうなりますか?
$perl -e 'while(<>){print +(split " ")[0]."\n"}' /etc/services
これより簡単な方法があれば教えてください。
>>197
いやいや、そういうことじゃなくて、
どうして特殊変数を上の例のようにmyとして
設定できないのかということ。
>>196
http://perldoc.com/perl5.8.4/pod/perlrun.html

perl -ane 'print "$F[0]\n"' /etc/services
200169:04/06/11 15:09
>>193
もちろんそうなのですけれども、
あるスコープ内だけだとしても状態を変更して云々しないといけない
というのが心情的に気持ち悪いと感じました。
けれど、 >>191 さんの言われるように、Perl では特殊なことではないようですので、
そういうものだと思うことにします。

>>192
な、なるほど・・・
>>198
>>197 の解説にある通り、(原則) my は変数を局所化する
ものではない。局所的な変数を宣言(作成)するものだ。
/[^\0]/;
意味和姦ね.
ヘルプ
\000 にマッチしない
>>204
ネタ?
おまえら、Perl6の本がリニューアルしてますよ。
http://www.oreilly.com/catalog/059600737X/
\0はヌル文字、つまり[^\0]はヌル文字以外とマッチ。
1以上の場合は後方参照のそれだけど。
ラクダ本のパターンマッチの章をよく読んでね。
ところで質問です。Perlのソースコードについて解説してある
サイトなどはないでしょうか?あれば教えてください。
割と綺麗に書かれているので、なくてもそれ程困りませんが。。。
perl で gzip 圧縮したファイルはどう見るんですか?

while(<*.gz>){
print;
}

とかだと中身が見えるんですが、

open FILE 圧縮ファイル名;
while(<FILE>){
print;
}


で見ようとすると化け化けになっちゃうんですぅぅ。
>とかだと中身が見えるんですが、
見えないけど

今日のおさらいじゃないけど、これじゃダメなの?
$file=`zcat finename`
>見えないけど

あれぇ? また、確認してみます。

>今日のおさらいじゃないけど、これじゃダメなの?
>$file=`zcat finename

今日のことはわからないけど、今は基本的にはおんなじこと
してます。ただ、私は Windows+cygwin 環境なんだけど、zcat
使えない場合も想定しなきゃだめになっちゃって困ってるんです…
よく読んでないけど、これとか使えるんじゃン?
http://chaichan.hp.infoseek.co.jp/qa1500/qa1886.htm
現在プログラム板にはHSP関連スレに凶悪な荒らしどもが住みついています。

・HSPに関係の無い話題でスレッドを上げまくる
・HSPオフィシャルサイトの住人を名指しで誹謗中傷する
・重複スレを乱立させる

などの荒らし行為を行っています。
みんなで団結してム板のゴミどもを追い出しませんか?

【HSP関連スレ】
【皆のレイプ魔】HSP初質P25【WWEヲタ=ハゲ】
http://pc5.2ch.net/test/read.cgi/tech/1086878505/
HSP>>>>>>>>>>>>>C=糞w
http://pc5.2ch.net/test/read.cgi/tech/1071899663/
今日もどこかでHSP初心者が質問ですP19
http://pc5.2ch.net/test/read.cgi/tech/1084089079/
HSPについて
http://pc5.2ch.net/test/read.cgi/tech/1085149790/
Compress::ZlibはActivePerlに標準で入ってるはずだから、
それを使えば?

>>201
devel.tar.gz(5.9.1)をビルドしてみました。
http://www.ring.gr.jp/archives/lang/perl/CPAN/src/perl-5.9.1.tar.gz
確かに'my $_'と出来ます。
他の特殊変数はPerlの「環境」に属するものなだけに、
むしろこの$_のように使えないことの方が正しいような気もしました。

>>202
「変数の局所化」と「局所的な変数を宣言」の違いとは何でしょうか?
myによるローカル変数はシンボルという点から見れば、
localによる変数(つまりグローバルな変数)と違い、名前空間に属してない。
$perl -e 'package p;$a;my $b;while(my($k,$v)=each %main::p::){print "$k,$v\n"}'

でもシンボルの指示対象としてのメモリ領域は同じ機構で管理されてるようにも見える。
$perl -e 'print ${&{sub{my $a="a\n";return \$a}}}'

myとlocalの違いをちゃんと理解するのは結構難しいですね。
216209:04/06/12 10:18
>212,214
ありがとう! また、月曜にガッコで試してみま〜す。
>215
いわゆるリファレンスを通じて参照するのと変数スコープを通じて利用(参照)するのは内部的には同じこと。
データの実体はそのような参照カウントが0になった時に削除される。

つまり
sub a{
my $a = "hoge"; # "hoge"の参照カウントは1
return \$a; # カウントが増える
} # ここで$aのスコープは終わりなのでカウントは減る。my変数$aは消えるが "hoge" は消えない

$b = a(); # ここで "hoge" の参照カウントは1 になる

あとこの場合my変数がlocalでも実際何も変わらない。
local変数のスコープの終わりで参照カウントが1減るだけ。
>>215
myは新しく変数を作って有効範囲の中ではそっちを
アクセスする。元の変数はそのまま残ってるので
package名をつければアクセスできる。

localはシンボルテーブルがもっている変数の領域
へのリファレンスを退避して新しい領域を割り当てる。
ブロックを抜けるときに元に戻す。

以下のプログラムのmyとlocalを入れ替えて
実行するとわかりやすいかも?

$x = 1;
print \$x, "\n";
{
my $x = 2;
print \$x, "\n";
print \$::x, "\n";
}
print \$x, "\n";
>>217-218,>>219さん。どうもありがとうございます。
頂いたレスを元に自分なりに考えてみたのですが、
「局所」というものをブロック,eval,do,subなどのコード領域を意味するとして、

local(グローバル)変数の場合
コンパイル時には全ての変数をシンボルテーブルの頭から辿る中間コードを生成。
実行時
・局所に入る。
・local関数は新しい変数用と古いシンボルテーブルエントリ用のメモリ領域を作成し、
 シンボルテーブルの該当箇所の アドレス値を新たなメモリ領域を指すように書き換え
・・・・・
・シンボルテーブルエントリを対比しておいた古い値のアドレス値に書き換え。
・GC発動(local指定された変数と待避用アドレス値の領域が参照カウント数に応じて
 ----おそらく----削除される)
・局所抜ける

my変数の場合
コンパイル時には局所専用シンボルテーブルのエントリを参照する中間コードを生成。
実行時
・局所に入る。
・my関数は新しいメモリ領域を作成し、局所専用シンボルテーブルの該当エントリに
 そのアドレスを書き込む
・GC発動(local指定された変数と待避用アドレス値の領域が参照カウント数に応じて
 削除される)
・局所抜ける
(局所専用シンボルテーブルはどの段階で作成されるのかという問題はあるけど)

概要はこんな感じでしょうか。
ちゃんとした理解には程遠いとは思いますが。。。
ああ、急いで書いたらめちゃくちゃな文章だ。
もう少し調べてからまた書きます。
>221
「実用Perlプログラミング」読め。話はそれからだ

GCと参照カウントは異なるものなので混ぜるな危険。
223デフォルトの名無しさん:04/06/12 15:44
質問します

1.
ショッピングサイトを立ち上げているのですが、”決済する” のボタンを押すと、カード会社のサイトにジャンプし
、そのサイトで情報入力を行い、その戻りを受けてユーザに完了画面を出力しようと思います。

2.
こちらから、form post で、カード会社のCGIを呼び出し、カード情報入力画面をだします。
そのCGIは結果を success 又は ng でこちらに返してくるのですが、このままのつくりだと、
ユーザにカード情報入力後の画面に success , 又はngと ぽつんと表示され訳がわからない状態となります

3.
そこで、 form post属性で他のcgiを呼び出し、その結果を受けて、”xxxx円 決済が完了しました ありがとうございます
トップに戻る” と出したいのです。form post で呼び出したcgiの結果を判定する方法がわからないので、教えて下さい。
>223
WebProg板いけ。結果のHTMLに詳細書いてるんならHTTP::Responseの$->content読めばいい。
>>224
Perl コーディング初心者質問コーナー Part35
http://pc5.2ch.net/test/read.cgi/php/1085557731/310

310 名前:nobodyさん[] 投稿日:04/06/12 13:33 ID:FD8KxqwO
質問します
(ry
>>223 板違い。
ていうかマルチかよ。
227デフォルトの名無しさん:04/06/12 16:19
>>224

とりあえず、サンクスこ
>>220
そんなメモリだGCだって深刻に考えなくてもいいんじゃ?
local は既存のシンボルテーブルの値を退避させて新しい値に入れ替える
my はそのスコープ内だけでアクセスできる”無名シンボルテーブル”と言えるようなシンボルテーブルを作成して変数を作る

俺はこう捉えてるけど誤解してるかなぁ?
Perlのオブジェクトって重いって聞いた。
あまりオブジェクト乱用して作っちゃマズイ?
オブジェクトだから遅いのではなく>>229が書いたから遅いのさ。
ってことで好きなようにしてください。
>>230
いや、まだ書いてもないし。

ココで前に見た覚えがあるんだよね。
Perlのオブジェクトは重いって。
ほとんどのルーチンをオブジェクトに書き換えようかと考えてんだけど・・・
実際の所、どうなの?
>>231
そりゃ、生でダラダラ書くよりゃ遅いさ
ぐだぐだ言わずにまずBench
233デフォルトの名無しさん:04/06/12 22:00
SYSLOGにアウトオブメモリーが大量に記録されるのでいろいろ調べてみたんだが
どうやらユーザーのperlスクリプトが原因っぽいというところまでは判明
ところが私はperlにあんまり詳しくないのでどこから手をつけていいか困っています
perlでこれをやるとメモリー資源を食いつぶすっていうような代表格みたいなのってありますか?

>>233
巨大ファイルを開いて一気に配列に読み込むとか。
再帰関数が無限ループとかはどうでしょうか?
>>233
% perl -e 'while (1) { fork; }'
おもしろいつもりなのかな
相当受けたようだな
>>233
perlの前にまずユーザに警告するべきでは?
ども、調査続行中です
データーの類に巨大なものが無いので配列の線は無いっぽいです
その後わかったことは数十分かけて使用メモリーが少しづつ増えていって使い切ったところで自殺(自滅?)してるようです
無限ループが絡んでる線が濃厚でしょうかね?
警告というほどの大げさなことはしてませんが単純なバグなら直してもらえばすむので
連絡中ですご心配ありがとです
数十分。。。
デーモンなんじゃない?
大喰らいなでーもんだな(w
漢数字をテキストで表示するカウンターにしたいんですが、
変換がどうもうまくいきません。
2345人が万二千三百四十五人と出てしまいます。
sub kansuji{
my($number) = $_[0];
my($return) = '';
my(@suji) = ("","一","二","三","四","五","六","七","八","九");
my(@keta) = ("","十\","百","千");
my(@oketa) = ("万","億","兆");
my(@nums) = split(//,$number);
@nums = reverse (@nums);
my($r) = @nums % 4;
my($limit) = int(@nums / 4);
for($j = 0; $j \= $limit; $j++){
my($ceiling) = $j == $limit ? $r :4 ;
for($i = 0; $i < $ceiling ; $i++){
my($f) = ($i != 0 && $nums[$i+$j*4] == 1) ? "" : $suji[$nums[$i+$j*4]];
$return = join("",$f,$keta[$i],$return) unless($nums[$i+$j*4] == 0);
}
$return = join("",$oketa[$j],$return) unless($j == $limit);
}
return $return;
}
どこが間違っているかご教授願います。
my($r) = @nums % 4;
my($limit) = int(@nums / 4);

たぶんここ。4桁のときは、$r=4,$limit=0になって欲しいのでは
ないだろうか? ということで、

my($r) = @nums % 4 || 4;
my($limit) = int((@nums - 1) / 4);

てとこかな。
>>244
何か気に入らなかった・・・
見た感じ、複雑に見えるし・・・
・・・で、俺も考えて作ってみた。
改行多いって怒られるんで、次につづく・・・
sub kansuji{
  my (
    $number, $count, $ketaCount,
    @suji, @keta, @oketa, @nums, @newNums
  );

  $number = $_[0];
  @suji = ('', '壱', '弐', '参', '四', '伍', '六', '七', '八', '九');
  @keta = ('十\', '百', '千');
  @oketa = ('万','億','兆');
  @nums = split(//,$number);
  @nums = reverse (@nums);

# まだつづく・・・
  $count = 0;
  $ketaCount = 0;
  foreach (@nums) {
    if ($_ == 0) {
      $count++;
    } elsif ($count == 0) {
      push (@newNums, $suji[$_]);
      $count++;
    } elsif ($count < 4) {
      push (@newNums, $keta[($count-1)], $suji[$_]);
      $count++;
    } else {
      push (@newNums, ($oketa[$ketaCount], $suji[$_]));
      $ketaCount++;
      $count = 1;
    }
  }

  @newNums = reverse (@newNums);
  $value = join('', @newNums);
  return $value
}
漢数字は意外にロジックがむずいんだが…。
ググったらこんなん出ました。
http://neko.mimi.gr.jp/~fge/pastime/ideo_digit.html
逆に、漢数字を数値に直すには?
>>250
まず聞くんじゃなく自分で考えろ。
>>251
いや、お題として面白そうだと思ったんでネタ振りのつもりだったんですが・・・

ココはノリが悪そうなのでもういいです
ショ、ションナ!!
254デフォルトの名無しさん:04/06/13 21:55
LWPでとってきたHTMLファイルがあります。
ファイル中の
<img src="a.jpg">
を絶対パス
<img src="http://..../a.jpg">
にしたいのですが、簡単な方法はありますか?

>>254
getしたURI+src部分=恐らく絶対URI
256デフォルトの名無しさん:04/06/13 23:07
>>255
絶対パスと相対パスが混在している場合を考慮すべきと思われ
257デフォルトの名無しさん:04/06/13 23:28
258デフォルトの名無しさん:04/06/13 23:31
っていうかそのへんを扱うモジュールってなかったっけ。
いま捜してるんだが。HTML::LinkExtorでもないし。
>>257
もちつけw
単純にやるなら
if http://で始まるならそのまま
elsif /で始まるならgetしたURIのhttp://address:port + 相対パス
else 上二つに合わないならgetしたURI+相対パス
260デフォルトの名無しさん:04/06/13 23:40
getしたURIをhttp://foo.com/abc.htmlとして
リンクがdef.htmlだと
〉 上二つに合わないならgetしたURI+相対パス
だとだめだべ。
http://foo.com/abc.htmldef.html



ごめん
getしたURIの一番最後の/まで+相対パスだね

モジュールも探せばあるんだろうけど別に難しくないし俺は自分でサブルーチン書いたよ
262258:04/06/13 23:54
モジュールみつからん
絶対車輪の再発明だとおもうんだがなあ
鬱だ師脳

この程度の文字列操作が車輪だって?
264258:04/06/14 00:21
だってIMG srcのところを抽出したりしなけりゃいけないだろ?
265デフォルトの名無しさん:04/06/14 00:23
>>259
ああ、もちろんPerlで書くときはそうするw
>>264
それは別の話だろ・・・
つかsrc属性値の抽出はHTML::LinkExtorだけど
おまけにスレ違い
267258:04/06/14 00:37
書きかたが悪かったかも。

HTML::LinkExtorでsrcを抽出はできるんだが、
img以外のタグはそのまま通さなければいけないだろ?

は?そのままって?
てゆーか君は何がしたいの?
#!/usr/local/bin/perl
use strict;

my (@race_code0, @race_code1, @race_code2, @race_code3);
@race_code0 = ("abc", "def", "ghi");
@race_code1 = ("aaa", "bbb", "ccc");
@race_code2 = ("111", "222", "333");
@race_code3 = ("123", "456", "789");
my @array = (\@race_code0, \@race_code1, \@race_code2, \@race_code3);

print @($array[0]);


こんな感じで参照を配列に格納して格納先から要素数を
取り出したいのですがどうすればいいのでしょうか?
要素数取り出す、スカラーを取り出したい。
>>269
print scalar @($array[0]);
print scalar @$array[0];
272220:04/06/14 03:55
ソースコードの全体がなんとか掴めたところで、
perly.cのPerl_yyparse()
yynewstate:
・・・
switch (yyn) {
/* contains all the rule actions; auto-generated from perly.y */
#include "perly.act"
}
・・・
goto yynewstate;

から

op.cのPerl_block_startという関数まで辿り付いたけど
何やってるのかよくわからないですね。
my変数用としてどんな処理をしてるのか知りたいだけなんですが。。。
273デフォルトの名無しさん:04/06/14 09:55
分からないならラクダ本引けよ。
「実用Perlプログラミング」の20章に「Perlの内部構造」ってのがあるから
もしまだなら読むといいと思われ。
具体的な作用ならEffectivePerlにも書いてるけど
どうやら実際的な実装法を知りたいだけか
>>270-271
damopo

#!/usr/local/bin/perl
use strict;

my (@race_code0, @race_code1, @race_code2, @race_code3);
@race_code0 = ("abc", "def", "ghi");
@race_code1 = ("aaa", "bbb", "ccc");
@race_code2 = ("111", "222", "333");
@race_code3 = ("123", "456", "789");

my @array = (\@race_code0, \@race_code1, \@race_code2, \@race_code3);

foreach(@array) {
print "@$_\n";
}


my $test = $array[0];
print "@$test\n\n";

#print scalar @$array[0];

コメント部分のような感じでアクセスするにはどうすればいいのでしょうか?
print scalar @{$array[0]};
>>277

できますた
279デフォルトの名無しさん:04/06/14 21:22
簡単になんでもできると聞いてパール始めたんですが黒画面に文字がでるようなプログラムしか作れないじゃん。 シーやジャバもそうだった。 つまらん。
>>279
アフォか、吊りか?さあ、どっち
C = そのままじゃGUI無理
Java = GUIできる
Perl = CGIで"GUI"OKだし Perl/tkがある
hoge.txt に m/hoge/ とか適当に正規表現が書いてあったとして、

open IN, "hoge.txt";
while(<IN>){
    chomp;
    push(@seiki, $_);
}

で $seiki[0] に 文字列 'm/hoge/' が入ったとして、
この $seiki[0] を正規表現パターンとして、別の文字列 $string に
マッチするか調べたい場合はどうすればいいのですか?
$string =~ /$seiki[0]/;
perl -e '$string="hoge";$seiki[0]="m/hoge/";if(eval "$string=~$seiki[0]"){print "MATCH"}'
「ー」←これマズイよな?凄くマズイよな?
>>284
eval のとこは "\$string=~$seiki[0]" じゃない?
つーか変数にm/,/まで入れる仕様が糞
おとなしくパターンだけ書いとけ
288デフォルトの名無しさん:04/06/15 06:54
しかしコンソール画面からの実行ってマジでマンドクセーな。
ボタンひとつで実行でき、かつ自動でブラウザが立ち上がりCGIまで試しに実行できる機能もついた夢のような統合開発環境ふうエディタ、誰か作れ。
>>288
どこが面倒なんだ。
拡張子plだったらダブルクリックでコンソール画面が立ち上がってPerlが起動。
スクリプトが実行される。
# Windowsの場合はな。

後はメニューとか作って数字打てば分岐処理してくれるように作ればいい。
コンソールが面倒とか言うお前は本当に物作るする気力があるのかと小一時間(ry
290デフォルトの名無しさん:04/06/15 08:17
>>289
コンソールはともかくとしても、CGIの動作確認がボタンひとつでできる疑似サーバ&ブラウザ的な機能は初心者には重宝すると思われ。
Perlを始めよう!とか結構便利な気がするんだが。下のウィンドウがブラウザだったら。。。
>>290
そうゆうの以前作ろうかなと思ってたけど
結局ローカルにApache入れればその方が現実的な環境なんだよなぁ・・・
でもコンソールも使うけどねぇ・・・perl -c とか
293デフォルトの名無しさん:04/06/15 10:30
いきなりすみません;

二次元配列のメモリの確保のしかたを教えて欲しいんですが…
>>293
いや・・・
メモリとかは勝手にPerlさんが確保してくれる訳だが。
295デフォルトの名無しさん:04/06/15 11:41
>>294
あー、でも分かるなあ。
昔はメモリにマシン語領域確保してポークとかピークとかアンド演算子使って1ビット単位でメモリを直接いじってたからなあ。なんせ1バイトも無駄にできない時代だったからね。
今のパソコンってそういうのやりにくいよね。
OSの管理から完全に解放され、ユーザがまったく自由に扱えるメモリ空間がほしいときはたまにある。
296デフォルトの名無しさん:04/06/15 11:46
print "Location:xxxx.cgi?para\n\n";
で、表示されるフレームを target='_top' のようにやる方法を教えてください。
>>295
やりにくいかどうかはべつにして、確保したメモリー内で
自由に1ビット単位で使い倒してもらっていいのだが・・・

>296
WebProg板行け。HTTPヘッダのレベルではそういう解決はない。
呼び出し側のブラウザが決定することだ。
ムリヤリやるなら
CGI呼ぶ→結果のHTMLがjavaScriptで別窓を開く→その結果のHTMLはまたどこかへmeta refresh で飛ぶ
299デフォルトの名無しさん:04/06/15 14:28
質問です。

MACアドレスを取得したいのですが、どうしたらよろしいでしょうか。

IPアドレスの取得までは分かったのですが。
色々と調べても、MACアドレスについて(特にperl)は資料がなく困っています。

`/sbin/ifconfig eth0` =~ /HWaddr\s+(.*)/; print "$1\n";
301デフォルトの名無しさん:04/06/15 16:06
読み込むファイル内に変数が書かれていて、
その変数を置き換えたい時はどうすれば良いの?
以下は思いつくけど、単に置換えている状態。
普通に変数は変数として、当てはめる事は出来ない?
# 変数が多いので、置換えをいちいち書くのは美しくない

file.txt
---
$A is a $B.
---

CH.pl
---
#!/usr/local/bin/perl
$A="This";
$B="pen";
open(IN,$ARGV[0]);
while (<IN>){
s/\$A/$A/;
s/\$B/$B/;
print ;
}
close(IN);
---
% CH.pl file.txt
This is a pen.
これってevalでできるの?おれも知りたい。
>>301-302
#!/usr/local/bin/perl
my $A = 'This';
my $B = 'pen';
{
  local $/ = undef;
  my $data = <DATA>;
  print eval "qq/$data/"; # デリミタは適宜変更
}
__DATA__
$A is a $B.
304302:04/06/15 17:09
ああ、なるほど。>>303どうもありがとう。
305301 :04/06/15 17:24
>>303 ありがとう。
かっこえー。
しかし、自分が使っているリファレンスが簡易版?だからか、
載っていない文法/用法だ…
勉強になりました。
CookBookには他の方法も載ってたね。
……どんなのだか忘れた。
$obj->method()
みたいなのも大丈夫だった記憶があるんだけれど。違ったっけ?

こんな感じだっけ?

s{
(\$[\w\[\](){}#>-]+)
}{
$1
}egex;
308デフォルトの名無しさん:04/06/15 23:59
ちょっと質問ですが、

#!/usr/bin/perl -w
use strict;
foreach my $num ( 0..9 ) {
print "$num";
}

これってなにも表示されないんですが、仕様ですかね。。
ちなみに、print "$num\n";もしくは、foreachのブロックを
抜けた後に改行をプリントすると表示される。。。。

ちなみにperl5.8.0です。
309308:04/06/16 00:03
ちなみに、

print "aaaaaa"

も、改行いれないとなにも表示されない。。。
しらなかった。。。
perl -e '$|=1;for(0..9){print;sleep 1}'
改行記号でバッファのフラッシュすることになってるのでは
>>308
>>309
よくわからんが・・・
バッファしてフラッシュしてないからだろ。
改行するとフラッシュする。
312311:04/06/16 00:11
なんてこった・・・
レスがかぶっちまった・・・○| ̄|_
313308:04/06/16 00:29
>>310,>>311
レスありがとうございます。
どうも、私の端末の原因のようです。

310さんが提示してくださったように、sleepを入れて実行したところ、
0から9まで表示された後、表示が消えてしまいました。
(また、プロンプトだけに戻ってしまった。。。)
なので、ちゃんと表示はしているようです。

Cで書いても同様でしたので、Perlとは関係なさそうです。。。
お騒がせしました。。。m(__)m
314デフォルトの名無しさん:04/06/16 00:30
>>313
いやPerlとおおいに関係のある話だが。
315デフォルトの名無しさん:04/06/16 00:31
Cのstdioにも似た仕組みがあるというだけ。
perl -e 'for(0..9){print"$_"}'
perl -e 'for(0..9){print"$_a"}'

後者では端末に何も表示されません。どうしてでしょうか?
317308:04/06/16 01:05
原因がなんとなく判明しました。。。
zshを使っていたのが原因だったようです。

シェルをbashに変更したところ
問題なく表示されました。。

たぶんフラッシュ自体は、プロセス終了時に行われるんだと思います。
>>316
よ〜く考えよぉ〜
オカマは男だよぉ〜

うぅ〜う〜うぅ〜う〜うううぅ〜
>>318レスは難易度高いと思われ

>>316
perl -e '$_a="MANKO\n";for(0..9){print"$_a"}'
を試してもらえればきっとどうしてか理解してもらえるだろう
${_a}こうなっていたんですね。
321デフォルトの名無しさん:04/06/17 03:35
現在Win98SP4上で ActivePerl v5.6.1 を利用しているのですが、
この環境で、ActivePerl Build 522 をインストールしても
両方のPerlを共存させる事は可能でしょうか?

目的はJPerlを利用したい為です。
322321:04/06/17 03:43
すみません、Win98ではなくWin2kです。
できる
ただあんたにパスの指定ができる能力が必要

ただASP.Perlとか使う場合はまた別だけど
>>299
無理だからしんどけ
おとなしくCで
325デフォルトの名無しさん:04/06/17 04:32
C言語みたいに別ファイルに定数定義して、
それから定数を参照・使用するって可能ですか?
>>352
可能
イロイロ方法はある

別ファイルをevalでメモリに読み込むとか

.pmでモジュールをつくって
それをuseすればいい
327321:04/06/17 04:49
>>323
ども、いちおうできたっぽいです。
デフォルトで5.6.1ではなくて.5.005_03が使われるのが気になりますけど。
JPerlは糞!
だよね
perl5.8最強伝説
日本人ならPerl5.8必須だろ。プロバイダの鯖はいつまで5.6入れトンじゃボケ!
>>330
バージョンアップの要請メール送ったか?
大体は鯖管理者にメール送れば、結構柔軟に対応してくれるけど・・・

プロバ鯖か・・・
微妙だな・・・
でも、どうしても5.8にしてほしいならメール送らない事には何も始まらない。
332デフォルトの名無しさん:04/06/17 12:47
perlccについて質問ですが、モジュールを利用したPerlをバイナリに変換して
該当のモジュールを入れていないマシンで、そのプログラムを動かすことが
できますか?
5.8にする予定はあるかと聞いたら「する予定はあるが時期は未定。しかし数ヶ月〜半年以内などということは無い」だと。
おいおい…5.8シリーズはもう十分安定していると思うのだが…
「時期が未定」これって予定がないのと何が違うんだ?
>>334
予定がない = そんな事する意思なし。
予定は未定 = 意思はある。けど、そのうちな〜。

意味はおおいに違う。
意味は違うが結果は同じ orz
>>332
PARならできるようだが、perlccはどうだろう?つーかperlccはまだβ版ですらないからなぁ。
338デフォルトの名無しさん:04/06/17 14:12
>>332

解答ありがとうございます。
PARについて調べてみたいと思います。
339デフォルトの名無しさん:04/06/17 14:38
PARって何?改造ツールのあれ?
340デフォルトの名無しさん:04/06/17 14:51
341デフォルトの名無しさん:04/06/17 14:53
>>340
ありがとう。
ARはARCHIVEのことなんだ。
Perl2exeでも一応モジュール含めて単一バイナリにできるけど
予定がない = キッパリ!
予定は未定 = いえね、旦那、そうする積りがあるようなないような、ぐにゃぐにゃ.......さーて、どっち
スマソ。誤爆した。
予定がない = よそ行きゃいいんだよ
予定は未定 = やる気はないが、ずるずると引き留めとこう

>>333
5.8 にすることで、既存の (ユーザの) スクリプトが動かなくなって、
トラブルやクレームが大量に発生するというような可能性もあるわけで、
そう簡単に、はいアップデートします、とはいかないでしょう?
5.8 自体が十分に安定してるかどうかとはまた別問題で。
うーん?
5.6、5.8間で、互換を失うようなバージョンアップあった?
文字コードまわりにたくさん無かったか?
tr///に2バイト文字が使えるようになったとかそんなんだったような気がする
内部的にUTF-8で動作するようになるんだっけか。
350デフォルトの名無しさん:04/06/17 21:25
perl-5.8をrpmで固めたいんだけど、色々と調べても今ひとつ解りません。
「この通りすればO.K.」みたいなサイトはありませんか?

checkinstallも試してみたけど、「installのルールがありません」でエラーが出てしまうし。(;´д⊂
rpm?
REDHATスレできけや
5.005とかならともかく、5.6からならあまり問題ないような>5.8
jperlで作ったコードの移植は大変だったけどね。
う〜む。何もいきなり/usr/local/bin/perlを5.8にしてくれ、というわけじゃないんだ。
とりあえず/usr/local/bin/perl5.8を用意して、ユーザーにその旨を伝え、
移行期間(半年程度?)を置いた後に/usr/local/bin/perlを5.8にしてくれればいいのだ。
もちろんその際/usr/local/bin/perl5.[56]は残しておいてくれてかまわないわけで。

あああマンドクサイですかそうですか。
でもよほどのことがないかぎり
5.6でもいいような気がする。

5.8使いたい理由ってなんだ?
どうせ5.6のモジュール使えば解決する話だろ。
>>354=>>333のプロバのアホ管理者
Perl5ってLallyが1人で開発してるの?
>>354
面白い香具師だな!
>>354
5.8を使いたい理由はただ一つ。Encodeモジュールだ。
>>358
perl5.6で
Jcode.plか
Jcode.pm使えや


#■■終了■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
>>354
スレッド
あと、標準モジュールどっさり。
俺、Perl標準モジュールの使い方一つもしらねーや・・・
他の人が作ったライブラリで使用してるのは、jcode.plくらい。
後は自分で作ってるし・・・

Perl標準全モジュールの使い方が載ってる本とかありますか?
362デフォルトの名無しさん:04/06/18 00:59
>>361
CPAN
>>360
スレッドっているか?forkでよくね?
そこまでパフォ上げたいなら
PHPかJSPにするだろ。
PHP!出た!PHP出た!得意技!PHP出た!PHP!これ!PHP出たよ〜〜!
365デフォルトの名無しさん:04/06/18 11:00
速度
Perl>>>PHP
PHPしか書けない漏れはPG失格ですか、そうですか、、、、、凹
別にPHPだけでもそれで出来る事は大抵やれるっていうんなら
PGって名乗っても悪くはないと思うけど。

けど「PG」って堂々と名乗りたいなら、何に限らずある程度複数の言語を使え、
それぞれの言語である程度のものが出来る程度のスキルは無いと、
まあ、恥を掻く事があるかも知れない。
>>361
俺も最初はjcode.plしか使ってなかったけど、標準モジュール使い始めたらjcode.plなんて全然使わなくなった。
CGI,Jcode,(CGI::Pretty),CGI::Carp,HTML::Entities,POSIX
CGI作るときのオススメー。
以後このスレは5.8をインストールできないドキュソな管理者を
責めあげるスレになりました。5.6と共存でもいいじゃん。
/usr/bin/perlは5.6のままでいいからさ。
perl5.8ってpthreadいるんでしょ
そりゃpthread入ってない環境もあるだろうし
めんどいじゃん
5.8じゃなきゃいけない理由を挙げてみろよ
あたらしいことはいいことだ。
utf8な文字列をまともに扱いたいんだよ。
375デフォルトの名無しさん:04/06/19 01:18
Perl6をPerl5のインタプリタ上で実装してるパッチとかありますか?
あったら見てみたい、使ってみたいのですが。
>>375
まぁPerl6ってperl5を使わないと動かないんだけどね・・・
なんか遅そうですね
378Perlerの本音:04/06/19 08:00
スクリプト言語なんていくつあってもいい。
sh,Scheme,Python,Ruby,...普通に使える。

とはいいつつも一番手に馴染んだものってのが
やっぱりあって、それが僕の場合はPerl5なんです。
こういうのはもう理屈じゃない。体が覚えてるようなものだから。
真珠が埋め込まれている肉体。
ここはお前の日記ty(ry
crontabで実行するとき
42 * * * * script/test.pl -I /home/hoge/script
としてtest.pl内useしているcommon.pm /home/hoge/script/common.pm
のディレクトリを@INCに追加したいのですがうまくいきません。
どうすればいいのでしょうか?
>>381
test.pl で use lib すれば?
>>382
pwd
/home/hoge
dir
script/test.pl
script/common.pm
./script/test.pl

この環境の場合
use lib 'script'
でokですか。

フォルダが変わった場合ソース弄るの嫌なんで
オプション指定で解決したいのですが。



#21 * * * * cd script; ./test.pl
#の方法を思いついたのでこれにしました。
>>383
use lib '/home/hoge/script';
use common;

42 * * * * /home/hoge/script/test.pl

でいいいじゃん。

> フォルダが変わった場合ソース弄るの嫌なんで
> オプション指定で解決したいのですが。

普通モジュールってのはいろんなプログラムから使う、って事で
モジュールにするわけだから、プログラムとの相対位置関係を
維持するって発想は間違いで、どっからでも使える絶対位置に置く
ってのが基本じゃない?

俺は /home/hoge/lib/ とかに置いていろんなとこにあるいろんなプログラムから

use lib '/home/hoge/lib';
use script::common;
ってやるよ。
test.pmがどこにあろうがpwdがどこだろうがソース弄る必要ないよ。
use FindBin qw($Bin); # 実行ファイルのパスを取得
use lib "$Bin/../lib"; # 実行ファイルのあるディレクトリから相対的にライブラリをインストールしてあるディレクトリを指定
>>385

       ヽ(・ω・)/   ズコー
      \(.\ ノ
    、ハ,,、  ̄
387デフォルトの名無しさん:04/06/19 23:16
正規表現についての質問です。

"XXAXX\nXX\nXAXX"
という改行を含んだ文字列があってA〜Aの間を取りたいと思っています

/A.*A/ではドットが改行を含んでいないので取得できません
/A[.\n]*A/だとできるのかなと思ったらできませんでした。

なんとかA〜Aを抜き出す方法があれば教えてください。
/A[^A]*A/は無しにしていただけると助かります。
(本当はもっと複雑なのでA以外を取得という技は使えないのです)
/A.*?A/s
389黒死犬 ◆EgxBlf8nvc :04/06/19 23:26
m オプションを付けなきゃダメさ
390黒死犬 ◆EgxBlf8nvc :04/06/19 23:28
あ、sだったけ、でしゃばって御免
sかmのどっちなんだろ?

なんだ?なんかエロい感じがするぞ?なんでだろ?
sでした。ちなみに私もsです。
>>388-390
ありがと〜
5.6でいいっていってる奴は国際化やったことねーだろ。
perl -e 'use encoding "euc-jp";print length "こんにちは"'
DBのスキーマからWeb出力までUTF8で統一するのに、
一番邪魔なのが古いperlだ。
Perl5.005,Perl5.6は老害
それでもperlを選んでる辺りが低脳ですね
>397
毎回全部書き直して環境も変更できると思ってるのか?若いな。
糞SEは黙ってたほうが吉
400デフォルトの名無しさん:04/06/21 09:30
(駱駝本の)スカラーコンテキストでの範囲演算子の動きが理解できないのですが、
詳しく説明しているHPはないでしょうか?
>>400
例えばどんなコード?
402デフォルトの名無しさん:04/06/21 10:02
>>401
コードも判りませんが、それ以前に本の解説がわからないです。
>>402
駱駝本に例になるコードが出てるだろ。それが実際に動くような
スクリプトを書きゃいいじゃん。それが理解の第一歩。
それとも、上げ膳据え膳の解説が希望なのか(w
スカラーの".."はおれも分らん。まともな説明も見たことない。
でもつかわなそうだし、別に理解しなくてもいいんじゃね?
行範囲演算子として使えれば、十分。
$perl -ne 'if(3..5){print}' /etc/group
407じゃね?:04/06/21 10:32
じゃね?
perl -e '@a=(0,1,1,0,0,1,0,0);for(0..$#a/2){print+($a[$_*2] .. $a[$_*2+1])?1:0}'
こういうのでいいの?つまり真偽の状態を持つ演算子ということで。
$_の値が
0(0,1)=左が偽である限り状態は偽
1(1,0)=左が真にになったので真。右に真が来るまで真
2(0,1)=右が真になったので、次の状態↓からは偽。ここは真
3(0,0)=左が偽であるので状態は偽($_=0と同じ)

これでいいかな?
>>405
正規表現も便利だぞ
while(<>){
 print if /start/ .. /end/;
}

これにstartとendを含む行があるようなテキスト食わせてみ

なるほど、確かにスカラ文脈でも範囲を表してるわけだな
テキストのサーチなんかでいちいちフラグ使わなくてもよさそう
411デフォルトの名無しさん:04/06/21 13:15
kbhit()みたいなことできますか?
>411
Term::ReadKey
モジュールについているパッケージ名で
package Term; # とか
package Term::Readkey; # とか
package Term::Foo; # とか
等があった場合 Term の部分が共通していますが、
これらは全く別物で関連性がないものとして扱われるんでしょうか?
関連性があるから共通部分があるとは思えないのかね?
簡単に言うと
Foo::Bar::Baz とあるなら
Foo::Bar::Baz は Foo::Bar を利用し
Foo::Bar は Foo を利用している
415デフォルトの名無しさん:04/06/21 15:38
質問です
10分ごとに処理させるプログラムなのですが
time関数でむりやり組んだのですがidx値が10.万を超えてしまって
まともに動かないんですが
いいプログラムあればご教授ください
bacetime();
while(1) {
print"------- work ------\n";
msleep(5000);
thistime();
}
sub bacetime
{

$basetime=time;
}
sub thistime()
{
my $thistime;
my $idx;
$thistime=time;
$idx=$thistime-$bacetime;
if($idx >= 600) {

bacetime();
}
print $idx;
print "\n";
}
>>414
そういうことを聞いているんじゃないよ。
417413:04/06/21 16:36
>>416
勝手に答えんなヴォケっ

>>414
他のモジュールをさらっとみてきましたけど
package Foo::Bar::Baz; # は
use Foo::Bar; @ISA=qw(Foo::Bar);
package Foo::Bar; # は
use Foo; @ISA=qw(Foo);
のような傾向になってましたけど、このようにuseとか@ISAを指定していなければ
やはりモジュール同士は全く関係がないという事でしょうか?
418416:04/06/21 16:38
>>417
何を偉そうに、
>>417-8
下手くそな自演だな(w
まあ勝手にしてくれ。
禿げ
421デフォルトの名無しさん:04/06/21 17:47
>>415
cron使うという考えはないわけ?
422デフォルトの名無しさん:04/06/21 18:06
すみません、超初心者の質問です。
私は、C/C++(VC,BCB)、PASCAL(DELPHI)をそこそこ使えるのですが、Perlの難しさに困っています。
CGIを作る事を前提にPerlを学ぶとして、良本を紹介して欲しいのですが、お願い申し上げます。
423デフォルトの名無しさん:04/06/21 18:09
俺的には

> C/C++(VC,BCB)、PASCAL(DELPHI)をそこそこ使えるのですが、

これと、

> Perlの難しさに困っています。

これが繋がらない。
424デフォルトの名無しさん:04/06/21 18:15
>>421さん
モジュールやライブラリで使用したいので
cronは無理です
425422:04/06/21 18:36
MASM(DOS)も使えるのですが、C、BASIC(VB)と言うのは、高級アセンブラ+ライブラリーでしょ。
つまり、以前にMASMなどのアセンブラを学習しておけば、N88-BASIC(86)など簡単に使えるし、これにイベントの考え方、コントロールの考え方を理解すればVBも使えます。
Cなど、構造化アセンブラーで、DOSの時代には、コンパイルされた後のアセンブラーソースも想像しながら書いていました。
つまり、パラダイムが同じなんですね。C++は、若干苦しみました。OOPですね。

でも、Perlという言語は、本当の意味の高級言語で、呪文の様な1行でCなら数行書かなければいけない事を出来そうです。
この上、暗黙の変数?ってのが、よく分かりません。
今、読んでいる本は、Perlを体系立てて説明していないので、非常に困っています。
?って変数だったか?
427デフォルトの名無しさん:04/06/21 19:01
> C/C++(VC,BCB)、PASCAL(DELPHI)をそこそこ使えるのですが、

これを自慢したくて書き込んだとしか思えない。
428422:04/06/21 19:03
>>427
 自慢にならんよ。
 同じパラダイムの言語を何個使えても、単語の入れ替えだけじゃん。
>>415>>424
my($wait,$time) = (600,time);
while(sleep(1)){
if($wait <= (time - $time)){
$time = time;
print "$time\n";
#ここで処理
}
}

何をするのか分からないが
単純に約10分ごとに秒を出すような処理
ふと思ったのですが、
print (scalar 1,10);
これを実行すると、
110
と出力されます。
scalar演算子君は無視ですか?
431デフォルトの名無しさん:04/06/21 19:36
>>429 ありがとうございます
早速組んでみます
>>430
> scalar演算子君は無視ですか?
いいえ。
print(scalar("aaa"),"bbb");
print("aaa","bbb");
"aaabbb"
>>430
print (scalar 1,10);
print scalar( 1) ,10;
print scalar( 1,10);
:
:
print scalar(@{[1 ,10]});
>>417
Foo::Bar という表現はBarクラスはFooクラスを継承してますよという意味で使われるので
全く関係が無いなら使うべき表記じゃないしコード上でも使えないはず
FooとBarが関係ないならFoo::Barは存在しないわけだから
>435
的外れ。Foo::BarとFooおよびBarは無関係。
正確には、Foo::BarはFooパッケージの中にあるので、Fooのシンボルテーブルを削除するとFoo::Barまで消えてしまったりするが、言語レベルではそれだけの関係に過ぎない。
例えば、CGIクラスとCGI::Carpクラスは互いに関係無いクラスだ。

ただ、意味的には関係のあるクラスを入れ子にするのが一般的だろうけどな。
とりあえず Term パッケージというのは存在しない。
438413:04/06/22 00:30
答えて下さってる皆様ありがとうございます。
>>437
とりあえず>>412を見て質問を考えました。

>>419-420が出てきたのでとりあえずperlmodを読んでみましたが、答えになりそうな
> パッケージは、$OUTER::INNER::var のように、別のパッケージの
> 中にネストすることもできます。 しかし、これが名前の検索順序
> に関るものではありません。 すべてのシンボルは、その時点のパ
> ッケージにローカルであるか、完全な形でパッケージ名をつけて、
> 外部のパッケージから導入したものでなければなりません。 たと
> えば、パッケージ OUTER にいるとすると、$INNER::var という表
> 現は、$OUTER::INNER::var を参照します。 パッケージ INNER は、
> まったく独立したグローバルなパッケージとして扱われます。

> たとえば、パッケージ OUTER にいるとすると、$INNER::var という表現は、$OUTER::INNER::var を参照します。
の部分がよくわかりません。
というか試しに書いてみたスクリプトでは
package Fooで$Bar::varを触るとpackage Barの$varを触っている事になってしまうんですが、
どうなるのが正しいのでしょうか?
>>436
>ただ、意味的には関係のあるクラスを入れ子にするのが一般的だろうけどな。
んじゃ一般的に
>Foo::BarとFooおよびBarは無関係。
とは言えないんじゃ?
にしても
>CGIクラスとCGI::Carpクラス
のように必ずしもモジュール名=クラスの継承関係じゃないってのは引っかかるなぁ・・・

>>438
package Bar で @ISA = qw(Foo) したかい?
最後の文変ですね^^;
よく読んでなかった
>>438
>package Fooで$Bar::varを触るとpackage Barの$varを触っている事になってしまうんですが、
>どうなるのが正しいのでしょうか?
そうなるのが正しいです。
package Bar で @ISA = qw(Foo) したなら
Foo内で $Bar::var は $Foo::Bar::var ですし、BarがFooを継承していない場合は
$Bar::var は単に package Bar の $var です。クラスの階層としてはFooと同レベル。
いずれにせよpackage Barの有効範囲内の$varであることに変わりは無い


で合ってますか?エロイ人w
441413:04/06/22 03:02
英語のままのperlmodを機械翻訳2種類ほどにかけたところ、
どちらも日本語perlmodとは違う訳し方で似たような結果になったので
名無しさん@英語勉強中の方々(←どうもありがとうございます)に聞いてみたところ
> たとえば、パッケージ OUTER にいるとすると、$INNER::var という表現は、$OUTER::INNER::var を参照します。
ではなく
「例えば、 package OUTER の範囲内で、 $INNER::ver が $OUTER::INNER::var を参照する事はどこにもない。」
の方が正解に近いようです。(←名無しさん@英語勉強中の方々には失礼ですが否定されたときの伏線です)
つまり、継承していてもしていなくてもpackage Foo内でもpackage Foo::Bar内でも
$Bar::varはpackage Bar内の$varを参照するということになるはず。
442540:04/06/22 05:16
perl cgiでデータベースを扱いたいのでSQLを使いたいのですが、可能でしょうか?
関連サイトサイト探したのですが、リナックスの奴しか見つかりませんでした。
関連サイトありましたらおしえてください。
windows2000、自サーバです。
443デフォルトの名無しさん:04/06/22 07:03
> perl cgiでデータベースを扱いたいのでSQLを使いたいのですが、可能でしょうか?
可能
> 関連サイトサイト探したのですが、リナックスの奴しか見つかりませんでした。
リナックスの奴とは?
> 関連サイトありましたらおしえてください。
ttp://www.google.co.jp
> windows2000、自サーバです。
自サーバとは?
444デフォルトの名無しさん:04/06/22 08:54
445デフォルトの名無しさん:04/06/22 09:29
てか
PostgreSQL/cygwin
MySQL
FireBird

全部 Linux/Windowsで動くだろうが

IISならMySQL/ODBCだかそんなのでうごくし
WindowsでActivePerlなら、
PPMコマンドでDBIとDBD-「ほげ」をsearch してみてください。
「ほげ」の部分はお使いのDBによって変わります。

>>413,438

パッケージ名は階層をつけることができるが、
階層の親子間では特に言語的なサポートは何もない。
階層をつけるのは作成者によるカテゴリ分けを容易にするため。

ここでいう言語的なサポートは
「継承」や「階層の親パッケージの参照」のことね。

ただしある配布パッケージが、複数のPerlモジュールを含み
それらがパッケージ階層を構成していることは珍しくない。
LWP などがそうだね。

要するに、TMTOWTDI ってこと。
449デフォルトの名無しさん:04/06/22 13:49
パッケージの中にリストコンテキストを入れたいんですけど、検索のキーワードは
何がいいでしょう?
調べてもキーワードが悪いので、思っている内容にヒットしません。

モジュールのサブルーチンで

my $self = shift;
$chr[0] = 'test1';
$chr[1] = 'test2';
$self->{data} = @chr;
return $self;

こんな感じにして、
呼出側で

@chr = $pkg->{data};
print "$chr[0]\n";

こんな感じでしてみましたがダメでした。
なぜダメかもわからんし……。
$self->{data} = \@chr;
@chr = @{$pkg->{data}};
じゃないの?
451デフォルトの名無しさん:04/06/22 14:38
>>450

ありがとうございます。
その書き方は知りませんでした。
解決しました。
>>451
ラクダ本のリファレンスのところは暗記するほど読んでおこうね
453413:04/06/22 16:21
>>448
ありがとうございます。
これで階層の深いパッケージの意味がわかったのでうまく扱えそうです。
お付き合いいただいた皆さんどうもありがとうございました。
454デフォルトの名無しさん:04/06/23 02:22
例えばモジュールの中で
bless {
foo => undef,
hoge => undef,
},$pkg;
と定義されていて、利用するプログラムから
'foo'や'hoge'の部分の名前を知る方法はありますか?

手持ちの入門書にはここら辺の事が書かれていないので、
呼び方もわからないので巧く表現できませんがお願いします。
>>454
> 例えばモジュールの中で
> bless {
> foo => undef,
> hoge => undef,
> },$pkg;
> と定義されていて、利用するプログラムから
> 'foo'や'hoge'の部分の名前を知る方法はありますか?
> 手持ちの入門書にはここら辺の事が書かれていないので、
> 呼び方もわからないので巧く表現できませんがお願いします。

sub Vars {
my $self = shift;
my @vars = keys %{$self};
return wantarray ? @vars : \@vars;
}
456455:04/06/23 03:06
意味的にvarsじゃなくてkeysですた。
しかも無駄に引用レスしちまった。(;´Д`)スマソ
457454:04/06/23 10:04
>>456

理解でしました。
ありがとうございます。
458デフォルトの名無しさん:04/06/23 23:24
Perl6はまだですかね?
あと10年
パロットがv0.10だもん
バージョン0.1上げるのに1年かい。
お忙しいところすいません、宜しければご教授ください

os Windows2000 ActivePerlv5.6.1で
Perlモジュール (FFST) playSoundを使用したいのですがうまくいきません

playSound('use/mawa.wav', 120);

一応再生は出来るのですが、
PlaySoundを呼んだ時にしばらく止まってしまします
数分するとなんとか機能取り戻すのですが、
それまではタスクからも止まりません

初歩的な質問なんですが、すみません。

環境変数を表示するperlのコードをfoo.plとでもして、chmod +xしておきました。
ファイルの先頭も#!/usr/bin/perlとだけ書いたのですが、./foo.pl として実行
しようとすると、bashがそんなインタプリタないぜ、とか言ってます。
もちろん、perl foo.plは正しく実行できますから、パスは通っています。
463デフォルトの名無しさん:04/06/25 04:00
telnetで接続するとシェル(shやcshやcmd.exeやcommand.com)が起動し
telnetを通してシェルが操作できるサーバーを作っています。
サーバーの部分は問題なく出来たのですが、シェルを起動する部分で system('/bin/sh'); としたところ
スクリプトを起動したコンソールにシェルのプロンプトが出てしまいます。
また、telnetで接続してきたクライアントからの入力をシェルに渡す事が出来ません。
クライアントからシェルの入力を受け取りクライアントに出力を渡すにはどうやればいいのでしょうか?
>>462
which perl
とか。
>>463
かなりスレ違いじゃねーのかと・・・
telnetでシェル起動するサーバって・・・
telnetで接続できて、シェルが起動しないtelnetって何の価値があるのかと。

何してんだかわかねーが・・・
素直にtelnetデーモン入れろよ。
>>465
>telnetで接続できて、シェルが起動しない

ftpd とか httpd とか。
>>463
Net::Telnet とか Expect とか使えば?
と微妙なレスをしてみる。
Perl/Tk 使ってる人ってあまりいないの?
単独スレ需要なし?
>>468
餅は餅屋。
PerlでGUIプログラムするのって間違ってる派。

GUIやりたいなら、違う言語を学べ
本格的なアプリ作るならともかく、さくっとGUI作れるのは楽でいいぞ

>>468 >>470
賛同者がいるかようだからスレ立ててみたら?
おれは今のところ関心無し。
472470:04/06/25 10:50
過去スレ読んでも稀にしか質問ないし、特に必要性は感じてないけどな
ここでいいんじゃねーの、数が多けりゃ別スレにでもするのがいいだろうけど

話し逸れるが、どうせ別にするならWindows を別にしてくれた方が有り難いな
*BSDのlibexec/telnetd/*.[ch]を見て勉強しよう。
いや、したいと思います。。。
Perl/Tkの使用自体は別に反対でも賛成でもないけど、人口が少ないのでスレには反対派。
このスレの中でTkしても間に合う。

俺はたまーーにTkする。
…ってもインタプリタなperl君だから自分専用作業のためのGUIしか作ったコトないけどね。
Perl/Tk使ってみたい派 一票
Tcl/Tkスレがあるからそこですれば?
PHP みたいに HTML 風の <% print "hoge"; %> のような記述をする
テンプレートエンジンがよくあると思いますが、
例えば、メールのメッセージを作成するようなケースだと、こういうタグ形式よりは、
もっと行指向ベースなテンプレートで記述したいと思うことがよくあります。
そういった用途に向いたテンプレートエンジンでお勧めなものがあれば教えて下さい。
なんの話なのかさっぱりだ。普通にヒアドキュメントでいいんじゃねえの?
インタプリタのテンプレートは使い難い
ASPやJSPでもなければ普通に書こう
よくウェブのプロジェクトだと、プログラマーとデザイナーで分担すると思いますが、
同様に、実装者 (プログラム書く) と運用者 (メール文面書く) を分担したいのです。
複雑な制御構造とかは要らないのですが、変数→文字列置換に毛が生えたくらいのが
できるようなものはないかなあと。
などと質問する暇があったら自分で実装した方が早いですかね。
この質問は取り下げます。

スレ汚し大変失礼いたしました。
自分で作った方が早いよ
後々不満だらけに成るからカスタマイズ出来ないと窓から投げたくなる
$html_out =~ s/<!-- html_hoge -->/$html_hoge/;
みたいなコードが大量にあるんだけど、ひょっとして邪道?
普通
別に邪道ではない
けど
$html_out =~ s/<!-- ([a-zA-Z0-9_]+?) -->/$1/;
こうかな
$html_out =~ s/<!-- ([a-zA-Z0-9_]+?) -->/${$1}/;
こうか
>>488
全部同じ処理じゃねーか
別ファイルにして、埋めるところは全部 %s にして、sprintf で一気に流し込んでいるです。
491463:04/06/25 22:15
ありがとうございます。
えーと、telnetdとはちょっと違って接続したら認証はなくて直接シェルが出てくる感じです。
えーと、とりあえずtelnetdのソースをもう一度見てきます。
ログインシェルとして起動した?
bashなら -lとかつけて

とか関係ないレスつけてみる。
>>491
systemじゃなくて、openでパイプ
>>478
Perlのフォーマットとかはどうよ?
495デフォルトの名無しさん:04/06/26 12:26
今日こういうソースを見たのですが・・・

@queue : shared = ();

これは何をやっているのですか?
空の配列を宣言?しているのでしょうか
ただ宣言するだけでも空になると思うのですが・・・
明示的にしているとか?
ちなみにパッケージは
use threads;
use threads::shared;
です
perl -e 'use threads;use threads::shared;@queue : shared = ();'
なんでこれが通るんですか?
497495:04/06/26 12:41
失礼!

@queue : shared = ();

ではなくて

my @queue : shared = ();

でした
>>497
そのソースどこから落とした?
499デフォルトの名無しさん:04/06/26 13:32
Perlの開発に使えるような統合開発環境ってありますか?
出来ればLinuxで。
perl -MO=Concise -e 'my @q:shared=()'
コンパイル後のこの出力を理解できるようになれれば
いいんですけどね。なかなか。
Perlの開発はラリーにおまかせあれ
502495:04/06/26 14:09
>>501
次のスレタイ?
>>495
スレッドで共有する変数の宣言、および初期化
505495:04/06/26 15:16
>>504

そういうことみたいですね。で、調べてみたら、

ttp://www.donzoko.net/doc/memo/perlithreads.html#note_context

Perlのスレッドシステムは「明示的な共有データ」という考えに基づく。
→デフォルトでスレッド間でデータを非共有。
これによりスレッドセーフなモジュールの開発を簡単にしてくれる。

とあるので、まさにこれがその書き方なんでしょうね。

で、これらの共有変数に対してウェイトセットに入っている
スレッドを

cond_broadcast(@queue);

として起こしてあげる、と。
なんとなく雰囲気はつかめました。
どうもありがとうございました。
>>504
初期化とはどういう意味があるんでしょう?
>>506
my @foo = ();
上記の文については、空の初期化は無意味。my宣言したものは常に空だからね。
my @foo; # @fooは空だからね!
まぁ、こんなコメントをつける代わりに、 =()をつけていると思っていいよ。
初期化しないで使ったら警告でまくり
>>508
例えばどういうケース?
my @queue : shared = ();
これのコロンはなんていう演算子?
http://perldoc.jp/docs/modules/threads-0.99/threads/shared.pod
shared属性( my $var : shared )を使うことで、ある変数をコンパイル時に
共有化されたものとしてマークすることもできる。
質問させてください。

トラックバックのpingを実装しようとSocketでPOSTリクエストをする
スクリプトを書きました。実際にリクエストはできるのですが、相手側からの
意図した応答が得られませんでした。リクエスト内容を教えていただけませんか?

ttp://lowlife.jp/yasusii/stories/8.html
ここのリクエスト内容を参考にしました。

ttp://www5e.biglobe.ne.jp/~halcyon/cgi-bin/tb/test.txt
書いたスクリプトです。

よろしくお願いします。
あ、ごめんなさい。これCGIですね。Webprogにいきます。
スレ汚しごめんなさい。
>>510
演算子じゃない。version5.6.0から追加された変数・関数に対するアトリビュート指定。
perldoc Attribute::Handlers
perldoc attributes
515464:04/06/27 02:31
>>492-493
ありがとうございます。
>>492
私は、基本はtcsh困った時はsh派です。と言う冗談は置いといて、
最終的にcommand.comで使うので
(MS-DOSプロンプトのバッファの少なさをtelnetクライアントのバッファで補おうかというのが目的)
その辺りはおそらく関係ないと予想されます。
>>493
という事で open(SHELL, "| $shell |"); みたいなopenをしてみたところ暴走しました。
ちょっとこっちの書き方が悪そうなので何とかしてきます。
516464=463:04/06/27 02:31
間違えた。いや、間違ってないけど間違えた。orz
そういうときは普通 Open2 とか Open3 とか使うのかと思ってたが
昔拾ったシェルにコマンド流すようなCGIのソースの一部
$Pipe = ' 2>&1 |'; # Unix,NT->' 2>&1 |' 95,98->' |'

sub ExecCommand
{
my $Msg = &CurrentDir . '> ';
if ( $FORM{'Command'} eq '' ) {
return $Msg;
}
$Msg .= $FORM{'Command'} . "\n";
open(IN, "$FORM{'Command'} $Pipe");
while ( <IN> ) {
$Msg .= $_;
}
close(IN);
return $Msg;
}
参考までに
>>515
おまいさんPerl云々の前にshの使い方知らないだろ?標準入力からコマンド渡してどうすんだ。
>>149
> for (my $i = 0; $i < 10; $i++){
> sleep 1;
> print "\x1b[A" if $i;
> print " i = $i\n";
> }

↑の "[A" について解説願います!
>>520 多くのターミナルでカーソルを一行上にあげる文字列が
"\x1b[A"。/etc/termcap ってファイルがあったら、中を覗いて
みると、up=\E[A とか書いてあるはず。
522520:04/06/27 13:58
>>521

なるほど。為になりました。
ありがとうございました!
>>520
ANSI エスケープシーケンス(escape sequence) 。
カーソルを上に移動させるものです。
詳しくは「ANSI エスケープシーケンス」でググッて味噌。
524523:04/06/27 17:02
おっと、了解済みだったか、スマソ。
ログファイルから正規表現を使って特定するものだけを抜き取り、
別ファイルに出力したいのですが、ちょっと難問が…

ログファイルは基本的に下記のように発言者、日時、発言内容で成り立っています。

<ログの例>
山田 2004/06/28 09:12:15 ○○○○○○○○○○○○○○
佐藤 2004/06/28 09:15:58 △△△△△△△△△△△△△△
鈴木 2004/06/28 09:15:58 □□□□□□□□□□□□□□

このように1行で1人の発言内容ならば問題無くある特定の人物の発言だけを抜き取る事はできるのですが、
複数行にまたがった発言ログの場合、どのように取り出せばよいのでしょうか?
必ずしも次の行に発言が無い場合もあります。
このようなログを特定の人物のものだけ抜き出し、複数行にまたがっている発言内容は1行で出力したいのです。

<困ってるログの例1>

山田 2004/06/28 09:12:15 ○○○○○○○○○○○○○○
○○○○○○○
佐藤 2004/06/28 09:15:58 △△△△△△△△△△△△△△
鈴木 2004/06/28 09:15:58 □□□□□□□□□□□□□□

<困ってるログの例1>

山田 2004/06/28 09:12:15 ○○○○○○○○○○○○○○
佐藤 2004/06/28 09:15:58 △△△△△△△△△△△△△△

△△△△△

△△△△△
鈴木 2004/06/28 09:15:58 □□□□□□□□□□□□□□
ログファイルの構造がおかしい
splitで分けて、項目が三つじゃない行は前の行の続きってことにすればいいんじゃねえの?
ちょっと心配なのに発言内容部分が splitで分けられちゃう
(\sが含まれる)可能性はないんですか?
なkれば、>>527 でOkじゃない?
next if /^$/; もいれれば、2つ目の困ったパターンもOk。

529525:04/06/28 10:59
実際の発言内容には普通に\sなどは存在します。
じゃ、単純にsplitしないで、名前、日付、時間でとってから、
残りは内容、空行以外で名前、日付、時間に合致しないのは
続きの内容としてアペンドしていきゃいいんじゃね?
オレなら多分名前,日付,時間が行頭にあることを正規表現で調べて、
マッチしなければ直前の行の一部にするというようなコードにするかな。

my $NAME = '佐藤';

my $name;
my $buf;
for (;;) {
  $_ = <>;

  if (!defined $_ || m{^(\S+) \d{4}/\d\d/\d\d \d\d:\d\d:\d\d }) {
    print $buf if $name eq $NAME;
    last if !defined $_;

    $name = $1; $buf = $_;
  } else {
    $buf .= $_;
  }
}

運悪く発言内容の一部に正規表現マッチするような部分があって、それが
たまたまうまい具合に行頭にきちまうこともあるだろうけど割り切りね。
>>525
もしプログラムの方をいじれるならフォーマット変えた方がいいと思われ。
たとえば、発言の終了は LF で発言中の改行は CR とか。
ようするにとんでもログフォーマットなわけだ。
今からでも遅くはない、フォーマットを変更しろ。

個人的には、\t 区切り、発言内容中の改行は<br>にでも。@テキストエディタで直接みられるように。
>>529
さんざん言われてるけどログの構造が間違ってるとしか言いようがない
もし発言内容に
山田 2004/06/28 09:12:15 ○○○○○○○○○○○○○○
なんてのがあったらどう?
もう手ぇ付けらんないでしょw
半角スペースで区切ってんのにデータの中にも半角スペース書けんのかYO!!w
ちょっとワラタ。

ところで、俺の場合ログファイルなどの区切り文字は自分でこんな感じの関数作ってる。
場合によっちゃ重いんだけど、実体には普通に全ての文字を書きたいから…。

#連結時
sub my_join ($$;@) {
  my $separat = shift or return();
  my $enclose = shift or return();
  my @entity = @_ or return();
   $separat ne $enclose or return();
  map {s/($separat+)/$separat$1/go} @entity;
  return( join qq[$enclose$separat$enclose], @entity );
}

#分割時
sub my_split ($$$) {
  my ($separat, $enclose, $all) = @_;
  my @entity = split /$enclose$separat$enclose/, $all;
  map{s/$separat(?!$separat)//go} @entity;
  return(@entity);
}
↑あ、時給自足で書きこんだり読み込んだりする時だけね。
俺はもっぱら大した大きさのデータじゃなきゃ、Data::dumper、とかStarableとかで
変数構造そんまま格納して読み込んで使ってる。
splitだのjoinだの、デリミタ何にするかとか悩まないし、すげえ便利。
>>537
ログファイルみたいに逐次書き出しみたいなのは可能?
>>538
可能。
俺は150人ぐらいだけどある組織の会員データとか、
その会員向けに組織別に開設したBBSのログファイルとか
組織別に開設したMLの登録リストとかをData::Dumperで格納してる。

ついでにその変数構造をHTML::Templateのテンプレートにあわせた形にしてるので
読み込んでテンプレートに食わせるだけで表示できるようにしてる。

デリミタかませてファイルに格納したり、読み込んでsplitして変数に組み立てて、
それから吐き出し形式にしてテンプレートに渡して、とかしてない。

Storableでもいいけど、データがエディタで直接開けてデバッグに便利なので
Data::Dumperをもっぱら使ってるけど、まあこんなくらいのデータ量だから。

ただData::Dumperは自前で排他共有ロックしなくちゃ、だけど
Storableは、
lock_store \%table, 'file';
$hashref = lock_retrieve('file');
なんてそれもついでにしてくれちゃうんで便利だよね。
何も考えないで Data::Dumper or Storable って楽な割りに強力だよね

ハッシュの3重ネストとか、もう処理めんどいから Storable で一発
必要になったら考えれば良いし、何より互換性は最強だしな
ログファイルとかで悩む時点でオワットル
>>541
どういういみ?
543539:04/06/28 22:30
>>540
Storableって互換性、最強?
ちょっと前に書いたやつ、多重ハッシュそんまま保存したくて
MLDBM使ったやつがあるんだけど、環境動かしたとき大変だった。
Storable使うように書き換えようかな
みんなが驚いたコード教えてよ
有用なやつで
545デフォルトの名無しさん:04/06/28 23:29
>>529
CSV形式を使えばいいんじゃない
改行とかカンマが有る場合は 「"」 で囲う

で「"」内での「"」は「""」で表現する

この形式ならよく使ってるよ
>>545
処理速度に難有りなんだなこれが。
このスレでTips集作ってみるってのも面白いかもしらんね
548デフォルトの名無しさん:04/06/29 00:37
教えてください。
ブラウザでファイルのアップロードする掲示板みたいなものがあります。
複数のファイルを送信しているのですが、ひとつずつファイルを選択してから
送信の繰り返しをしています。
何とか順次ファイルを送信したいのですが、相手のプログラムを変更したり
サーバーに直接ファイルを転送する事ができないので、Perlで自動的に
送信をするようにしたいと思っています。
受け取る側のCGIなどは見つかるのですが、送信をするにはどうしたら良いかがわかりません。
サンプルプログラムなどが載っているサイトがあれば教えてください。
>>548
CPANにあるlibwww-perl使うのがいいと思われる。
>>549-550

ありがとうございます。
>>546
だな。 Data::Dumper や Storable の方が遥に高速で効率が良い。
553デフォルトの名無しさん:04/06/29 01:33
>544
> みんなが驚いたコード教えてよ

print @List[0]
554デフォルトの名無しさん:04/06/29 01:36
>>553
セミコロンがなくてもいいのかーっ!!ってこと?
555デフォルトの名無しさん:04/06/29 02:32
あ、いや。本来は

print $List[0];

が正しいのに、思ったように動作していたこと。
>有用なやつで
@List->[0]

@List[0]
print @list[0..4];
とかやるともっと驚けるかもよん。

僕が驚いたのは
@hash{qw/foo bar baz/} = qw/foo bar baz/;
かなー。目から鱗と言うか。

やっぱり Schwartz 変換かな
よく読むとそんなにトリッキーじゃないんだけどね
最初に見たときは小便ちびりそうになった
スライスはラクダ本に載ってるだろ。
スライスで配列のメンバを一つだけ指定してると考えればなんらおかしな
ことではない。557はどうやって解釈するのか知らんけど。
>>557>>553
my %namr2index=();
my @names=qw(foo bar Hoge etc);
@namr2index{}=0..$#names;

あと@List[0]と($List[0])が同じ
@List1 = ('AAA');
@List2 = ('AAA','BBB');

$Scalar1 = scalar @List1;
$Scalar2 = scalar @List2[0];

print "$Scalar1, $Scalar2";

で、

1, AAA

ですが何か?
563561:04/06/29 23:48
>@namr2index{}=0..$#names;
@namr2index{@names}=0..$#names;
の間違い
なぜ、みんなで変数の基本を晒しあってるんだ・・・?
馬鹿ばっかだから。
566デフォルトの名無しさん:04/06/30 00:49
@List->[0]
で、これはどう解釈するんだ?
>>566
分かって無い奴が間違っただけだと思うからスルーするが吉な気がするのは俺だけだろうか

リファレンスでは -> 省略できるけどね (←関係ありそうで無い話)
>>566
俺も分からん。。。教えて!えろいひと!
シェルから拝借した${sv}という書き方の延長で
@{av}という書き方もできるのね。
これはスライスにも適用可能。@{av[0,1]}、@{hv{1,3}}

あと、@av->[0]と関係あるかどうかは分らないけど、
av->[0]と@を省略してもOK。
>>569
@を省略しちゃえばavは裸の文字列定数で表されたシンボリックリファレンスに
なるからむしろわかりやすい(use strict refsすれば確認できる)のだが、
@av->[0]はやっぱり俺にはわかんね。

ラクダ本3版の3.2矢印演算子のところには、左側は(ハードでもシンボリックでも
いいけど)リファレンスじゃないとだめって書いてあるんだけどねぇ。
571デフォルトの名無しさん:04/06/30 11:55
データは@linesでまとめて読み込むのとwhileで1行ずつ読み込むのではどっちがいいんですか?
まとめてだと並び替えとか便利だけどメモリを食うと思うし1行ずつだとメモリは食わないけど並び替えとか難しそうだと思うけど
どっちでやったほうがいいんですか?
>>571
もう既に分かってるじゃん。
メモリ食って困るときは while で、そうでなきゃ @ で
色々なやり方がある、どれがいいかは適当に選べ
まったくだ
自分のやりたい様にやるってのPerlなのに、これだから最近の若者は
574デフォルトの名無しさん:04/07/01 00:24
大学のunixサーバーで以下のスクリプトを実行したのですが、
input dirname: question
sh: /petit.cgi: not found.
sh[2]: /petitlog.cgi: not found.
sh[3]: /count.dat: not found.
sh[4]: /pastno.dat: not found.
sh: /past/1.dat: not found.
sh: /jcode.pl: not found.
sh[2]: /lock: not found.
と表示されて
うまくいきません。
いろいろ試してみたんですが何が悪いのか良く分かりません。。
どなたか分かる方いらっしゃいましたらご指南願います。

#!usr/bin/perl

print "input dirname: ";
$dirname = <STDIN>;

system("chmod 705 $dirname/petit.cgi");
system("chmod 606 $dirname/petitlog.cgi $dirname/count.dat $dirname/pastno.dat $dirname/past/1.dat");
system("chmod 604 $dirname/jcode.pl");
system("chmod 707 $dirname/lock past");
>574
ファイルが無いって怒られてんじゃん。
>>574
> #!usr/bin/perl
typo?
>>574 system の行の前に
chomp $dirname;
っていれてごらん。$dirname に改行が入ってるからだよ。
578デフォルトの名無しさん:04/07/01 00:58
@array = (['A', '45', 'dog'], ['C', '23', 'cat'],['B', '5', 'fish']) ;
という配列があったときに2番目の要素をキーとして並べ替えをするには
どのように書いたらよいでしょうか?

調べたところ、CSVライクなデータで3行目のデータをキーとして
並べ替えるときには
@new_array = sort { (split(/\,/,$a))[2] <=> (split(/\,/,$b))[2] } @array;
というのを検索して探し出しました。
 しかし、今回のようにすでに二次元配列として格納されている場合には
どのように並べ替え関数を指定したらよいのか分かりません。
教えてください。
>>578
@new_array = sort { $a->[1] <=> $b->[1] } @array;
ファイルが無い… ただの屍のようだ…
>>578
579ではないが注意点として、new_arrayの各要素を変更すると@arrayの内容も変化してしまうので注意。
コピーしているのはリファレンスであって参照先ではないので。
対策としてdcloneとか思いつくけど(逆に片方変化させるともう片方も変化する、ということを利用もできる)。
582デフォルトの名無しさん:04/07/01 01:17
>>579

サンクス!試してみます!
583デフォルトの名無しさん:04/07/01 07:39
パールとは関係ないんですけど
ドスプロンプトでハードディスクのCではなくDに格納されてる
ディレクトリを呼び出すにはどのようにすれば委員でしょうか?
PC初心者板行け
585デフォルトの名無しさん:04/07/01 07:53
>>584
あの世逝け
ローカルのPerlを使用して
インターネットショートカットファイル.urlの中身
『Modified=00276B6EEE5EC40111』
から更新日時・アクセス日時を読み取りたいと考えているのですが、可能でしょうか?

ググッた感じModified=〜のキーを解析されてる方を見つけることができませんでした。

じゃあ無理ってことだね
>>586
スレ違い
589デフォルトの名無しさん:04/07/01 19:09
formatの使い方をサンプルを示して分りやすく教えなさい(5点)
UTF-8からSJISに変換したいんですが、
軽い方法は無いですか?
jcode.pmは重すぎて…
HTMLでホームページを作っているのですが、良いフリーCGIがなく
自作でパールのCGIプログラミングをこれから始めようと
思っているんのですが、少し疑問なことがあります。
CGIの中身は全て直に書き込んでいるのでしょうか?
それとも作成ソフトというものがあるのでしょうか?
もし、作成ソフトがある場合、どのような使い方になるのでしょうか?
教えて君の初心者ですが、もし宜しければ教えてください。
作成ソフトみたいなのはほとんど無いよ。
一応あるけどほとんど使ってる人はいない。
普通のエディタでガリガリ書いてる。
板違い厨には放置を
594デフォルトの名無しさん:04/07/01 20:18
'$a=[1000]->[()];print $a'
これはどうして1000になるんですか?
595591:04/07/01 20:26
>>592
レスありがとうございます。エディタだけだと知り迷いが吹っ切れました。
>>593
パール言語での作成を考えていたのでこちらでいいのかと思いましたが、
スレ違いだったようですね^^;
失礼しました。
>>594
int(()) は0
[1000]->[0]
[1000] '1000'という要素を一つもつ無名配列の
参照を -> によりデリファレンスして、
[0]で配列の最初の要素(ここでは1000)にアクセス。
>>590
Jcode.pmはちゃんとコンパイルして使ってるか?
コンパイルしないJcode.pmはあくまでもコンパイラの無い環境の為の代替手段だぞ。
598デフォルトの名無しさん:04/07/02 10:42
myとlocalの違いを教えてください
>>598
ダイナミックスコープとレキシカルスコープで調べてください。
実装の詳細を汁のは難しいです。
>>598
1から嫁
601デフォルトの名無しさん:04/07/03 03:50
WindowsでActivePerl使っているんですが、
getcってリターンを押すまで入力を受け付けないけど、
1文字何かキー押すだけで入力受け付けるようにできませんか?
cookedモードからrawモードに変えるみたいなもんです。
nethackみたいなゲーム作るにはそれができないと無理なんで・・・。
603デフォルトの名無しさん:04/07/03 04:26
>>602
ありがとうございます
use Term::ReadKey;
ReadMode('cbreak');
$key = ReadKey(0);
ReadMode('normal');
これでできました
604デフォルトの名無しさん:04/07/03 12:40
WindowsでActivePerl5.8で勉強中です。
$first = <STDIN>;
print $first;
$second = <STDIN>;
print $second;
とすると、入力→出力、入力→出力という動作になりません。
改善する方法はあるでしょうか。
while (<STDIN>){
print;
}
606デフォルトの名無しさん:04/07/03 14:05
perl -ce 'BEGIN{print "begin\n"}END{print "end\n"}'
ラクダ本第二犯には-cオプションを指定したときでも
BEGIN,use,ENDの三つは実行されるとありますが、
ENDの出力がありません。どうしてでしょうか?
またオプションを-ecと逆にしたときは何も表示されません。
これは仕様ですか?
>またオプションを-ecと逆にしたときは何も表示されません。
これは当たり前でした
>>606
Changes5.6より:

[ 4323] By: gsar on 1999/10/09 18:48:31
Log: don't run END blocks when running under -c switch (older,
rarely useful behavior may still be obtained by putting
BEGIN { $^C = 0; exit; } at the end of the script)
>>608
どうもありがとうございます。
610デフォルトの名無しさん:04/07/04 08:09
$perl -e 'while(($k,$v)=each %::){$l=length $k;$max=$l>$max?$l:$max;push @a,[$k,$v]}
for(@a){print $_->[0] . (" "x($max+1-(length $_->[0]))) . $_->[1] . "\n"}'
とすると、あるシンボルテーブルを一つのハッシュのように見ることができます。

ここで、各エントリをハッシュ値と見なして、
*::a{SCALAR,ARRAY,HASH,CODE,GLOB,FILEHANDLE,NAME,PACKAGE}に一挙にアクセスするには
どうしたらいいでしょうか?
*::a{SCALAR}と\$aは同じ意味ですので、リファレンス値のリストを取得したいと思います。

perl -e '$a="";print *::a{SCALAR}'
SCALAR(0x8181f64)
キーが一つの場合は上のようになるのですが、
スライスとしてアクセスする方法がわかりません。
perl -e '$a="";@a=();print *::a{SCALAR,ARRAY}' #ARRAYのリファレンスだけ取得できる。
perl -e '$a="";@a=();print @*::a{SCALAR,ARRAY}' #syntax error
perl -e '$a="";@a=();print @{*::a{SCALAR,ARRAY}}' #何も表示されない
少し説明がごちゃごちゃしてしまいました。リファレンスのリストが欲しければ
@KeyList=(SCALAR,ARRAY,HASH,CODE,GLOB,FILEHANDLE,NAME,PACKAGE);
とでもして、それを*::a{$KeyList[$i]}とでもすれば得られます。
そうではなく、型グロブをハッシュのように操作する方法が知りたいと思っています。
シンボルテーブルを2段階のハッシュのようにみなしてアクセスすることは不可能なのでしょうか。
>>610-611
そうやってアクセスする事で何をしたいのか
さっぱり分からんのだが。

my$f="%20s %17s %16s %15s %15s %15s %s\n";
my@t=qw(SCALAR ARRAY HASH CODE GLOB IO);
printf$f,"SYMBOL",@t;
while(my($k,$v)=each%::){printf$f,$k,map*{"$v"}{$_},@t}
>>612
ありがとうございます。
perl -e '@a;%a;my @t=map *main::a{$_},(SCALAR,ARRAY,HASH);print "@t"'
型グロブに対するスライスはちょっと無理そうなので、
このmap関数で代用するのがよさそうですね。なるほど。。。
614デフォルトの名無しさん:04/07/04 11:41
正規表現オプションの「g」は何の略なんでしょうか?
globalですかね?
そだょ
>>615
ありがとうございます。
617デフォルトの名無しさん:04/07/04 21:29
全文検索でヒットした奴を
行の真ん中に表示されるようにしたいんですがどうすれば良いんですか?

つまりglobalを検索したとすると、

                      global SchoolNet Director
 we have increased the US publics global awareness
                CanWest global Communications
              help address global warming issues
   California Wood Use Endangers global

↑こういう風に結果を出したいんです。
行全体を出力してその真ん中に目的の語がくるようにしたいという意味です。
>>617
おそらく質問が板違い
>>619
CGIじゃない
perlの授業で出てきた奴
pos?
>>617 KWIC と検索して出てきたスクリプトをパクる。
my @line = (
  'global SchoolNet Director',
  'we have increased the US publics global awareness',
  'CanWest global Communications',
  'help address global warming issues',
  'California Wood Use Endangers global',
);
my $word = 'global';

my($max, @pos);
for (@line) {
  my $pos = index $_, $word;
  $max < $pos and $max = $pos;
  push @pos, $pos;
}
print ' ' x ($max - shift @pos) . "$_\n" for @line;
>>619-622
バカは下手にでると際限なく威張りますね
わからないならレスしなくていいよ。

>>623
最初からそれを書けよ
とりあえずそれでいいよ。もらっとく。

お前らもっと初心者にやさしくしろよ。
答えられないなら黙ってろ。
多分それだと評価低いよ。行にキーワードが含まれないときや、
複数含まれるときのことを考えていない。そもそも課題とは
ちがうことしてるし。
課題でPerlかぁ・・・俺は初めてのプログラミングの課題はTcl/Tkでランチャー作らされた記憶が、あいやシェルスクリプトだったけな
>>624
       (  _,, -''"      ',             __.__       ____
   ハ   ( l         ',____,、      (:::} l l l ,}      /      \
   ハ   ( .',         ト───‐'      l::l ̄ ̄l     l        │
   ハ   (  .',         |              l::|二二l     |  ハ こ  .|
       ( /ィ         h         , '´ ̄ ̄ ̄`ヽ   |  ハ や │
⌒⌒⌒ヽ(⌒ヽ/ ',         l.l         ,'  r──―‐tl.   |  ハ つ │
        ̄   ',       fllJ.        { r' ー-、ノ ,r‐l    |  ! め │
            ヾ     ル'ノ |ll       ,-l l ´~~ ‐ l~`ト,.  l        |
             〉vw'レハノ   l.lll       ヽl l ',   ,_ ! ,'ノ   ヽ  ____/
             l_,,, =====、_ !'lll       .ハ. l  r'"__゙,,`l|     )ノ
          _,,ノ※※※※※`ー,,,       / lヽノ ´'ー'´ハ
       -‐'"´ ヽ※※※※※_,, -''"`''ー-、 _,へ,_', ヽ,,二,,/ .l
              ̄ ̄ ̄ ̄ ̄       `''ー-、 l      ト、へ
628デフォルトの名無しさん:04/07/05 13:49
現在、ファイルの中身を変数に一気に格納するのに

open FILE ,'hoge.txt';
while (<FILE>) { $text .= $_ }
close FILE;

としています。
初心者的にはループが起きているので効率が悪く感じています。
これ以上にエレガントなやりかたってあるのでしょうか?
お願いします。
>>628
たしか最近どっかで話題になってたと思うが、perlvar(1)に例示されてる

open my $fh, "foo" or die $!;
local $/; # enable localized slurp mode
my $content = <$fh>;
close $fh;

が面倒がなくていいと思う。
>>629

ありがとうございました!
>>628
>>169-170

現スレくらい検索しろや
perlモジュールの量は圧倒的だな。俺ハールやってて良かった、ムフフ、、、、
、、、ふふふふふああーあーあーーあーああaaaaa\saa.a...a..a.aksskjalksksl
alsllalllalalaskls:::aaaa9)))))99)))998)((88(88(8
(perl (def((((((8 (defun perl () 8(99 )))9 ) 9))))) ))))))))SS))9)
CommonLispからPerlへのトランスレータとかないの?
それはLispスレで聞くべきかと
>>633
それって嬉しいのか?
CL でもライブラリは FFI 使えばなんとでもなるし。
636デフォルトの名無しさん:04/07/07 11:01
PERLの変数はどれくらいの容量のデータまで格納できるんですか?
画像のアップロードを作るときとかフォームのデータや画像データを変数に格納しなきゃならないんですが
画像サイズが10MBとかになっても大丈夫ですか?
>636
環境によって違うが、大抵は4GB弱だな。
最も、そんなにメモリを積んでるマシンは少ないだろうから、実際にはそのマシンのメモリ次第だが。
perl自体は2GBくらいまでは大丈夫だろ。
>>636
WebProg板の方が詳しい人いるんじゃね?
サーバーの設定とか関わってくるのかもしれんし。
Perl的には物理メモリ+スワップ領域をこえさえしなけりゃ大丈夫だろ
>>636
1変数にそんな大量なデータを入れることがわかっているなら
そうならないようなプログラムにすりゃいんじゃねの?
だいたい一時期にすべての内容をメモリーにバッファリングする
必要があるの?そこから考え直したほうがいいと思うよ。
641デフォルトの名無しさん:04/07/07 13:18
>>640
フォームで送信したときread(STDIN,$all_data,$ENV{'CONTENT_LENGTH'});で受け取っているんですが
送信した時$ENV{'CONTENT_LENGTH'}にフォームと画像の全てのデータが含まれているため
メモリにバッファリングしないようにすることができないんです
open O, ">$ofile" or die;
my $len=$ENV{'CONTENT_LENGTH'};
while($len) {
 my $data,$size=64*1024; # 64Kbyteづつ
 $size = $len if ($len<$size);
 read(STDIN,$data,$size);
 print O, $data;
 $len-=$size;
}
close O;
うpろだなんざその辺にソースごろごろ転がってるからそれ使えや
使わなくてもいいから読んでみれ
644デフォルトの名無しさん:04/07/07 15:34
>>642
それだと$len=$ENV{'CONTENT_LENGTH'};で$lenに10MBの
データを格納してしまっていることになるんじゃないんですか?
>>644
$ENV{'CONTENT_LENGTH'} には何が入ってんの?
>>645
かず

>>642
64kBでも大き過ぎるんちゃう?
647645:04/07/07 16:16
>>646
何故お前が答えるんだ
648646:04/07/07 16:22
>>647
板違いだったからだよ。
649デフォルトの名無しさん:04/07/07 16:43
>>645
$ENV{'CONTENT_LENGTH'}はフォームに入力されたデータと画像ファイルのデータ
が一緒になった長い文字列です。
それぞれboundaryという文字列で区切られています。
650646:04/07/07 16:48
>>649
なんでそんなとこにそんなデータがすでに入ってるんだよ
read(STDIN あたりのひきすうのならべかたがまちがっていないか?
651デフォルトの名無しさん:04/07/07 17:14
>>650
すいませんただのデータのバイト数でした
652デフォルトの名無しさん:04/07/07 17:31
画像ファイルだけだったらいいんですがフォームデータも混じっているため
boundaryという文字列でsplitしなければならないのでboundaryの位置が一定じゃないので
>>642のプログラムみたいに$sizeの値を固定できないんです。
653646:04/07/07 17:34
>>651
板違いだから下の方でこそこそとやる気はないのか?俺だって粘着してるし。
あと、結局これは車輪の再発明になるから素直にuse CGIするか
cgi-lib.plの2.18を拾ってきてrequireした方がいいよ。
あえて挑戦するなら$ENV{'CONTENT_TYPE'}からboundaryを取り出して
while (<STDIN>)でまわしながらboundaryかboundaryのお尻に--が付いているやつか
ヘッダかボディか調べていくのが楽でいいかなと。
どうしてもreadを使いたいならcgi-lib.plをひたすら読め。インデントを修正しながら読め。
実際有名なCGIはこれからコピペした臭いがプンプンするぞ。
sendkeyを使わずにキー入力させることはできますか?
655デフォルトの名無しさん:04/07/07 19:03
Perlってなんて読むの?
656デフォルトの名無しさん:04/07/07 19:23
ぺろる
657デフォルトの名無しさん:04/07/07 19:27
まじ?
ラクダ本3章まで暗記した。ハァハァ
でもちょっとよく理解出来なかったところや、
忘れ欠けてるところがある。復習しないと。
生真面目でいつも勉強ばっかりしてるんだけど
大して成績のよくない奴っていたよな。
660デフォルトの名無しさん:04/07/07 22:21
>>655
ぱぁる
>>659
なにが言いたいんですか?w
暗記力のなくなった年寄りの僻みですか?ww
まあまあ。>>658 はレイ・ブラッドベリの『華氏451度』の世界に
にそなえて準備をしているだけなんだよね。
663デフォルトの名無しさん:04/07/08 01:54
Perlの良さって何よ?
>>663
何の略か調べたら少しは分かるんでないかな
正直、ラクダ本をまともに全部読むのは間違ってる。

お前ら、国語辞典を1ページ目から読んだりするか?
俺はPerlの辞典というような取り扱いをしてる。
「社会工学」は読んだけど、他は全部斜め読み。
まともに読みましたが、何か?
一遍ざーっと流し読みしてなんとなく頭に入れる
必要になったら読み返せばいいから詳細は忘れてOK
ProgrammingPerlよりもperldocを熟読した方がいい
英語の勉強にもなるし、いつでもどこでも読める文章だし
669デフォルトの名無しさん:04/07/08 10:41
Perlでreturnするときに、複数返すことできますか?
例えば、return($tt, $gg);みたいに
670デフォルトの名無しさん:04/07/08 10:46
>>669
それでできるのに聞くということは、試していない証拠だな。
perl -e'print sub{return("a","b")}->(),"\n"'
672デフォルトの名無しさん:04/07/08 10:51
>>670
いあ、それやってるんだけど、呼び側の受け取り方法がわからなくて
673デフォルトの名無しさん:04/07/08 10:54
>>672
($b,$n)=func;とか
674デフォルトの名無しさん:04/07/08 10:56
死ぬほど簡単な質問でとても申し訳ありません。
いくら調べても分かりませんでした。

PHPで
while(true){
 $a[] = $i;
 $i++;
}
とすれば配列に値がどんどん入ります。
これをperlでコーディングするにはどうすれば良いでしょうか?
どこを見ても、最初に@a = (1,2,3,4);
と最初に配列の初期化をしています。初期化なしでいきなり入れ込む方法を教えて下さい。
675デフォルトの名無しさん:04/07/08 10:59
>>674
$a[$i]=$i;
676デフォルトの名無しさん:04/07/08 10:59
教えて下さい
サブルーチンをコールする時に&つける時とつけないときの違いはなんですか?
push @a, $i
>>674
機能上はpushだけど、
その書式はperlにも入れてほしいよね。
ものぐさ度No.1が誇りなんだから。
func(1,2);
sub func{
sub subr{print +(caller)[2]," @_\n"}
&subr;
&subr();
subr;
subr();
}
>>676
サブルーティンは、"&" という記号を頭に付けて呼び出すことがで
きます。 Perl 5 では、"&" はなくてもよく、宣言済みのときに
は、括弧も省略できます。 (ただし、defined() や undef() の引
数として使う場合のように、サブルーティンを名指しするときには
"&" は省略できないことに気を付けてください。 また、サブルー
ティン名や、&$subref() や &{$SUBREF}() 構造を使ったリファレ
ンスでサブルーティンの間接呼び出しをするときにも省略できませ
ん。
とperlsubに書いてある。
681デフォルトの名無しさん:04/07/08 11:23
phpのpreg_match関数に相当するperlの関数を教えて下さい。
682デフォルトの名無しさん:04/07/08 11:24
>>681
m//
>>682
$str="foobaa hogehoge hugahuga";
if(preg_match("/hoge/i",$str)){ print "ある"; }
こうする方法が分かりません。
if($str =~ /hoeg/i){
...
>>676
&があるとプロトタイプのチェックが行われないのは大きな違いだと思う。

sub f($) {my($x)=@_; print "$x\n"}

と定義しておいたときに以下を比べればわかるだろう。

f();
f(10);
f(10,20);
&f();
&f(10);
&f(10,20);

また&なしのときはあらかじめ宣言されていれば引数の周りのカッコを省略
できるが、&つきのときは省略できない。

f 10;
&f 10;

さらに丸カッコごと引数を省略した&<関数名>には現在の@_をまるごと渡すと
いう機能がある。&なしにはその機能はない。

sub g { &f; }
sub h { f; }

g(10)
h(10)

いまどき&をつけて関数呼び出してる奴は○○
687681:04/07/08 11:41
>>684
ありがとうございます。

今、yahooメールを全部ローカルに保存するperlスクリプトを作っているのですが、
もしかして、すでにありますか?

yahooメールのhtmlから日付とサブジェクトと本文を抽出して、

2004-07-08-10-05-35-ひさしぶり.txt
というファイルを作って、内容に本文を入れるってのを作る予定です。

たぶん、ここに居る人たちなら、1時間ぐらいで作ってしまうんだろうなぁ。
>さらに丸カッコごと引数を省略した&<関数名>には現在の@_をまるごと渡すと
>いう機能がある。

@_は他の特殊変数と同じでダイナミックスコープであり、"&f"という形で
サブルーチンを呼び出したときだけ、そのまま引き継がれるということですよね。
他の呼び出し形式の場合は関数の頭でlocal @_=(引数)として、呼び出し元の@_の値を
待避してるのと同じですね。
689681:04/07/08 11:49
>>687です。
ヤフーメールサーバがクッキーでクライアントを認識してるっぽいですが、
どうすればメールサーバをだませるでしょうか?
>>689
クッキーもらえばいいんじゃないの?
691687:04/07/08 12:12
>>690
もう少し具体的にお願いします。

クッキーの制限に「自分で送り込んだクッキーからしかデータを取り出せない」
というものがあるので、推測ですが、ブラウザがサーバとクッキーの対応表を
持っていて、「このサーバにはこのクッキーを渡す」という処理をしているのだと思います。

という事は、今から作ろうとしているperlプログラミングはヤフーメール限定なので
「問答無用でこのクッキーを渡す」という記述ができれば、メールサーバを騙せると思います。

もしこの理解で間違いなければ、その騙す方法を教えて下さい。
http://search.luky.org/fol.2002/msg00271.html
やってみてないけど、この辺とか参考になるのでは。
693687:04/07/08 12:36
>>692
ありがとうございます。
私と同じような事をしようとしていますね〜。というか、同じソースのような・・・w
>>693
Cookieヘッダ出力する行はGETのあとにないとだめだろうな。

LWPとHTTP::Cookies使った方が楽そうな気もするけど、スクラッチで
書くのもそれはそれで勉強になるからお好みで。
>phpのpreg_match関数に相当するperlの関数を教えて下さい。

Perl の m// に相当するのが preg_match (perl regular expression: match)なわけだが _| ̄|○
>>691
yahooメールは設定しだいでメル鯖と直で話せるからそっちの方が簡単かもね
http://help.yahoo.co.jp/help/jp/mail/mailsoft/mailsoft-01.html

ちなみにあなたが送受信の対象にしてるのはWeb鯖でメル鯖じゃないですよ
ExtUtils::MakeMaker使うとき、autoconfみたいにsendmailのありかを
探してソースに埋め込むみたいのはどんな感じでやるのが普通なの
だろうか?
そこまで高度なことはこのスレは対応してません
>>697=698
>>697
普通PurePerlなモジュールをプリプロセスしてインストールする、ということはしないな。
動的に探すか、ユーザーに指定させるか、~/.mymoduleconfigでも作る(こんなことするのはCPAN.pmしか知らんが)かするのが一般的。

つーわけで、どうしてもやりたいなら適当にやりたいようにやれ。

imgタグでCGIスクリプトを呼び出して、そのスクリプトでLocationヘッダを
用いて別のページに飛ばせますか? こうするとContent-type: image/gif(jpeg)
ヘッダとLocationヘッダをひとつのスクリプトで使うことになってうまくいかないんですが・・・
>>701
print "Location: http://www.google.co.jp/intl/ja_jp/images/logo.gif\n\n";
はページ移動ではなくHTML内の画像として表示されたけど、
print "Location: http://www.google.co.jp/\n\n";
は×マークだった。

まあ無理だろうなあ。
704名無しさん@そうだ選挙に行こう:04/07/11 19:17
複数行あるファイルから、改行をなくしすべての行を結合して一つの変数に入れたいとき
while(<FILE>){;
chomp;
$data .= $_;
}
今はこのようにしているのですが、一行でズバッと記述する方法ってないですか?
改行を削るとなると1行でズバッとは難しいが、
たぶんループするよりは

{
 local($/);
$data = <FILE>;
}
$data =~ s/\n//gs;

の方が速いだろう。15KB,200行ぐらいのファイルで
試したけど3割ぐらい短い時間で終わったよ。


map {s/\n//} <FILE>
707704:04/07/11 20:38
>>705
なるほど置換すれば早くできるのか
>>706
mapがよくわからんのです

ありがd
708デフォルトの名無しさん:04/07/11 21:02
>>705
置換オプションの s は不要なのでは?
join(/\n/,<FILE>);
>>709
イミフメイ
711705:04/07/11 22:30
>>708
はい本来は不要です。

$*に影響されるパターンかどうか気にするのメンドウだから、
複数行が含まれた文字列に正規表現使うときはsかmを必ず
つけることにしてるのでした。
>>705
>>169-170らへんの話とは無関係?
713:04/07/11 23:00
>>705じゃなくて
>>704だった
実行時の引数として整数の配列を与えると,各要素を昇順(小さい順)に並べ替えて出力
するスクリプトを作る、ただし、perlのsort命令を使わない。という
プログラムを教えてくれませんか?
バブルソートを用いたプログラムを教えて欲しいです。
715705:04/07/12 00:13
>>713
改行含んでいいならそのまま使えるけど、
改行を削ろうとするともう一工夫いるって話
だろ。
20000バイトほどのファイルをreadで1000バイトずつ読み込みたいのですが、
どのように書けば夏バテし難いさっぱりとしたコードになりますか?
>>716
どう書いてたら夏バテしそうになったの?
>>714
宿題は自分でやろうな
どうしても困ったらgoogleに聞け、サンプルコードがいくらでも転がってる
719716:04/07/12 01:14
>>717
my($total, $read, $buf, $data);
$total = $read = 0; $buf = $data = '';
while($read = read(IN, $buf, 1000)) {
  print "$read 読みました\n";
  $total += $read;
  $data .= $buf;
}
print "全部で $total 読みました\n";

なんですが、ファイルハンドルINのファイルのサイズが1000に満たないときは
どうなるか考えていたら目が夏バテしそうになりました。
>>715
ちなみに
s/\n//g より tr/\n//d のが速いと思われ
てか\rも消そう。
ていうかたいていの処理系において、
1000という中途半端な数字を使うことは好ましくない
厨房用のOSには\rが付いている。
724705:04/07/12 10:28
>>720
s//をtrにしたら705と同じファイルでさらに3割ほど実行時間が短縮
しました。結局もとのやつの約半分の時間で終わります。trって速い
ですなー。
725714:04/07/12 12:55
>>718
いろいろ調べたんですけど、理解できなくて。
もう少しがんばってみます。ありがとうございます。
726716:04/07/12 13:04
>>722
でも、読み込みを1000バイトで区切ってそこで一旦別の処理をしたいというときは
どうすればいいんですか?
ソートアルゴリズムを知らない俺でも
配列の要素1つに注目して後続の要素と値の大小を比べ、配列内の位置を交換していく手法くらい思いつくけど
ちなみにこれは何ソートと呼ばれるんだ?
>>726
>>722が言ってるのは1000って数字がコンピュータ的に半端な感じがするってだけかも
ひょっとしたらハードウェア的に最適な値が存在するのかもしれないが気にするほどでもないんじゃないかな
>>726
ほとんどのOS, たいていのライブラリによる入出力、バッファリングでは
1000などという中途半端な値は使われないので
512 4096 8192, 65536 などの値を使っとけ
で、誰も肝心の >>716 の質問には答えてないわけだが。
ていうかファイルサイズがバッファサイズ (?) に満たなくても
>>719 で問題無いと思うのだが?
>>730
皆そう思っていたから、特にコメントつけないのでは?
>>729
だからといって、1000バイトで区切ってはいけないという
ことは無いはず。そんなものいちいち考えてやらんでも
よかろうに・・と思うが。なので 1000バイトで切ってイイヨ。
ネットワーク越しの操作では必ずしもキリのいい数字ではない罠
733716:04/07/12 14:57
いやでも1000バイトに固定してしまうと、例えば25716バイトのファイルを読み込むときに
25回ループして読み込んだ後716バイトが残るじゃないですか。
こうなった場合残り716バイトに対して1000バイト読み込もうとするのは
何か都合が悪そうな気がして仕方がないのですが、どうするのがいいのでしょう?
>>727
バブルソート
>>733
君がどう思おうが perl はそういう使い方を正式にサポートしている。

http://perldoc.com/perl5.8.4/pod/func/read.html
http://flex.ee.uec.ac.jp/texi/perl/perl_90.html

サイズが分かっていて、どうせ全てを変数に入れるのなら、始めから
read IN $data, $size で一気に読み込んでしまえばいい。
>>733
ちゃんと read の説明読んでみなよ。
その場合、716バイト読んて、戻り値に716が帰る、
もう一回 read 実行すると、 end-of-file だから0が
帰り、while から抜ける。ね、大丈夫でひょ。
737716:04/07/12 16:11
そうか。>>719では1000バイトに満たないのにreadする他に
0バイトしか残っていないのにreadする事があるのか。
なんかもう読み込めないのにreadするのはちょっと無駄な感じがしますね。
えーと、今回は全部読み込む事よりも1000バイトずつ区切りながら読み込む事が
重要です。
>>737
ていうか、最初は気持ち悪いのかも知れないけど、
>>719 で定石通りなのでそのまま突き進んでよし。
C で read() 使って書くときも同じような感じで書くよ。
>なんかもう読み込めないのにreadするのはちょっと無駄な感じがしますね。
これは違うと思うな、もうデータが無いことはどこかで検出する必要が
あるわけで、それを行っているだけと、考えれば無駄でもなんでもない。
それに0バイトをreadしにいっているわけではないことに気がつかないと。
どうしてもきっちり読んで終わりたいのであれば、
最初に、 $len = -s $file; で長さを求め、
$len/1000 回と、$len%1000が0以上なら+1回読めば
いいんじゃないのか?
しかし、そんな細かい頭では、perl使ってる意味ないじゃん。
おまいら話が逸れすぎ。

> どのように書けば夏バテし難いさっぱりとしたコードになりますか?
だ。
716が勝手に夏バテしてるだけ。
>>716
そんなに気になるならとりあえず、while{..} の中に、
last if ($read<1000); いれて、即刻涼め。
744714:04/07/12 17:38
だめだ、サンプルみたいなのはあったけど、理解できない・・・
理解できる方、解答お願いできませんでしょうか?よろしくお願いします。
うごくかな?
sub sort{
 local (*a)=@_;
 for(my $i=0;$i<$#a;$i++) {
  for(my $j=$#a;$j>$i;$j--) {
   if($a[$j]<$a[$j-1]) {
    ($a[$i],$a[$j])=($a[$j],$a[$i])
   }
  }
 }
}
あ・・・
($a[$j],$a[$j-1])=($a[$j-1],$a[$j])
>>745

746の修正を入れれば動く。&sortとして呼ばないとシステムの
sortが呼ばれるのに気がつかずしばらく悩んだのは内緒だ。
perlスクリプトをHTMLに埋め込むことって出来ますでしょうか?
例えばpingを打ちたいと思ったら
CGIだと
クライアントから要求→サーバがping実行→クライアントに実行結果を返す
ですが、HTMLの中にスクリプトを埋め込むことによって、クライアントからpingを打つことは可能でしょうか?
うまく意味が伝わらなかったらごめんなさい_no
>>748
まあ、>>1
>>747
override する手もある罠。
751748:04/07/12 20:46
>>749
すみません。
CGIのことではなかったので・・・
あちらで聞いてみますね。お邪魔しました。
752716:04/07/12 20:52
実は元から最もシンプルな書き方が出来ていたみたいですね。
自分が勝手に夏ボケしていたようです。
このまま>>719をベースにする事にします。
相手してくださった皆様どうもありがとうございました。
753714:04/07/12 21:40
>>745>>746>>747
ありがとうございます。参考にしてがんばってみます。
754745:04/07/13 09:08
>>747
そういえば呼び方書かなかった・・・?
あと配列渡しは @data=(2,5,3,1,6,7,8); ってなとき、
&sort(\@data); って感じで。

if ($a == $b && $b == $c && $c == $d){
 なんたらかんたら;
}

上の($a == $b && $b == $c && $c == $d)の部分を
もっと簡潔に書く方法ってありませんか?
文字列なら ("$a$b$c$d" eq "$a"x4)
あ、文字列に関係ないか・・・
>>755
横に並べるからみっともないのであって、縦に並べると非常にわかりやすくなるです。
if (
  $a == $b # 等幅フォントなら半角空白で条件式がそろえられるし、
 and $b == $c # コメントを入れたりも出来るし、
 and $c == $d # 修正/削除も楽だし。
 ){
 なんたらかんたんら
}

でもって、数値比較しているんだから、
$a+$b+$c+$d == $a * 4
でもいいと思うし。
2+1+1.5+3.5==2*4 ですが
!grep {$a != $_} $b, $c, $d

わかりにくそう。
if((grep{$a == $_}$b, $c, $d)== 3){
print 'true';
}
成功したのが3回なら、ってどう?
やっぱ >>756 が、いちばん perl らしくてスマートでないか?
>>762
文字列であるとして
$a == "hoge"
$b == "hog"
$c == "ehoge"
$d == "hoge"
だったらどうなるの?

if (($a, $a, $a) == ($b, $c, $d)) {...}
>>763 パチパチ
765755:04/07/13 15:04
いろいろありがとうございます。
ちなみに$a〜$dに代入するのは数値です。
なので>>756の記述は使えませんです。
う〜ん、やっぱり普通に縦に記述していくのがいいのかなぁ。
761は却下ですか?そうですか
767755:04/07/13 15:08
って書き込んでる間にレスが・・・
>>763さんありがとうございます!
なるほど、かなりスマートでわかりやすいです。
さっそく使わせてもらいますね。
わろたw
@array = ($a, $b, $c, $d);
if((grep{$array[0] == $_}@array[1..$#array]) == $#array){
print 'true';
}

うーん、こっちの方が汎用性あると思うんだけどなあ、
やっぱ駄目ですか?そうですか
770755:04/07/13 16:10
>>769
ごめんなさい。
どちらもすてがたいです。
実際処理するとなるとどっちの方が軽いですかね?
甘えすぎ
>>763
> if (($a, $a, $a) == ($b, $c, $d)) {...}
リストってスカラコンテキストでは最後の要素を見るから、
if ($a == $d) {...}
という解釈になるんじゃないの?
773755:04/07/13 16:55
>>771 すいません、甘えすぎました。
>>772 そうなんですか?
自分で動く事を怠っていてはだめですよね。
ちょっといろいろ試してみます。
($a, $b, $c, $d) = (2, 1, 3, 2);
if (($a, $a, $a) == ($b, $c, $d)) {
print 'hoge';
}
--
hoge
775755:04/07/13 17:19
>>772
>>774
ホントですね・・・。
>>769さんのはちゃんとできました。
なんだか失礼な事しちゃってごめんなさい。
とりあえずは>>769さんのを使わせていただきます。
いろいろありがとうございますです。
>>759
わははー
orz・。
>>775
初心者のうちは何かと気の利いたコードを書こうとしがちですが、
後で見たときに「何してるんだろう?」と思うようなコードを書くくらいなら、
素直に
  if ($a==$b and $b==$c and $c==$d) {...}
と書いた方が、後々有益だと思いますよ。
# そもそも「簡潔」な書き方を求めていたような・・・
ちなみにこのような書き方をする場合、== の左右にはスペースを
書かない方が見やすいこともあります。
>>777
Space around most operators.
>>778
777が言ってるのは条件をたくさん並べる時の話では?
if ($a == $b and $b == $c and $c == $d) {...}
だと何だか締まりが無いが、
if ($a==$b and $b==$c and $c==$d) {...}
だとまとまりがあってすっきりする。
Cなんかでも同じだが、普段は空白入れても過剰な場合は
削るってのは当たり前だと思うが。
漏れ的には、一回だけなら758さんのタテ並べ、
複数回処理するなら、769さんの案をサブ化して使いたい。
781デフォルトの名無しさん:04/07/13 23:01
my %ok;
$ok{ ($a) x 4 } = 1;
if($ok{$b, $c, $d}){
# ...
}
#まッ、いろいろな方法があるって事で
$a == $b and $b == $c and $c == $d
$a == $b が真で $b == $c が真であれば $a == $c は真であると思うのだが、
その比較が無いという事は勝手に $a == $c の比較を行ってはいけないのだろう。
んー、よくわからないぞ?
&&やand演算子を使うという事はそれ以前が成立しない場合速攻で偽って事であってブツブツ...
俺も条件を縦に並べることがあるが、それは1つ1つの条件が長い場合で
あって、この程度ならば777案でいいと思う。
779も言っている通り過剰な空白は削るべきで、それは縦の空白も同じ。
横に書けるものをわざわざ縦に書いて、無駄に風通しの良いコードを
書くことに何のメリットも感じられない。
可変個数用に769案をサブ化というのは賛成。
黙って if( $a==$b and $a==$c and $a==$d ) でいいんじゃねーの
どうせならめちゃくちゃトリッキーにしようぜ
$a==$b and $a==$c and $a==$d

$a==$b and $b==$c and $c==$d
は、どっちががいいの?
自分は $a=$b=$c=$d ぽく見える後者が好きなんだが。
>>786
そりゃ質問した奴が一番知ってるだろ。
$b, $c, $d が $a と等しい事を伝えたいなら上、
$a が $b と等しい上に $b が $c と(以下略)なら下って感じかな。

どれが軽いかは黙ってベンチマークだろ。
>>781も違ってねーか?
my %s;
map { $s{$_} = 1 } ($a, $b, $c, $d);
if (keys(%s) == 1) {
# ...
}
結果どうこうより意図が伝わる、前や後ろの文脈との繋がりが分かりやすい書き方の方がいいんじゃないの
コードを読むのは人間なわけだし、一部のコード片だけ見てごちゃごちゃやるのは高速化以外の良い結果は生まないと思うなぁ
if ($a == $b && $b == $c && $c == $d){
 なんたらかんたら;
}
の”なんたらかんたら”の部分によってはもっと良い方向に書ける時もあるわけだし・・・

まぁそこまで言っちゃうと質問者にとっては余計なお節介になるのかな・・・^^;
>>781
>>789
すいません。これ何してるのかわからないです。
どなたか解説してくれませんか?
>>791
嫌です
793769:04/07/14 12:07
嫌ですか、そうですか。
>>785
もいっこ考えてみた。

@array = ($a, $b, $c, $d);
if ($#{[ keys %{ { map{ $_ => 1 }@array }}]} == 0 ){
print 'ok';
}

無名ハッシュに入れて
そのキーを無名配列に入れて
そいつの最後の添え字が0なら(要素一個なら)
全ての値が同じ、と

どう?
>>791
一瞬また間違ってるお前帰っていいよと書こうと思ったが、どうやら
$a, $b, $c, $dをキーとしてハッシュに1を代入。
$a, $b, $c, $dがすべて等しい場合キーが1つしかないはずだから
keys==1で比較すればいいだろうみたいな感じだな。
配列要素を数える場合はスカラ文脈で評価するってのか定石じゃね

@array = ($a, $b, $c, $d);
if ( keys %{{ map{ $_, $_ } @array }} == 1 ){
print 'ok';
}
すっきりしたべ
796769:04/07/14 15:03
>>794
>keys==1で比較すればいいだろうみたいな感じだな。
何が言いたい?
っぷ!?大丈夫か?おまえ
>>796
そういうお前も大丈夫か?
質問者が持ってきたコードは$a==$bでなかったらこれ以降の比較は必要なしというコードだぞ。
それをもっと簡潔にしたいといってるのになぜすべて比較しなければならなくなるんだ?
>>797
その話題は既に収束してて、 >>785 から題意が変わったのでは?
799769:04/07/14 19:04
>>797
なるほど!そうだな、言うとおりだ。
じゃ、こんなんはどうだ?

@array = ($a, $b, $c, $d);
if(grep{$array[0] != $_}@array[1..$#array]){
print "not ok \n";
}else{
print "ok \n";
}
>>799
>そうだな、言うとおりだ。
とか言いながら、自信満々に全比較してるのは何故?
ワロタw
802≠799:04/07/14 20:42
俺も作ってみた。

if ((sub{$_[0]==$_ or return for @_[1..$#_];1})->($a, $b, $c, $d)) {
  # 全部等しい
}
if($a == $a&$b&$c&$d){
これじゃだめなの?
あ、全然だめだね。スマソ
すっきり書くだけなら

if( judge($a,$b,$c) ){
なんたらかんたら;
}

sub judge($$$){ $_[0]==$_[1] && $_[1]==$_[2] }
って、隅の方に条件式を追い出しちゃうてのは?


調べる要素がもっと多いなら
sub judge(@){
while(@_>1){
return 0 unless(shift ==$_[0]);
}
1;
}
とかってどう?
コピーしてないので、渡された配列喰っちゃいますが。
>>805
>とかってどう?
うーん、無駄が多いよなぁ。
802が既に関数形してんだから、ちょっと書き換えて、

sub is_all_same {  # judge じゃ何する関数か分からんので変更
my $t = shift;
$t==$_ or return for @_;
1;
}

とかした方がいいんじゃね?
807769:04/07/14 23:51
>>800
おお、そかそか。
じゃ、とりあえず配列全部なめるmap grep だめジャン。
じゃ、これはどだ?

@array = (..);
foreach(@array[1..$#array]){
not_ok() if $array[0] != $_;
}
print "ok \n";
}

ま、あれだ、判定式サブルーチンに逃がすか、
偽でサブルーチンに逃げるか、って事だけど。
これならいい?
808769:04/07/14 23:53
>>807
閉じブレース余計ですんで、すません
>>807
そんだけごてごて書いた上に、sub not_ok {...} も作れってこと?
しかも、not_ok 内で exit するか、もう1つか2つ細工しないと
結局全部比較する上に、必ず print "ok" が実行されると思うんだが。
いじればいじるほど(ry
トリッキーじゃなくてただの遠周りにしか思えてこないな
811デフォルトの名無しさん:04/07/15 06:50
これからPerlを学ぼうと思っている者です。
よろしくお願いいたします。
Active Perlをインストールしようとすると

There is a problem with this Windows
Installer package. A program run as part of
the setup did not finish as expected. Contact
your support personnel or package vendor.

と表示され、インストールできません。
最近購入したばかりのパソコンなのですが
パソコンに原因があるのでしょうか?
分かる方いらっしゃいましたら教えてくださいm(__)m
よろしくお願いいたします。
>>811
未経験なので予想で。
1.ダウンロードしたファイルが壊れてる。→再ダウンロード
2.インストール権限がない。→administratorとかでログイン
たぶん2かな
>>809
仰るとおり。
じゃ、これは?

@array = ($a, $b, $c, $d);
LABEL:{
foreach(@array[1..$#array]){
last LABEL if $array[0] != $_;
}
print "ok \n";
}

これなら可変個要素比較し、偽で処理抜けるし
@array = ($a, $b, $c ...);
print (join('',@array) =~ /^$a+$/ ? 'OK' : 'NG');
>>815
756、763を読め。

数値限定だが、
@array = ($b, $c ...);
print join('', map "$_,", @array) =~ /^(?:$a,)+$/ ? 'OK' : 'NG';
ならOK
特定のファイルの仮想パスを絶対パスに変換する関数なんてあるんでしょうか?aspのServer.Mappathみたいな。
818811:04/07/15 17:05
>>812-813

返信ありがとうございます
再ダウンロードは何度かしてみましたが
やっぱりできません。

2のadministratorとかでログインというのは
どうやればいいのでしょうか?

何も知らなくてすいませんです。
よろしくお願いします。
use List::Any;
print "ok" if all { $a == $_ } ($b, $c, $d);

>>818
Windowsの話だからPC初心者板かな
821デフォルトの名無しさん:04/07/16 19:09
find . -name "*.[ch]"|while read l;do echo $l;mv $l $l.bak;sed -e s/^typedef */typedef /g < $l.bak > $l;rm -f $l.bak;done

シェルでよくこのような処理をするのですが、Perlでもっと簡単にやる方法はありますか?
>>821
対象ファイル名を表示しなくてもいいなら

perl -i -pe 's/(?<=^typedef) */ /g' `find . -name "*.[ch]"`
winでTkやってて、んでダブルクリックで起動してるんだけど、
キーボードのボタン認識ってどうするんだろう?
>>822
凄い!プロセス起動のコストがないので爆速ですね!!
-iオプションの威力がよく分りました。
>818
親によってWinにプログラムを組み込めない処置されているってことさ
親に頼め

もしくはダウンしたファイル本当にwin用なのか?msiなら無事入れられたぞ
Subject: ActivePerlのインストールについて
> windows98の環境にActivePerl5.6.1をインストールしようとinstmsi.exe(バージョン2.0)を入れた後、
> ActivePerlを入れると下記のようなエラーメッセージが表示されます。
> There is a problem with this Windows Installer package.A script required for this install to
> complete could not be run.Contact your support personnel or paceage vendor.

Res
> IE5.0以上が入っていないとインストール時に問題が出ると言う話は
> 聞いたことがあります。

> ご回答ありがとうございます。
> ブラウザはIE6.0 SP1 を使っています。

> DOSからインストールしたら成功しました。

> ダウンロードしたのが、msiファイルじゃなかったに違いない。(たぶん)
> MSIとAS Packegeとあったはずだけど。
> instmsi.exeを入れた意味が無いw(今後のためなら、問題無いが)

> msiファイルは
> ttp://www.activestate.com/Products/Download/Download.plex?id=ActivePerl
> の一番上のMSIをダウンロードしたので間違いではなかったと思います(たぶん)
> 2段目のAS PackegeをDOSから入れて成功しました。

一部省略済み
すいません。
@arrayに1〜100の数字が重複なしで20個くらい入ってまして、
その中にない数字80個くらいを配列の形で取り出したいんですけど、
どのようにすればいいのでしょうか??

>>827
#!/usr/bin/perl

my @array = (1,5,15,22,33,45,46,51,55,58,59,60,69,71,72,75,80,81,82,90,95,98,99);
my %Check;

@Check{ 1 .. 100 } = (1) x 100;
delete $Check{$_} foreach @array;

my @Surplus_array = sort grep exists $Check{$_}, keys %Check;

print "$_\n", foreach @Surplus_array;
my @a;
{
my %temp;
@temp{ @array } = ();
for(1..100){
push @a, $_ unless exists $temp{ $_ };
}
}
>>828
827じゃないけど、deleteって何かコスト高そうでBenchとってみた。
0 代入してtrue判断するよりも、 delete/existで判断した方が早いんだな
勉強になった。
>>828,829さん
なかなかアイディアが浮かばずできなかったのですが、
大変参考になりました。
ありがとうございます。
$a = "hello";

print "$a world";

出力: hello world

なんですが、出力をhelloworld とくっつけて表示させてい場合、

print "$aworld";

じゃ、だめじゃないですか。これってどうやって解決したらいいんですか?
{}
834833:04/07/19 10:48
記号書いただけじゃ分からんな・・・。

"${a}world"
$a."world"
print "${a}world";

で、行けました!ありがとう833
$aworld = "helloworld"
print "$aworld";
837836:04/07/20 16:28
syntax error at test.pl line 2, near "print"
Execution of test.pl aborted due to compilation errors.

orz
ダサッ
1行目にセミコロンがない〜♪
えっと

@test = ("test", "test2", "test3");

に対して、
$name = "test";
という変数があったとして、

@$name[0]

のように、変数内の文字列から配列を呼び出したいのですが、
どういった方法があるのでしょうか
>>840
eval("@" . $name ."[0..2]");
おぉ
どうもありがとうございます
PAR: Perl のスクリプトを Windows 用の実行ファイル (exe形式) に変換する
http://namazu.org/~satoru/diary/20040716.html

という記事を参考にPARを使ってみようと思ったのですが、
nmakeを使ってのPAR-0.85のコンパイルに失敗します。
PAR-0.85を公式サイトよりDLして、解凍し、プロンプトから、
perl Makefile.pl
nmake
とすると、
NMAKE : fatal error U1064: MAKEFILEが見つかりません、またターゲットが指定されていません。
Stop.
となり、うまくいきません。他のモジュールのコンパイルはうまくいくのですが、
これは何が問題なのでしょうか?
nmake -f Makefile とかすりゃイインジャネーノ
846デフォルトの名無しさん:04/07/21 16:09
いつの間に5.8.5が出たんだ。
つい先日インストールしたばかりなのに。
847デフォルトの名無しさん:04/07/21 18:37
$str = "abc";
$reg = "/a/";

print "Match!" if($str =~ $reg);

Match! と出力させたいのですがどうすればいいですか?
>>847
普通なら、
  $str = "abc";
  $reg = "a";
  print "Match!" if $str =~ /$reg/;
とするとこだが、あくまで
  $reg = "/a/";
にこだわるなら、
  print "Match!" if eval("$str =~ $reg");
とか。
849デフォルトの名無しさん:04/07/22 00:48
すみません、質問です。

Socketを使ってWeb上のリソースを取得しようと考えているのですが、
リクエストした先のURLがリダイレクションを行った場合、そのリダイレクション
を追跡してリソースを取得することは可能でしょうか?


具体的にはSocketを使ってamazon.co.jpの検索結果を読み込みたいと
思っているのですが、amazonでは検索結果をリダイレクションして出力する
ためか、Perl側で何も取得できないようです。

たとえばAという人のBというアルバムを検索すると
GET exec/obidos/external-search/?mode=music-jp&keyword=A B

該当するAという人のBというアルバムのページがあった場合、
exec/obidos/ASIN/B00005LN4Q/qid%3D109042..../250-5281286-9396....
といったURLにリダイレクションして出力される

Google等で検索してみたんですが、どうも分からなかったので、ご質問させて
頂いた次第です。何卒、ご教授を・・・。
>>849
Amazonの検索を使いたいならAWSを使えといってみる
>>850さん
ありがとうございます!

Amazon Web Serviceですか。こういうのがあったとは知りませんでした。
SOAPを使うようですね。

これならリダイレクション云々に悩む必要もなさそうです。
世間知らずで恥ずかしいばかりです・・・。
>>848
なんか、$strまで展開されそうな気もしますが。
と思ったけど、evalって都合よく解釈してくれるのね。

でも
print "Match!" if eval("$str =~ $reg");
じゃないとMatch!とは表示しないような気がする。
853852:04/07/22 02:50
そういえばこんなの

$str = "abc";
$reg = qr/a/;
print "Match!" if($str =~ $reg);

もあったね。require 5.006 っぽいけど。
>>852
展開されても問題ないじゃんじゃんー
855デフォルトの名無しさん:04/07/22 07:35
$a=4;
$b="*5";
$c=$a $b;

これで$cの値が20になってくれと言っているようなものだ。
$c = eval("$a $b");