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

このエントリーをはてなブックマークに追加
"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あたり
過去ログ

Perlについての質問箱
http://pc.2ch.net/tech/kako/1017/10177/1017736187.html
Perlについての質問箱 2箱目
http://pc3.2ch.net/tech/kako/1033/10336/1033688230.html
Perlについての質問箱 3箱目
http://pc2.2ch.net/tech/kako/1041/10412/1041205885.html
Perlについての質問箱 4箱目
http://pc2.2ch.net/tech/kako/1048/10485/1048519394.html
Perlについての質問箱 5箱目
http://pc2.2ch.net/tech/kako/1053/10530/1053053082.html
Perlについての質問箱 6箱目
http://pc2.2ch.net/test/read.cgi/tech/1060689008/
[プログラミング自体の経験が無い奴はまずココを読め]

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/
>>1
5デフォルトの名無しさん:03/11/06 09:20
http://www.nmt.ne.jp/~misao/cgi/kokorogy/kokorogy1_cgi.txt
このプログラムにほかのプログラムでテキスト出力した計算結果を読み込むプログラムを教えてください。
open (FILE,'data.txt');
$DATA=<FILE>;
とした場合
data.txtの中に、「1〜10」の数字が改行されながら入っている場合は、最初の一つ目のデータ「1」だけが、$DATA に代入されてしまいました。

個人のデータごとに違う値を読み込み出力させるには、どのようにしたらよいのでしょうか?
>>5
$DATAを@DATAにすれば?
7デフォルトの名無しさん:03/11/06 11:38
Ruby の p みたいにオブジェクト(リファレンス)の中身を手軽に表示できる関数はありませんか?
8デフォルトの名無しさん:03/11/06 11:40
>>1
マジ乙
Perl6はこれから流行りますか?
10名無し募集中。。。:03/11/06 18:03
シラネー
PerlもPerl6あたりで言語として落ち着くんだろうな。
>>7 Data:Dumperは?
>>7
use Data::Dumper;
print Dumper($ref);
下のコードみたいにTkとNet::Pingをいっしょに使うと
perl.exeがアプリケーションエラーで落ちるんですが、
これは仕様か私の環境だけでしょうか?
環境はWin2000, ActivePerlです。

use Tk;
use Net::Ping;

$text = '';

$top = MainWindow->new();
$top->Label(-textvariable => \$text)->pack();

$text = 'OK' if (Net::Ping::pingecho('localhost'));

MainLoop();
15デフォルトの名無しさん:03/11/07 00:19
use strictやってれば-wはつけなくていいですか?
>>12>>13
サンクスです
apache のログの検索ワード(UTF-8)をEUCに変換しようとしています。
Vine Linux 2.5 (perl-5.6.1 + Jcode-0.75)では成功するんですが、
Redhat9 (perl-5.8.0 + Jcode-0.83.tar.gz)では文字化けします。
こんな感じです↓
while (<IN>){
$_ =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
Jcode::convert(\$_,euc);
print $_;
}
perlのバージョンが違うからですか?
日本語対応が違うからでしょうか?
>>18
変換処理は Jcode がやってるんだから perl のヴァージョンは関係ない。
Vine 側では locale が EUC-JP のターミナル、Redhat 側では locale が
EUC-JP 以外のターミナルでそれぞれ表示し「化けてる」なんて馬鹿な事
を言っているのでなければ、

・Jcode.pm のヴァージョンを揃えて試す
・食わせているログが本当に同じか確かめる
・変換元が UTF-8 である事が確定しているならそれを明示
 Jcode::convert(\$_, 'euc', 'utf8');
2018:03/11/07 17:14
>>19
ありがとうございます。
もう一度確かめてみると、LANG=ja_JP.eucJP の環境変数を
セットしていないユーザがスクリプトを実行すると、
うまく変換できていなかったようです。
(コンソールではなくてファイルに保存したものを後で確認)
なぜでしょう?
>>20
Jcode MLに逝けよ
2218:03/11/07 18:51
Jcode ML を覗いてきました。

RedHat 9 の Default の locale が en_US.utf8 なので、
差し障るみたいですね。
# なぜだか分かりませんが。

なお、RH9にはEncodeがはじめから入っているので、
それを使えば吉とのこと。
つまりもうちょっとシステム周りも勉強しなさいってこった
配列の配列ってリファレンス使うしかないの?
もうちっとお手軽な方法はないんでしょうか?
>>24
リファレンスによる方法のどういう点がお手軽でないかを説明してくれ。
>>24
見た目も使い勝手もC言語に近いと思うが。
どんなところが不満なの?
全然近くないだろ。
28デフォルトの名無しさん:03/11/08 14:29
>>25
質問に質問で返すな
2928:03/11/08 14:30
いやなんでもない
30デフォルトの名無しさん:03/11/08 15:22
ファイルを読み込んで、値の小さいもの順にソートし、画面に出力させるプログラムを教えてください。
テキストには、n個のデータと名前があります。それを値が、小さいもの順に表示し、値の隣に名前も表示できるようにお願いします。
********テキストファイルの中身(data.txt)*********
17.56  Itirou
12.367 Jirou
1.5697 Saburou
56.23 Shirou
0.35 Gorou
****************** 
*******画面に出力すると
順位 数値  氏名
1: 0.35  Gorou
2: 1.5697 Saburou
3: 12.367 Jirou
4: 17.56  Itirou
5: 56.23 Shirou
**********************
と表示させたいのです。
また、順位、数値、氏名をTable文で囲って表示したいのです。
よろしくお願いします

31デフォルトの名無しさん:03/11/08 15:29
my $array = [
['a','b','c',],
['d','e','f',],
['g','h','i',],
];
print $array->[2][2]; #簡単!
>>30
print join ' ', ++$i, ':', @{$_}, "\n"
  for sort { $a->[0] <=> $b->[0] } map [ /([.0-9]+)\s*(\S+)/ ], <>;
>>30
system("sort -n data.txt|cat -n");
system("sort -n data.txt|cat -n|plain2html");
34デフォルトの名無しさん:03/11/08 15:52
>> 30 ほれ。
perl -ne 'BEGIN{print "順位 数値 氏名\n"} chomp;m/([\d\.]+).*?(\w+)/;$h{$2}=$1; END{foreach(sort {$h{$a} > $h{$b}} keys %h){$c++;print "$c: $h{$_} $_\n";}}' data.txt
3534:03/11/08 15:58
- $a} > $
+ $a} <=> $
36デフォルトの名無しさん:03/11/08 17:44
>>30
初心者風に分かりやすく書くと
$i = 1;
@sortfile = sort @file;
foreach(@sortfile){

print '$i : $_\n';
$i++;
}
3714:03/11/08 17:54
Windows使っている人は案外少ないのかなぁ〜
他で聞いてきます、ありがとございました。
38デフォルトの名無しさん:03/11/08 17:56
>>37
perl.exeに問題がある。
有料のを金だして買いなされ。
39デフォルトの名無しさん:03/11/08 22:09
>>31

my @array = (
['a','b','c',],
['d','e','f',],
['g','h','i',],
);
print $array[2][2]; #こっちの方が良くないか?
40デフォルトの名無しさん:03/11/08 22:18
printとprintfの違いを教えてください。
42デフォルトの名無しさん:03/11/08 22:25
>41
ありがとう。熟読してみます。
printfとsprintfはC言語の入門書の方がよほどわかりやすく書かれてる。
なんでPERLの本はどれもprintfについてちゃんと解説してくれないんだろ?
>>7
>>13
use Tk::ObjScanner;
Tk::ObjScanner::scan_object $ref;

を使てみた。これ凄くイイ!

無名配列や無名ハッシュをフォルダー、スカラ値をファイルに見立てて
ツリー表示。
scan_objectはDataDumperから呼び出すと自分でMainWindow->new
してくれる。

WeakRefパッケージがインストールされてる必要あるから気を付けて。
DataDumperの存在だけでも幸せな感じなのに、不向きと言われる複雑な
データ構造の検証に効果期待できそう。
>>43
printで十分なことが多いから
>>43
「Effective Perl」にPerlの*printf系の詳しい説明があった気がするが。
ま、*printfの機能自体C言語からの借り物だし。

sprintfでフォーマットかけながらスカラ値にするのは便利だけどね。
>>14
私も会社で補助ツールにActivePerlでつ。がんがれ。

>>38
気になりまつ...ポインタとかないでつか?
bindとlistenはネットワークプログラミングの入門書の方がよほどわかりやすく書かれてる。
なんでPERLの本はどれもbindについてちゃんと解説してくれないんだろ?
>>49
普通、サーバープログラムじゃないと使わないから
>>37=14
「他で聞いてみます」と言われてからやるのもなんだけど。
Windows XP Professional + Active Perl 5.8.0 build 806 でも落ちるね。
とりあえず、Net::Ping::pingecho() を Mainwindow の生成前に持ってくると落ちないようだ。
5244:03/11/09 02:04
>scan_objectはDataDumperから呼び出すと自分でMainWindow->new
すまん、Perlデバッガの間違いですた。

気軽にデバッグができるのがPerlの魅力。最近Ruby本よんで浮気心も湧い
たんだけど、このモジュールを見付けて思い直せたかも。
53デフォルトの名無しさん:03/11/09 03:42
すごいくだらない質問ですみません。

今、ActivePerlをWindows XP HomeEdition使ってるのですが、たとえば

print "hello\n";

とやっても hello がコマンドプロンプトで見えないくらい早くコマンドプロンプトが消えてしまいます。
C:\ perl test.pl
とか入力した際にコマンドプロンプトがそのまま残って

C:\ perl test.pl
hello
C:\

みたいにしてくれる方法は無いのでしょうか?
Perl初心者で勉強を始めたばかりなのですが、出力結果が見れないので困っています。ご教授よろしくおねがいします。
5453:03/11/09 03:58
すみません、いまやって見たら普通に出来ました。
違う質問なんですが、

open(F,"<test.txt") || die "cannnot open test.txt:$!\n";
while(<F>){
print;
}
close(F);

これを実行すると、
cannnot open test.txt:No such file or directory
と言われてしまいます。

同じ所にtest.txtはあるのですが何ででしょう?
>>54
open F, '<' . './test.txt' or die "cannnot open test.txt:$!\n";
これでどうだ。
5653:03/11/09 04:52
>>55
レスありがとうございます!
超初歩的なミスだったみたいです。

これからも馬鹿な質問するかも知れませんがよろしくおねがいします!
57デフォルトの名無しさん:03/11/09 05:03
いやです
マジレスキター
まぁ、ある程度は自分で頑張って・・・
59aaa ◆4nT1PmNFnA :03/11/09 21:10
aaa
で、どういう初歩的なミスだったの?
配列 @array = {a,a,b,d,c,6};

とかで、重複する文字列を消す方法はありますか?
>>61
man perlfaq4
6361:03/11/09 23:14
解決しましした。
すまん。
くだらない質問なんですが、$_を一時的な変数として使うのは
使い方間違ってますか?
別に間違っちゃいない。よくやるよ。
ただ、知らないうちに破壊しちゃってた、なんてことに気をつけれ。
>>65
そうですね。ありがとうございました。
間違っちゃいないが注意して使えよ。

sub hoge{
$_ = $_[0]; # !!
#$_をいじくる
return $_;
}

というふうに関数内部で$_の中身を破壊するのは止めとけ。
で、local($_)とかわざわざするくらいならmy変数使え。
俺は正規表現関係で $foo =~ /.../ をいくつも書くのが面倒な時だけ"$_への明示的な代入"をしてる。
$i = @url;
for ($i2 = 0; $i2 < $i; $i2++){
$ua = new LWP::UserAgent;
$ua->agent("LWP::GETHEAD");
$request = new HTTP::Request HEAD => $url[$i2];
$response = $ua->request($request);
print $url[$i2],"Last-Modified:\t", $response->header("Last-Modified"),"\n";
}
配列@urlにURIをぶちこんで、
更新日時を取得して表示するプログラムをつくったんですが、
表示してる途中に止まるんです、処理が重いのでしょうか?
何か解決方法は?

>>68
ドコで何秒くらい止まるのか不明。
タイムアウトを短くするとか。
レスポンスコードもチェックした方がいいかも。
リファラが必要な場合もある(普通は必要ないけど)。
質問とは無関係だけど、ループはforeach使うとよりスマートになるかな。
70デフォルトの名無しさん:03/11/11 01:09
localとmyの区別が出来ない>>67は死んでください
別に区別できてないとは思わんけどね。
myで済むものを「わざわざ」localにするなってだけの話でしょ。
>>71
local($_); が my $_;
で済むの?
>>72
local($_); とは書いてあるが、my $_; とは書いてない。エラーになるんだし。
「my変数」ってことは my $hoge; ってことでしょ。
74デフォルトの名無しさん:03/11/11 10:25
perlから外部プログラムを起動するにはどうすればいいんでしょうか。
C言語のsystem()のようなのを使いたいんですが。
perldoc -f system
ああ、なんだ、systemってそのままあったのか・・・。
どうもありがとうございました。
78デフォルトの名無しさん:03/11/11 16:09
関係ないが、Perlの「=>」表記って最高に可読性があるね。

%hoge=(
'aaa' => 1,
'bbb' => 2,
'ccc' => 3,
);
初心者がPerlについて質問です。
XPのパソコンにActivePerlをインストールした後
コマンドプロンプトで「perl-v」を実行したら
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
C:\>perl-v
'perl-v' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
と、でました。
これはPerlが導入できてないということでしょうか?
原因は何でしょう?
アドバイスもしくは誘導をお願いいたします。
perl -v
   ~
8179:03/11/11 18:33
解決しました。ハローワールド。
>>80さん、ありがとうです。
自分のプログラマーとしての才能のなさにびっくりしました。

でも目の前にある新しい世界にどきどきしてます。
>>80
お前には向いてないからやめた方がいいぞ
ここ最近スレの伸びが早いなぁ
なぁ、Windowsの話題は別スレが良いんじゃないか?

ゲンナリしてるヤシの数
>>79
ネタかと思った。
>>84
ActivePerlの話題はWindows板に行けとでも?
それともActivePerlスレ立てるのかい?
ところでみなさんPerlでswitch使う?

漏れは
SWITCH:{
if(COND1){
//処理1
last SWITCH;
}
if(COND2){
//処理2
last SWITCH;
}
}

とやってるのだが
if( COND1 )
{
処理1
}
elsif( COND2 )
{
処理2
}
else
{
処理3
}

そのまんまだなぁ。たしかif-elsif-else文は内部で最適化
かかるとかなんとかでswitch処理はあまりひねったことしてない。

だらだら長い分岐の場合はハッシュに無名サブいれてキーにヒット
したら無名サブコールさせる。スコープの問題とか出そうなので
ケースバイケースでやったりする。

my %subs = (
COND1 => sub{ 処理1 },
COND2 => sub{ 処理2 },
);
for(keys %subs){ $subs{$_}->() if($cond eq $_) };

...気味悪いよな、やっぱり。

>>87
Switch.pmはどうよ?
Perl5.8.0では標準で付いてるみたいだけど。

http://search.cpan.org/~dconway/Switch-2.09/Switch.pm
9088:03/11/12 00:02
あぁッ、タブは詰まっちゃうのか。for文で回さないなら
もっとシンプルになるけど、初心者にはもう読めまいな。

my %subs = (
COND1 => sub{ 処理1 },
COND2 => sub{ 処理2 },
);

$subs{$cond}->();
初心者は無理だが初級者はこれぐらい分からないとな
for でまわされる方がかえってわかりにくい。
>>89
Switch.pmはソースフィルタだからコンパイルが遅くなる上に、
結局の所if-elsif-elseに対するラッパーだから実行速度も遅いという欠点がある

ちなみにSwitch.pm(に限らず他のソースフィルタモジュール)がどういうふうにソースをいじるかは
perl -MO=Deparse script.pl
とすればある程度知ることができる
>>93
まーそうだろうね。かなりムチャしてるっぽいし>Switch.pm
Perl6からはgiven〜whenとなって実装されるらしいので
それまではif〜elsif〜elseで我慢しろと。
$msg = <STDIN>;
if ($msg eq "exit") {
exit();
} else {
print "Syntax Error.";
}
exitと打ち込んだら終了それ以外ならエラーメッセージを出力。
という風にしたかったのですが、どのような文字を打ち込んでもelse{}の方が実行されてしまいます。

書き方自体が間違っているのでしょうか?
96デフォルトの名無しさん:03/11/12 12:17
Perlには変数や関数の名前付けのガイドラインのようなものはありますか?
>>95 はい。
>>95
よくはまる罠
exitと入力してEnter押したら、exitの後ろに改行がついている
9995:03/11/12 13:16
なるほど 1行丸ごと取ってくるので改行まで入ってしまうんですね。
"exit\n"で正しく終了してくれました。
97-98さんありがとうございます。
>>99
chomp使ったほうが良いと思われ
10295:03/11/12 14:00
100>> なるほど〜
$msg =~ s/\n//g;
と書くよりchompで切った方が読みやすいですね。
勉強になりました。
>>101
THX!
10496:03/11/13 00:25
再度質問させて下さい。
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlstyle.html
を見ているのですが、

・その行内でマッチする最後の括弧の後にスペースを入れる。

これがどうゆうことを示しているのか分かりません。
どなたか簡単な例で説明できる方はいらっしゃいませんか?
if ($foo) {
とか
open(FOO, $foo) || die "$!";
の ) の後にスペースを入れるということでは?
でも
print "\n" if ($foo);
の ) の後には普通スペース入れないよね…
セミコロンは
・No space before the semicolon.
が適用されるんで問題ないっしょ。つーか
こんなもんラリーが「こうしたらいいよ」って言ってるだけなんだし
好きにすればいい。
107デフォルトの名無しさん:03/11/13 08:17
初歩的な事ですが聞きたいので教えてください。
今 a.txtには

a b
c d
e f
g h

といったようなデータが入っていて、これらを配列に読み込ませたいのですがどうすればいいのでしょう?
手動でやると

@hairetu=("a","b","c","d","e"...........,);

と言った事がやりたいのですが・・・・。
push, split を調べれ
最近新しいノートパソコンを買うことになったので
家に余っている【ThinkPad A20m】を3台(一台は汚れていますが・・
MDコンポ1台を無料で譲ります。欲しい方居ましたら貰ってやって下さい

http://www.ka3.koalanet.ne.jp/~magic32/muryou.html
110デフォルトの名無しさん:03/11/13 10:00
↑イラネ
11196:03/11/13 10:13
良く分からないのでこの部分は見なかったことにします。
なにが分からないのか分からん
113デフォルトの名無しさん:03/11/13 18:21
>>108
ありがとうございます!
114デフォルトの名無しさん:03/11/13 19:17
@list = ("abcaabbccaaabbbcccabcccccabcccabcccc");

foreach $value (@list){
if ($list =~ /c{2,4}/){
s/c/X/;
print "$value";
}
}

リストの特定の文字列cをXに置き換えたいんですけど・・・。
イマイチ分かりません。この初心者にどなたか慈悲を。。。
>>114
http://www5a.biglobe.ne.jp/~n_rieko/perl/1.htm
ここから全ページ順番に最後まで読んで & 試してから
まだ分からなかったらもう一度おいで。
116デフォルトの名無しさん:03/11/13 19:23
if ($request{'processType'} eq 'add') {# 追加の場合はエラーチェック
# 存在チェック SQL の配列
my @compareSqlList;
# 存在チェックする項目名の配列
my @compareItemList;

if ((defined $request{項目名})&&($request{項目名} ne '')) {
my $sql = "SELECT "."\n"
." *"."\n"
." FROM テーブル"."\n"
." WHERE 項目名 = '$request{'項目名'}'"."\n"
;
push (@compareSqlList, $sql);
push (@compareItemList, "項目名");

$error = checkValues::isCompareError_2(\@compareSqlList, \@compareItemList, $err_msg);
}
}
処理は走ってるんだけど
$err_msgに格納してあるエラーメッセージが表示されないんだわ。何でかわかる?
>>114
演習問題を他人にやらすんじゃぁねぇーよ
118デフォルトの名無しさん:03/11/13 19:33
>115
そこは有名なサイト?なので頻繁に見ています。
なんか根本から違うような気がしないでもないのですが
自分では気が付かないというか・・・。難しいです。
ヒントでも良いので取り敢えず何か教えてください。
ヤレヤレ
>>114
$list = "abcaabbccaaabbbcccabcccccabcccabcccc";

$list =~s/c/X/g;

これじゃダメ?
っていうかデータ構造はリストじゃなきゃだめなの?
>>114
foreach が何をするものか理解してる?
そこをきちんと理解すれば、foreach の次の行が間違ってるのが分かるはず。

あと s/// の使い方も間違ってる。
いじりたい文字列の入ってる変数が $_ 以外のときは、陽に変数を指定する必要あり。

>>120 を参考によ〜く調べてみるべし。
122デフォルトの名無しさん:03/11/13 21:33
foreach(条件)ですよね・・・。
そこが間違ってるのは気づきましたが、
結局良く分かりません。置き換わりません・・・。
>>122
論点の整理ね

1.
@list = ("abcaabbccaaabbbcccabcccccabcccabcccc");
->@list というデータ構造はどういう意味か

2.
foreach $value (@list){
if ($list =~ /c{2,4}/){
-> $list =~/c{2,4}/ の $list という変数は何を指しているか

3.
s/c/X/;
-> s/c/X/; で置換される対象の変数は何か?

これらの意味が分からないと問題が解決しないと思われ
}
}
>>114
> リストの特定の文字列cをXに置き換えたいんですけど・・・。
> イマイチ分かりません。この初心者にどなたか慈悲を。。。
演習問題ならやってみよっと。

@list = ("abcaabbccaaabbbcccabcccccabcccabcccc"); # 配列らしいけれども 1 要素しかないよね?

foreach $value (@list){ print $value if $value =~ s/\Gc{2,4}/X/g; }

注意点は、
・最長マッチさせること
・マッチ対象を重複させないこと
なのかな?

採点キボンヌ
>>124
>>114 は X の数を c の数に対応させたいのではないだろうか?
abcabccabccc -> abcabXXabXXX のように。
>>124
grep の方が良いのかもとか思ったりした。。。
print(join '', grep s/\Gc{2,4}/X/g, @list);
いんや map かも?(優柔不断)
127デフォルトの名無しさん:03/11/13 22:53
何となく出来ました(´ω`)
有り難う御座いました。
128デフォルトの名無しさん:03/11/14 00:48
0x0003を0x0300
0x1234を0x3412
にするにはどうすればいいのですか?
130デフォルトの名無しさん:03/11/14 02:01
>>128
($n<<8)&0xFFFF)|$n>>8
じゃダメかしら?
131デフォルトの名無しさん:03/11/14 02:36
IPアドレスを、ドット区切りからドット区切りなしの10進数に変換する式を本で読んだのですが必要ないと思って捨ててしましました。
知ってる方いらっしゃいましたら、教えて頂けませんか?
132デフォルトの名無しさん:03/11/14 03:14
>>131
inet_aton?
>>131
こゆこと?

$dec=($dec<<8)+$_ for split(/\./,"64.71.145.43");
printf "%08x = %d\n",$dec,$dec;
134デフォルトの名無しさん:03/11/14 09:30
教えてください。
HTMLからBODYの部分だけをとるには、
どうすればいいのでしょう?教えてください。
135デフォルトの名無しさん:03/11/14 09:44
>>134
出来ました!お騒がせしました。
136デフォルトの名無しさん:03/11/14 14:52
>>133
ありがとうございます。えっと、ちょっと違いますです。
IPアドレスの32bitを、そのまま10進表記にした数字を
ドット区切りから求めたいのです。。。
>>136
あっちにも書いたけど

my $ip = '192.168.0.1';
my $dec = vec pack('C4', split /\./, $ip), 0, 32; # 3232235521
138デフォルトの名無しさん:03/11/14 21:18

@name = ($FORM{'year'},$FORM{'month'},$FORM{'day'},$FORM{'hour'},$FORM{'minute'});

open (IN, ">> @name.txt");
print IN @data;
close(IN);

2003 01 01 01 01.txtとなってしまいます。200301010101.txtにするにはどうしたら
いいのでしょうか?
>>138
undef $";
>>139でもいいけど、joinかな。
141138:03/11/14 21:30
お返事ありがとうございます。
perlはじめてまだ2日目なので、それをどこに挿入すれば良いかわかりませんので
おしえてくれませんでしょうか。

あと、
間違って $FORM{'year'},"\n",$FORM{'month'},というファイルを保存してしまったところ
削除ができなくなってしまいました。どうすれば良いでしょうか?
rm -f "2003 01 01 01 01.txt"
143デフォルトの名無しさん:03/11/14 21:35
>>142
お返事ありがとうございます。
2003 ? 01.txtというファイルが保存されており
rm -f "2003 ? 01.txt" とコマンドを入力したのですが、削除できませんでした。
これはもうあきらめるしかないのでしょうか。。
144デフォルトの名無しさん:03/11/14 21:41
>>140
JOINで検索した資料を参考にしたところできるようになりました。139さんもありがとうございました。
>>143
ls -Al | cat -e してみる。(コントロールコードとファイル名の終端を'$'で表示)
該当するファイルを表示されたとおりに入力して削除してみりる。
rm -rf 2003^M01.txt かな。
146143:03/11/14 22:06
>>145
だめでした・・・。
>>146

#!/usr/bin/perl
unlink "2003\n01.txt"

Perlで作ったファイルなら
Perlで消してはどうでしょう
unlink "2003 \n 01.txt"; かな
rm 2003*.txt とかでいいんでね?
150146:03/11/14 23:24
みなさんのご協力により無事消すことができました。
ありがとうございました。
151デフォルトの名無しさん:03/11/14 23:40
foreach(1..60){
if ($_ 〜〜〜

において、$_が1〜9の場合01〜09と先頭に0を付けるようにしたいのだが、
perl独自の方法で解決する事はできるのでしょうか?

それとも、別個にプログラムを作成しなくてはならないのでしょうか?
(s)printf "%02d" とか
> したいのだが、
> のでしょうか?
154デフォルトの名無しさん:03/11/15 00:40
PERLで特定のフォルダ内のファイルをリスト化しHTMLで出力する場合、
どのようにリストを取得すれば良いのでしょうか?
155デフォルトの名無しさん:03/11/15 00:48
>>154
readdir
156デフォルトの名無しさん:03/11/15 00:55
>>155
THX

ここに居る人たちは本当に詳しいなぁ。なんでこんなに詳しいんだ??
>>156
安心しろ。あんたが無知なだけだ。
>>157
ワロタ。全くもって同意。
そもそも readdir もあんまり perl の話じゃないしな。
159デフォルトの名無しさん:03/11/15 02:02
>>137
ありがとうございます。ところが数値が-1062731775になってしまします。
(print "$dec";しただけです。)
多分signedとして出力してるのではないかと思うのですが、unsignedにするにはどうすればいいでしょうか?
160デフォルトの名無しさん:03/11/15 02:08
>>159
それどっかのHPに書いてあったよ。忘れたけど。

ところで、Webプロキシのperlどっかにおっこってないでしょうか。
161デフォルトの名無しさん:03/11/15 04:14
教えてください。

@hairetu には (a,b,c,c,t,a,t,b,・・・・・・・)
とたくさんデータが入っていて、

aは全部で何個
bは全部で何個と言う風に計算したいんですけど、さっぱり分かりません。

どなたか教えていただけ無いでしょうか?
>>161プログラミングの才能ないね
>>161

$a = grep {$_ eq a} @hairetu;
$b = grep {$_ eq b} @hairetu;
   :
>>159
$dec = sprintf "%u",$dec;
でどでそ?

>>161
a-z の数を調べるのだろうか・・・
$alphabet{$_}++ foreach @hairetsu;
で %alphabet に数値が入りそうな。。。
>>159
#--- test.p ---
my %ip;
for (@ARGV) {
  $ip{'d'} = vec pack('C4', split /\./), 0, 32;
  $ip{'lu'} = sprintf '%lu', $ip{'d'};
  $ip{'lx'} = sprintf '%lx', $ip{'d'};
  ($ip{'b'} = $_) =~ s/(\d+)\.?/unpack 'B8', pack 'C', $1/eg;
  print "$_: $ip{$_}\n" for qw(d lu lx b);
}
__END__
> perl test.p 255.255.255.255
d: 4294967295
lu: 4294967295
lx: ffffffff
b: 11111111111111111111111111111111

http://perldoc.com/perl5.8.0/pod/func/vec.html
http://perldoc.com/perl5.8.0/pod/func/pack.html
http://perldoc.com/perl5.8.0/pod/func/unpack.html
http://perldoc.com/perl5.8.0/pod/func/sprintf.html
166161:03/11/15 12:56
そうなんです、全く才能無いんですけどやらないといけなくて・・・・

>>163
>>164
a-zの数を調べるのじゃなくて、配列には (次郎、太郎、三郎、次郎、・・・・
の様に何が入っているかは事前に分からないんです。
>>166
だから >>164 でいいんじゃねぇのか?
>>166
才能がないならブー垂れないで、もがけよ。
他人が手助けしてくれているのに
条件を後出しするって何様の積もり?
169デフォルトの名無しさん:03/11/15 15:27
#>>166
use strict;
my @hairetu = qw(a b b c a b);
my %count_hash;
map {$count_hash{$_}++} @hairetu;
while(my ($key, $value) = each %count_hash)
{ print "$key: $value\n"; }
170デフォルトの名無しさん:03/11/15 15:33
なんか、mapのボイド・コンテキストでの使用はトリッキーでどうも好かんね。
171デフォルトの名無しさん:03/11/15 15:42
>>170
map {$count_hash{$_}++} @hairetu;
より
for (@hairetu) {$count_hash{$_}++}
のほうがお好きですか。
172デフォルトの名無しさん:03/11/15 15:46
うん。それか164の後半の書き方が好きだね。
mapは基本的にはリストからリストの写像って感じでつかうね。
sub timeOut {
my ($r_time, $compare_time) = @_;
if ($compare_time ne "") {
return (time - $r_time > $compare_time);
} else {
return (time - $$r_time{'time'} > $$r_time{'timeout'});
}
}

このサブルーチンは何をしているのでしょうか?
>>173
> sub timeOut {

小学生にも笑われるぞ
>>173
undef か 1 を返しています。

でいいのかな?(w
変数の扱いを見ると本体は、かーなーりー混乱しそうなソースのようですけれども(哀)
>>174
私が作ったのではないので聞いているのですよ

>>175
ありがとうです〜
>>176
自分が作ってないやつは全部聞くのか?
そもそも、こんな短かいのが読めないやつが「自分で作」れるとは到底思えんのだが。
>>174
笑うところどこ?

# Javaみたいなスタイルだから?
>>178
timeOutと{の間のスペースでしょう。
180178:03/11/15 21:35
>>179
うーむ。深いですね。
ありがとん。
timeOut って書いてあるからタイムアウト処理なんだろ
182161:03/11/15 23:36
>>167
>>168
>>169
ありがとうございます!
やって見ます!
183デフォルトの名無しさん:03/11/16 05:04
>>137 >>164
レスが遅くなって失礼しました。希望通りの結果を得られました。ありがとうございました。
184デフォルトの名無しさん:03/11/16 05:05
こんな感じに外部の画像ファイルを自分のページで加工ってできるの?
ttp://images.google.co.jp/images?hl=ja&lr=&ie=UTF-8&oe=UTF-8&q=a
image magickで外部ファイルって加工できないの?
185161:03/11/16 05:11
>>169
ありがとうございましたm(__)m
これで出来ました。本当に助かりました。
187デフォルトの名無しさん:03/11/16 14:42
exit;
を入れるとエラーが出てしまいます。
考えられる原因は何でしょうか?
>>187 貴方の存在
>>187
「Perl が動きません。考えられる原因は何でしょうか?」
の問に完璧に答えられたら教えてあげるYO!
Tkを使ってる会社ある?普通はJavaかな?
予想

CGIとして動かしていて、エラーというのはPerlが出すエラーではなく、HTTPサーバが出すエラーである。
ヘッダーを出力せずにexitしたからエラーとなった。
正規表現で (/A.*?B/) と書くとAとBの間に改行文字があった場合マッチしない
ようなのですが改行文字があってもマッチするようにするにはどう書いたらいいんでしょう?
>>192
sオプション
>>193
むむ、確かに。助かりました。
ところでObjective Perl 実践してる人います?
漏れはどうもあの泥臭い文法が好きになれないんだが
>>195
データ構造が複雑になる時には。
@data = (["January", 28], ["February", 15], ["March", 18], ["April", 20]);
という2次元配列があったとして、各配列の2番目の要素(28や15)で
ソートして2次元配列を生成するにはどうしたらよいのでしょう?
198デフォルトの名無しさん:03/11/18 02:20
sort {$a->[1]<=>$b->[1]} @data;
じゃダメかしら?
>>197
どうしたらよいか自分で考えたのかおまいは
>>197>>198
Perl の sort は安定なソートをしてくれると思うけど、神経質な人は
> sort{ ($a->[1] <=> $b->[1]) or &CmpMonth($a->[0], $b->[0]) } @data;
ってやって、
> sub CmpMonth($$) {
> my( $MonA, $MonB ) = @_;
> %Mon = (
> 'January' => 1,
> 'February' => 2,
> ...
> 'December' => 12
> );
> $NumA = $Mon{$MonA};
> $NumB = $Mon{$MonB};
> return ($NumA <=> $NumB);
> }
ってしておくといいかも。
Bug があると恥ずかしいのでsageで。
>>200
それなら
sort day_month @data;
sub day_month { #以下略
}
の方がスッキリすると思うが
202デフォルトの名無しさん:03/11/19 00:46
>>199
コード示せないのに偉そうなこと言ってんじゃね〜よ
ボンクラ君!
203デフォルトの名無しさん:03/11/19 00:47
>>202
煽るよりもまずすべきことがあるでしょう。
204デフォルトの名無しさん:03/11/19 01:01
>>202
オナニーならしましたが、なにか?
205デフォルトの名無しさん:03/11/19 03:57
$tmp="こんにちは。今日はいい天気ですね。";
$tmp=~/(.*)。/;
print $1;


教えてください。上のは自分で"。"で区切るようにしたつもりで
こんにちは
と表示したかったのですが、全文出てきてしまいます。

どうすれば。で分ける事が出来るのでしょう?
>>205
この場合最短マッチすれば桶

単に区切るなら、split が吉鴨
207デフォルトの名無しさん:03/11/19 05:09
>206
split使った方がよさそうですね。
ありがとうございました。
208デフォルトの名無しさん:03/11/20 00:04
他のスレで聞いてもまともな答えが返ってこなかったのでここで聞きます。

シリアルポートを下記でオープンして
open(COM1, "+>COM1") or die "Can't open COM1: $!";
read($Port,$response,1);
ってやると永久に待っているのですが、10secで
タイムアウトなんて出来ないんですか?
perldoc select
210デフォルトの名無しさん:03/11/20 00:21
>>209
あっちでもそんなこと言っていた奴がいたが、それじゃわかんねーっつーの!!
211デフォルトの名無しさん:03/11/20 01:02
212デフォルトの名無しさん:03/11/20 01:23
どう考えても、perlを使用するメリットが感じられない。
デバッグ大変やろ?
小手先のテクニックではなく、トータルの開発効率で考えろよ。と
perl馬鹿どもに言いたい。
213デフォルトの名無しさん:03/11/20 01:29
ほとんど、モジュール使うようにしているからそうでもない。
>>212
自分で書いてるんだったら、記述が悪い。
持ってきたんだったら、ソースが屑なだけ。

結局、自分はいいソースをみたことがないということで勉強不足やといいたいわけな。
>>210
これで分からないならプログラミングなんてやめたほうがいいな
>>212
日本語が良く分からんのだが、

> 小手先のテクニックではなく、トータルの開発効率で考えろよ

perl を使ってるやつは小手先のテクニックを考えてるから perl を使ってるのか?
217デフォルトの名無しさん:03/11/20 08:31
質問です。十進数を二進数に変換する関数を作っています。
しかし、現在のコードでは255より大きい引数を取れません。
引数に、任意の整数を取れるように改良する方法を教えてください。
コードは以下の通りです。

sub tenToTwo { unpack("B8", pack("C", $source)); }
print tenToTwo(4);

お願いします。
>>217
10進数->8進数->2進数でやれ
10進数->8進数: sprintf
8進数の各桁->2進数の下3桁


>>217
<q cite="http://perldoc.com/perl5.8.0/pod/func/pack.html">
sub bintodec {
  unpack("N", pack("B32", substr("0" x 32 . shift, -32)));
}
</q>

sub dectobin {
  my $bin = unpack 'B32', pack 'N', shift;
  $bin =~ s/^0+//;
  return $bin;
}
220デフォルトの名無しさん:03/11/20 18:14
ある値がいくつ含まれているか数えたいのですが、効率のいい方法(負荷の軽い方法)はあるでしょうか?
具体的にはこんな感じです。すごく無駄っぽいので、なにかいい方法を探してます。

$n =($value =~ s/\r/\r/);
>>220
$n =($value =~ m/\r/g);
222デフォルトの名無しさん:03/11/20 18:45
tr
文字数カウントするだけなら tr/// 使うでしょ。普通
224217:03/11/21 08:07
>>219
ありがとうございます!
225りるれろ:03/11/21 08:18
MacOSXでperlを使う際に、日本語を処理させるにはどのようにすれば良いでしょうか?
>>225
use encoding;
227デフォルトの名無しさん:03/11/21 13:30
グローバル変数を使わずに、クロージャで関数に値を閉じ込めながら
処理していく、そういったやり方のサンプルコードはありませんか?
229デフォルトの名無しさん:03/11/21 18:25
んー、やっぱりカウンターもどきの物ばっかりですな。
クラスにおけるデザインパターンのようなプログラムデザインに
影響を及ぼすような何かは、LISP使いにならないと学べないのかな。
「関数を返す関数」の鮮やかな使い方が見たい。。。
7箱目に今日気付いた。2週間越しか。。

誰も答えてない奴を一つ。
>>151
foreach("01".."60"){

マジカルインクリメントでもいい。
>>229
黒豹本ではクロージャの活用例として、
GUI のコールバックプロシージャと、
乱数・偶数ストリームの生成器が挙げられている。

ま、目的無しに手段は学べんってこった。
>>229
Scheme勉強兼SICP嫁目鱗必至
233デフォルトの名無しさん:03/11/21 21:03
>>220です。
>>221-223ありがとうございます。
自分的にはm//の方がいいかと思うのですが、やっぱりtr///の方がいいでしょうか?
また、蛇足ですが、今までtrはほとんど使ってこなかったのですが、s///とtr///の違いは何でしょうか?
あまり違いが分からないのですが、後学のために教えて下さいませ。
>>233
教えてクレクレ君?
自分でその違いを見つけてみるのも楽しいと思うけれども。。。
235デフォルトの名無しさん:03/11/21 21:38
教えてクレクレ君ですいません。
あんまりperlに楽しみを求めていませんので・・・道具として使っているというか・・・
perlを愛している人には申し訳ないのですが・・・
236デフォルトの名無しさん:03/11/21 21:40
ロジックは愛してるかもしれません。
それを考えるのは好きなのでこの仕事をしてるのかもしれません。
ただ、目的のためにはCでもPerlでもいいわけでして・・・
メンテナンスがいいことと、文字列処理がしやすいのでperlを使ってます。
駄文すいませんでした。
>>233
どういう基準に対して「いい」のかに依ると思うが。
http://perldoc.com/perl5.8.0/pod/perlop.html#Regexp-Quote-Like-Operators
http://perldoc.com/perl5.8.0/lib/Benchmark.html

クリティカルな用途なら道具の特性を深く知っておくべきだし、
雑務のお手伝いさんなら意図通り動いてりゃそれでいいんじゃないか?
238デフォルトの名無しさん:03/11/21 23:37
>>237
おっしゃる通りです
>>230
>>152 の立場は…?
ただ単なる道具としてPerlを使ってようが教えてクレクレじゃどうせ道具としても使いこなせんだろー
道具として使っているのなら尚更・・・という職人気質みたいなこというと嫌われますよねこの昨今(哀)
242デフォルトの名無しさん:03/11/22 09:22
>>240
ん?何を勘違いしてるんだろう?
ここでもそうだけど、メーリングリストとかの自称Perl使いは、構文に凝りすぎだと思います。

>>241
知る必要があることと無いことがあると思うんですよ。道具に関して。
例えば、車を使うのにエンジンの組み立て方を知る必要があるでしょうか?
コンピュータ制御されたエンジンのアルゴリズムを知らないと、車を運転する資格がないのでしょうか?
ある程度の線引きがあると思うんですよ。ここまで知ってれば十分っていう。
掲示板で教えてくれる親切な人は、その線引きがおかしい人がいるんじゃないかと。。。
243デフォルトの名無しさん:03/11/22 11:26
>>242
道具として使うなら、せめて「ProgrammingPerl」くらいは持ってるべき。
あるいは、マニュアル(perldoc)くらい嫁と子一時間(以下略

perldoc -f s -> perldoc perlop と進めば、最低でもs///とtr///くらいの
基礎的知識は容易に得られる。
前者は正規表現置換演算子。後者は一括文字置換演算子。

trは正規表現より遥かに高速で、tr/AB/BA/という芸当が出来るのが特徴。
sは常勝不敗で最強無敵。理論上は何でもできるが、何でもやらせられるほど
高速ではない。書き方によって大きく差が出るPerlの中に潜む別言語。
>>242
構文に凝ろうが凝るまいが本人の自由だろ。
コーディングに凝るのはPerl使いだけに限らないし。

道具に関して知る必要があることとないことの線引きなんてないね。
それも本人の自由だから。
ここまで知ってれば十分なんて思ってるような香具師はプログラミングに
限らず何やっても大成しないよ。
245デフォルトの名無しさん:03/11/22 11:35
>>242
Perlの構文ならその車の使い方に相当するんじゃないの?
エンジンの組み立て方はPerl(のインタプリタ)の作りに相当するものだよね?
>>242
基本的には同意。
とはいえ、Perl モジュールの内部構造とか、Perl での OO の実現方法とかなら、その
車の例えに合致してると思うけど、s///, tr/// レベルは Perl 組み込みの演算子で、
しかも利点として挙げられてる文字列処理なわけで。
人に聞くよりも自分で調べたり試してみたほうが身につくとは思うんだけどな。

で、端的にいうと、tr は文字ごとの置き換え、s は文字列の置き換えで正規表現が利用可能。
と、「人に聞く」形にして嫌がらせしてみるテスト(w
>>239
あ、「誰も答えてない奴」ってのは「誰も答えてない質問」ではなく「誰も答えてない回答」って意味です。すまん。
>>242
その凝りすぎの表現がperlだと普通かもしれない罠。
要するにアレだ、AT車乗りはトランスミッションなんて知らなくても運転できるじゃんと言うが
PerlはMT車なのよ
つか何に例えようが
所詮Perlではtr、sは自分で調べろよって次元の話なんで
こんなことウダウダ言ってる間にドキュメントに一通り目を通せるだろ。
馬鹿の逆切れみっともないでFA
253デフォルトの名無しさん:03/11/22 23:11
>>249
C:MT
Perl:AT
だろ
Perl:Mach Go Go Go
255デフォルトの名無しさん:03/11/23 14:09
>>253
私もそう思います。Cはメモリ特に関連で仕様をきちんと理解していないとクリティカルなエラーを起こしますが
その辺は適当に済ませられるPerlは優れているというか便利だと思います。
Cはあまり日曜大工に向きませんが、Perlは日曜大工向きだと思います。
慇懃無礼
257デフォルトの名無しさん:03/11/23 22:17
すみません。そういう意味ではなかったんですが。
258デフォルトの名無しさん:03/11/24 04:40
259デフォルトの名無しさん:03/11/24 06:28
perl/tkでのX環境での日本語入力について情報どこかにありますでしょうか?

例えば、kinput2の場合、リソースに
perl*inputMethod: kinput2
とかしておくだけではダメなんですね。
260デフォルトの名無しさん:03/11/24 07:00
system()でシステムコマンドを実行する際にユーザを変更して実行(或いはユーザを指定して実行)したいのですが、
perlでこのような事は可能でしょうか?

---
OS FreeBSD4.9RE
Perl ver5
>>261
system('su username -c "whoami"');
あたりまえだが要root。
263259:03/11/24 09:25
setenv LC_ALL ja_JP.EUC
setenv LANG ja_JP.EUC
setenv XMODIFIERS '@im=kinput2'

と環境変数を設定しておけば、

#!/usr/bin/perl
use Tk;
MainWindow->new()->Text()->pack();
MainLoop();

で、テキストウィジェットが開いて日本語入力&編集できるようになりました。
perl/tkは日本語も使えて便利でいいですね。
264261:03/11/24 11:50
>>262さん
教えて頂いた方法で上手くいきました。
ありがとうございました。m(_ _)m
265デフォルトの名無しさん:03/11/24 19:49
$old_fh=select(STDOUT);
$| = 1;
select($old_fh);

これが何をしているのかまったく分かりません。
2年ほど悩んでいるのですが教えてください。
267デフォルトの名無しさん:03/11/24 21:26
>>265
まず現在のファイルハンドルを退避し標準出力をデフォルトに設定している。
次にデフォルトのファイルハンドルに関連する特殊変数$|に代入することで、標準出力を自動的にフラッシュするように設定している。
最後に退避したファイルハンドルを再設定している。

これがあなたのお役に立てば良いのですが ;-)
>>266>>267
ありがとうございます。
なるほど。原理は良く分かりました。
select( (select(STDOUT), $|=1 )[0])

Lispの甘く危険な香りが・・・(;´Д`)
use IO; しとけば
autoflush STDIO 1;
if($foo == 1+2+4) は勝手に if($foo == 7) と解釈してくれるみたいですが、
if($bar eq uc('foobar')) は if($bar eq 'FOOBAR') と解釈してくれるのでしょうか?
>>271
演算子には優先順位というものがあってだね、
その順番に従って計算されていくのだよ。

http://perldoc.com/perl5.8.0/pod/perlop.html
uc は named unary operator (名前付き単項演算子) 扱いな。
273271:03/11/25 07:07
>272
わからないのは
ttp://perldoc.com/perl5.8.0/pod/perlop.html#Constant-Folding
が uc 等にも効くかという事です。
>>273
#--- test.p ---
use strict;
my $foo = 7;
my $bar = 'BAR';
if ($foo == 1 + 2 + 4) { print 'foo!' }
if ($bar eq uc 'bar') { print 'bar!' }
__END__

> perl -MO=Deparse test.p
use strict 'refs';
my $foo = 7;
my $bar = 'BAR';
if ($foo == 7) {
  print 'foo!';
}
if ($bar eq 'BAR') {
  print 'bar!';
}
test.p syntax OK
>>269
その書き方、ちょっとビクーリしました
>>275
らくだ本を読んだことないのか?
らくだ本でなくても普通のムック本にのってるだろ、それ>>269
278271:03/11/26 06:25
>>274
B::Deparse は構文解析をしているだけのようにしか見えないですが、
それは perl がコンパイルした物と同じになるのでしょうか?
>>278
そう判断した根拠やどこまで調べたかを示して頂けませんかね。
答える側の勉強にもなりますし。
http://perldoc.com/perl5.8.0/pod/perlcompile.html#The-Decompiling-Back-End
http://www.perldoc.com/perl5.8.0/lib/B/Deparse.html

これ以上の事が知りたかったら、perl のソースコード追うなり
識者の集まる ML で尋ねた方が早いと思いますよ。
http://www.freeml.com/info/[email protected]
280デフォルトの名無しさん:03/11/26 16:35
5.8.2とjperl5.005とで同じスクリプトを使えるようにしたくて、

if ($] > 5.008) {
use encoding "sjis";
use open ":encoding(sjis)";
binmode STDERR, ":encoding(sjis)";
}
とやってもうまくいきません。

ifブロック内にuseが入れられないとするなら、
同じようなことをやる方法ってないのでしょうか?
(あ、ShiftJIS使うなってのはナシで)
281デフォルトの名無しさん:03/11/26 17:06
>>280
無理

無謀です
やめましょう
282デフォルトの名無しさん:03/11/26 17:27
>>281
まぁ超力ずく解決でイイなら、5.8.2とjperl5.005じゃ@INCが
違うだろうから、jperl5.005の@INCの先頭のディレクトリに
nopなダミーencoding.pmとopen.pmを書いて入れとく、

とか考えたけど、binmode STDERR, ":encoding(sjis)";
は解決不能っぽいですな。w
>>280
> use encoding "sjis";
は、BEGIN { require encoding; import encoding "sjis";}と等価。
BEGINで分かるようにuseは必ずコンパイル時に評価される。
実行時にuseと同じことしたいならrequire+importにする。

if ($] > 5.008) {
require encoding; import encoding "sjis";
require open; import open ":encoding(sjis)";
binmode STDERR, ":encoding(sjis)";
}
ってのは、どうよ。実際にうまく動くかどうかは分からないが
試してみそ。

>>283
実行時にプラグマを読んでも無駄

BEGIN{
if ($] > 5.008) {
require encoding; import encoding "sjis";
require open; import open ":encoding(sjis)";
binmode STDERR, ":encoding(sjis)";
}
}
285デフォルトの名無しさん:03/11/27 07:47
ん〜

$strs = "0123456789acdefghijkl";
とある
これのx番目の文字だけを書き換えたい
で、
print strchg($str,5,"st");
とやれば

0123st6789acdefghijkl
としたい
便利な関数とか無い?
>>285
splice
287286:03/11/27 08:17
メンゴ
substr
288C厨:03/11/27 10:07
Perlって不便ね
289デフォルトの名無しさん:03/11/27 12:41
漏れもC厨だけど、今日からPerl勉強し始めてるんでageちゃう。
>>285
http://perldoc.com/perl5.8.0/pod/func/substr.html

sub strchg {
  my($expr, $offset, $replacement) = @_;
  substr $expr, $offset, 1, $replacement;
  return $expr;
}
291デフォルトの名無しさん:03/11/27 16:52
>>290
ありがと♪

substrにそんな使い方があるとは知らなかった
てっきりExcelのmidと同じだと・・・

print substr($msg,2,4);
substrはperl4の昔から左辺値になるんだけど..........
知らない香具師大杉
言われりゃ思い出すんだが、コード書いてるときはすっかり忘れてる < 左辺値
.. のフリップフロップとかも

精進が足りないのぅ
適当なファイルで、保存後コマンドラインから実行して3分後から倍速モードになる
#!/usr/bin/perl
$tick = time();
sleep(180);
while (1) {
@date = localtime($tick);
$fmt = sprintf("%02d%02d%02d%02d.%02d", @date[4] + 1, @date[3], @date[2], @date[1], @date[0]);
`date $fmt`;
print "$fmt\n";
$tick += 2;
sleep(1);
}


OSの時計が倍になるらしいんですが意味わかりまつぇん

教えてくだちぃ
$tick += 2; sleep(1);

1秒ごとに時計を2秒進めてるから倍速になったように見えるだけでしょ。
perl/tkで、文字列入力ウインドウを作って、
ユーザが文字列入力できてEnter/Returnが押されたら
入力中の文字列をperlの変数に入れて特定の関数を呼ぶ、
っていうのはどうすればできるでしょうか?
>>297
素早い反応どうもありがとうございます。

$object->bind( "<Return>", [CallBack] );

と、単にバインドすればよいわけですね。
pure perl な SAX2 パーサってありまつか?
300デフォルトの名無しさん:03/11/28 13:36
Perl/TkよりもカッコイイGUI開発環境ってPerl.NETかなー
とか思って色々調べてるんだけど、日本語情報皆無でつね・・・
301デフォルトの名無しさん:03/11/28 14:35
>>300
おめでとう!
君がPerl.NET関連情報翻訳の第一人者だ!
302デフォルトの名無しさん:03/11/28 14:36
>>300
おめでとう!
君がPerl.NET関連情報翻訳の第一人者だ!
303デフォルトの名無しさん:03/11/28 15:04
Perlコミュニティは初心者に対して病的に親切だと聞きました。
もしかしてマジですか?
さあ。俺に言えるのは、言語が病的なことだけです。
305デフォルトの名無しさん:03/11/28 16:25
すみませんどなたか教えて下さい。

Perl から system関数を使用して 外部(自作)のコマンドを呼び出して
戻り値を取得したいのですが、戻り値の値の範囲は 0〜255 までなのでしょうか?
詳しい方教えて下さい。

環境:WindowsXP ActivePerl v5.8.1

呼び出し元
sysetm( "foo.exe" );
printf "ReturnCode->[%d]\n", $? >> 8;

呼び出し先 foo.c
int main( void ) {
return 1077; <-- この値を呼び出した Perl プログラムで取得したいのです。
}

よろしくおねがいします。
306デフォルトの名無しさん:03/11/28 17:03
戻り値を標準出力に出力させて
Perl側がsystemの代わりに逆クォートを使い
外部プログラムの標準出力を文字列として受け取るのではダメなのか?
307デフォルトの名無しさん:03/11/28 17:18
返信ありがとうございます。
それで解決できそうです。

とりあえず、戻り値として返そうとすると、値は 255 までしか
返せないんでしょうか?

よろしくお願いします。
309デフォルトの名無しさん:03/11/28 18:04
環境はWindowsXPです。
return 1077; はPerl側では取得できない様ですね。。。
>306 で教えて頂いた方法で解決しようt思います。
ありがとうございました。
310デフォルトの名無しさん:03/11/28 19:05
下記のような外部ファイルがあり、ある文字の含まれる行をカウントしたいのですが、
「ある文字」というのが スクリプトであらかじめ設定できないないので困っています。
-----外部ファイルの例----------------------------------------
(適当な文字列、. も含まれる).(★ここを数えたい★) (後ろは任意の文字列)
power.hogehoge-man Yah!
2cher.mona- (・∀・)アヒャ
fusianasan.hogehoge-man 2Getttttttttttttttttttttt
tarako.umaibou.mentai I love 2ch which is NHK
------------------------------------------------------------
このとき、hogehoge-manの数とmona-の数、mentaiの数を数えたいのですが、
数える対象を指定する方法がわからんです。

たんに m/$word/とすると、何度もhogehoge-manを数えてしまって効率が悪いです。
どうか 教えてくだされ。
311クンクン(葬式):03/11/28 19:13
>>310
数えたいのは
/^(\S+)\.(\S+) .+$/
の $2 の部分ってことでいいわけ?
じゃ、ここを切り出して、
$testpattern = $2;
$testpattern =~ m/$word/
でどうよ?

あなたの質問を誤解していたらごめんなさいね。
クククのクーソ
312クンクン(葬式):03/11/28 19:17
>>311もう少し親切に

@patterns = ('hogehoge-man', 'mona-', 'mentai');
$cnt = 0;

while(<>) {
 /^(\S+)\.(\S+) .+$/;
 $testpattern = $2;
 foreach $pat (@patterns) {
  $cnt += ($testpattern =~ m/$pat/);
 }
}

クククのクーソ。。。
>>310 ハッシュを使えば良いんじゃないかな。マッチした文字列をキーにして

$count{$1}++

という具合に。
314デフォルトの名無しさん:03/11/28 23:53
ActivePerl 5.6.1 環境で、外部プログラムを実行し
その外部プログラムの実行時間を親側で監視することって
できるんでしょうか、Unix環境のalarmのような
ActivePerlではalarmは実装されてないので
>>314
UNIXのalarmってそんなものだったっけ?
指定時間後に自プロセスにSIGALRMを送るように設定するものだったと思うけど。
「パソコン」というShiftJISの文字列をjcode.plでEUCに変換すると
「パャRン」のように文字化けします。
これは「ソ」という文字の2バイト目にエスケープと同じ文字コードが
存在するためです。
そこで「ソ」が含まれる文字は「ソ\」に置き換えしたいのですが
どうもうまく動きません。

$str =~ s/ソ/ソ\/;

これじゃダメなんでしょうか('A`)
317デフォルトの名無しさん:03/11/29 00:13
>>315
言葉足らずですみません
外部プログラムがある一定時間動きっぱなしのときに
KILLシグナル送って強制的に終了させたいと思ってるんです
318クンクン(葬式):03/11/29 00:30
>>316
jcode.pm とか encode モジュールとかは?
クククのクーソ。。。
>>317
Perl5.8.0ならUNIXと同じalarmが実装されているみたいだよ。
320319:03/11/29 00:39
↓のプログラムを実行したら、5秒後にcaughtと表示して終了すればいいんだよね?

sub alrmhandler
{
print "caught\n";
exit(0);
}

$SIG{ALRM}='alrmhandler';
alarm(5);
while(1){;}
>>316
jcode.pl に渡す以前で \ の解釈が行われてないか?

use strict;
require 'jcode.pl';
chomp(my $str = <<'EOF');
パソコン
EOF
jcode::convert(\$str, 'euc', 'sjis');
print join ' ', map unpack('H2', $_), split //, $str; # a5 d1 a5 bd a5 b3 a5 f3

http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
>>316
$str =~ s/ソ/ソ\\/;

っていうかencode使え
323デフォルトの名無しさん:03/11/29 01:10
>>320
そうそう、このとおりでつ
実際にはforkのあと子プロセスをexecして、そのプログラムが
一定時間帰ってこなかったときに kill('KILL', $pid);
で子プロセス強制終了したかったんです
Windows環境ではあきらめてたんだけど、バージョンうpで
alarm実装されてたのか、とにかくありがとうございます
>>321
変数に格納された時点で¥の解釈が行われてました('A`)
文字列置換プログラムでIDを入力したらそいつのメールアドレスが表示されるみたいなプログラムって
できるんですか?例えば tamaru と入力したら [email protected] みたいな
326クンクン(葬式):03/11/30 01:09
$input = tamaru;
$output = $input . '@domo.ne.jp';
クククのク〜ソ。。。
>>325
IDをキー、"キー + @xxx.ne.jp " をバリューにするような
ハッシュを作っておけば

print $hash{'tamaru'}; とかすればいいんじゃない
>>315 >>317
alarmとかで、ミリセカンド単位で何ms後(例:100ms)になにかしたい場合は、

use Tk;
MainWindow->new()->after(100, \&callback_func);
MainLoop();
sub callback_func { print "hoge\n"; }

これだけで大丈夫ですよ。
afterの代わりにrepeatとすれば定期的に呼び出してくれます。
329デフォルトの名無しさん:03/11/30 01:58
そんなものをperlで書く意図がわからない
C/C++つかえや、(,,゚Д゚)ゴルァ
330317:03/11/30 02:11
>>328
おお、これもいいですね

結局は alarm() で子プロセス kill は ActivePerl5.8/WinXP
ではうまくいかなかった(cygwinではOK)んで
Win32::Process を使って実現しますた
>>329
Windowからのイベント待ちしながら、文字列処理しながらできるのが、
Perl/Tkのいいところじゃないですかー。C/C++は比較対象にすらならない。
332デフォルトの名無しさん:03/11/30 07:54
$mojiに文字列(html)が入っていて、その中からhttpアドレスだけを全て抜き出したいんですが、どうすればいいですか?
ttp://www.din.or.jp/~ohzaki/perl.htm
見たんですけど、うまくいきませんでした。

どなたか知恵をください。
>>332
まずはh抜きはやめることだ。
>>332
何がうまくいかんのかさっぱりわからん。
そのページに思いっきり答えが載っているというのに。

> # 文書 $text から http URL を抽出して @http に格納する
> @http = $text =~ /s?https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+/g;
335デフォルトの名無しさん:03/11/30 11:06
巨大な文字列を引数や戻り値として関数間でやりとりするときは
リファレンスにすると効果ありますか?っていうかC,C++屋なので、
Perl使いがリファレンスを全然使わないのが不思議でならないのですが。
336332:03/11/30 11:08
>>334
ttpで始まるURLを抜き出せません
8年ぐらい前の記憶では、確かに効果はありました。 計測してみれば…。
338デフォルトの名無しさん:03/11/30 11:19
Perlの言語的/実装的に見て、リファレンスを使ったところでそれ程の効果が
ないのか、それともPerlerが単にドキュソなのかハッキリして欲しいね。
引数に関しては、あれは暗黙のリファレンス、それもconstの、ってことでいいよね?
だけど、みんなmy変数にいったん「コピー」してから使ってる。ハァ?って
感じでしょ。値の参照だけなら$_[0]でいいじゃん。戻り値の扱いについては
まだちょっと分らず。
>>335
初心者か。
参照使えよ。
340デフォルトの名無しさん:03/11/30 11:30
>>339
ハァ?リファレンスとは参照のことではないのですか?
&func(\@values);
...
sub func{
foreach (@{$_[0]}) {
こんなに簡単に出来ることをどうしてやらないのか。
>>335,338 一般化して言うんじゃないよ。どんなコード読んでんだ。
>>339 お前は英語を勉強しろ。
>>340
あんた痛いよ。
参照は誰でも普通に使ってる。
ちなみに参照とはリファレンスのことだよ。
こんな事書かなくても分かると思うけど。
自己レス。
>それもconstの、ってことでいいよね?
これは間違い。constじゃなかった。
$ perl -e '$a=0;&{sub{$_[0]=1;}}($a);print "$a\n";'
1
344332:03/11/30 11:41
結局どうやればいいんでしょうか・・・
>>335>>338みたいな馬鹿は無視して私の質問に答えてほしいのですが。
345デフォルトの名無しさん:03/11/30 11:46
>>332
ホレ

http://(?:(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][-a-zA-Z0-9]*[a-zA-Z0-9])\.
)*(?:[a-zA-Z]|[a-zA-Z][-a-zA-Z0-9]*[a-zA-Z0-9])\.?|[0-9]+\.[0-9]+\
.[0-9]+\.[0-9]+)(?::[0-9]*)?(?:/(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0
-9A-Fa-f][0-9A-Fa-f])*(?:;(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa
-f][0-9A-Fa-f])*)*(?:/(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][
0-9A-Fa-f])*(?:;(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0-9A-F
a-f])*)*)*(?:\?(?:[-_.!~*'()a-zA-Z0-9;/?:@&=+$,]|%[0-9A-Fa-f][0-9A
-Fa-f])*)?)?

perlメモから

346デフォルトの名無しさん:03/11/30 11:55
>>336
「ttpで始まるURL」などというものは存在しません。

あなたの要求は初めから間違っています。「URLで無い文字列」も
同時に抜き出したいなら、自分で正規表現を改造する努力をしてください。
たった一文字変えるだけです。

あるいは、あなたが正確な質問をするなら、誰かが答えてくれるかもしれません。
347デフォルトの名無しさん:03/11/30 12:05
340のケースにしても、
@valuesの全ての値をいったんリスト値とみなして、
個々の値、それぞれにリファレンスを作成して関数呼び出し。
呼び出された側では、作成されたリファレンスの集まりを
@_という変数でPerlのやってくれる自動デリファレンス機能で
アクセスする。
なんて面倒な処理をさせたくない。リスト値を渡すとしても、
その全てを呼び出される関数内において使うとは限らない。
\@valuesと、参照で渡しておけば必要なものを最低限の
コストでアクセスできる。と思うわけですよ。
348デフォルトの名無しさん:03/11/30 12:16
>>340
func(\@values);
...
sub func{
 my $arg_listref = shift;
 foreach (@$arg_listref) {

いくらサンプルとはいえ、あなたには優雅さが欠けていますよ。
せめてこれくらい優雅に書き上げてもらいたいものです。
349デフォルトの名無しさん:03/11/30 12:29
CやC++なら、コンパイラの挙動など知らなくても、
アセンブラソースを見れば、言語的なものがどういった具合に
扱われてるのか一目瞭然だけど、Perlerの人はどうするの?
まさかperlのソースを読むとか?
楽駄本は4章までをかなり読んだけど、内部の細かいところは
ソース見てくれって感じで扱ってないよね。まあセンスのある人なら
インタプリタの挙動ぐらい、弄ってるだけで分るんだろうけど。
>>349
言いたい事が良く分からんのだが、perl -d でイイんじゃねーの。
>>349
言わんとするところは分かるが、方向が間違ってる

・Perlのソースを読まなくても、プログラムの挙動は理解出来る。
 たとえば、length()って書けば、文字列の長さを返せばいいんであって、
 中の人が strlen(3C)を使ってようが、何を使ってようが関係ない。

・言語を勉強する時に、アセンブラソースを見て理解するようでは頭が固すぎ。
 as is で理解しよう。

とはいえ、中の実装が気になることも稀にある。デバグ時とか性能改善
図りたいときとか。でもソース読むより、strace で調べるくらい
352デフォルトの名無しさん:03/11/30 14:41
>>351
3Cって何?
>>352
man pages のセクション
354デフォルトの名無しさん:03/11/30 14:53
strlen(3)のことか。
>>340
明示的にそんな書き方しなくても、関数へのパラメタは
参照渡しなので安心すれ。

@a = (1,2,3,4,5);
print join(",",@a),"\n";
test(@a);
print join(",",@a),"\n";

sub test { $_*=2 for (@_) }
>>354
そうとも言えるし、違うとも言える。
俺も正確なことは知らんが Solaris とかの man pages では
C library は 3C とかになってる。
あと X 関係は 3X11 とか。
>>355
もう少しスマートに書きましょう。
>>355
微妙に違う。
個々のパラメータはそれぞれ参照になっているが、配列パラメータは新たなリストが作られる。
例えば…
@a = qw(1 2 3 4 5);
sub test{
push @_, 6; # $_[0]は$a[0]の参照だが、@_は@aの参照ではない。よってこれは無意味な操作
}
test(@a);
print "@a\n"; #-> 1 2 3 4 5

よって、巨大な文字列を扱う場合は特にリファレンスで渡しても効率はよくならないが、
巨大な配列を渡す際にはリファレンスで渡した方が効率はよくなる。
>>358
戻り値についてはどうなんでしょうか?
関数内においてmyで作成された変数のリファレンスを返すものと、
変数そのものを返すものの違いです。Perlは全ての変数を同一の
ヒープ領域に確保する(と思われる)ので、やっぱりreturnにおいても
暗黙のリファレンスが使われているのかな。
Perlにおいては
関数の引数や戻り値において使われている暗黙の参照=C++のリファレンス的
'\'において取得し*{}でデリファレンスするようなもの=C,C++のポインタ的
という考えで間違っていますかね。識者の人、おながいします。
XML::Parser::* と XML::SAX::* ってどう違うの?
ソース嫁
>例えば…
>@a = qw(1 2 3 4 5);
>sub test{
>push @_, 6; # $_[0]は$a[0]の参照だが、@_は@aの参照ではない。よってこれは無意味な操作
これはそうですね。仮にtestを呼び出すときに、test(@a,@a,@a);
とした場合など(いい例ではないですが)が分り易いですね。@_ != @aの例として。
関数呼び出しの時点で、概念上いったん平たく全ての値を並べて、それに対する
個々のリファレンス(Cでのポインタ)の配列を作成して、
それのアドレスをパースしたツリーに埋め込むという感じなのかな?
$_[]という構文要素は引数として渡されたリスト値の個々の値を指し示すものとして、
@_という構文要素は一時的に作られた(概念上の)配列の全体を示すというものとして、
とらえる感じでいいのかな?

>>362
そうですね。。。ソースを読むのが一番正しいことには違いないです
364デフォルトの名無しさん:03/11/30 16:41
perlのソースを読める人がこんなところで、アフォな質問はしないと思うんだが・・・
>>364
私はアフォです。それは別にいいですが、360については
間違っていますか?間違っているならどうまちがっていますか?
366つられてみるか:03/11/30 17:42
Perlの仕様を熟知していないのであればコピーする方が無難。

f1(['a'..'c']);

sub f1 {
split //, 'xyz';
&f2;
foreach (@{$_[0]}) {
print "$_\n";
}
}

sub f2 {
foreach (@_) {
print "$_\n";
}
}
>>359
戻り値に付いては基本的には値で返しているように見える。
ただしサブルーチンのアトリビュートにlvalueを指定すると参照を返すことになる。
もちろん、C++で参照を返す関数と同様、戻り値を変数に代入するとコピーが発生するわけだが。

my $f = "f";
my $g = "g";
sub f { $f } #1
sub g :lvalue { $g } #2
my $fref = \f();
$$fref =~ s/f/F/;
print f(), "\n", $$fref, "\n";
my $gref = \g();
$$gref =~ s/g/G/;
print g(), "\n", $$gref, "\n";

>>360
大体そんな感じ。戻り値に付いては上記参照。

>>362
細かな所は少しは読んでるけど、全体像をつかむのは辛すぎる…。俺には無理。
368デフォルトの名無しさん:03/11/30 18:09
>>365
ソース読む前にperldoc嫁。
つーか、細かいこと気にするより書きたいように書いてる方がよっぽど効率がいいんじゃね?
本当に「実行」効率を考えなきゃならんのなら、そもそもスクリプト言語を使うなという話になる。
漏れは、スクリプト言語の利点は手軽さにあると思ってるから、書きやすさ、単純さを優先しがち。

要するに、リファレンス使うのが面倒くさいから必要がない限りは使わないというのが漏れの考え。
370デフォルトの名無しさん:03/11/30 18:28
>>369
プ
plを使うためにActive PerlをC:\Perlにインストールしたのですが、
コマンドプロンプト上から「ppm>enter」でppmプロンプトを呼び出そうとしても
「No Perl script found in input」と出てきて呼び出す事ができずに困っています。
原因を調べてみたのですがC:\Perl\binにpathを通せばいいらしいと言う事が分かっただけで・・・・

C:\Perl\binにPathを通すにはどうしたらいいのでしょうか?
初心者質問で申し訳ないです。

perlのリソキ(オライリー)
ヤフオク>コンピュータ>本>言語>その他
373332 ◆tr.t4dJfuU :03/11/30 20:07
さっきから332と言っている人が自分ではないのですが・・・・。

ともかくみなさんありがとうございました。
>>371
お使いのOSが2000/XPなら、コントロールパネル->システム->
詳細設定タブ->環境変数と書かれたボタンで環境変数にアク
セスできます。95/98(たぶんMeも)なら環境変数はc:\autoexec.bat
で設定されているのでテキストエディタで開いてpathに;c:\Perl\binを
書き足してください。
ただし、ふつう正常にActivePerlがインストールされた場合Path
は自動的に設定されます。インストールが正常に行われたかどうか
一度チェックしてみたほうがいいと思います。たとえば、コマンド
プロンプトからPerl -v[enter]でPerlのバージョン表記は出るでしょうか。
関数の引数、戻り値の扱いがどうなっているかは、
Devel::Peek::Dumpで見ると分かりやすいよ。

use Devel::Peek;
sub a { Dump(\@_); }
sub b { my $x = 'b'; Dump($x); $x; }
sub c : lvalue { my $x = 'c'; Dump($x); $x; }
sub d {
my @a = qw(a b);
print "[\@a]\n"; Dump(\@a);
print "\n[a(\@a)]\n"; a(@a);
print "\n[a(\\\@a)]\n"; a(\@a);
print "\n[b()]\n"; my $x = \b();
print "\n[\$x]\n"; Dump($x);
print "\n[c()]\n"; my $y = \c();
print "\n[\$y]\n"; Dump($y);
}
d();
376デフォルトの名無しさん:03/11/30 22:02
教えてください。

$temp1, $temp2, $temp3 ・・・・・・

と自動的にしたいときに

for($i=1;$i<10;$i++){
$temp$i=・・・・・・

とかじゃだめなんですけど、どうすればいいんですか?
377デフォルトの名無しさん:03/11/30 22:16
>>376
コードを自動的に書き出すスクリプトを実行して、結果を貼り付けろ。
>>376
use strict;

my @temp = ('abc', 'def', 'ghi');
foreach my $temp (@temp) { print "$temp\n" }

my %temp = (a => 'abc', d => 'def', g => 'ghi');
foreach my $key ('a', 'd', 'g') { print "$temp{$key}\n" }

no strict 'refs';
use vars '$temp1', '$temp2', '$temp3';
$temp1 = 'abc';
$temp2 = 'def';
$temp3 = 'ghi';
foreach my $num (1, 2, 3) { print ${'temp' . $num}, "\n" }
>>376
素直に配列使えばいいんじゃ… とか言っちゃダメですか?
こういうことがしたいんと違うん?

for($i=1;$i<10;$i++){
${"temp$i"} = $i;
}
print $temp1, $temp2, $temp3;
>>376
for($i=1;$i<10;$i++){
eval("\$temp$i=・・・・・・");
stat '/path' は stat(2) を行う。
lstat '/path' は lstat(2)
stat FH は fstat(2)
ここまでは問題ないのですが、
lstat FH は何をするのかわかりません。
383376:03/12/01 04:32
まじ感謝っす!
みなさんドモ!
>>382
fstat
385デフォルトの名無しさん:03/12/01 10:06
3桁区切りの値
1,000/-1,000,000

1000/-1000000
等の数値にしたいのですが、
スマートに書く方法を教えてください。
386クンクン(葬式):03/12/01 10:12
>>385
s/,//g;
じゃだめ?
クククのクーソ。。。
387デフォルトの名無しさん:03/12/01 11:08
ありがとうございます。
確かにスマートでした。
クソでスマソー
388デフォルトの名無しさん:03/12/01 11:09
Y氏 好循環  I氏 悪循環  (日本)
 (健康体)  (喘息)

1.(神が喘息であるかないかを決める)
  Y        I
2.喘息でない人  喘息の人は
は体力がある   体力がない
Y I
3.        行動力、
         五感(嗅覚)が鈍り感性が変化
         する
  Y        I
4.神は異常な感性の人間は本来人に迷惑をかけるか

ら外に出てはいけないと思っている。
Y I
5.変化なし    アトピーになる
Y I
6.正常な感性   外に出なくなりさらに異常な感

         性になる
Y I
7.正常な人間    異常な人間(レッテル)
389デフォルトの名無しさん:03/12/01 11:09
Y I
8. 死
  Y        I
9.      来世
Y I
10.神は異常な人間は人に迷惑をかけるので行動を抑

制する必要がある
Y I
11.神は異常な人間は人に迷惑をかけるので行動を抑

制する必要があると思っている。
Y I
12.神が喘息であるかないかを決める
  Y        I
13.喘息でない   喘息である
  Y        I
     1.に戻る

神は事態の収拾に必死、頑張れよー。
390デフォルトの名無しさん:03/12/01 11:10
アトピー性皮膚炎の治し方

行動力=ガッツ=体力

アトピー性皮膚炎の患者は、
感覚の鈍い人間が多い。
それはなぜか。
幼少期喘息になるから、
体力がつかないため、
五感が弱るからである。
解決方法は、
五感を強くしてやればいい。
体力をつけることですぐに五感が正常になり、
行動力も湧くのである。
五感が正常になり、体力もつけば、
アトピー性皮膚炎も不思議と消えることが多い。

391デフォルトの名無しさん:03/12/01 14:02
jperl を使っているのですが length 関数で漢字一文字を1バイトとして
計算させるには、どうしたらいいですか?
392デフォルトの名無しさん:03/12/01 14:39
>>366
&関数名 と関数呼び出しするときは無条件で空リストつけますよね。普通は。
@_がダイナミックスコープで嬉しいことってあるんでしょうかね。自分には分りません。
>>391
不可能!
もっとも、あんたがlength関数が漢字を考慮する様に
jperlパッチを書き換えれば話は別だが
>>391
大抵の文字コードでは、漢字は 2 byte 以上で符号化されているので
1 byte と答える関数は計算方法がおかしい。

…という話ではなく、漢字一文字を 1 文字として返したいのなら、
>>3 の各サイトを参考に length をオーバーライド。

>>392
それが誰にとっての普通かは知らんが、頻繁に呼び出される場合は
&func; の方が引数リストのコピー or 生成が行われない分効率良くなる。
395デフォルトの名無しさん:03/12/01 17:12
WinNT 3.51でperl使える?
396デフォルトの名無しさん:03/12/01 18:38
次のソースが、
v5.8.2 built for cygwin-thread-multi-64int だと駄目で、
v5.8.1 built for MSWin32-x86-multi-thread だとOKなのですが、
なぜでしょう。前者だと連想配列にアクセスしても空になる。

&init_words;
print "Your Name? ";
$name=<STDIN>;
chop($name);
print "Your word is $words{$name}\n";

sub init_words {
  open(WORDSLIST, "wordslist");
  while($name=<WORDSLIST>) {
  chop($name);
  $word=<WORDSLIST>;
  chop($word);
  $words{$name}=$word;
  }
  close(WORDSLIST);
}
>>396
先頭行に%words=();を入れりゃ動くと思うよ、どっちでも。
しかし、スパゲッティなスクリプトだな。
398デフォルトの名無しさん:03/12/01 20:16
>>397
「%words=();」を入れただけでは駄目です。
ファイルを外出しにしたいのです。
というか、これLearning Perlという本に載っていたサンプルなんですけど。
さらに
foreach $key (keys %words) {
print "at $key we have $words{$key}\n";
}
とやると、at $keyの部分が丸々消え、なのに、$words{$key}
のところはちゃんと表示されます。
>>398
いらつくなよ
wordslist の改行が \x0D\x0A なら、そうなりそうな気がする。
Win32::Process で実行した外部プロセスの
標準出力ってどうやって得ればいいんだろうね
もしくはsystem, execで得た実行結果の標準出力も
chop($name);
で切ったのは、\x0D\x0Aの一文字だけ。
\x0D\x0A
二文字に見えるぅ
わしには8もじにみえるんじゃが
405382:03/12/02 03:11
>>384
ありがとうございます。
fstat ですか。
fstat をしたい時にどちらを使おうか悩んでしまいそうだ。
>>396
&init_words;の次の行に
@words_keys = keys %words;
$n_keys = scalar @words_keys;
print "the number of keys is $n_keys\n";
print "@words_keys\n";
を入れて%wordsの中にブツが入ってるか調べたらどうよ。
中身を表示させるのはDebugの基本だぜ。
配列に存在するかどうかを調べる方法ってないの?

use List::Util qw/first/;

my @primary_colors = qw/red yellow blue/;

defined(first { $_ eq 'red' }, @primary_colors); # true
defined(first { $_ eq 'purple' }, @primary_colors); # false

とかは思い付いたんだが、なんだかダサい。カコイイの教えて、エロい人。
>>407 grep じゃ?
>>408
要素数が多い時は遅い罠
順序等が重要じゃないならばハッシュにしてしまうのも手ではある
>>408
perlfaq4 は grep は使ってくれるな、とおっしゃってる。
左ローテートはどのようにやるんでつか?
スクリプトの出力を、そのスクリプトのファイル自身に
格納しておきたいんですがどうやればできますか?
ファイルの末尾に__DATA__と書いておく方法では、
DATAハンドラは書き込みように開けない、といったようなエラーになりました。
413412:03/12/03 22:30
一時ファイルに書き出しておいてから
元のファイル名へrenameしてできました。
>>411
@array = @array[1 .. $#array, 0] if @array > 1;
とかのこと?
push( @array, shift(@array) );
>>412
perl script >> script
Perl のオフィシャルサイトは http://www.perl.com/ ですか?
>>418
そっちみたいですね。
サンクス、
420デフォルトの名無しさん:03/12/04 00:49
Perlのコーディング規約例でよいものはないですか?
ぐぐっても他の言語の事ばかり出てきて、Perlに関するものがひっかからない...
422デフォルトの名無しさん:03/12/04 03:12
質問です
chdir て日本語のディレクトリには移動できないんですか?
できるとしたらどうやればいいんですか
424423:03/12/04 10:00
俺の場合、これだけだと不足なのでJavaと.NETのコーディング規約も
参考にしてる。

JavaTM 言語 コーディング規約
http://www.tcct.zaq.ne.jp/ayato/programming/java/codeconv_jp/index.html

Visual Studio コーディング技法
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vsent7/html/vxconcodingtechniques.asp
425デフォルトの名無しさん:03/12/04 15:00
質問ですが、



$codepath = argv[0];<----------------たとえば"C:\test\prog/game/"

$codepath =~ s/\\/\//g;

print $codepath;

この結果で、求めているのは当然C:/test/prog/game/なんですが、
私の環境では、このとおりに表示されるのですが、
ある他人の環境では、C:testprog/game/となるのは、
なにか環境変数などの違いがあるのでしょうか?

一応ともに、win2000&cygwin&bashです。
LANGは設定していなく、MAKE_MODE = UNIXです。
# $/=undef
$a=\`look pearl`;
print $$a;
#=>pearly

v5.6.0の結果です。
コマンド置換のリファレンス先の内容が$/によって変わるみたい。
この、振る舞いは、ちょっと、あやしい気がする。
427デフォルトの名無しさん:03/12/04 18:40
初心者の教えて君ですみません。

変数$pointの値を
printで文字列と混ぜて出力する場合
どう記述すればいいのでしょうか?

例えば$point=10;の場合で
 あなたの得点は10点です。
というふうに出したいのですが・・
>>427
print "あなたの得点は${point}点です。";
>>425
my $original = $ARGV[0];
(my $replaced = $original) =~ tr|\\|/|;
print "[$original]=>[$replaced]\n";

>>426
#--- cmd.p ---
print join "\n", qw(list or scalar);

#--- test.p ---
local $/ = $ARGV[0] ? "\n" : undef;
my @str = `perl cmd.p`;
print map "[$_]", @str;

cmd.p の出力は改行が含まれているので、test.p で $/ の値がデフォルト
("\n") ならコマンド入力演算子が ("list\n","or\n","scalar") を返す。
$/ が undef なら "list\nor\nscalar" というスカラー値を返す。

#--- test2.p ---
my @ref = \('list','or','scalar');
my $ref = \('list','or','scalar');
print map "$_:[${$_}]\n", @ref, $ref;

リストリテラルに対するリファレンスは (\'list',\'or',\'scalar') の略記の
ように解釈される。リストをスカラー変数に代入した場合は最後の
要素が代入される。

よって、何らあやしくない。正常。
perl5.8 以降の safe signal が原因だと思うのですが、
例えば以下のようなコードを実行した場合

$SIG{'ALRM'} = sub { waitpid(-1,1); };
alarm(1);
$_ = select(undef,undef,undef,10);
print "error=$!\n";


perl5.6.2 だと、期待した通り error=Interrupted system call となるのですが、
perl5.8.2 だとシグナルハンドラ内の $! がそのまま返ってきているようで、
結果が error=No child processes になってしまいます。

これは仕様? バグ?
仕様だとしたら、システムコールの再実行条件が特定できねーYO
>>430
この辺に何か載ってない?

perldelta
perl56delta perl561delta
perl570delta perl571delta perl572delta perl573delta
perl58delta perl581delta
432425:03/12/04 21:57
>>429
そのとおりやってみましたが、結果は一緒で、
[\\]が[/]にならず、ただ[\\]が消えただけです。

おれの環境下ではできているのですが、どうしてもある他人の環境下では[/]にうまく変換されません。
433430:03/12/04 21:59
>>431
ありがとう。流しては読んでたんだけど、perlのキモチになって
もっかいよく読んだらわかった。

unsafe signalでは
・select開始
・sigalarmが起こる
・シグナルハンドラ実行
・select終了(Interrupted system call)

だったのがsafe signalだと
・select開始
・sigalarmが起こる。覚えとく。
・select終了(Interrupted system call)
・シグナルハンドラ実行

となっていたのでした。

$SIG{'ALRM'} = sub { waitpid(-1,1); };
alarm(1);
$_ = select(undef,undef,undef,10);
print "error=$!\n";

上のコードで言うと、selectとprintの間で
ハンドラが呼ばれているんだから $! が壊されて当然というわけか…

$SIG{'ALRM'} = sub { local($!); waitpid(-1,1); };

とすることで期待通りに動くようにしました。さんきう!
>>432
非常に不安なんだが

$codepath =~ s/\\/\//g;

の前に print $codepath; するとちゃんと入力した文字列が表示されてるのか?
入力するときのクウォートの仕方が違う、とかじゃないよね?
435422:03/12/05 07:26
厨な質問でスマンが、誰か俺の質問にも答えてくれyo!
それとも放置プレイですか
>>435
WinXP/ActivePerlで確認

require 'jcode.pl';

chdir(&jcode::sjis("C:/Documents and Settings/おまいのユーザ名/デスクトップ/新しいフォルダ"));
system("dir");

chdir("C:/Documents and Settings/");
system("dir");

これでどうだ?
437デフォルトの名無しさん:03/12/05 10:19
お聞きしたいです。FILE2から特定のデータを持ってきて、FILE3の2番目の配列と完全マッチングをさせて
そのときの行Noを取りたいのですが、うまくいきません。。。
if文の書き方が悪いのでしょうか?
どうかよろしくお願い致します。
open(FILE2,"trace-no.txt");
open(FILE3,"java.txt");
$no = 1;
while($line = <FILE3>){
if ($line =~ /^T/){
@number =split(/ /,$line);
chop ($number[1]);
chop ($number[1]);
#print $number[1];
#print "\n";
#for($i=0; $i<@trace; $i++){
while($traceno = <FILE2>){
chomp($traceno);
print $traceno;

if($number[1] =~ /$traceno/){
push @number1,$number[1];
push @gyou,$no;
print $traceno;
print "\n";
last;
438435:03/12/05 10:21
そうか。eucでスクリプトを書いたならsjisに変換しないと
いけなかったわけですか。というかよく俺がwin使っててeucで
スクリプトを書いてるとわかったね。
名探偵ホームズですか? >>436
とにかく、ありがとう! 出来ました。愛してるよ!
>>437
if も while も閉じ括弧が見当たらんのだが…。
http://www5a.biglobe.ne.jp/~n_rieko/perl/6.htm
440437:03/12/05 10:59
>>439
すいません。途中で切れてしまいました。
open(FILE2,"trace-no.txt");
open(FILE3,"java.txt");
$no = 1;
while($line = <FILE3>){
if ($line =~ /^T/){
@number =split(/ /,$line);
chop ($number[1]);
chop ($number[1]);
#print $number[1];
#print "\n";
#for($i=0; $i<@trace; $i++){
while($traceno = <FILE2>){
chomp($traceno);
print $traceno;
if($number[1] =~ /$traceno/){
push @number1,$number[1];
push @gyou,$no;
print $traceno;
print "\n";
last;
}#if-number[1]
}#for-$traceno
}#if-$line
++$no;
close(FILE2);
close(FILE3);
>>440
まだ足りないから ++$no; の後ろに while の閉じ括弧があるとして、
そのスクリプトだと FILE3 の1行目を調べた時点で FILE2 は最後まで
読んでしまうけど、それがお望みの動作なの?
http://www5a.biglobe.ne.jp/~n_rieko/perl/7.htm
よくわからないけどこんな感じかねぇ?

open FILE2,"2.txt";
open FILE3,"3.txt";#ファイル3:スペースで区切ってある
while(<FILE2>){
chomp;
push @trace,$_;

}
while (<FILE3>){
chomp;
@array = split/ /;
++$i;#行番号
for($n=0;$n<$#trace+1;$n++){
if ($array[1] =~ m/^$trace[$n]$/){
print $i," ",$array[1],"\n";
}
}
}
close FILE2;
close FILE3;
>>437
日本語が良く分からん。
trace-no.txt と java.txt の一部を晒して、どういう出力を期待してるのか
書いた方がいいと思うぞ。
s/foo/bar/
よりも
s{foo}{bar}
の方がカッコイイと思うのは俺だけですか?
>>444
1文字多いから打つのだるい
446ヽ(´ー`)ノ:03/12/05 15:23
>>444
回数指定に困るんだよな、見やすいけど。
s, foo, bar, x かなぁ、いつも。
447デフォルトの名無しさん:03/12/05 16:12
perl for windowsで、現在存在している他のアプリケーションの
ウィンドウをタイトルで検索したり、ウィンドウに対してキーイベント等を送ったり
する方法はありますか?
448437:03/12/05 18:04
TRACE 18216:
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:119)
javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
org.apache.jasper.servlet.JspServlet$JspCountedServlet.service(JspServlet.java:130)
TRACE 17957:
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:119)
javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
java.txtはこんな感じです。
で、ここのTRACEの次の数字をtrace-no.txtの中からマッチングさせてその行が取りたい。
17957なら5行目って感じで。
あと、trace-no.txtは
0
16409
6148
2114
2113
32980
32997
6147
6146
6146
6145
32992
16465
32991
な感じです。
>>448

> 17957なら5行目って感じで。
訳分からん。プリゼン能力0だな
my %trace_no;

open FH, "<trace-no.txt" or die $!;
while (<FH>) {
chomp;
$trace_no{$_} = 1;
}
close FH;

# test
#print "[$_] [$trace_no{$_}]\n" for sort keys %trace_no;

open FH, "<java.txt" or die $!;
while (<FH>) {
if (/^TRACE\s+(\d+)/ && $trace_no{$1}) {
print "$.\n";
}
}
close FH;

こんなんかな?
open FHJ, "java.txt" or die;
open FHT, "trace-no.txt" or die;
while ($_ = <FHJ>) { /^TRACE\s+(\d+):$/ and $lines{$1} = $.; }
while ($_ = <FHT>) { chomp; print $_, " -> ", ($lines{$_} || "not found"), "\n"; }
452デフォルトの名無しさん:03/12/05 22:58
447おしえてください。
>>452
教えてもらって当然と思ってないかおまいは

とりあえずWin32モジュールあたり調べてみろ
親切だな(w
455437:03/12/06 03:05
>>450
>>451
ありがとうございます。
ハッシュをうまく使うといいんですね。
参考になりますた。
すいません、ちょっとお聞きしたいのですが、
@array1 =(1,6,11,3);
@array2 =(4,9,14,6);
このように配列が定義されているとき、
hoge.datファイルを読み込ませて$array2-$array1の行を出力させるにはどのような
処理をさせるとよいのでしょうか?

open IN,"hoge.dat" or die;
while(<IN>){
for($i=0; $i<$array1; $i++){
if (($array1[$i] < $j) && ($array2[$i] > $j)){
print "$_;
}
}
j++;}
close IN;
こうだとうまくいかないです。何かいい方法はないでしょうか?
よろしくお願いいたします。
$array1 やら $array2 はどこで定義されているんですか?
とりあえず全部詠む必要ないきもするけど
open my $fh, '<doc.txt' or die $!;
my @files = <$fh>;
close $fh;
for my $i(0..$#array1){
print join '', @files[ $array1[ $i ]..$array2[ $i ] ];
}

459デフォルトの名無しさん:03/12/06 19:19
>>457
すいません、配列$array1ではなく@array1でした。
配列の定義は下のようにしています。
#!/usr/bin/perl
@array1 =("1","6","11","3");
@array2 =("4","9","14","6");
>>458
そのようにすると、最初の@array1[0]と@array1[1]との数値になってしまいます。
2hoge2
3hoge3
4hoge4
5hoge5

7hoge7
8hoge8
9hoge9
10hoge10

12hoge12
13hoge13
14hoge14
15hoge15

4hoge4
5hoge5
6hoge6
7hoge7
open IN,"in.txt";
@files = <IN>;
close IN;
unshift(@files, "0行目\n");
for $i(0..$#array1){
print $files[$array2[$i]-$array1[$i]];
}
>>456
hoge.datに何が書いててどう使うのかさっぱりワカラン
転載してるコードが文法ミスってる
>こうだとうまくいかないです。
走らせてみたってことでしょ?どんなエラー出たのか書いてみたら?
462456:03/12/07 02:31
>>461
hoge.datにはApacheのエラーログの内容です。
127.0.0.1 - - [06/Aug/2002:15:02:20 +0900] "GET /~alchu/welcome5.htm
127.0.0.1 - - [06/Aug/2002:15:02:33 +0900] "GET /~alchu/welcome3.htm
127.0.0.1 - - [06/Aug/2002:15:02:38 +0900] "GET /~alchu/welcome2.htm
127.0.0.1 - - [06/Aug/2002:15:40:02 +0900] "GET /doc/ HTTP/1.1" 200
です。ここから特定のIPアドレスの行を取るところまではいきました。
ですが、あまりにファイルの容量が大きいため、全文検索はやめたいと思い、
悩んでいます。
>>460はエラーはでませんでした。
表示結果は上記の用になりました。
やはり、下記のように全文検索を行うしかないのでしょうか?
#!/usr/bin/perl
@array1 =("1","6","11","3");
@array2 =("4","9","14","6");
for($i=0; $i<@array1; $i++){
open IN,"hoge.dat" or die;
$j=0;
while($_= <IN>){
if (($array1[$i] <= $j) && ($array2[$i] > $j)){
print $_;
}
$j++;
}
print "-------------------\n";
close IN;
}
>>462
どういう出力を期待してる?
>>456 の「$array2-$array1の行」の意味がワカラン。
1行目から4行目、6行目から9行目… を出力させたいってこと?
>>462
my %num;
for (my $i = 0; $i < @array1; $i++) {
  my @num = $array1[$i]..$array2[$i];
  @num{@num} = (1) x @num;
}
open IN, '<' . $file or die $!;
$num{$.} and print "$.: $_" while <IN>;

もしくは

my(%num, @pickup);
for (my $i = 0; $i < @array1; $i++) {
  my @num = $array1[$i]..$array2[$i];
  @num{@num} = (1) x @num;
  push @pickup, [ @num ];
}
open IN, '<' . $file or die $!;
my @line = ('dummy');
$num{$.} and push @line, $_ while <IN>;
print map "$_: $line[$_]", @{$_} for @pickup;
perl/tkのtext widgetで、
表示されてる内容の中のURL部分をクリックしたら、
そのURLをもとにブラウザを起動したいと思います。

そこで、そのURLの文字列をゲットする関数について、
どうすれば作れるか知りたいんです。お願いします。
「Perlについての質問箱」シリーズもかなり息の長いスレになってきますた。
ここで勝手連的にこのスレのサポートページを作ろうと思っています。
いま考えているのは、
1. このシリーズの過去ログアーカイブ
2. スレッド専用ソースコードうpろだ
3. 過去ログのダイジェスト (Q&Aにまとめたもの)
4. リンク集
こんなところかな。
きながにまっててください。
>>466
がんがれー
>>466
おお、超期待。既出質問の誘導先は決まったな。
気長には待てないのでゆっくり急いでください。
>>466
最初から完成したものを作ろうと思わずに、
とりあえず作って徐々に完成させていけばいいと思うよ。
>>466
こういうのあると助かるよなー
実際仕事で助言頂きたくてこのスレ見ることあるし
ガンガレ
>>470
仕事は自分でガンガレ
先輩方教えて下さい
文字列abcdefを左に2ビットシフトさせてcdefabと表示させるには
どうしたらよいですか?
$a = $a << 2;
これじゃ駄目ですか?
それはビットシフトではない。
$a =~ s/^(.{2})(.*)$/$2$1/;
>>472
$str =~ s/^(..)(.*)\z/$2$1/; # >>473 とほぼ同じ

$str .= substr $str, 0, 2, '';
475472:03/12/07 23:21
>>473-474
ありがとうございます.ちょっと作業してみますね.
476472:03/12/07 23:31
できたです!!上の通りやったら出来たです!
本当にありがとうございました!
$_ #この変数?って基本ですか?
477t:03/12/07 23:42
ご教示お願いします。
以下のperlでprintString1という関数を実行した場合、ファイルの最初の1行を
読み込んだ後、2行目以降を読み込まないのはどうしてでしょうか?
代わりにprintString2を実行すると3行表示されるのですが。。

open($handle,"input1.txt");
for(my($i)=0;$i<3;$i++){
printString1($handle);
#printString2($handle);
}
print "fin\n";

sub printString1{
my($handle)=shift(@_);
my($str)=<$handle>;
print $str;
}

sub printString2{
my($handle)=shift(@_);
$str=<$handle>;
print $str;
}
479452:03/12/08 16:11
わかったのでちゃんと報告します。
Win32::GuiTestが目的のものです。
べんり。
>>466
テンプレサイトですか
先に言っておく、「乙」と。

あぷろだは こういうのがあるけどナ
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/index.html
481デフォルトの名無しさん:03/12/08 18:31
正規表現じゃない単なる文字列の置換をしたいのですが
そのような関数ってありますか?
質問箱に質問です
[1-4]asd[1-5]の部分だけをシフトさせたい時は,下のプログラムをどのように書き換えたらよろしいですか?
下のプログラムだとasdf jklの部分からシフトしてしまいます
if(/asdf jkl [1-4]asd[1-5]/)
$_ =~ s/^(.{2})(.*)$/$2$1/;
print "ID is $_\n";

484481:03/12/08 21:05
自分で作りました・・・

sub replace
{
my($str, $a, $b) = @_;
my($offset, $length, $pos, $inc);
$length = length($a);
$pos = 0;
$inc = length($b);
while (1)
{
$offset = index($str, $a, $pos);
if ($offset == -1) { last; }
substr($str, $offset, $length, $b);
$pos += $inc;
}
return $str;
}
s/hoge/fuga じゃイカンのかと小一時間問い詰めたい
どっちが早いんだろう
Benchmark 取るがよろし
split して join ってのもあるが、split の第1引数が正規表現パターンだからダメか・・・
my $db = tie (%h, "DB_File", "test.db", O_RDWR|O_CREAT, 0644, $DB_BTREE) || die "error\n";
とやるとエラーになります。
カッコでくくらないと大丈夫なんだけど…これは環境によるものなんでしょうか?
カッコ外しても大丈夫じゃなかった…%hに何入れてもtest.dbが空のまんまだった…
>>484
Benchmark 取ってみますた

use Benchmark;
$str = "hogehoge";
timethese(1000000, {'test1' => '®exp($str, "hoge", "fuga");', test2 => '&replace($str, "hoge", "fuga");'});
sub regexp{
my($str, $a, $b) = @_;
$str =~s/$a/$b/g;
return $str;
}

#sub replaceは>>484のやつ

Benchmark: timing 1000000 iterations of test1, test2...
test1: 4 wallclock secs ( 4.53 usr + -0.01 sys = 4.52 CPU) @ 221385.88/s (n=1000000)
test2: 7 wallclock secs ( 6.17 usr + 0.02 sys = 6.19 CPU) @ 161603.10/s (n=1000000)

Benchmark 最近覚えたもんだからサブルーチンの比較対象が違うかもしれないが
もし違ってたらご指摘おながいします
>>489-490
http://perldoc.com/perl5.8.0/pod/perlop.html
|| は , より優先順位が上。tie は list operator 。
493481:03/12/08 23:57
>>485
例えば、'.'から'_'に置換する場合、
'.'は'\.'にしてやらないといけませんよね。
ただそれだけです。
てゆーか、Perlにreplace相当の関数が標準でないことが不思議です。
>>493
perlfaq6 を読みなさい
先輩方教えてください
if(/ABCD [0-3][0-3][0-3]/){
s/$&//; #←ここで文字列全体($&)ではなくて数字の部分だけを指定するには,/$&/ /;ここに何を入れたら
よかですか?
497デフォルトの名無しさん:03/12/09 00:10
open(STDOUT, "| tee ${sname}.html") || &errorpage("teeのバグ");
open(STDOUT, "| tee ${bname}.html") || &errorpage("teeのバグ");

print "Content-type:text/html\n\n";


(&errorpage()はまんまエラーページ表示のやつで、$sname・$bnameは名前の文字列っす)
でCGIプログラムエラーが起きてしまいます・・・
問題箇所は間違いなくココなんすけど。
教えてくださいッ!
498497:03/12/09 00:14
うっわ、思いっきり板違いですやん・・・
マジすみませんでした
>>497
&errorpage($!);
>>496
ありがとうございます
そこ見て取り掛かってるんですけど,どうしてもできません.
数字のみって指定は\dとかいてあるけど,これを指定したら文字列として扱われてしまうし・・・
ヒントだけでも頂けませんか
>>500
> 数字のみって指定は\dとかいてあるけど,これを指定したら文字列として扱われてしまうし・・・
ハァ?
$_ = 'ABCD 231';
print "$_ => ";
if(s/(?<=ABCD )([0-3]{3})/$1/){
#痴漢が行われた時の処理
print "$_\n";
} else {
#痴漢なし
}
>>503
痴漢が行われたときの処理は現行犯逮捕でしょ
今日は 寒いねぇ。冬本番って感じだな
初心者ですいません。
とあるプログラムを起動しようとしたら
Can't locate Win32/API.pm in @INC …
と言うエラーメッセージが出たのですが何が原因なんでしょうか?

翻訳してみたのですが解決方法が解らないのでご教授願いたいと思います。
>>506
Perlというのはまあ、「らいぶらり」とか「モジュール」という名のサブルーチン群を読みながら実行するわけだが、
そのサブルーチン群というのは @INC のディレクトリに格納されている (はず) なわけだ。
君が実行したいプログラムは "Win32/API.pm" というモジュールを読みたがっているようだが、
君のシステムにそれがインストールされていない、とPerlが逆ギレを起こしたんだね。

それから、質問の仕方について。
1. どういう環境ですか (Win/UNIX/Mac)
2. どういうバージョンのPerlですか (perl -v した結果。場合によっては Perl -V だけど、いきなりこれをやると迷惑)
3. どういうプログラムを動かそうとしたのですか (または、どこのサイトから拾ってきたプログラムか)
こういう基本的なことを書いてくれないと返事できなくて激怒する住人がいるので気を付けて下さい。
それから、学校の宿題は友達に聞いてくれ。
>>507
ム板にしては優しい香具師だな
509デフォルトの名無しさん:03/12/09 21:23
my qw(aaa bbb ccc);
こういう書き方ってできないんでしょうか?
510506:03/12/09 21:56
>>507
的確なレス有難うございました。
507さんの回答から検索範囲が狭まってなんとか解決できました。

次質問するような事があれば、基本的な事が判る様な書き込みにしたいと思います。
スレ汚し失礼しました^^;
>>509
my qw($aaa $bbb $ccc); の間違い。スマソ
511だけど、とんでもない勘違いしてました。吊ってきまs
use DB_File;
use Fcntl;
my %db_imp;
tie (%db_imp, "DB_File", "imp.db", O_RDWR|O_CREAT, '0644', $DB_BTREE)
|| die "Can not open\n";

これだけのコードですけど、dieがかかってしまいます…
imp.dbは生成されるんですけど、
パーミッションが--w----r-Tでサイズ0になってます。
514513:03/12/10 15:05
自己解決しました。
パーミッション指定部をシングルクォートでくくるのがまずかったようだけど…どうしてだろ
515デフォルトの名無しさん:03/12/10 15:11
regexについての質問です。

文字列の中に括弧でくくられたものが「(xxxx(xxxx(xxx)xxx))」などとあった場合、
括弧でくくられた中身をとりだすにはどうしたらよいでしょうか?
具体的には、一番外側の括弧でくくられた文字列を取り出したいと思っています。
>>514
0644 は 8進数リテラル
'0644' は文字列 → 10進数として解釈 → 8進数換算で 01204

>>515
my($part) = $str =~ /^[^(]*\((.*)\)/;
517デフォルトの名無しさん:03/12/10 16:54
ご質問させて下さい。
ある文字列があり、その文字列の大きさは決まってません。
その文字列を(例えば)2バイト毎に分割したい場合はどうすれば良いのでしょうか。

$str = '0123456789'; # このような文字列を、、

@strs = qw(01 23 45 67 89); #このように分解したいのです。
518デフォルトの名無しさん:03/12/10 17:14
@strs = unpack("(a2)*", $str);
>>517 こんなのとか?
$str = '0123456789';
@data = $str =~ m/.{2}/g;
520517:03/12/10 17:16
>>518
迅速な回答有難うございます。
unpackのテンプレートはそのように使えたのですね、大変勉強になりました。
別解:
@strs = ($str =~ /../g);
奇数文字の場合、最後の一文字も入れたければ
@strs = ($str =~ /..?/g);
522521:03/12/10 17:23
あう、リロードする前に出しちゃった。
スマソ
523デフォルトの名無しさん:03/12/10 17:33
There's more than one way to do itか
       ☆ チン     マチクタビレタ〜
                         マチクタビレタ〜
        ☆ チン  〃  ∧_∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
          ヽ ___\(\・∀・) <  サポートページまだ〜♪
             \_/⊂ ⊂_ )   \_____________
            / ̄ ̄ ̄ ̄ ̄ ̄/|
        | ̄ ̄ ̄ ̄ ̄ ̄ ̄ |
        | Perlの質問箱  |/

もう少し待っててくらはい。すみません。
gzipを扱うにはどうすればいいですか?
526デフォルトの名無しさん:03/12/10 21:17
>>526
いやPerlじゃなくてPHPで使いたいんだけど・・・・
氏ね
>>527
ム板にはPHP関連のスレはないよ。
Webプログラミング板とか逝ってみ。

【PHP】質問スレッド Part12
http://pc2.2ch.net/test/read.cgi/php/1070639208/
530529:03/12/10 22:38
・・・と思ったら一つだけあったな。
荒れてるけどなー(w

http://pc2.2ch.net/test/read.cgi/tech/1057324268/l50
531デフォルトの名無しさん:03/12/10 23:13
●●△▽◎◆□▽●●◆○△

左右対称に反転させて表示させるって分からないよ。。。(´ω`)
引数がどうだら?って何が何だか。。。泣きたいyo
print join("", reverse(split(/ */, $x))), "\n";
533デフォルトの名無しさん:03/12/11 01:16
print join("", reverse(split(/ */, $x))), "\n";
これはどこでどうやって使うのでしょうか?

print join("●●△▽◎◆□▽●●◆○△", reverse(split(/ */, $x))), "\n";
???(´д`)ヾ???
>>531=533
もっと基礎からやれ。

$x = "●●△▽◎◆□▽●●◆○△";
536デフォルトの名無しさん:03/12/11 02:19
>>532>>535
あ\、ササΒ□、?@Βあササ
こう表示されました。
>>536
本買うなり入門サイト読むなりしろ。
http://www.rfs.jp/sitebuilder/perl/
http://www5a.biglobe.ne.jp/~n_rieko/perl/

my $str = '●●△▽◎◆□▽●●◆○△';
print length($str), "\n"; # 13 文字だが 26 byte
my @chr = unpack('(A2)*', $str); # 2 byte ずつにバラす方法 from >>518
print join('/', @chr), "\n"; # ちゃんと分かれている
@chr = reverse @chr; # 順序を反転
print join('/', @chr), "\n"; # 反転した
$str = join('', @chr); # 間に文字を挟まずに繋げる
print $str; # 繋がった
538デフォルトの名無しさん:03/12/11 14:09
INFILE(ファイル名a)の内容が
I am 1poooo1234.
I am 1qoooo1254.
I am 1poooo1256 and 1poooo7896.
メインの方をwhile文から書くと,
while<INFILE>{
chomp;
if(s/([1-2]{1})(po)(ooo)([0-9]{4})/$3$4$1$2/g){
print OUTFILE"$_\n"; #OUTFILEはファイル名b
}
}
このプログラムだと,INFILEの1行目と3行目は変更されて(ooo12341po)などと表示されるのですが,
2行目は表示されません.if文で一致していないから表示されないのでしょうか?
どのように変更すれば2行目(I am 1qoooo1254.)も表示されるのでしょうか.
ご教授お願いします.
>>538
君は p と q が同じに見えるのか?
540538:03/12/11 14:38
>>539
えーっと,pとqは違いますよ.
2行目は変更しないで表示させたいという事です.
上の例でやると2行目そのものが表示されないのです.
>>540
パターンに合わない文字列はそのまま表示させたいならif文にしなければいい

while(<INFILE>){
chomp;
s/([1-2]{1})(po)(ooo)([0-9]{4})/$3$4$1$2/g);
print OUTFILE"$_\n"; #OUTFILEはファイル名b
}

s/hoge/fuga/g は置換するだけじゃなくて、置換した回数も返してる。
>>538のようにifの条件式のなかで置換させると置換が行われないパターンは偽(0)になって、
真の時の処理のprint文がすっとばされてる。
失礼 ) がひとつ多かった
誤: s/([1-2]{1})(po)(ooo)([0-9]{4})/$3$4$1$2/g);
正: s/([1-2]{1})(po)(ooo)([0-9]{4})/$3$4$1$2/g;
543538:03/12/11 15:01
>>541-542
なるほど!
if文の中で置換してしまうと一致しないパターンは飛ばされてしまうんですね.
とても勉強になりました.本当にありがとうございました.
感謝です
>>531

use 5.008;
use encoding 'euc-jp';

my $x = '●●△▽◎◆□▽●●◆○△';
my $y = reverse($x);
print "$x\n$y\n";
perl5.6.0のperlfuncのsplitの説明には
perl -le '@a=split(??,"abc");print @_'
#=>abc
となると書かれているように思うがならないんですけど。
>>545 splitが@_を変更すると?
547デフォルトの名無しさん:03/12/11 19:34
Cの関数内static変数と同じことはPerlでどうやればいいですかね。
closureを使う方法でもいいですが、そうすると関数リファレンスを
代入した変数をグローバル変数として持たないといけないような気がします。
何かいい方法はないでしょうか?
>>547
our
>>548
これです。探していたのは。どうもありがとうございます。
550デフォルトの名無しさん:03/12/11 19:40
>>547
perldoc perlfaq7 の How do I create a static variable を
目を皿のようにして読め。
あ、でもourって5.6から追加された機能なんですね。
みなさん、5.00Xはそろそろ切り捨てですか?
553デフォルトの名無しさん:03/12/11 20:14
小数点以下を切り上げるにはどうしたらいいのでしょうか???
554デフォルトの名無しさん:03/12/11 20:43
>>553
$x = (int $x == $x) ? $x : int($x) + 1;
555デフォルトの名無しさん:03/12/11 20:56
LWP(libwww-perl)をインストールしてる最中に下記のようなエラーが
出てしまいました。原因がサッパリわからないんですが、どなたか
ご存じないでしょうか。長文でスイマセン。

# perl Makefile.PL && make
# make test
base/common-req........ok
中略

robot/ua-get...........HTTP Server terminated
FAILED tests 1-3, 5, 7
Failed 5/8 tests, 37.50% okay
robot/ua...............HTTP Server terminated
FAILED tests 1-3, 5, 7
Failed 5/7 tests, 28.57% okay
local/http-get.........Can't call method "is_redirect" on an undefined value at local/http-get.t line 216, chunk 1.
HTTP Server terminated dubious Test returned status 57 (wstat 14592, 0x3900) DIED. FAILED tests 1-19 Failed 19/19 tests, 0.00% okay
local/http.............Can't call method "is_redirect" on an undefined value at local/http.t line 189, chunk 1.
HTTP Server terminated dubious Test returned status 57 (wstat 14592, 0x3900) DIED. FAILED tests 1-18 Failed 18/18 tests, 0.00% okay
local/protosub.........ok
中略
all skipped: no reason given
Failed 4/39 test scripts, 89.74% okay. 47/415 subtests failed, 88.67% okay.
Failed Test Stat Wstat Total Fail Failed List of Failed
-------------------------------------------------------------------------------
local/http-get.t 57 14592 19 30 157.89% 1-19
local/http.t 57 14592 18 28 155.56% 1-18
robot/ua-get.t 8 5 62.50% 1-3 5 7
robot/ua.t 7 5 71.43% 1-3 5 7
1 test skipped.
*** Error code 35
556デフォルトの名無しさん:03/12/11 22:21
ファイルを読み込んで、それの内容を変更して
別の名前で保存するってどうやれば良いんでしょうか?
557デフォルトの名無しさん:03/12/11 22:21
open,read,write
558デフォルトの名無しさん:03/12/11 22:33
open(F, "a.txt") || die "メッセージ";
while (<F>) {
print;
}
でread、write、にすれば一連の流れで出来るんですか?
559デフォルトの名無しさん:03/12/11 22:35
open(F, "a.txt") || die "メッセージ";
while (<F>) {
print;
}
でread、write、にすれば一連の流れで出来るんですか?
なんで or ではなく || をつかう人が多いのだろう?
561デフォルトの名無しさん:03/12/11 22:39
>>560
目立つから
562デフォルトの名無しさん:03/12/11 22:43
ああ出来ない!ファイルを読み込んで内容を変更して書き出しが出来ない!
orと||は優先順位が違うッス
-f "読み込みもとファイル名" or die "ないです";
local *Source_data;
open Source_data, "読み込み元ファイル名" or die "$!";
my $Source = join '', <Source_data>; # いっぺんに読み込むのでメモリ容量に注意。
close Source_data;
# $Source を書き換え。
open Destination_data, ">書き出し先ファイル名" or die "$!";
print Destination_data, $Source;
close Destination_data;
みたいな?
565デフォルトの名無しさん:03/12/11 23:11
結局駄目ぽΣ(゚Д゚)ガーン
566デフォルトの名無しさん:03/12/12 00:43
Perlのプログラムそのものを字句解析・構文解析したいのですが
良い方法ないでしょうか?
>>566
perlに読ませる
>>556
1. ファイルオープンして読みこみ
2. 内容を変更
3. 書きだし先ファイルオープン
4. 3.へと書き出す
5. ファイルクローズして終了

writeはちがうだろ。

open(IN,$in) or die; #元ファイル
open(OUT,>,$out) or die; #出力先ファイル
while(<IN>){ #例として
.......
.......
print OUT $_;
}
close IN;
close OUT;
<Event status="happened" startTime="01:23:45" eventType="song">
 <s:Song title="Unfinished sympathy">
  <s:Artist name="MASSIVE ATTACK">
   <m:Media runTime="307.68"/>
  </s:Artist>
 </s:Song>
</Event>

これが10個連続しているxmlのプレイリストを、

01:23 : MASSIVE ATTACK - Unfinished sympathy [5:07]
  ・       ・                  ・              ・
  ・       ・                  ・              ・

と整形して表示するスクリプトを作りたいのですが、
上手くハッシュにして抜き出すには何を使うのがベストですか?
(clipコマンドって複数にマッチしたら最初のしか抜き出さないのかなぁ・・)
お手軽にXML::Simpleはどうでしょ。

use XML::Simple;

my $songlist=XMLin('./songs.xml');

foreach $song (@{$songlist->{'Event'}}){
print $song->{'s:Song'}->{'s:Artist'}->{'name'}." - ";
print $song->{'s:Song'}->{'title'}."\n";
}

こんな感じで
MASSIVE ATTACK - Unfinished sympathy
MASSIVE ATTACK - Protection
みたいに表示されます。
572デフォルトの名無しさん:03/12/13 00:21
Perlを勉強し始めたばかりのものです。
とあるページで定数の宣言に

*MAX_BUF = \1024
print $MAX_BUF, "\n";

という記述があったのですが、どうしてこれが定数になるのでしょうか?
574572:03/12/13 00:54
>>573
できました。
XML::SimpleとXML::Parserとexpatをインスコするんですね。

use XML::Simple;
$content = `curl -L ¥"http://www.radiofg.com/rcs/XMLSongs.xml¥"`;
my $songlist=XMLin($content);
print "[ Radio FG Playlist ]¥n¥n";
foreach $song (@{$songlist->{'Event'}}){
print substr($song->{'startTime'},0,5)." : "; # 秒数は省略
print $song->{'s:Song'}->{'s:Artist'}->{'name'}." - "; # アーティスト名
print $song->{'s:Song'}->{'title'}; # 曲名
$length = $song->{'s:Song'}->{'s:Artist'}->{'m:Media'}->{'runTime'}; #演奏時間を変換
print " [".int($length/60).":".int($length%60)."]¥n";
}

素人OSX使いなので勉強になりました。ホント感謝です。

http://live.radiofg.comのソースを使ってました
(一桁秒数が未修正ですが‥)
ttp://mac.oheya.jp/etc/img-box/img20031213004626.jpg
おー、なんだかかっこいいですね。
秒数はprintfを使って
printf "[%2d:%.2d]", $length/60, $length%60;
なんてやるとお手軽に桁がそろえられますよ。
576デフォルトの名無しさん:03/12/13 19:48
>>574
本当にあんたは572なのか?
577デフォルトの名無しさん:03/12/13 21:15
最近Windows環境でPerlスクリプトを書く機会が多いんだが
「Win32 Perlアドミニストレータハンドブック―PerlによるWindowsシステム管理の自動化」
この書籍は果たして買いでしょうか、迷ってます
578デフォルトの名無しさん:03/12/14 10:34
質問なのですが、同じ内容の中身が複数ある配列を検索して
検索にヒットしたもののうち1つだけを削除するのに何か上手いやり方ないでしょうか?
たとえば、
@array = ("あああ","あああ","いいい","ううう")
とある場合、あああで検索かけてあああを一個だけ消したいのですが・・・
579デフォルトの名無しさん:03/12/14 11:05
perlであと何年ゴハン食べれますか?
580デフォルトの名無しさん:03/12/14 11:21
>>579
別にPerlを使えるから飯食えるわけじゃない。
Perlを使って何が作れるの?っていうことが問題だ。
>>578
ハッシュじゃだめなの?
たとえば

%data = ('あああ' => 2, 'いいい' => 1, 'ううう' => 1);

みたいにキーは文字列、値は重複カウント数をとるようなデータを
作っておいて該当するキーが見つかったら重複カウントをデクリメントする
みたいな
>>578
my @array = qw(a b c d a b c d a b c d);
my $search_word = 'a';

# 頭から消す
for my $i (0..$#array) {
  $array[$i] eq $search_word or next;
  splice @array, $i, 1;
  last;
}
print "@array\n";

# 尻から消す
for my $i (reverse 0..$#array) { (同上) }
Terminating on signal SIGBREAK(21)
ってエラーがでてしまうんですが、たちけて
>>584
要素をユニークにすることが>>578 のやりたいことだとは限らない。

1. 特定要素で検索することに意味があるのか?
2. 一つだけ残す、ではなくて一つだけ「削除」であることに意味があるのか?
3. 検索にヒットした要素が一つだけである場合削除するのか?

参考になるのは間違いないとは思うけどね。
586578:03/12/14 16:16
>>582さんのspliceってやつを使ったらできました!ありがとうございます!
しかし参考にしてる本にはどこにもspliceなんて載ってなかった・・・
丸1日つぶれちゃってかなり鬱です。
マジかよ。spliceなんて push, pop, shift, unshift と並んで
配列処理の基本関数だろ。JavaScriptにも同名のメソッドがあるのに。
そんな本は乞食の燃料用に捨ててしまえ。
W3Cの作る仕様を読まずにHTMLの本を書くことと、
Perlの言語仕様もろくに知らずにPerlプログラミングの
入門書を書くこと、どっちが有害かな?
HTMLだろ、騙されるヤツの数が違いすぎる
掲示板作ったんですが、最初から〜十個までは表示できるのですが
11個〜20個という方法が思いつきません。
1から20まで読んで1〜10は廃棄、という方法のほかに何かあるものなのですか?

それと削除機能もですけど、削除されたところを除外して、他のログを上書きという
方法のほかに何かあるでしょうか
>>590
・レコードを固定長にしてシーク。
・削除マークをつける。
>>590
板違いっぽい。
WEBプログラミング板
http://pc2.2ch.net/php/
593デフォルトの名無しさん:03/12/15 03:11
Perlでiniファイルや、confファイルを読み込みたいのですが、
Javaでいうところのリソースバンドルのような動作するツールはないでしょうか?
よろしくお願いします
>>579
Perlそのものでメシ食ってる人は知らない。
(そこら辺 C や COBOL, Java と違う)
ただ、Perl を知らないと10日かかる仕事を1秒で終えた人ならたくさん知っている。
597デフォルトの名無しさん:03/12/15 10:14
依頼人「10日くらい前からなんですが、デスクトップになんか変なアイコンができちゃったんです」
Perlを知っている人「これはねえ、こうやってゴミ箱に動かせば消せるんですよ」
解決に一秒。驚異の早業師”Perlを知っている人”恐るべし。
>>598
Perl使ってる人を馬鹿にしてるんだろうけど、Perl関係ないじゃん。
>>596
そういうケースの9割以上はshで片付けられるかな。
Perlの方が楽だけど。
PerlでCGIばっかりやってると、プログラミング能力落ちるよな。
CGIなんて所詮ただのバッチ処理だから。ベタに書くのが
一番速かったりするし。
>>600
sed,awk使ってもいいならshでも余裕だね
俺は面倒だから全部Perlでやるようになった
おかげでawkすっかり忘れた
603571:03/12/15 17:15
>>575
あ、そんなんありましたね。どうも。
独学なもんで基本が‥‥わざわざサブルーチン作ってました。

>>576
モロ間違えました。
604570:03/12/15 17:17
>>603
ってまた間違えたり。無線LANケーブルで首吊ってきます。
605590:03/12/15 20:31
ありがとうございました。板違い申し訳ないです…。帰ります…。
>>596
どきっとしますた(汗)
おかげで余計な仕事までさせられています(泪)
607デフォルトの名無しさん:03/12/15 21:09
parrotを使ってみてるひとここにいますか?
608M:03/12/15 21:58
PERL:DBI について詳しい方がいらっしゃいましたら
教えていただきたいのですが。

データベースハンドルを二つ以上、発行して、異なるデータベース
の情報にアクセスすることは可能なのでしょうか?

ちなみに自分が作ったPGを起動すると、一つのDBの情報はもってこれるの
ですが、片方のDBについては、以下のエラーにより、取得できません。
PGでは、データベースハンドルを2個取得して、SQL文を個々の
セッションで発行するようにしています。

[エラー]
Can't call method "prepare" without a package or object reference at mts_kanyuu.pl line 49.
Issuing rollback() for database handle being DESTROY'd without explicit disconnect().
CGIにしても、最近はほぼ100%,LinuxかFreeBSDが使われてて
そういうい場合はPerlもあたらしめのことが多いから、
5.00Xはもう考えなくてもいいのかな。5年ぐらい前までは
WebサーバにHP-UXにPerl4なんて組み合わせもあったんだけどなあ。
もう昔話だね。
>>609
うろ覚えだが、FreeBSD 5.x 系って perl 4.x に戻したんじゃなかった?
>>610
FreeBSD 4.x は Perl 5.005_03 が標準で含まれているが、make world 時の
負担を減らす等の理由で、FreeBSD 5.x からは Perl 自体が標準では
入らなくなった。

ports/packages には 5.005 も 5.6.x も 5.8.x も用意されているので、
4.x だろうが 5.x だろうが必要なヴァージョンをインストールできる
(4.x に 5.8.x を入れたら、/usr/bin/perl が 5.005_03 、/usr/local/bin/perl
が 5.8.x になる) 。
612デフォルトの名無しさん:03/12/16 04:39
>>601
業務系はほとんど同じだと思うけど。
CGIと業務系はレベル的には変わらないね。
どちらもただのデータ入出力のやり取りだからね。
ま、ゲームも同じような物だけど。
難しいプログラムなんて基本的にはない。
所詮プログラマーなんてそんな物。
面倒なプログラムはあるけど。
随分と自信家だこと
614デフォルトの名無しさん:03/12/16 19:34
ハーイ、シツモーン! (/*・・)o

globでファイルの拡張子を指定してファイル名取得ってできますよね。
my @list = glob("*.txt");

同じ要領で指定した拡張子以外のファイル名って取得できます?
例えば、Aフォルダ内のtxtファイル以外のファイル名を取得。

どんぞよろしく。
grep { -f && !/.*\.txt$/ } glob "*"
616デフォルトの名無しさん:03/12/16 20:35
そのまんま使ったらうまくできました。
ありがとうございました。
どうしてこれで取得できるのか調べねばφ(・・。)ゞ
今までずっとペリと読んでいて今更パールなんて読めません。
一体どうすればいいんでしょうか・・・
真珠と嫁。
国産のオブジェクト指向スクリプト言語は紅玉だ。
>>616
Schwartz変換と同じ。
知らなければ調べるよろし
>>616
my @list = glob("*");
my @not_txt;
foreach (@list){
 if(-f){
  if(!/*\.txt$/){
   push @not_txt, $_;
  }
 }
}

これで我慢しとけ
>>615>>616
調べるためのヒント

1. grep { ブロック } リスト っていう関数があるはず。調べてみましょう。
2. -f ファイルテスト演算子というのものがあります。調べてみましょう。
3. /*\.txt$/ これを ! で否定しているわけですね。
4. && アンドです。両方とも成り立つときに真です。
622617:03/12/17 18:23
>>618
   _、_
 ( ,_ノ` )      n
 ̄     \    ( E)サンクス!!
フ     /ヽ ヽ_//

真珠か、いー響きだ。
623デフォルトの名無しさん:03/12/17 23:15
文字列を保存したファイルを開いて
その文字列をランダムで表示させるプログラムってどうやるのでしょうか?
>>623
何がわからないのかはっきりさせろ。
1.ファイルの開き方が分からない
2.ランダム値の作り方が分からない
3.表示の仕方がわからない
625デフォルトの名無しさん:03/12/18 01:06
ファイルを開いてからが分かりません。
どうやってファイルの中の文字をランダムで表示させるのか・・・。
626デフォルトの名無しさん:03/12/18 01:24
ご教授願います。
http://www.police.pref.osaka.jp/topics/17.html
こんな情勢によって、18未満の登録を受け付けないようにしたいのですが、
西暦と月日から計算して、年齢を割り出すCGIの為、上手く18未満へのエラ
ーを返す事が出来ません。

スクリプトは、
sub age {
my($b_year, $b_month, $b_mday) = @_;
local $_;
if ($b_year < 1000) { $b_year += 1900; }#ver4以前のデータを補正
local $_ = $year - $b_year;
if ($mon < $b_month) { $_--; }
else {
if ($mon == $b_month && $mday < $b_mday) { $_--; }
}
return $_;
}
とサブルーチンを組んであり、呼び出しは
print age($bY, $bM, $bD) . "歳"; のような感じです。

if (age($bY, $bM, $bD) => 18) { $errStr .= "18歳未満の方はご利用出来ません<br>"; }
のようにエラーを返したいのですが、「age($bY, $bM, $bD)」の仕組みがわかりません

ご教授願います。(#ver4以前のデータを補正は必要ないと思われます)
>>625
1と3は分かってて、2が分からないってことでいいんだよな?
randを調べてみそ。
>>608
どのレベルの話をしてるかわからんが、
以下のようなコードで想定通りの動作を得られた。
根本的な勘違いをしてないか?

use DBI;
$s = DBI->connect("dbi:Sybase:SYBASE", 'login', 'passwd');
$p = DBI->connect("dbi:Pg:中略", 'login', 'passwd');

print $p->selectrow_array("SELECT COUNT(*) FROM table1"), ": Pg\n";
print $s->selectrow_array("SELECT COUNT(*) FROM table2"), ": Syb\n";

1つめのエラーは、もらったはずのDBハンドルに 0 とか undef が入ってるんだろ?
2つめのは氏欄
人に説明しやすいソース出せ

Perlスレで PG とかいわれて、DBD::Pg のことかとオモタヨ
>>614
老婆心ながらアドバイス
シェルで使うような正規表現でglobbingしたいのでない限り
opendir readdir 使った方が軽いし融通も効く…と思うぞ

opendir($D, '.') || die;
@dir = sort grep(/pattern/, readdir($D));

perldoc File::Glob File::Find を見ておくのもよいかもしれん
>>626
何を助教授されたいか知らんが
この age ってサブルーチンは、引数の他にも
グローバル変数 $year $mon $mday が必要だろ?
それはセットされてるか?

# このサーバは日本国内にあるのが前提
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime;
$year += 1900;
$mon++;

もし localtime などを使用して現在日時が得られているのなら、
与えられる引数(サブルーチン内の $b_year とか)は、
localtime のものと互換性があるか?
year は +1900 のゲタをかまさないといけないし
month は +1 のゲタをかまさないといけないワケだが

で、これがいちばん重要なんだが
・サブルーチン age を修正したいのか?
・与えられた生年月日から年齢を得る方法(あるいは18未満判定)を知りたいのか
どちらだ?
>>626
試行錯誤して動かせるレベルなので。。。

sub GetAge {
my($bY, $bM, $bD) = @_;
unless($bY && $$bM && $bD) {return '';}
if($bY =~ /[^0-9]/) {return '';}
if($bM =~ /[^0-9]/) {return '';}
if($bD =~ /[^0-9]/) {return '';}
if($bY < 1900 || $bY > 2023) {return '';}
if($bM < 1 || $bM > 12) {return '';}
if($bD < 1 || $bD > 31) {return '';}

my($s, $m, $h, $D, $M, $Y) = localtime(time);
my $age = $Y + 1900 - $bY;
if($M+1 < $bM || ($M+1 == $bM && $D < $bD) ) {
$age --;
}
return $age;
}
ここら辺なのだろうか?

「・与えられた生年月日から年齢を得えて18未満判定)をしたいのです」
んです、どうこをどう説明したらいいんでしう...
632デフォルトの名無しさん:03/12/18 10:08
おそらく初歩質問。でも自分にとってはかなり問題。
質問させてください。

$list="111aaa222bbb333ggg<ここでいったん切る>9999vvvvgggg5555sss"
って変数があっってそっから<ここでいったん切る>を目印に文字列を分割したい場合にどうすればよいのでしょうか?
$mae="111aaa222bbb333ggg"
$shirushi="<ここでいったん切る>"
$ushiro="9999vvvvgggg5555sss"
こんな感じで3パターンの変数を作りたいです。

よろしくおねがいします。
分割の目印になる文字列が一定ならsplitがお手軽だと思うけど

$shirushi="<ここでいったん切る>";
$list="111aaa222bbb333ggg<ここでいったん切る>9999vvvvgggg5555sss";

($mae,$ushiro) = split($shirushi,$list);

print $mae."\n";
print $ushiro."\n";
Perl のソースコードを HTML 形式にフォーマットするモジュールありますか?
やりたいのは Perl のソースコードを食べさせる
Vim や Emacs みたいに =pod .. =cut や # 以降を淡色表示にしたり、
変数や定数、予約語や久美子み関数を違う色にタグ付けした HTML のコードを吐き出すの。

このすれのサポートページのコンテンツにと思っていたのだが、結構大変そう。
構文解析とか必要だろうし、なかったら Flex と Bison つかってでもやるしかない。
>>634
Emacsに読み込ませてface2htmlすれば?
>>634 Perlモジュールじゃないけど enscript ってプログラムがあるよ
>>635
VimユーザなのでVimにも相等の機能がないか調べたらありました。
:$VIMRUNTIME/syntax/2html.vim
でHTMLなコードを吐き出してくれるようです。
>>636
Vim/Emacs もいいけど、
こっちの方が呼び出しとか結果をとりこむのが簡単そうなので
こっちにします。

感謝ハムニダ >>635>>636
333 名前: nobodyさん [age] 投稿日: 03/12/17 19:45 ID:???
http://www2.rocketbbs.com/200/pikkee7.html

話が食い違ってる厨房が二匹
printについて熱く議論してるし(プゲラ
639質問1:03/12/18 18:36
宿題なのです。
教えてチャンでごめんなさい。
このプログラムがどういう風に実行されてるか解読して来いといわれました。
お暇な方、いらっしゃいましたらお願いします。
sub search_p {
my @key;
$in{word} =~ s/( )+/ /g;
$in{word} =~ s/\s+/ /g;
$in{word} =~ s/^\s//g;
if (!$in{new_reg} && !$in{word}) { &error("検索項目を入力して下さい。"); }
if ($in{word}) { @key = split / /,$in{word}; }

&header;
&search_win;
print "<br><br>\n";
print "<hr color=\"$body_text\" size=1 noshade>\n";
my ($path, $past, @hit);

640質問2:03/12/18 18:36
foreach $path($log_path, $past_log_path) {
if (!$in{chk_p} && ($path eq $past_log_path)) { last; }
open(READ,$path) or &error('Log open error');
while (<READ>) {
if (@hit >= $hit_max) { last; }
if ($in{new_reg}) {
my (undef,undef,undef,undef,undef,$time) = split /\t/;
if ($now_time <= $time + ($new_limit * 60 * 60)) {
my $w = $past . $_;
push @hit, $w;
641質問3:03/12/18 18:37
}
next;
}
if ($in{chk_m}) {
if (!/^\d+\t\d+\t0\t/) {
next;
}
}
my ($i, $ok, $ng);
foreach $i(@key) {
if (index($_, $i) < 0){
$ng = 1;
}else{
$ok = 1;
}
}
if ($in{select} eq "and"){
if ($ng){next;}
}else{
if (!$ok){next;}
}
my $w = $past . $_;
push @hit, $w;
}
642質問4:03/12/18 18:38
close (READ);
$past = "past";
}
my $cnt = @hit;
if ($cnt == $hit_max) {
$cnt = "<b>検索結果が $hit_max 件を超えたので中断されました。</b>";
} elsif (!$cnt) {
$cnt = "何も見つかりませんでした。";
} else {
$cnt .= " 件";
}
print <<EOF;
643質問5:03/12/18 18:39
<table border=0 cellpadding=2 cellspacing=0 width="100%">
<tr><td colspan=3>
$cnt
<hr color="$body_text" size=1 noshade>
</td></tr>
EOF
foreach (@hit) {
my ($get,$past_word);
if (index($_, $past) == 0){
$past_word = '<font color="blue">[PAST]</font>';
$get .= "&past=1";
s/^$past//;
}
my ($no,$mno,$pno,$tred,$titl,$time,$name,$email,$url,$cmnt,$ipadr,$pwd) = split /\t/;
my $date = &get_date($time);
if ($email) { $name="<a href=\"mailto:$email\">$name</a>"; }
($cmnt) = split /<br>/, $cmnt; $cmnt .= "...";
$get .= "&$dm";

print <<EOF;

644質問人:03/12/18 18:40
スレ汚しすみません。
>>639-643

プログラマ歴5年の俺様が解析するに、これは
「検索項目を入力させて、検索結果を表示するプログラム」
だな。うん
646デフォルトの名無しさん:03/12/18 18:46
インターネットの匿名掲示板2ちゃんねるにて、殺人を予告するスレッドが立ちました。
以前にもこの人物は同様の行為をくりかえしており悪質、偏執的でかなり危険な状態にあります。

予告がされたURLはこちら↓
http://comic3.2ch.net/test/read.cgi/voice/1071634666/

「年内に」と時刻を指定していることで、かなりひっぱくした状況にあると思います。予告されている対象は、声優の田村ゆかりさんであり、
彼女は年末にライブを行う予定があることから、脅迫罪とともにライブに対する威力業務妨害罪の適用も可能かと思います。

宿題は自分でやろうな
648デフォルトの名無しさん:03/12/18 18:50
>627
ランダム関数を使うのは分かってるのですが
どうやったら他のファイルの文字列を(ランダムで)表示させるのかが分かりません。
>>648
出来ない事を一度にやろうとするな
他のファイルを読み込む→配列に突っ込む→配列の要素をランダムで選ぶ→それを表示させる
>>638
(´,_ゝ`)プッ
651デフォルトの名無しさん:03/12/18 19:38
>649
他のファイル@array(・・・・・・・・)から
どうやって文字をランダムに表示させるんですか?
open(F, txt) || die "表示不可";
のあとが分かりません。
>>651
配列に突っ込むがわからないということでつか?
653デフォルトの名無しさん:03/12/18 20:50
別のファイルを読み込んだ後はどうするのか・・・分かりません
654デフォルトの名無しさん:03/12/18 21:52
open(F, "kuji.txt") || die "can't open\n";

srand;
$num= rand(@array);
print "選ばれた文字は$numです\n";

close (F);

これじゃ駄目なんですよ。当たり前なんでしょうが・・・
分かりません。(((゚Д゚;)))) シクシクシクシク
>>639-643
プログラマ歴15年の俺が推測するに、
こういう風に実行されてるはずだ。

Perl 起動

スクリプト読み込み

構文解析

コンパイル

実行
>>654
「配列の要素をランダムで選ぶ」が分からないんでしょ?
もうちょっと質問する努力をしてくれ

print $array[rand(scalar @array)];
>>655
ごめんごめん 「配列に突っ込む」も分からないのか
つーか何にもわかってねーじゃねーかゴルァ

my @array = <F>;

甘やかし過ぎかな?
658デフォルトの名無しさん:03/12/18 22:51
そうなんですよ。Perl致し方なくやってるもんで全然分からずに・・・
なんとかあやふやなモノが出来ました。有り難う御座いました。
win上での実行法で質問なんですー
核心部分を言うとperlスクリプトのファイルをダブルクリックで実行した時にDOS窓が開いて一瞬で閉じるのを防ぐ方法は無いでしょうか
$val=<STDIN>やら引数無しsleepでも止まりませんでした・・・

具体的にはスクリプトファイルへのショートカットをSendToフォルダに置いて、任意ファイルを「送る」からプログラムに投げたいのです
んでその後パラメータを入力するって動作をさせたいのです
>>659
1) 「最小化して実行」
2) wperl.exe を使ってみる
質問なのですが、
ひまわりっていう日本語プログラム言語のページに書かれていたんですけど、
>PerlやRubyのようにバイトコードに変換してから実行すれば
>速度面は改善されるだろう。
えっとperlてバイトコードに変換してから実行してたんですか?
Windows2000でActivePerl5.8つかってるんですが、
perlのbinフォルダにある、perl.exeとperl5.8.0.exeの違いって何ですか?
>>662
ファイル名のみが違う。中身は(たぶん)一緒。
いずれも、実行部本体である perl58.dll を呼び出している。

で、なぜ名前が違うものが用意されてるかというと
Perlバージョンに依存したものを実行する必要があるときのため。
664662:03/12/19 07:41
>>663
了解。さんくす
665662:03/12/19 07:44
てかCRCとったら同一でした・・・・
すません。
md5も一緒でした
unixだとハードリンクしてるだけなんだがな。
print "abc";
sleep(1);
print "def";
sleep(5);
print "ghi";

こう書いたら6秒止まってからabcdefghiと出ます。
abc(1秒止まって)def(5秒止まって)ghiと表示するにはどうすればいいでしょうか?
なぜ上記ではダメなのかも教えていただけるとありがたいです。
$arr = [
 ['', qw(a b c)],
 [qw(A 1-1 1-2 1-3)],
 [qw(B 2-1 2-2 2-3)],
 [qw(C 3-1 3-2 3-3)]
];

↑のような配列を
↓のように変更したいのです。

$arr = [
 ['', qw(A B C)],
 [qw(a 1-1 2-1 3-1)],
 [qw(b 1-2 2-2 3-2)],
 [qw(c 1-3 2-3 3-3)]
];

一応考えてみたのですが、もっと良い方法がある、とかありましたら教えて頂けますでしょうか。

my $reverse_arr = [];
my $n = '';
for ($n = 0; $n <= $#{ $arr }; $n++) {
 push, @{ $reverse_arr }, [ map { $arr->[$_]->[$n] } 0 .. $#{ $arr } ];
}
$arr = $reverse_arr;
>>670
foreach my $array_ref (@$arr) {
 foreach (@$array_ref) {
  tr/a-zA-Z/A-Za-z/; # 小文字を大文字、大文字を小文字に変換
  s/^(\d+)\-(\d+)$/$2-$1/; # ハイフン区切りの数字の前後入れ替え
 }
}

# 結果の確認
print "@$_\n" for @$arr;

これでいいのかな?やりたいことと違うならもう少し詳しく説明よろ
672670:03/12/19 22:25
>>671
申し訳ない。例が悪かったです。

$arr = [
 ['', qw(a b c d e)],
 [qw(A あ い う え お)],
 [qw(B か き く け こ)],
 [qw(C さ し す せ そ)]
];



$arr = [
 ['', qw(A B C)],
 [qw(a あ か さ)],
 [qw(b い き し)],
 [qw(c う く す)],
 [qw(d え け せ)],
 [qw(e お こ そ)]
];

正式名称知りませんが、表の軸の入れ替え?をしたいのです。
一応自分の書いたコードでも動作しているのですが、他にスマートな方法があればお伺いしたいな、と。
行列の行と列を入れ替えるってことですね。
素直に書くとこんな感じ?素直な分、>>670さんのより多分早いと思う。

for (my $i=0; $i < scalar @{$arr}; ++$i){
  for (my $j=$i; $j < scalar @{$arr->[0]}; ++$j){
    ($arr->[$j][$i], $arr->[$i][$j])=($arr->[$i][$j], $arr->[$j][$i]);
  }
}
674673:03/12/19 23:20
あ、だめだ>>673はn行n列の行列じゃないとうまく動かないや。
>>672
670のでいいんじゃ?
列を行にしてるんだよね
逆に行から列もできるけど行数x列数だけpushしまくりになるからめっちゃ遅いだろうな・・・
変換対応のテーブルを事前に作っておくか自動で作って置いて、変換の際はそそくさと済ませちゃうとか。
sin 計算が煩雑なのであらかじめ sin テーブルを作るみたいなノリで。@わりと古い脳内回路です(^-^;)
行列モジュール使っちゃダメか?
>>677
脳内杉
この案件だとそそくさも何もないだろw
質問です。
perl.exeとwperl.exeの違いは具体的に何なのでしょうか?
Windowsだと.plファイルを関連付けするとDOS窓が起動しなくなるけど、
Linuxなんかでは違う動作なのでしょうか?
>>680
Subsystem=3(コンソール)
Subsystem=2(GUI)
の違い。具体的な違いについてはパス。

コンソールアプリでバイナリをつくると、デスクトップから
実行した際に、(コンソールを放棄しても)コンソールが現れてしまうし
GUIでバイナリ作ると、今度はコマンドラインから起動しても
start XXXX.exe と同じく実行ファイルが終了を待たずに detach されてしまう。
コンソール/GUI共用バイナリはとても作りづらいので、
用途によって perl.exe wperl.exe を使い分けるちうわけだ。
Perl/Tk なサンプルコードを書いて、コマンドプロンプトから
perl wperl それぞれで起動してみるとわかるんじゃないかな?

ちなみに Unix 系のバイナリでは、wperl に相当するバイナリは存在しないのが普通。
682トッド若松:03/12/21 01:24
16進数が文字列として処理されてしまうのですがいい方法ないですか?

-----処理----------
$a="10:0x10";

@b=split(/:/,$a);

print "$b[0]\n";
print "$b[1]\n";

-------結果-------
10
0x10 <--- ここを16にしたいのだが....
>>682
hex
684トッド若松:03/12/21 01:55
>683

申し訳ないが、hexを使う場合、以下のように16進の判定が必要になります。
if($b[1]=~/^0x/){
$b[1]=hex($b[1]); # または、$b[1]=sprintf("%x",substr(b[1],2);
}
print "$b[1]\n";

例が悪かったのですが、10進、16進どちらの形式が入力されているかが、あらかじめ分からない場合、上記のような判定分なしの解決策はないでしょうか。




>>682
先だって16進→10進変換行っておけ

$a =~ s/0x([0-9A-F]+)/hex($1)/egi;

(安全のためには、split で切り出してから変換した方がいいのだが
手を抜きたい場合は上記でおk)
686デフォルトの名無しさん:03/12/21 21:25
ちょっと質問させてください。
あるファイルをバイナリとして読み込んで、
それに対応した画像を表示させようと思っています。
例えば「01 23 45 67 89 AB」という内容のファイルで
0〜F.gifのファイルで対応させています。
1バイトで画像二つ分になります。
大体うまくいくのですが、おそらく「00」があると
「0」として認識している感じです。
いろいろ対応をしたんですがことごとく失敗してます。
対処法を教えていただけませんか?

以下に現在の方法を簡単に書きます
@data に1バイト分の数値データの配列が入っています。
(当然0から255までの数値のみ)

foreach $a (@data){
$a = sprintf("%x", $a);
}

で、16進法に変換します

for ($i=$start1 ; $i<= $end1 ; ++$i){
$dat = $dat . $data[$i];
}

文字列変数$datに指定範囲のデータを入れて
0〜Fのを画像タグに置換しています。
%02x
688686:03/12/21 22:46
>>687サン
サンクス!!!

$a = sprintf("%x", $a);
を意味を理解せず使ってたので…
精進いたします。
>>686
本題には関係ないが、

$a (と $b) は使わない方が良い
$dat = $dat . $data[$i]; は $dat .= $data[$i]; とも書ける
>>689
ちゃんと理由も説明してやれよ
691686:03/12/22 13:22
>689サン
$a $bはここに書くために変えました。
元は他の変数名です。

$dat .= $data[$i];
こんなのあったのはなんとなく知ってましたが、
このプログラムをちゃちゃーっと書いていたので、
調べるのもなんなんで、安易にああしました。
こっちのほうがきれいですよね。

ご丁寧にありがとです。

$data[$i]をsprintf("%x", $a)にしたほうが
全然効率的だとしばらくして気が付いた…(苦笑
692686:03/12/22 13:33
$aを使わないほうがいいのは暗黙的にある関数に使われていて
干渉するから…とかですか?

ぐぐってみたけども'$a'がなかなかうまく引っかからないのね…

>691
sprintf("%x", $a)じゃなくてsprintf("%02x", $data[$i])だった…
かなり旧型のWin98機でActivePerl5.8.1を使っているのですが、
モジュールをインストールする際に必要な C コンパイラで、手軽というか
容量が少なくてすむものはないでしょうか。
Borland C++ や Cygwin は、このマシンにはきつくて。
>>692
http://www.hyuki.com/yukiwiki/wiki.cgi?Perl%A4%CEsort%B4%D8%BF%F4

Googleで「一般的な単語なので云々」って言われたら「+」を使うといいですよ。
http://www.google.co.jp/intl/ja/help.html
>>691
my $file = "\x00\x00\x00\x32\x5F\x0D\x0A\x23\x00\x00";
my $dat = substr join('', unpack 'H2' x length $file, $file), $start, $end - $start + 1;
696クンクン(葬式):03/12/22 14:21
>>693
LSI-C 86 試食版
でググるといいかも。。。
クククのクーソ。。。
perlをつかって2ちゃんねるに書き込みする事はできますか?
699クンクン(葬式):03/12/23 10:03
>>697
どういうスクリプトで書いていたか (Perl? sh? Ruby?) は分からないけど、
適当なプログラムを組んで自動的に2ちゃんねるにかくことはできるわよ。。。

http://pc.2ch.net/test/read.cgi/linux/1059012918/
で hourly kernel.org.ticker という人のレスは一時間おきに自動的に投稿されているの。。。

クククのクーソ。。。
700デフォルトの名無しさん:03/12/23 15:29
質問させてください。
簡単なチャットを作ったのですがどうしてもうまく動きません。
同じディレクトリにchat1.cgiとchat1.datとcgi-lib.plを置いています。
表示はできるのですが送信を押すとInternal Server Errorになります。
使用環境は自宅サーバーでApach1.3.29とActivePerl5.6です。
どなたかわかる人いましたらご教授おねがいします。
エスパー募集中です。未経験者歓迎。
702700:03/12/23 16:03
703クンクン(葬式):03/12/23 16:10
/var/log/apache/ の下に error.log とかない?
そこにヒントがあるかも知れないわね。。。
鯖が動いているプラットフォームは Windows かしら?
だとしたら↑のディレクトリじゃないけど、
Apache が吐き出すエラーログをよく見るのよ。。。

クククのクーソ。。。
704クンクン(葬式):03/12/23 16:19
>>700>>702
18行目。
×spritf
○sprintf
クククのクーソ。。。
705700:03/12/23 16:29
>>704
うわああああああああ!!
大感謝!!
うごきました!!!
>>705
何やってんだ。最低でもコンパイルエラー取り除いてから実行しろよ。
707クンクン(葬式):03/12/23 17:33
>>706
>>700にも書いていたと思うけど、 perl -cw chat1.cgi やっても見つからないわよ。。。
クククのクーソ。。。
>>707
そりゃif文の中チェックしてないからだろ
へぇ、そうなんだ
初耳
>>708
if文は関係無い。
未定義の関数を呼び出す文があっても
-wc はエラーを出さないよ。

$ perl -wce "a();"
-e syntax OK
>>704-710
(´-`).。oO( 組込関数の冗長な括弧を書かなければ防げたね… )
712デフォルトの名無しさん:03/12/23 22:59
上級者の方に質問ですが、
perlのコンパイル時に実行禁止の関数を設定できるオプションがあるようなのですが
いくら探しても出てきません。
例えばexecやsystem,symlink関数を使わせないようにするには
どうすればいいでしょうか?
クンクンこんなとこにまで出てくんなよ!















…と思ったら葬式か。まあ、葬式だけは許してつかわす
>712
$ perl -M-ops=exec,system,symlink -e "system 'ls'"
'system' trapped by operation mask at -e line 1.

http://www.perldoc.com/perl5.8.0/lib/ops.html
http://www.perldoc.com/perl5.8.0/lib/Opcode.html
>>698
それではできない。以上。
716680:03/12/24 13:15
>>681
お礼が遅くなってすみません。
半分くらい理解、あとは自分で調べます。
ありがとうございました!
gccのPerlとActivePerlって共存可能ですか?
あと違いはありますか?
ついでに皆さんのOSとインタプリタを教えてください。


print "Start ...";
# 重い処理
print "Done.\n";
と書くとprintされるものが\nまで溜め込まれるようで
「重い処理」が終わった後に表示されてしまい、意図したものと異なってしまいます。

print "Start ...\n";
# 重い処理
print "Done.\n";
と書くと思ったように表示されますが、 Start と Done を一行に表示させたい場合、
どうしたらいいですか?
あ、後ろの質問の解決方法がわかりました。

$| (use English;していれば $OUTPUT_AUTOFLUSHも可) に
0以外の値をセットすると、printとかwriteを実行するたびに
出力するんですね。

まだ試していませんが、これで多分 解決!
719クンクン(葬式):03/12/24 14:07
>>717
わたしは Cygwin の Perl が半分、もう半分は職場から自他草場に繋げて Linux の Perl ね。
バージョンは 5.8 系を。
クククのクーソ。。。
>>717
WinXP + ActivePerl + cygwin(Perl除く)ですが何か
>>717
cygwin 内で閉じてるときは cygwin perl
スタンドアロンのときは ActivePerl
使い分けてるな。W2k.

cygwin perl と ActivePerl の違いはクサる程ある。
722クンクン(葬式):03/12/24 15:19
>>717例えばNT 系で chmod は鬼門だわ。。。
ククーン。。。
>>717
オレの環境ではActivePerl522ベースのjperlと
ActivePerl808が共存してるからできるんじゃないの。
一方を、例えばgccのperl.exeをgperlとかに変更すれば
いいとおもわれ。
文字列を四文字づつのリストに分解したいです。

例:"abcdefghijklmnop" ⇒ ("abcd", "efgh", "ijkl", "mnop")

一行くらいでスパッとやるイディオムをキボンヌ
726724:03/12/25 06:54
>>725
dクス
日本で一番レベルが高いPerlコミュニティーってどこ?
728クンクン(葬式):03/12/25 10:09
>>727
巨大掲示板群「2ちゃんねる」のプログラム板「Perlについての質問箱」とか
WebProg板のPerl関連スレッドとかかしら。。。
クククのクーソ。。。
>>728
バッカじゃねぇーの
いつまで葬式やってんだよ
>>696
え、LSI-C 86 試食版でモジュールのコンパイルってできるのですか
どうもです試してみます
732しかこ:03/12/26 16:31
教えてください。

openで指定するファイル名に、ワイルドカードを使用することは可能でしょうか?
別システムから上がってくるログファイルの内容を読み込んでチェックしたいのですが、
目的のファイル名が前半部分しか特定できません(後半はランダムな文字列が上がってきます)。
ですので、例えば
samplexxxxx.logというファイルの'sample'部分だけを指定し、samplexxxxx.logをオープンしたいのです。
イメージとしては、ワイルドカード使用のような方法があればと思います。

open (InFile1, "sample*.log")

のような指定は可能でしょうか。また、なにか他に方法はないでしょうか……。
勉強不足だなーとは思うのですが、よろしくお願いします。
>>732
my @file = glob 'sample*.log';
for my $file (@file) {
  open InFile1, '<' . $file or die $!;
  ...
>>732
open(FH, '/bin/cat /path/to/sample*.log |');
735しかこ:03/12/26 17:38
>>733,>>734

すばやいご回答ありがとうございます!
早速試してみます。

ありがとうございましたー(礼)。

736クンクン(葬式):03/12/26 17:40
>>732
本当にそういう処理をしないといけないのかしら。。。
samplefoo.log と samplebar.log って二つのファイルがディレクトリ内にあったら、
どちらがオープンされるのか分からないわよ。。。
ただ単に「○●という処理がしたい」という前に、本当にそういう処理が必要なのか
考えてみたらどうかしら。。。
クククのクーソ。。。
一括処理したい時は普通にある
738734:03/12/26 18:57
>>736
なにも前提条件ないので、処理の順番とかそういうものに
一切目をつぶった回答をしてみた。これで困るなら
質問者>>732からさらなる質問があろうと思ったので。

もっと手抜きするなら for (`/bin/cat /path/to/sample*.log`)

ちなみに俺は opendir 派。
UNIXに依存したコードってカコワルイ。
740デフォルトの名無しさん:03/12/26 19:52
perlってパースした後のデータを、ファイルに書き出すような機能ってあるの?
またそれを読み込んだりして、コンパイルのオーバーヘッドを回避したり。
741ヽ(´ー`)ノ:03/12/26 20:37
>>740
> perlってパースした後のデータを、ファイルに書き出すような機能ってあるの?
何の事言ってるか知らんが、serialize の事なら相当の機能はある。

> コンパイルのオーバーヘッドを回避したり。
(´Д`)?
>>741
上に書いた「データ」というのはプログラムのことです。
http://perldoc.jp/docs/modules/Storable-2.05/Storable.pod
ここに書いてあるようなもののことではありません。
*.plというプログラムをパースしたあとのデータという意味です。
mod_perlのないサーバーでCGIを軽く実行させるために
何かいい方法はないかと探してました。
perl2exe
ActivePerlでImage::Magick 5.26を使ってbmpをjpgに変換するスクリプトを作ってます
Setメソッドでqualityパラメータを渡せば圧縮品質を決めれるらしいのですが
qualityの値を指定してもしなくても、生成されるJPEGファイルのサイズが同じで指定が効いてないようです
こりゃ仕様?バグ?未実装?
何か知ってる人いたら助けてくらさいー
746デフォルトの名無しさん:03/12/28 01:17
初学者です。
違う書き方がいくらでもできてしまうPerlに萎え萎え。
推奨コード、非推奨コードみたいなのをまとめたドキュメントってどっかに転がってないものでしょうか。
ひととおりの書き方を覚えて、その中から好きな書き方を選ぶのってなんだか手間だよ。
>>746
PerlやめてJavaでもやれば?
初学者ってことは仕事でやってんじゃないんだろ?
萎えるようなもんわざわざやることはない。
>>746
散々既出だけど、先ずはperldoc perlstyle。日本語訳はこれ。
ttp://perldoc.jp/docs/perl/5.8.0/perlstyle.pod
それからEffective Perlに一通り目を通すと
書き方が収斂されていくと思うまつ。

でもPerlってそんなに自由過ぎるかな?
pythonはよく知らないんだけど、そっち系から入ってくると
萎え萎えなのかな。
書いてくウチにだんだん収斂しテクに一票
いっぺん中〜大規模なもの書いてみれば
スタイル身に付くよ

人のコードは参考にならないことが多い(むしろ害になることも)
CGIにはろくなコードはないので、絶対に参考にしちゃだめです。
むしろSchemeから学ぶことが多いです。
$val = 'foo' if not $val;

$val ||= 'foo';

$val = $val ? $val : 'foo';

$val !~ /.+/s and $val = 'foo';

perlマンセーw
>>751
どれが一番速いんですか?
753ヽ(´ー`)ノ:03/12/28 03:15
if (! $var) {
$var = 'foo';
}

が一番イイと思う
ブロックに出入りするより短絡論理演算が速い現実
くだらないが素直にベンチ執ってみる
#!/usr/bin/perl
use strict;
use Benchmark;
timethese(1000000,{
1=>q{
my $val='';
$val = 'foo' if not $val;
},
2=>q{
my $val='';
$val ||= 'foo';
},
3=>q{
my $val='';
$val = $val ? $val : 'foo';
},
4=>q{
my $val='';
$val !~ /.+/s and $val = 'foo';
}
})
Benchmark: timing 1000000 iterations of 1, 2, 3, 4...
1: 0 wallclock secs ( 1.09 usr + 0.00 sys = 1.09 CPU) @ 916590.28/s (n=1000000)
2: 1 wallclock secs ( 0.85 usr + 0.00 sys = 0.85 CPU) @ 1175088.13/s (n=1000000)
3: 0 wallclock secs ( 1.02 usr + 0.00 sys = 1.02 CPU) @ 978473.58/s (n=1000000)
4: 1 wallclock secs ( 1.08 usr + 0.00 sys = 1.08 CPU) @ 924214.42/s (n=1000000)
@Pen3 ActivePerl5.6.1ですた
うーむ。俺の好みの順番と一致してるのには驚いた。
757ヽ(´ー`)ノ:03/12/28 04:04
>>755
5 => q{
my $val = '';
if (! $val) {
$val = 'foo';
}
}

2.4.23 i686 GNU/Linux, Perl 5.8.2 で同じくベンチ。
環境によって結構変わるみたいですな。

1: 2 wallclock secs ( 2.02 usr + 0.00 sys = 2.02 CPU) @ 1485148.51/s (n=3000000)
2: 3 wallclock secs ( 1.96 usr + 0.00 sys = 1.96 CPU) @ 1530612.24/s (n=3000000)
3: 2 wallclock secs ( 1.93 usr + 0.00 sys = 1.93 CPU) @ 1554404.15/s (n=3000000)
4: 3 wallclock secs ( 2.25 usr + 0.00 sys = 2.25 CPU) @ 1333333.33/s (n=3000000)
5: 2 wallclock secs ( 2.04 usr + 0.00 sys = 2.04 CPU) @ 1470588.24/s (n=3000000)
3と4のコードはあくまで>>746に対する遊びなんで本気になさらず・・・
759デフォルトの名無しさん:03/12/28 05:06
初心者ですが質問させてください
たとえば
モナ1歳東京
ギコ2歳大阪
シィ3歳アメリカ
これがdata.datの中に入ってまして
これを出力させたいのですが

#!/usr/local/bin/perl

$filename = "data3.txt";

open(FILE, $filename);
$v = <FILE>;
close (FILE);

@allbody = split(/\n/,$v);

for ($i = 0; $i < @allbody; $i++){
print "$allbody[$i]";
}

exit;

これでうまく出力できません
改行ごとに1つの文字にしてそれをタブで区切って出力したいのですが、どなたかご教授お願いします
初心者ですみません
760759:03/12/28 05:08
モナ(タブが入ります)1歳(タブが入ります)東京
761759:03/12/28 05:09
$filename = "data3.txt";←間違い
$filename = "data.dat";です
>>759-761
お前の説明では、何を訊きたいのかさっぱりわからん。
$filename = "data.dat";

-f $filename or error('No such data file.');
local *FILE;
open FILE, '<' . $filename or error('Cannot open data file.');
@allbody = <FILE>;
close FILE;

print "$allbody[$_]"
    for 0..$#allbody
;
> 改行ごとに1つの文字にしてそれをタブで区切って出力したい

これがよくわからんなぁ。

元データのタブ → 削除
元データの改行 → タブ

つーことなんかねぇ。
ブラウザに出力するなら print "Content-type: うんたらかんたら\n\n"; も足りんし。
765759:03/12/28 05:50
>763
ありがとうございます!
でもなぜ
#!/usr/local/bin/perl

$filename = "data.dat";

open(FILE, $filename);
$v = <FILE>;
close (FILE);

@allbody = split(/\n/,$v);

for ($i = 0; $i < @allbody; $i++){
print "$allbody[$i]";
}

exit;
これではだめなのでしょうか…
/\n/
あえて元のスクリプトを活かすんだったら undef $/; かねぇ。
とりあえず、$v = <FILE>; で一行しか読んでないだろ。

ただ、やりたいことは、

$filename = "data.dat";
open(FILE, "<$filename") || die "$filename: $!";
while (<FILE>) {
chomp;
print;
}

(動作未確認) で済みそうなんだが。
768759:03/12/28 06:19
>766>767
ありがとうございます!
ちょっと難しいので勉強して出直してきます!
769デフォルトの名無しさん:03/12/28 09:01
>>747
ちょっとしたファイル操作で一発プログラムを書くのに便利そうなので勉強してます。
萎え萎えって書いたけど、Perlの泥臭ささはひとつの憧れでもあります。
工事現場で汗まみれになって働いてる男たちのある種のかっこよさと似ていますね。

>>748
ありがとうございました。
既出だったとはすいませんでした。
教えていただいたURLたいへん参考になりました。
EffectivePerlもそのうち買ってみます。

>>749
やっぱり書いていくうちに自然におぼえていくってのがセオリーなんですね。
人のコード読むためには必要なのかなあといろんな書き方覚えているところですが、
自分でどんどん組んでいったほうが意外と早道なのかもですね。

>>750
CGIのコードが糞ってのは驚きです。
いちばんPerlが普及している分野なのに!
schemeってそんなにいいんですか?
schemeのコードがそのままPerlでも動くんだったら勉強してみようかな・・・。

>>751-758
いろんな書き方の勉強になりました。
770デフォルトの名無しさん:03/12/28 09:33
>>769
CGIはPerlを学ぶ参考にならんよ。

CGIは、モジュール読み込みのオーバーヘッドを嫌悪し、
関数呼び出しのオーバーヘッドを嫌って書かれる。
既に存在するモジュールを使わずに車輪の再発明を繰り返し、
コピペし、インライン展開し、UNIX依存のコードを書いて。
0.01秒の実行速度向上のために、スクリプトをプリプロセッサに通し、
本体を__END__以下に移し、分割し、dumpし、コンパイルする。

少なくともそこにPerl本来の美しさは無いよ。
Effective Perl嫁
772759:03/12/28 12:41
初心者ですがまた質問させてください!
皆さんの協力で何とかここまでたどり着けたのですがこれを名前順や年齢順にソートするにはどうやったらいいのでしょうか
#!/usr/local/bin/perl
$filename = "data.dat";
print <<"EOM";
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY bgcolor="000000" text="ffffff">
<CENTER>
<TABLE border="2">
EOM
open(FILE, $filename);
@allbody = <FILE>;
close (FILE);
foreach $line (@allbody){
($name, $nenrei, $jyusho) = split(/\t/, $line);
print "<TR><TD>$name</TD><TD>$nenrei</TD><TD>$jyusho</TD></TR>";
}
print <<"EOM";
</TABLE>
</BODY>
</HTML>
EOM
exit;
ご教授おねがいしますm(_ _)m #掲示板の都合上改行は避けています
>>772
シュワルツ変換でググれ
あとラクダ本持ってるんならどこかに書いてある
774759:03/12/28 13:12
どこかにsortを入れて簡単にちょちょいとできないものでしょうか
$filename = "sort data.dat|";

にすれ。
年齢順なら "sort +1 data.dat|" な。
>>769
> 工事現場で汗まみれになって働いてる男たちのある種のかっこよさと似ていますね
似てね〜

> CGIのコードが糞ってのは驚きです
あぁ、こっちなら似てるかもね。

>>770
それもあるかもしれないけど、CGI の場合、
1. いろんな人がイイカゲンな (中途半端な) 知識で「CGI のつくりかた」みたいなのを書いていて、
2. 初心者がそれを鵜呑みにしちゃって、汚ない (Perl を理解せずに書いた) コードが氾濫、
3. そして、Perl を理解したつもりになって 1. に戻る
ってのもあると思う。
いや、もちろんちゃんと書かれたものや、綺麗なコードもありますよ (たぶん)。
非常に稀だけど。
777776:03/12/28 14:17
ゴメン

>>776
>> CGIのコードが糞ってのは驚きです
> あぁ、こっちなら似てるかもね。

「ある種のかっこよさ」 は CGI にもありません。当然。
>>775
年齢順なら -n も必要じゃないか?

>>774
ttp://www.kt.rim.or.jp/~kbk/perl5.doc/perlfaq4.html
>>776

諸悪の根源は
KENTとかレスキューとかか・・・
>>770の言うようにCGIはべた書きの方が速い。
真のPerlerは、そのべた書きのプログラムを
しこしこ手で書くのではなくて、べた書きのプログラムを
「生成する」プログラムを書く。2,3のCGIなら
手で書いた方が作業効率いいけど。
Perlのコードの綺麗さに関してはそれほど天井高くないよーな気が

>>779
レスキューはトップページ見るだけでコードがどんなか伺い知れますねw
>工事現場で汗まみれになって働いてる男たちのある種のかっこよさと似ていますね。
激しくワロタ(w
>>779
KENT ってのは知らなかったので今ちらっとコード見てみたんだけど、
ガクガクブルブルですた…
ひぃいいいいー

レスキューの方のコードはかなり昔に見たけど、おかげで最初から自分で書く決心がつきました (w
自動生成されたhtmlを手本にhtmlを手書きするようなもんだな
見よう見まねで書かれたHTMLを見て、それで勉強するようなものかも

経験的に
Perlを知ってるヤシのCGI>>>>>>>>>>>>>>CGIしかしらんヤシのウンコPerlコード

今はUnixでもWindowsでもPerlナシじゃ生きてけない体だがな
さいきんmod_perlマンセー
で、手本になるPerlのコードはどこに転がってんの?
>>786
CPANから、良さげなコードを探す

ハズレクジを引かないようにな
>>772

sub by_name {
    (split /\t/,$a)[0] cmp (split /\t/, $b)[0]
    }

sub by_age {
    (split /\t/,$a)[1] <=> (split /\t/, $b)[1]
}
こういうのをつくっておいて、名前でソートしたければ
foreach $line ( sort by_name @allbody){ ............

ただ毎回splitするのは効率が悪いので>>773さんが
教えてくれたシュワルツ変換してみる。
sub sort_by_name {
    map { $_->[0] }
    sort { $a->[1] cmp $b->[1] }
    map{ [$_, (split /\t/)[0] ] }
    $_[0];
}
でも、ブラウザに出力するのなら板違いじゃないか?
790788:03/12/28 21:15
あ、間違えてた。
sort_by_name()の最後の行がスカラーになってるけど、
配列(@_ や @$_[0] とか)にしないとだめですね。
791デフォルトの名無しさん:03/12/28 22:05
今月号のハッカージャパンにWin32::GUIを使った
貴重なPerlスクリプトのソースが載ってる。
PerlでPerl/TKよりカッコイイGUIプログラムを作りたい香具師は必見でしょ。
#Win32::GUIの動作サンプル

#モジュールの定義
use Win32::GUI;

#マスターとなる窓の定義 style はWin32API参照
my $Window = new Win32::GUI::Window(
-name => "Window",
-title => "登録するURLの名称をいれて下さい",
-style => WS_CAPTION | WS_SYSMENU,
-width => 600,
-height => 64,
);
$Window->Show();

#入力ボックスの定義
$Textfield2 = $Window->AddTextfield(
-name => "Textfield2",
-left => 5,
-top => 5,
-text => $meg,
-width => 580,
-height => 22,
);
#よく分からんが改行でボタンが押されるようになる設定
$Window->{-dialogui} = 1;

#隠しボタンの定義
$Button = $Window->AddButton(
-name => "Simple",
-left => 600,
-top => 5,
-text => "",
-tabstop => 1,
-ok => 1,
-style => hidden,
);

#フォーカスの固定化
$Textfield2->SetFocus();
Win32::GUI::Dialog();

#ここのボタンをクリックした時の処理を書く
sub Simple_Click
{
exit;
}

#ここに終了した時の処理を書く
sub Window_Terminate
{
exit;
}
ハッカージャパンのサンプルソースをそのまま転載してみました。
WindowsXP、ActivePerl5.8.0、Win32::GUI(Version: 0.0.558)
で動作確認済みです。
Schwartz変換よりGuttman-Rosler変換の方が速いと言われている。
my @allbody = (
"ギコ\t2\t大阪",
"モナ\t101\t東京",
"シィ\t31\tアメリカ",
);

#for (sort {$a cmp $b} map {sprintf"%-20s\t%s", (split /\t/)[0], $_ } @allbody) { #名前でソート、名前の最大長に注意
for (sort {$a cmp $b} map {sprintf"%03d\t%s", (split /\t/)[1], $_ } @allbody) {#年齢でソート
my ($check, $name, $nenrei, $jyusho) = split /\t/;
print "($name, $nenrei, $jyusho)\n";
}
よーし。パパ、シャチ泳ぎしちゃうぞー。

@sorted_by_name = sort {
($m{$a} ||= (split /\t/, $a)[0]) cmp
($m{$b} ||= (split /\t/, $b)[0])
} @allbody;
>>795 の「Guttman-Rosler変換」てのを知らなかったのでぐぐってみたら、
「Perl データマンジング」
http://www.pearsoned.co.jp/washo/prog/wa_pro67-j.shtml
って本がひっかかったんだけど、読んだことある人いる?
もしいたら評価を教えてもらえると嬉しい。
最近、各種キャリアの契約台数が拮抗して、EZwebに関する不具合が多くなりました
一部のEZweb(UP.Browser)では、対処したとしても新機種や固有の機種での不具合
があるようですが、それを解消するような関連するスレやサイトを教えてください。
>>798
EZwebはDNSのキャッシュ残しすぎてるから
mod_perl使ってるけどキャッシュの
調整が出来ないサイトそのままのような感じだね。
回避するには日時でもなんでもいいからURLに一つパラメータ作ればいい。
>>799
ありがとうございます、参考になりました。
最近、3キャリア対応のスクリプトを配布しているサイトが少なくなりましたが
どこかいいサイトないですかねー??
>>798-800
全然perlに関係ない。
プログラムの書きかたやアルゴリズムの質問してください。
list変数を扱う関数で、popは末尾から要素を取り除き、shiftは先頭から要素を取り除きますが、
任意の添え字の値を取り除き、それ以後の値を前に詰めるにはどうしたら良いでしょうか?
今書きながら思いついたのは以下の処理ですが、これは馬鹿でしょうか?(&全く動作確認してません)

$soeji = 3; # <- 任意の番号
$kazoeru = 0 # <- 数える用
@list_2 = grep {$soeji != $kazoeru++;} @list;

やはり全部ループ回すしかないのでしょうか?
なにか良い方法をご存知の方はご教授下さい。
>>797
持ってます
内容は題名どうり主にフィルタとしてのPerlの書き方中心
関連して多段リファレンスでメモリ上でのデータの保持の仕方とか
後半HTML、XMLのパースもあるけどあくまでモジュールの使用例を示す程度
ソートについては9ページだけ

全体的に難しいことは書いてないし、浅く広く的な構成だから立ち読みで済むなら立ち読みで済ませたい感じ
ラクダ本→(effective|クックブック)と進んだ人ならわざわざ買う必要ないかも
>>802
splice
@array=@array[(0..$#array)から$soejiを抜いた部分集合];
みたいなことってできないのかな。
806802:03/12/29 06:37
>>804
ありがとう。その関数初めて知ったよ。
ちょっと嬉しいw。

しかし値を一つ抹消させるにしてはおおげさな関数だなぁ。。
その関数、知らなくてベソ掻いてたのダーレ?
>>791-795
GUIを作りたいならThe GUI Loftつーperlでかかれたツールもある
Win32::API、Win32::GUIが必要
Visual * よろしくラベル貼ったりするやつみたい
ttp://www.bahnhof.se/~johanl/perl/Loft/
809797:03/12/29 09:40
>>803
ありがとう。すごく参考になりました。

ちなみに私は ラクダ本→実用Perlプログラミング と進みました。
(時期的には「実用」はラクダ本のかなり後だけど)

そういえば effective もクックブックも持ってないな。
我ながら変な本の選び方かも… (w
>>808
それ便利そうなんですよね。
でもそれ用のモジュールが必要なんでしたっけ?
>>810
配布してるアーカイブにインストール用のバッチファイルがあるからさくっとインスコできる
Win32::API、Win32::GUIはもともとこれらを使うコードを自動生成するようなツールだから当然必須
>>809
> ちなみに私は ラクダ本→実用Perlプログラミング と進みました。
なら、次はDamian ConwayのObject Oriented Perlなんぞはいかが?
邦訳もあるようだ。
ちなみに、「Perl データマンジング」は図書館に買わせて読んだ。
perlで色々なデータをどういうモジュールで取り扱うか悩む初心者には
よい本。
Schwartz変換よりGuttman-Rosler変換の方が速いのはよく考えてみれば
当たり前だな。
813デフォルトの名無しさん:03/12/29 22:36
「続・初めてのPerl
Perlオブジェクト、リファレンス、モジュール」
っての今日買ったYO!
良いぞ。これ。
リファレンスの基礎とか、オブジェクト指向とか、
CPANへのモジュール登録とか、脱初心者の痒いところに手が届いてる。
windows用のActivePerlでPerl/tkみたいなguiプログラミングできるんでしょうか?
>815
そのものがあるんですね。
まだ詳しくはわかってませんが
ありがとうございました。
817デフォルトの名無しさん:03/12/31 14:22
a.plでb.plとc.plをrequireしてて、
b.plでもc.plをrequireしてる場合、
c.plを2度呼び出していると言うことになるのでしょうか?
818クンクン(葬式):03/12/31 14:44
>>817
質問する前に自分で実験してみたらどうかしら。。。

a.pl ---
require "b.pl";
require "c.pl";
print "A\n";

b.pl ---
require "c.pl";
print "B\n";

c.pl ---
print "C\n";

$perl a.pl
C
B
A

$

結論から言うと、c.pl は1回だけ呼ばれたみたいよ。。。
これは version 5.8.0 の場合の実験結果だから4, 5, 5.6の場合は
保証できないわよ。。。

クククのクーソ。。。
819ぼるじょあ ◆yBEncckFOU :03/12/31 15:14
>>817
(・3・) エェー
requireは一度しか読み込みを行わない関数だYO!
perldocにも書かれてるから間違い無いYO!
そうだよなぁ。。。
毎回読み込ませるようにしたいときは、use lib と no lib かな?
>>820
perldoc -f requireのサンプルを見て
allways_requireを実装しするとか(遅
822何いってんだか(w:03/12/31 16:22
>>820
perldoc -f do

ラクダ本の関数の章読んだことねぇのか?
なぁるほ「ど」(悪寒)

>>822
> ラクダ本の関数の章読んだことねぇのか?
知人に貸与したところ知人もろとも消えましたから(哀)
やはり手元に置いておくべきだよなぁブツクサ
>>818
なるほど、そのようにして調べるべきでした。
ありがとうございます。
超初心者なのですが質問させてください
モナ:1歳:東京
ギコ:3歳:大阪
シィ:4歳:アメリカ
このデータが入ったファイルを開き
open(FILE, $filename);
@all = <FILE>;
というように@allに代入し、それを年齢順にソートするにはどのようにやるのでしょうか
ちなみに
@all = sort @all;では、名前順になってしまい、どうやってソートしていいのかわかりません
初心者名質問ですみませんがご教授よろしくおねがいします。
>>825
このスレ全部読んで出直してこい
sort { ((split /:/, $a)[1] =~ /^(\d+)/)[0] <=> ((split /:/, $b)[1] =~ /^(\d+)/)[0] } @all;
で、動かなかった。。。鬱。
>>827
動いたけど…?
>>827
sort のなかで split を呼び出すと非効率的よ。。。

@all = map {$_->[0]} sort { $a->[1] <=> $b->[1] } map { [ $_, (split /:/, $_) ] } @all;

眠くて実験する気力がないから匿名で投稿するわ。。。
クククのクーソ。。。
>827 >829 ありがとうございます。
でも、そのままコピペでやったのですがまったくソートされず
そのまま出力されてしまいました。。
>>830
年の始めくらい、ちっとは理解する努力しろよ。

>>829
$a->[1] <=> $b->[1]
は 1 → 2 じゃないと意図したように動かん罠。
>>830
KENTレベルにして欲しかったら、そう言ってね。
@data = map{ $_->[ 1 ] }
sort { $a->[ 0 ] <=> $b->[ 0 ] }
map { [ m/:(\d+)歳/ , $_ ] } @data;
use strict;
my @all = <DATA>;
my @sorted = map{substr($_, 3)}sort map{sprintf"%03d%s",m!:(\d+)歳!,$_} @all;
for (@sorted) {print}
__END__
モナ:1歳:東京
ギコ:3歳:大阪
シィ:4歳:アメリカ
なんか話題がループしてるなぁ(w
last;
このスレで質問するやつは学習能力ないね


って言われてもしかたないなw
>>837
このスレで回答する香具師も習能力ないね


サルのひとつ覚えのシュワルツ変換はヤメレ
839デフォルトの名無しさん:04/01/02 18:24
>>838
学習能力あるとどういう風にコード書くの?
>827>829
ありがとう!
そして最大のヒントをくださった831さん!
ありがとうございました!
ばっちりうごきましたです!
海外掲示板用オフラインリーダーを作るスレ
http://pc2.2ch.net/test/read.cgi/tech/1072883528/

海外でよく使われていうる掲示板スクリプト
専用のオフラインリーダー作って下さい。

必要な条件はID、PASSを管理できること、
OpenJaneみたいな三面型の見た目。
簡単にローカライズできるように言語ファイルを採用
初心者ですが、何度も質問させていただき何度も偉大な回答いただきてありがとうございます。
これが最後の質問なのですが、お願いしますです。
モナ:1歳:東京

こういったデータが20件あって、それを5件ずつ表示させ、
なおかつ次のページへのリンクを作りたいのです(掲示板でよくあるやつです)
それを先ほど教えていただいた年齢順でソートさせてから5件ずつ表示させるには
どのようにやるのでしょうか
ご教授よろしくおねがいします。
@array=qw(k u s o s u r e);
@goken=@array[0-4];#←最大のヒント!
print "@goken";

これでkusosまで表示されるぞ!
あとは君の頭次第だ!
844デフォルトの名無しさん:04/01/03 09:26
>842
何番まで表示したかとう言う数字をリンクの中に入れればOK。

後はWEBプログラミング板に行ってください。

845デフォルトの名無しさん:04/01/03 15:27
馬鹿ばっか
>>842
>>1読め!
板違いだっていうことがわかるだろ?
あんたのやろうとしている事は、Webプログラミングなの。
ここはム板。
よーし、お年玉でクックブック買っちゃうぞ〜



ナンツッテ
俺は今日、「初めてのPerl」 と 「続・初めてのPerl」 を買ってきたよ。
良質の睡眠薬だわ、これ。
849842:04/01/05 02:25
>>843 >>844
ありがとうございます。
違うやり方でしたが苦戦した結果なんとかうまくできました。
850クンクン(葬式):04/01/05 10:09
>>848
クックブックは、1ページから全部の例題をやってみたら究極のPerlハッカーになれるわよ。。。
わたしのオフィスにも一冊おいてあるし、トイレでウ○チするときもお風呂にはいるときも持っていくし。

クククのクーソ。。。
>>850
久美子のキャラに似てる?
>>850
クックブックはそこまで深くないだろ
お前本当に読んでるのか?
ミンキーモモ?
854デフォルトの名無しさん:04/01/05 18:28
perlをACTIVEPERLでPCで動かしているのだけど、
while(1){

で無限ループにさせて、これをキー入力で停止&再開させたいのだけどどうすればイイのエロイ人!
856デフォルトの名無しさん:04/01/05 23:01
>>855
_| ̄|○ わからない・・・
857デフォルトの名無しさん:04/01/05 23:12
>>856
ctrl+s、ctrl+q
書籍ではクックブックってやつが最高レベルなんでしょうか?
859デフォルトの名無しさん:04/01/06 01:13
>>857
さーんくすー
■が点滅してるから止まってないと思ったけど、実際は止まってたよ
ありがおおおおおおおおおおお
でもわかりにくいから一時停止とか表示できないものかね
>>859
そーんな時は愛しのPerlちゃんに、アイから始まる
シグナルをおくっちゃえ!
きっと振り向いてくれるよ!がんばってね。
861デフォルトの名無しさん:04/01/06 05:34
>>860
insert?
862デフォルトの名無しさん:04/01/06 07:59
>>858
実用Perlプログラミングなども高度なことが書いてありますよ?
別名、黒豹本。
>>795
いまさらだけど、これって GR 変換?
GR 変換って pack を使って sort の比較部分 (>>795 だと {$a cmp $b}) を
書かなくてすむようにする、と理解したんだけど、漏れの理解が間違ってる?
>>863
あんたのいう通り。意味、動作は結果的に同じだが{$a cmp $b}がない
デフォルトのsortの方が速い。mapはO(N)、sort(quick sort)はO(N*log N)。
sortの中で余計なことをしなければN(sortする要素の数)が大きいときには
速くなる。
http://www.sysarch.com/perl/sort_paper.htmlによれば{$a cmp $b}が
あるなしで倍程度の時間の差がある。
質問なのですが、BSDのkqueueをperlで使いたくてコードを書こうと思ったのですが
XSかInline Cかで悩んでいます。
やはりXSの方が早いのでしょうか?(それとももうすでにモジュールがあったり?)
実験されたことのある方、よろしくお願いいたします。
>>865
関係ないですけど、今後XSは廃止になってInline系で統一されるんだとか。
嘘だったらゴメン。
>>865
syscallっていう手もある。って優香、これが一番手っ取りはやいと
思うけどな。どれを使うにしろ引数の構造体のpack unpackが(ry
やっぱり重要なサブルーチンなんかをInlineを使って作ると
激速になるんでしょうか?
もしかして2chのCGIが一部Cで書かれているというのはInline::Cを使ってる?
>>868
read.cgi が C
しかもべたべたのBasicが如きC
CGIはべったべたに書くのが一番速い。
関数なんて呼び出す必要すらない。
ただのバッチ処理だから。
>>869
やっぱCで書いてるんだ。ちなみにread.cgiをうまいことサブルーチン化して
Perl+Inline::Cにして作り直したら、同じようなパフォーマンスでるものですかね?
872デフォルトの名無しさん:04/01/07 20:53
ActivePerlでcommandがめん出るじゃないですか
あれでメッセージの表示の時に

waite 10秒
     ↑ここをカウントダウンできますか?
sleepさせてるときに残りの時間を出したいのだけど、そのまま出すとログが流れで逆にみにくいので。
>>872
エスケープシーケンス
>>872
for (0..10) {
  print "$_\r";
  sleep 1;
}
>>872
どうでもいいがスペルが違(ry
876デフォルトの名無しさん:04/01/07 21:39
うわ痛て
877デフォルトの名無しさん:04/01/07 21:51
>>873
>>874
>>875

ありがとうございます。
while (1) {
$waittime=100;
for (0..10) {
print $waittime;
sleep 1;
print "\r";
}
}
ところが>>874さんので表示されなかったので、↑のようにしてみたのですが、
これでもなにも表示されないです。ググって見たのですが、
秒を表示して、1秒舞ってそれを\rで消して、っていうしょりなのでしょうか?
>>877
$waitsec = 10;
$progress=1;
for(1..$waitsec){
  local $|=1;
  sleep 1;
  printf "[%-${waitsec}s] %3d%", "#" x $progress, $progress/$waitsec*100;
  if ($progress < $waitsec){
    print "\r";
  } else {
    print "わいてー!\n";
  }
  $progress++;
}
879デフォルトの名無しさん:04/01/07 22:58
>>878
ありがとう〜
メーターみたいなのまで付けてくれたのですね。
ありがとうございます。
こういうのほしかったのです。
880865:04/01/08 00:27
>>866
情報サンクスです。

>>867
たしかInlineやXSだとpackしなかった気がします。型変換はしていた気がしますが。。。

とりあえず、Inlineで書いてみます。
ありがとうございました。
一時期Perl6の話題で持ちきりだったけど今どうなってんだろうねぇ。
>>881
新しいPerlを欲しがってる人って実はいないんじゃないの?
DP-Perl 新バージョンキター http://search.cpan.org/~danpeder/DP-Perl-0.20/

作者は何考えてるんだ…
>>883
何かおかしいか?
名前からして「作者が良く使う関数をまとめたモジュールを公開してみた」って感じだが、
そんなモジュールよくあるだろ。
むしろ
・多少は使える関数群
・コーディング作法は良い
という点から、評価はできるぞ
>>882
今のperlで不満ないよなw。

今後のバージョンアップ予定もプラグマとか、スレッドとか、
もっとちゃんとexeにコンパイル出来るとか、そーゆー細部系しかなかった記憶な予感。
Perl6にどうしてもなじめない人の為にInline::Perl5とか出る予感。
ここ見て初めてInline::Cなんてものがあるのを知った。
楽ちんすぎて涙がうるうるしてしまった。
>>887
Inline系モジュールっていくらPerlが何でもありでも
ここまでやる?って感じだよね。
誰かWin32::API::Callback使ったことある人いる?
使ってみたんだが、アレ 一回コールバック返すと満足してコールバック消滅しないか?
まだ実験段階だからしょうがないのかなぁ・・・
>>878でメーターと%を2行に分けて表示したいんですがどうなおせばいいですか?
Inline::Rubyはありますか?
おお、使えそう
>>892
ホントにあるのか…
Inline祭りの会場はこちらですか?
896sage:04/01/10 02:54
質問です。データを
A,B,C,D,E
F,G,H,I,J
K,L,M,N,O
...

のような形で持っているとして、各行の3番目の部分(C,H,M)を別な文字列で
置換したいと思います。
普通にコードを書けば処理できるんですが、Perlのパワフルさを活用したい
です。どのようなコードを書けばいいのでしょうか?

なお、A、B、C...の部分には文字列が入り、1文字とは限りません。
よろしくおねがいします。
久しぶりなもので、sageミスです。
すみません。
>>896
置換するものは固定?なら

perl -F, -nae "$F[2] = '...'; print join ',', @F" < 1.txt > 2.txt

って感じかな?
899898:04/01/10 03:09
あ、↑はWindowsのシェルね。
Windowsのシェルってエクスプローラの事だろ?
違った?
コマンドラインって言えばよかろーもん

>>896
別な文字ってのはどう与えられるのかワカランが
open 略
while(<DATA>){
my @item=split/,/;
$item[2]=$subhash{$item[2]};#例えば変換テーブルを用意してるとして

}

ダサいかなぁ?
>>889
ハッカージャパン2003年5月号を購入しなさい。
903デフォルトの名無しさん:04/01/10 23:10
こんばんわ。ちょっと質問させて下さい。
モジュールの勉強してるのですが、以下のように書いたモジュールを呼ぶと
Line.pm did not return a true value at ./main line 3.
BEGIN failed--compilation aborted at ./main line 3.
と表示されてうまくいきません。use で読み込んだ時点で何に失敗してるのでしょうか?

#------------------- main の関数
#!/usr/bin/perl
use Line;

my($i,$j,$k,$r);
$string = <STDIN>;
chomp($string);
($i,$j,$k) = split(/\s+/, $string);
$r = Line::new($i,$j,$k);

print(" $r->{name}\n");

#------------------- モジュール Line.pm
package Line;

sub new {
my($name,$start,$end)=@_;

my $r_line = {
"name" => $name,
"start" => $start,
"end" => $end
};
return $r_line;
}
>>903
Line.pm did not return a true value
日本語に訳してご覧。




Line.pmの最後に1;
>>904
迅速なアドバイスありがとうございます。

>Line.pm did not return a true value
>日本語に訳してご覧。

Line.pmは真を返しませんでした。

あぁ辱かしい。以後気をつけます。
どうもありがとうございました。
Perl はいったいどこに向かって進んでるんでしょうか
907デフォルトの名無しさん:04/01/11 00:27
open OUTFILE, "> 〜〜〜";
これって前の内容を消す出力用ですよね?
for文を使って10回くらい処理を繰り返したいのですが,
その繰り返す度に内容を書き換えるやり方ってどうやるんでしょうか?
お前さんの言ってることが良く分からんが
open
10回書く
close
と書け

(open 書く close) x10 じゃ最後の物しか書かれない
もしくは open FILE ">>hoge"; を調べれ
>>908
>(open 書く close) x10 じゃ最後の物しか書かれない
これでした!最後の物だけ欲しかったんです.
ありがとうございました!
(゜д゜)ポカーン
最後のものだけ書けばいいのに
912デフォルトの名無しさん:04/01/11 17:32
キューにジョブを5000個ため、3つのスレッドでそれを処理することを試みます。
しかしこれを実行したところ
% ./ithread.pl
T1:0
T1:1
........................
T1:4998
T1:4999
T1 joined .
のように途中で処理が止まってしまいまつ。どうしてなんでしょうか?
アフォにでもわかるようにおしえてくださいな。
913912:04/01/11 17:33
///////////ソースです//////////
my $q = new Thread::Queue;
&main();
sub main {
  my $cnt = 0;
  while ($cnt != 5000){
    $q->enqueue($cnt);
    ++$cnt;
  }
  my $thread1 = threads->create(\&threadFunc, "T1");
  my $thread2 = threads->create(\&threadFunc, "T2");
  my $thread3 = threads->create(\&threadFunc, "T3");
  $thread1->join;
  print "T1 joined .\n";
  $thread2->join;
  print "T2 joined .\n";
  $thread3->join;
  print "T3 joined .\n";
}
sub threadFunc {
  my $num;
  my ($tName) = @_;
  while (defined($num= $q->dequeue_nb)) {
    print "$tName:$num\n";
  }
}
914デフォルトの名無しさん:04/01/11 17:33
URLの拡張子がjpgやgifなど、特定の拡張子だけ許可する(判別する)
正規表現を教えて下さい。
「http」からはじまる正規表現でお願いします。
古いバージョンの Perl はどこで手に入りますか?
ftp://ftp.funet.fi/pub/CPAN/src/unsupported/4.036/perl-4.036.tar.gz より
もっと古いのは公開されてないんでしょうか……。
>>915
simtelnetにコンパイル済のperl4.019があるけど
それ以外はシラネ
>>917
うわ、こんなものあるのか。




早速コンパイルしてみようと思ったのだが Configure が通らね〜。
う〜ん、そのうちちゃんと原因追及してみるか…
申し訳ありません唐突な質問をお許しください。
perlのモジュールのリファレンスって公開されているようなものではないのでしょうか?
IO::socketについて調べようと思ったら何処にもなかったです・・

本買うしかないんでしょうか?
perldoc IO::Socket
>>914
$URL =~ /(jpg|gif)$/i;

とおもったら、
>「http」からはじまる正規表現でお願いします。
こんな制約があんのか。マンドクセ('A`)
/^http:.*(jpg|gif)$/i
とすりゃいいだけでは…。そんなにマンドクサいか?
シリアルポートへの接続をしたいのですが、
BaudRate、Parity、Data(bit)、Stop(bit)など
接続条件の設定はどのように行ったらいいのでしょうか?
>>924
バカの質問の典型例だな(w
926デフォルトの名無しさん:04/01/12 11:30
>>924
WinならWin32::SerialPort、UNIXならDevice::SerialPort
などのモジュールがあるよ。

ttp://members.aol.com/Bbirthisel/alpha.html
ttp://members.aol.com/Bbirthisel/tpj_serialport.d/index.html
950以降だったらボブサップにケンカ売る!

>>923にちょと補足。
多分 /^http:.*?(jpg|gif)$/i が良さげ。
'*' の後の '?' がないと,後でもう一回頭をかかえる事になるかと存じ候。
>>927
へー。
? がある場合とない場合で何が変わりますか?
>>928
最長マッチと最短マッチ。
>>929
>>923 は ^...$ となってるけど、それでも影響するの?
931924:04/01/12 14:48
>>926
アリガトウ
モジュールがありましたか
932922:04/01/12 15:14
>>923
^http:.* を書くのがマンドクサかったんです(嘘

>>927
ん?>>923で桶だと思うよ?
933929:04/01/12 15:18
>>930
質問もとのコードは見ないでレスしただけだYO
934922:04/01/12 15:39
>>933
あれか。HTML文字列中のURLを検索とかいうパターンの場合か。
それは確かに?つけたほうがよさそう。^$消して。
>>934
でも、URL の途中に jpg とか gif とか入ってたら×じゃね?
岐阜県関係とか。
>>934
URL検索に使おうとしたって、
<a href="http://example.jp/index.html"><img src="example.jpg" alt="example"/></a>
なんてのにもマッチしちゃうよ。
おとなしくHTML::LinkExtor使えって言っても検索対象がHTMLとは言ってないわな
938デフォルトの名無しさん:04/01/12 19:44
>>927
フォームからの入力が正しいか調べるために
その正規表現でも大丈夫なんですか?


/^https?:\/\/[\w|\:\@\-]+\.[\w|\:\!\#\%\=\&\-\|\@\~\+\.\?\/]+$/

これはバナーURLが正しく入力されたか調べる正規表現らしいですけど
これを使って特定の拡張子を調べる正規表現に(書き換え)できますか?
>>938
拡張子だけを調べるなら、そんなマンドセー事しなくてもよかろうに
>>938
/^https?:\/\/[\w|\:\@\-]+\.[\w|\:\!\#\%\=\&\-\|\@\~\+\.\?\/]+$/ && /\.jpg$/
941デフォルトの名無しさん:04/01/12 20:01
>>940
&&を使わずに一つにまとめられないですか?
>>941
/^https?:\/\/[\w|\:\@\-]+\.[\w|\:\!\#\%\=\&\-\|\@\~\+\.\?\/]+\.jpg$/
なめとんのか?
>>942
やさしくしすぎじゃろ。

914=938=941 は以後放置の方向で
>>941
フォームで渡ってくるURLの拡張子だけを調べるなら、そんなマンドクセー事しなくてもよかろうに

つーか正規表現勉強しろや。ここはperlすれじゃ。
>>943
おまえやないとあかんねん
アプリレベルでどうゆう動作を希望・想定してるか言わないんじゃまともなコードは答えれないぞ
単純なコードだって時と場合によっちゃ冗長だったり不十分だったりするもんだ
947デフォルトの名無しさん:04/01/13 10:50
>912-913

use threads;use Thread::Queue;
$q = new Thread::Queue; $q->enqueue($_) for 1..100;
@t = map{ threads->create(\&threadFunc,"T$_") } 0..2;
for(0..2){ $t[$_]->join; print "T$_ joined.\n"; }
sub threadFunc { my($name,$num)=shift; while($num=$q->dequeue_nb){print "$name:$num\n";threads->yield();}}

うちのWindowsでActivePerl 5.8.2 build 808 で普通に動いてました。

こまめに他スレッドに切り替わってほしいなら
sub threadFunc { my($name,$num)=shift; while($num=$q->dequeue_nb){print "$name:$num\n";threads->yield();}}
でなければ切り替わる回数は減ります。

5.8.2は多国語対応が実用的になっておもろい。
みすった。 要するにyieldの有無で順序はかわるよ、と。
949デフォルトの名無しさん:04/01/13 11:44
こんにちは。ちょっと質問させて下さい。
perl で、50程度の小さい数値の加算を連続で続けていくと、
合計値が約2,000,000,000程度くらいになると、それ以降はマイナスの値が出力されてしまいます。
何かいい解決方法はないのでしょうか?

#-------------------
# 1行ずつデータを受け取り、項目毎に値を合計する
| = 1 ;
while(<>){
@l = split(/\t/) ;
$list{$l[0]} += $l[1] ; ←加算してるところ
for(sort keys %list){
printf "%s\t%d\n", $_,$list{$_} ;
}
print "\n" ;
}
950ヽ(´ー`)ノ:04/01/13 12:09
>>949
use bigint しる。もしくは Math::BigInt とか。


use Aspect::Trace;
use XML::LibXML::SAX;
するとエラーが出て、どうやら一緒に使えない模様。
相性の悪い CPAN モジュールってあるよね。こんな時、お前らどうしますか?
bigint
>>950
Marcel GrAnauer, Matt Sergeant, Christian Glahnにメール汁
953デフォルトの名無しさん:04/01/13 19:10
変数に2バイト文字を含むかどうかってどうやったら判別できますか?
954953:04/01/13 19:15
補足。
シングルクォーテーションマークに囲まれた部分に日本語を含むかどうか調べたいのですが、
$hoge1 = "abc'def'ghi";
$hoge2 = "abc'あいう'ghi";

で、$hoge2の場合だけ抜き出すにはどうすればいいんでしょうか?
>>953
漢字コードに依存、かつ正確にやろうとするとかなり面倒。
簡便な方法でいいのなら、sjis, euc なら /[\200-\377]/ にマッチするかどうかを、
jis なら /\033/ にマッチするかどうか調べれば「ほぼ」判定できる。
>>954
$hoge2 を euc にしてから、
$hoge =~ tr/[\x00-\x7F]//d;
してみるとか。
Perl5.8からは
m/[あ-ん]/
みたいなことができるのではないのですか?(よー知らんけど)
958デフォルトの名無しさん:04/01/14 02:29
文章中の英単語の出現数をカウントするスクリプト中で、次の
ような正規表現を使いました。
/\b[a-z]+\b/g
ほとんどうまくいっているのですが、何故かテキストファイル中にない文字列、
たとえばfiなどなぞの単語をカウントしてしまいます。
959958:04/01/14 02:29
なにがおかしいのでしょう?
Perlのコードって何で暗号みたいなの?
>>957
ちうわけでおまえら perl use encoding でぐぐっとけ。
一般人にはこれで十分。
require 'jcode.pl';

ってもう時代遅れなの?
初心者な質問させてください。
BBSを作ったのですが、ブラウザの更新ボタンを押すと
前回の書き込みが付け加えられて更新されてしまいます。
それをなくすにはどうしたらいいのでしょうか。
ご教授よろしくお願いします。
>>964
WebPG板逝け
>>963
WebPG板逝け
967ヽ(´ー`)ノ:04/01/14 12:36
>>952
やっぱりそれしかないか(´・ω・`)

ちょっと粘ってみて、自分で直せなかったらメールしてみるよ。ありがとう。
>>962
プロはもっと違うやり方でやってるとでも言いたいのか?
プロはPHPを使う
プロだってさ
>>969
(´,_ゝ`)プッ
PHP = プロ は PHP
ププッ
PHP = Pretty Hoot Privacy
Pro Home Page
Pu Home Page
EclipseのRegExp プラグインみたいに、
正規表現のチェックができるツールはないでしょうか?

この正規表現メモリはどこにマッチするかーなんてときに、
いちいちスクリプトを実行しなくても
デバッグすることができるんで、便利だと思うんですが。。

978912:04/01/15 00:25
>>947
私の作成したスクリプトや947さんが作成したスクリプトを
シングルプロセッサ上で動作させると正常に終了するのですが、
マルチプロセッサ上で動作させるとやはり正常に終了しません。
つまり、
........................
T1:4998
T1:4999
T1 joined .
のように処理がとまってしまいます。
どなたか助け出してください。お願いします。
>>977
ActiveStateのVisual Perl。
使い心地を試してレポートしてほすぃ〜

http://www.activestate.com/Products/Visual_Perl/
>>次スレ立てる人へ

6箱目がHTML化されたみたいなので追加よろ。

Perlについての質問箱 6箱目
http://pc2.2ch.net/tech/kako/1060/10606/1060689008.html
981クンクン(葬式):04/01/15 16:27
次スレ立ててみたわよ。。。
Perlについての質問箱 8箱目
http://pc2.2ch.net/test/read.cgi/tech/1074151549/l50
クククのクーソ。。。

>>980
了解
>>979
Visual Perlは495ドルもするのか、
重いけどEclipseで我慢すます。
   ∩_∩  ∧_∧
  (。・ヮ・)(・ヮ・。)
   ゚し-J゚  ゚し-J゚
print("うめるぞよ〜\n");
print("うめるぞよ〜\n");
print("うめるぞよ〜\n");
print("うめるぞよ〜\n");
print("うめるぞよ〜\n");
990デフォルトの名無しさん:04/01/15 20:56
PHP最強!
最強!
最弱
Rubyの指輪

曇りガラスの向こうは風の街
994デフォルトの名無しさん:04/01/15 22:38
PHP最高!
PHPってプログラミングに挫折した人の最後の駆け込み寺でしょ?
print("うめるぞよ〜\n");
print("うめるぞよ〜\n");
というか、ある言語を頭ごなしに毀誉褒貶するやつはシメジ
print("うめるぞよ〜\n");
言語に貴賎なし。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。