1 :
デフォルトの名無しさん :
2005/09/18(日) 02:23:25 "The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板
http://pc8.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
http://www.perl.org/get.html ● 2005/03/17現在の最新版: 5.8.7
● 2005/03/17現在の開発版: 5.9.2
リンク集は
>>2-3 過去スレは
>>4-5
2 :
デフォルトの名無しさん :2005/09/18(日) 02:25:15
3 :
デフォルトの名無しさん :2005/09/18(日) 02:26:44
4 :
デフォルトの名無しさん :2005/09/18(日) 02:29:01
5 :
デフォルトの名無しさん :2005/09/18(日) 02:29:59
6 :
デフォルトの名無しさん :2005/09/18(日) 02:38:09
初心者的な質問でスマソ。 $a=10; $b=3; $c=$a/$b; これで答えを出すと少数が大量につくのだが、小数点以下の数字の数を指定するにはどうしたらいいんだ? $c=3.33; とか。intと何かを使う?
>1乙 スレタイ間違ってるけどな >6 printf '%.2f', 10/3; 変数に入れるならsprintfで。
9 :
デフォルトの名無しさん :2005/09/18(日) 03:09:00
10 :
1 :2005/09/18(日) 03:11:33
はっ! 数字消して18入れ直したらしい。 前スレのテンプレをメモ帳にコピーして編集してたから・・・
template-toolkit + mod_perl環境にてサードパーティ製のpluginを 使用すると「plugin error - [plugin名]: plugin not found」 が発生してしまいます。Commaプラグインを例にすると 初回プロセス作成時に[% USE Comma %]しているテンプレートを読み込んだ場合は そのプロセスはその後もCommaプラグインをロードした状態を保持し続けるのですが 初回プロセス作成時に[% USE Comma %]を書いていないテンプレートを読み込んだ場合に 上記エラーが発生するようです。 エラー発生後、再度そのプロセスにアクセスするとCommaプラグインがロードされている状態になり エラーは発生しなくなるのですが他のプラグインを読むと何故か前に読んだプラグインがアンロードされます。 どなたか同様の症状に遭遇された方はいませんでしょうか。 -環境- fedora1 template-toolkit-2.14 httpd-2.0.51 mod_perl-1.99 perl-5.8.3 Apache::Reload使用
根本的な質問ですいません。CGI:sessionの使い方が(導入方法も?)まったくわからないのですが、 何か良いページや本をご存知の方いますか? どうやって使うんですか?と聞いて簡単に答えれるものでもないですよね?
14 :
12 :2005/09/18(日) 11:31:05
サーバによってCGI::sessionがインストールされていないこいうことは多いでしょうか?
たとえば、あるプログラムを作りそれをいろいろ使いまわす時に、サーバによってCGI::sessionが
無かったら困るのですが、どうなのでしょうか?
また、入っていなかった場合はcgiと一緒にCGI/sessionフォルダもアップをし、自分の領域からCGI::sessionを
読み込むとかは許されるのでしょうか?
>>13 ありがとうございます。がんばって読んでみます。英語苦手ですが…
フヒヒヒヒ!すみません!
19 :
1 :2005/09/18(日) 15:22:50
>>14 /libディレクトリを作り、そこにCGI::sessionをインストール
利用するスクリプトで
use lib '/lib';
use CGI::session;
>>19 TOPに入れるのか。。。
djb並みだよなぁ♪
22 :
21 :2005/09/18(日) 16:08:48
あ、既出だったか。失敬。
23 :
11 :2005/09/19(月) 00:11:54
>>16 TTのキャッシュでしょうか?もしそうでしたら使用しています。
デバッグの過程でキャッシュを使用しないで検証もしてみたのですが
同様の症状が発生しました。
ちなみにCommaとTruncateJpプラグインを使用して実験すると
CommaがロードされてるとTruncateJpがエラー
TruncateJpがロードされてるとCommaがエラー
という感じです。
発生状況がやや一定ではないので四苦八苦してます
>>23 ううむ。再現できないとなんとも。
確実に解決する方法としてはstartup.plでTTのプラグインをロードするってのがあるんだけど。
そのほうが効率もいいし。それじゃ駄目?
25 :
11 :2005/09/19(月) 02:01:12
>>23 さん
それで問題ないのですが
mod_perl、perl/CGIどちらでも動くように組んでいるので
動的にロードしてくれる方が美しいかなと思いまして。
今日もハマってみて何か分かったら報告致します。
>>25 あ、いや、
テンプレート内でUSEしておいて、
かつstartup.plに書いておけばいいっしょ。
27 :
11 :2005/09/19(月) 13:16:58
あ、勘違いしてました。 今までスクリプト中でuse Template::Plugin::Comma; ってして逃げてたので勝手に読み違えていましたorz
28 :
デフォルトの名無しさん :2005/09/20(火) 00:24:08
データベースとperlでデータをCSVに書き出すプログラムを書いています。 SQLで取得したデータをHTMLでテーブルにして表示しているのですが、 よくフリーメールであるような各行にチェックボックスがあって、 それにチェックを入れたデータだけCSVに書き出すといったものを作りたいのですが、 ロジック的にはどういったものになるのでしょうか??チェックボックスでCGIに渡せるパラメータは ○○=on とかってなりますよね。どうやって、データを識別したらよいでしょうか???
>>28 CGIの作り方なら、WebProg板かWeb制作板で聞いたほうがいいんじゃない?
Perlと無関係とは言わないけど、ブラウザからCGIのプログラムに送りつけられたものを
どう受け取るかというのは、CGI全般の基礎知識だしPerl以外に知っておくべきことが
先にありそうな気がする。
30 :
デフォルトの名無しさん :2005/09/20(火) 11:56:37
>>30 書き込み時刻から想像するけど、
>>28 は、ここで言われて、WebProg板に
移動したんじゃないの? いちおう初心者スレなんで、あんまりカリカリ
しないでのんびりやりましょうや。
質問させてください
perlでHTMLをテキストにパースする場合
HTML::FormatTextあたりって使わないのでしょうか?
手製でタグ削除より
1.lynxでダンプさせる
2.またはperlのテキストフォーマッタとして
HTML::FormatTextあたりが出ていました
自分も似た感じになってるのですが
ttp://homepage3.nifty.com/h_sasaki/contents/ap6xx.html それともテキストフォーマッタ相当の機能として統合されたのかな?
PPMのアーカイブ自体
ビルド800〜にはHTML::Format〜がみあたらない
...ので600〜から落として試したら
PPMでインストールできません。
ローカルのパッケージからインストールするには
なにか特別な設定がいるのでしょうか?
ActivePerl v5.8.6 built 811ですがreadmeどうり
cdでppm install html-format.ppd
するとsearchでネットワークを探しにいき
ないといいます。800〜のパッケージにはないのですが
ローカルから入れられないのでしょうか?
lynxでダンプさせていますがperlのテキストフォーマッタ
を使えないかなと思ったのですが
パッケージがはいらないので代わりに試せないorz...
カルシウムパ〜ラ〜
>>32 HTML::FormatText に
> Formatting of HTML tables and forms is not implemented.
とあるが、それでもいいならイイんじゃね。
> 手製でタグ削除より
単純にタグを削除したいだけなら、HTML::Strip とかはどうよ。
print 出力を変数内へ出力変更することはできないでしょうか? ・Sample my $res=""; select( $res ); #できないけど、こんなイメージ print "↑\n"; print "攻撃力2000\n"; select(STDOUT); print "(^_^) " x 3 ,"\n"; print $res; −出力結果− (^_^) (^_^) (^_^) ↑ 攻撃力2000
36 :
デフォルトの名無しさん :2005/09/20(火) 17:47:47
無難に$value = sprintf();でいい気もするけど。 少なくとも、その構文では変数に入れる意味が全くない。
>>35 少し高度になるけど、
パイプを使えばできるよ。
でも、特に理由がないなら sprintf か、
push あたりでいいのでは。
push の例:
my @res;
push @res, "↑\n";
push @res, "攻撃力2000\n";
print "(^_^) " x 3 ,"\n";
print @res;
−出力結果−
(^_^) (^_^) (^_^)
↑
攻撃力2000
>>36-37 回答有り難う御座います。
Sampleが良くなかったですね。 目的は、同じ構文で出力先を
アクティブに変更したいと考えています。 sampleをもうちょいマジメに(汗)書き直すと、
-Sample-
my $res="";
if( $mode=0 ){ #標準出力
select(STDOUT);
}elsif( $mode=1 ){ # File出力
open(FILE,">> access.log");
select(FILE);
}elsif( $mode=2 ){ # 変数出力
select( $res ); #できないけど、こんなイメージ
}
&logline;
select(STDOUT); # 出力先を元に戻す
if( $mode=1 ){ close(FILE); # File出力
}elsif( $mode=2 ){ $res をゴニョゴニョ文字列処理して転用 }
exit;
sub logline{
print "xx年xx月xx日 xx時xx分アクセス";
}
39 :
32 :2005/09/20(火) 19:22:34
>>34 ありがd
一発で入りました。
色々試してみます。
40 :
デフォルトの名無しさん :2005/09/20(火) 19:26:30
IO::String
>>37 さんの様に、全部配列に入れて好きに出力でもいいと思ってて、
C言語なら素直にその方法取りますが、Perlは結構いろいろ
できるみたいなので、こんなのもできるかなー と思いまして。
原始的な命令を繰り返すCに馴れてると、selectでprintの振る舞いが
変わるってのも結構な驚きで、perlって高級言語だなぁ と実感。
>>41 >
>>37 さんの様に、全部配列に入れて好きに出力でもいいと思ってて、
> C言語なら素直にその方法取りますが、Perlは結構いろいろ
> できるみたいなので、こんなのもできるかなー と思いまして。
技に溺れると、あとで後悔するよ。
C++などでは class hito{ public: void atama(){ ・・・} } void hanasu(hito taro){ ・・・ } main(){ hito sakaki; hanasu(sakaki); } このように関数間でインスタンスを渡すことができますが、perlではどのように すればよいのでしょうか? $test=hito->new(); hanasu($test); これでは失敗しました…。
44 :
12 :2005/09/20(火) 20:35:46
CGI::Sessionの件ですが、 CGI/Session.pmファイルも一緒にアップをして、 use CGI::session で読み込んでくれました。 なんか、サーバ側で普通はインストール(?)をしなくてはい気がするのですが、できてしまいました。何でですかねf(^^; とにかく、いろいろとありがとうございました。
>>42 ストリームと同じ振る舞いをする文字列オブジェクトって
大抵の言語にあるじゃん。
>>35 の難点といえば暗黙のグローバルな状態に依存してて
コードの局所性が低いことくらい。
>>43 普通にできます。
失敗するコードを出さないとそのくらいしか言えない。
47 :
12 :2005/09/21(水) 11:05:58
>>46 できました!!受け取り先をローカル変数にしていなかったために
できなかったみたいでした。
48 :
デフォルトの名無しさん :2005/09/21(水) 18:22:44
リストの各要素を2つの文字列を交互に挟みながら凍結したいんですけど、どうすればいいでしょうか? 例えば(1,2,3,4,5,6)というリストがあったら、 1+2-3+4-5+6という感じに凍結したいのですが。
49 :
デフォルトの名無しさん :2005/09/21(水) 18:38:04
凍結じゃなくて連結です。すみません。
50 :
デフォルトの名無しさん :2005/09/21(水) 18:47:56
my @foo = (1..6); print join("-", map { shift(@foo)."+".shift(@foo) } (0..$#foo/2)); 巨大配列だと遅い。奇数の時場合分けする必要がある。 もっと簡単にできそうだけど思いつかん。
my @foo = (1..60); $Out_Strings = join '', map { sprintf qq|%s%s|, $_ == 0 ? '' : $foo[$_] % 2 ? '+' : '-' , $foo[$_] } (0 .. $#foo); print $Out_Strings; 長ったらしい、、、
私ならこんな感じで普通に書くかな。面白くないけど。 use strict; sub njoin($\@) { my($delims, $list) = @_; my $r; my $i = 0; foreach (@$list) { $r .= $_ . $delims->[$i]; $i = ($i + 1) % @$delims; } chop $r; return $r; } my @l = (1, 2, 3, 4, 5, 6); print njoin(['+', '-'], @l), "\n";
53 :
デフォルトの名無しさん :2005/09/21(水) 19:49:07
ん?オレならこうするが @foo = (1..60); $bar = join '~', @foo; $bar =~ s/~([^~]*)~/+$1-/g; $bar =~ s/~/+/; print $bar;
俺ならこうかな。 sub ejoin(&@) { my ($sep, $s, @n) = @_; $s .= $sep->() . $_ foreach (@n); return $s || ''; } my $i = 0; print ejoin(sub { print $i, "\n"; (++$i % 2) ? '+' : '-' }, 1 .. 6);
my @foo = (1..60); my $str; my @sign = qw( + - ); $str .= $_ . $sign[ $_ % @sign ] foreach @foo; print $str; は?可読性と拡張性で勝負。
56 :
55 :2005/09/21(水) 20:21:27
>>54 ケコーンとか言おうとしたら10分も遅れてるじゃん俺
$str .= $_.('-', '+')[$_%2] for 1..100; と書こうとしたらかぶってる上にchop入らねー
58 :
55 :2005/09/21(水) 20:37:00
>>51 とりあえず無駄多すぎ
my @foo = (1..60);
print shift @foo;
print map { sprintf "%s%d", $_ % 2 ? '+' : '-' , $_ } @foo;
59 :
55 :2005/09/21(水) 20:40:16
print map { $_ % 2 ? "+$_" : "-$_" } @foo; ラス行もこれでいいと思われ。 2個の引数にsprintfは贅沢。
短さで勝負。 my @foo = (1..60); ($_ = join "+",@foo) =~ s/(\d)\+(\d+)\+/$1+$2-/g; print $_;
あ、これで十分か。 ($_ = join "+",@foo) =~ s/\+(\d+)\+/+$1-/g; print $_;
62 :
55 :2005/09/21(水) 21:07:04
>>60-61 >>53 を読んでその程度に縮めることは出来るとは思ったが、
join後にg置換って、場合によっては重くならないか?
#俺達TIMTOWDIの真っ最中:-)
ところでこの問題、与えられるリストは1..2Nだと仮定して いいのかね?
駄目に決まってんじゃん(^^)
どうだろう。perlの内部関数だけで完結する分速そうだけど、 配列がデカくなると巨大文字列がメモリをバカ喰いして遅くなるかもね。
任意の文字列のリストで通用するという条件にすると、 置換使った奴とか、その要素自体が偶数か奇数かで+-を 切り替えてる奴は使えなくなるよな。 たとえば @foo = qw(1 a -5 +5 xyz) みたいな。
>>62 TMTOWTDI ですよ。
@hoge = (1 .. 60);
$flag = !$flag and $_ .= '+' or $_ .= '-' for @hoge;
print substr(join('', @hoge), 0, -1);
69 :
68 :2005/09/21(水) 21:47:00
真ん中こっちの方がイイかも $_ .= $flag = !$flag ? '+' : '-' for @hoge;
70 :
68 :2005/09/21(水) 21:47:55
カッコつけ忘れた
いかにもPerlらしい、究極のリソース浪費術 @foo = (1..60); @sep = qw[+ -]; $bar = join '$sep[$count++%@sep]', @foo; eval qq[print "$bar"];
$str .= $_.('-', '+')[$_%2] for 1..100; chop $str; これでよくないか
配列に0追加で 2Nを満たせばいんでないの
realloc そんなに気になるかなぁ。 配列でかくて、セパレータ長ければ分かるけど。 1..60で、reallocは10回も無いのでは。
76 :
デフォルトの名無しさん :2005/09/22(木) 00:44:19
すいません、どなたか教えてください。 以下の感じでソケットでwebページ情報とってきてるんですけど、 もし、取得に失敗してタイムアウトした際に もう一度とってくるのってどうやって書けばいいのでしょうか? どうぞお願いしまする $client_socket = new IO::Socket::INET ( PeerAddr => $host, PeerPort => 'http', Proto => 'tcp', TimeOut => '1' ); unless ($client_socket){ print "Socket Error:$!\n"; }
77 :
デフォルトの名無しさん :2005/09/22(木) 01:19:23
「取得に失敗してタイムアウトした際に」の意味がわからん
>>76 do {
...
} while ($@ =~ m/Timeout/i);
WEBページで日本語とマッチングさせて情報取りたいんですけど、 Perlってプログラム中にそのまんま漢字とか平仮名とか入れて平気でつか? 多分無理だと思うんでつけど、そういう場合ってどうすればいいでつか?
どういたつまつて
83 :
デフォルトの名無しさん :2005/09/22(木) 13:57:48
$list=[\%data1,\%data2,...] としてデータ構造を作成した場合に $listが指している要素数を知るにはどうしたらいいんでしょうか
scalar @{$list}; じゃだめ?
85 :
83 :2005/09/22(木) 14:33:18
または $#$list + 1
プオーン
Perlのオブジェクトって、クラスチェンジできるよね。 これ使って何か面白いことできないかなぁ。前々から思ってるんだけど。 package Foo; sub new { bless, {}, Foo; } sub foo { print "foo\n"; } pacakge Bar; sub bar { print "bar\n"; } package main; my $obj = new Foo(); # Fooインスタンス作成 $obj->foo(); # --> "foo" と表示 bless $obj, Bar; # Barにクラスチェンジ $obj->bar(); # --> "bar" と表示 $obj->foo(); # --> エラー : Can't locate object method "foo"...
>>88 Smalltalkをインストールして
become: の senders を検索しる。
>>88 おもしろいこと=newとdeleteの整合性がとれなくなってアボン
91 :
デフォルトの名無しさん :2005/09/23(金) 14:54:55
FTPにて、指定フォルダ以下のファイルorフォルダを全てダウンロードするってどうやったらできます? Net::FTPでできるの? 教えてください。
92 :
デフォルトの名無しさん :2005/09/23(金) 20:29:23
画像掲示板でこんなのやりたいのです お願いします やりたいこと ・アップロードされた画像ファイルを縮小保存したい 条件とか ・画像は汚くてもかまいません ・jpg限定でかまいません ・鯖管じゃないのでimagemagicとかGDとかはナシで
何がよろしくお願いしますなのか分からない
仲間へのメールを間違えてここに書いちゃったんだよ きっと
95 :
88 :2005/09/23(金) 21:45:51
>>89 なるほどSmalltalkですか。いかにもありそう。
後で調べて見ます。
何でstdio使う関数とstdio使わない関数を一緒に使っちゃ駄目なの?
技術評論社のCGI&Perlって本で勉強を始めたのですが、 $in_file = "./smple_data.txt"; open( IN_FILE, "$in_file" ); $record = <IN_FILE>; print $record; close( IN_FILE ); exit; このプログラムの3行目がファイルから1行目を読み込んで $$recordに格納し、オープンしたファイルから1レコードを読み込む。 とされているのですが、何故1レコード目だけが読み込まれるのか理解できません。 データが3レコードあり、2レコード目を出力する事は出来ないのでしょうか? 全くの初心者なのでやさしく教えてください。
101 :
デフォルトの名無しさん :2005/09/24(土) 11:30:47
>>100 よくわかりません。
現在80ページ付近を勉強してるのですが、先に進めない訳じゃないんです。
学習が進めばこの項目は出てくると思うのですが、現状でその考え方を知っておきたいんです。
>>99 Perl の勉強を始めようかと思って、たまたまこのスレを覗いた Perl 経験ゼロの
俺が想像で教えてみる。役に立たなかったら、すみません。
たぶん、<IN_FILE> という部分で、ファイルの中身を"一行毎に"読み込むんでしょう。
なんで <IN_FILE> で一行読めるのか?は知りませんが....
まあ、とにかくそういう構文なハズ。
二行目以降が出力されないのは、繰り返し処理を使ってないからでしょうね。
単純に $record = <IN_FILE>; で一行読み込んできて、その結果を表示している
だけだから、一行目しか出ないと。
ちょっと検索してみた結果、以下の記述で全ての行を出力できそうな気がします。
%
>>99 のプログラムの3〜4行目を以下の記述で置き換える。
while (<IN_FILE>) {
print $_;
}
上記は「一行ごとにファイルを読み込んで、行が続く限り、繰り返し出力せよ」
というプログラムです。(たぶん合っていると思う)
ちなみに、「$_」 はデフォルト変数とかいうものらしい。
自動的に <IN_FILE> の結果が代入されるんでしょう。おそらく、ですが。
>>102 > なんで <IN_FILE> で一行読めるのか?は知りませんが....
行入力演算子。
> 二行目以降が出力されないのは、繰り返し処理を使ってないからでしょうね
>>100
>>102 ありがとう
全て出力するなら@recordでできるのですが、
>>102 さんが言っている、
>なんで <IN_FILE> で一行読めるのか?の所が納得できないのです。
何かしらオプションをつける事により、2行目だけを読み込んで出力も可能なのか?
それとも1行目だけしか不可能で、2行目を出力するには別のプログラムが必要なのか?
で引っ掛かってるんですよねぇ。
105 :
デフォルトの名無しさん :2005/09/24(土) 13:22:46
>>103 行入力演算子でぐぐったら解決しました!ありがとう!
俺はスカラーコンテキストやらリストコンテキストなるものを知らなかったなぁ。 $ は変数に付けるお約束の記号、ぐらいに思ってた...恥ずかしいな。 ま、千里の道も一歩から。たまたまこのスレ覗いて良かった。
>>99 解決されたようですが、細かいことだけ書いときます。Perlには、変な本も多いので。
> open( IN_FILE, "$in_file" );
この例の場合、$in_file をダブルクォートで囲う事には、まったく意味がありません。
囲わなくてOKです(「変数展開」で調べてください)。
できれば、ファイルが開けなかった際のエラー処理を入れましょう。
open(IN_FILE, $in_file) or die "Can't open $file. : $!\n";
open(IN_FILE, $in_file) or die qq(Can't open "$file". : $!\n);
とか、お好きなように。
> exit;
明示的に終了するケースでなければ、exit() は書かない人が多いかも。
>>107 ありがとうございます。
エラーはif文で処理していました。
open(IN_FILE, $in_file) or die "Can't open $file. : $!\n";
と
open(IN_FILE, $in_file) or die qq(Can't open "$file". : $!\n);
を試した所旨く動作しないのですが・・
>>108 あ、ごめん。$file じゃなくて $in_file でした。
エラーが起きないと追加した部分は動作しません。
試しに、$in_file を存在しないファイル名に変えてみてください。
おお!できました。 この方が分かり易いですね。 ありがとう、勉強になりました。
@line=<IN_FILE> とかしてファイルを全て読み込んでから処理するのではなく、 指定行だけ配列に読み込むことって出来ませんでしょうか? メモリをあまり使いたくないのですが・・・。
>>112 1行ずつ読んで希望の行が出てくるまで読み飛ばせば
メモリは食わないよ。
行が固定長であるとか、各行の先頭位置が別に保存してある
とかならいきなり希望の行の頭にseekして読めるけど。
一応、 $i=0; while(<IN_FILE>){ if ( $i >= 20000 && $i < 30000 ){ $line[$i - 20000] = $_; } elsif ( $i >= 30000 ){ last; } else { $i++: } } とか考えてみたんですが、これだと何万行もあるファイルの場合 結構かかりますよねぇ・・・
>>114 「行」、つまり可変長レコードは、どこからどこまでが一つのレコード
なのか実際に読み込まないと分からない。だから何万行あろうが、
頭から一行ずつ数えていくしかない。
my $target = 5; # 希望の行
my $line;
do { $line = <IN_FILE> } until $. == $target;
>>114 $. (ドット)を使え。man perlvar。
どっちにしろファイルでは頭から読んで逐一調べないと無理。改行の数を
数えないといけないから。
どうしても速く処理したいんなら、DB に突っ込むとかキャッシュを持つとか、
工夫するしかないんでないかな。
>>113 >>115 >>116 初心者の質問に答えて下さりありがとうございます。
「メモリ消費を抑えつつ高速化」ってのは難しいですね。
行ごとののバイト数は決まってないのでseekはできませんが、
$.かぁ・・・利用してみます。
用途に分けてファイルを分けるのが一番かな? 行ごとに処理とかいっても、改行文字ごとに区切ってるだけだし。
行頭位置を別ファイルにインデックスとして記録するか、だな
120 :
デフォルトの名無しさん :2005/09/25(日) 06:05:54
>>112 配一行一行の長さが不確定なら、プログラムにとっては、どう転んでも順に読んでいく
しかないから、特に実行時間の節約になるわけでもないし・・・
あ、これは普通のプレーンなテキストファイルの場合ね。
もし、今後も、同じファイルについて何度も「特定の行だけ狙ってを読む」予定があるなら、
>>120 さんのレスにあるように、手元のファイルをまずDF_Fileモジュールを使って、
移し変えたら?
http://perldoc.jp/docs/modules/DB_File-1.805/DB_File.pod > DB_RECNO
> DB_RECNOは固定長と可変長の両方のフラットなテキスト・ファイルを、 DB_HASHや
> DB_BTREEと同じキー/値の組のインターフェースを使って扱える ようにします。
> この場合、キーはレコード(行)番号になります。
っていうか、一歩下がって、何をしたいのかを書いてみた方が いいような。
>>117 >「メモリ消費を抑えつつ高速化」ってのは難しいですね。
キミのレベルでは杞憂だよ。
本当にメモリ量や速度が問題になるプログラムを
書けるようになってから心配すればいい。
空白を埋め込んで各行のサイズを揃えるってのはどうよ。
>>125 フィールド長を固定にする訳ね。
それはそれでありだけど、フィールド長が制限される罠。
容量も余計に必要だし。
質問があるのだが・・。チェックボックスでデータを受け取って HTMLの確認画面に反映させるプログラムを作っているのだが 行き詰った・・・。 例えば、course1,course2,course3とあってcourse1とcourse3がチェックされたら course2のところが空白で反映される。 ex.)HTML出力画面 course1 course3 こんな感じになるんだよな。 この空白を詰めて course1 course3 みたいな風に出力する方法ないもんかね?
129 :
128 :2005/09/26(月) 17:37:46
ちなみにソースはこんな感じです。汚くてごめん・・。 if($FORM{'course1'} ne "on"){ print "<TR><TH ALIGN=\"right\" VALIGN=\"top\">希望コース:</TH><TD>\n"; print "$HTML{'course1'}\n"; print "<INPUT TYPE=\"hidden\" NAME=\"course1\" VALUE=\"$FORM{'course1'}\">\n"; print "</TD></TR>\n"; } if($FORM{'course2'} ne "on"){ print "<TR><TH ALIGN=\"right\" VALIGN=\"top\"></TH><TD>\n"; print "$HTML{'course2'}\n"; print "<br>"; print "<INPUT TYPE=\"hidden\" NAME=\"course2\" VALUE=\"$FORM{'course2'}\">\n"; print "</TD></TR>\n"; }
131 :
128 :2005/09/26(月) 17:49:11
>>130 ごめん、板違いなんだ・・・。知らんかった。じゃ、聞きなおしてくる。
しつもーん Perl/TkモジュールでGUI組めるって知ったんだけども、 それって配布したらexeだけで動くの? それとも、exeの方でもPerl+Perl/Tkが必要なのかな。
>>132 そのexeをどうやって作るかによる。
Perlと関連モジュールをパックしてしまえばexeのみで動くし、
または単なるローダならソース及びモジュール群も必要になるだろう
GUI == exeと考えているなら大間違い
>>133 ありがと。
例えば簡単なメモ帳みたいなもの作ったとして、
それを作る時(ビルド?)にPerlとモジュールを一緒くたにすれば
そのまま配布しても向こうで動くってことかな。
でも、そうすると結構なファイルサイズになりそうw
135 :
デフォルトの名無しさん :2005/09/26(月) 20:47:20
だれか知っていたらご教授ください。。 下記の様にすると、InternalServerError になるんです。 print "Content-type: text/html\n\n "; $month = 08; print $month; 変数($month)が 08 と 09 の場合だけです。 07.06,05...は、ちゃんと 7,6,5と 表示されるのですが。 知っている方ぜひお教えください。m(_ _)m
板違いで失礼しました。 m(_ _)m
UPXで最大圧縮すると確か200kbくらいになったよ<PAR ただし動かない。
>>139 UPXって使ってなさそうなデータを取り除く機能無かったっけ
それが一緒にパックしたモジュールなんかを取り払っちゃってるとか
>>140 取り除く?そんなことしたら、upx -d で元に戻らんじゃないか?
先生大変です PARでexe化したものをupx -> upx -dしたら元に戻りませんでした
当初
>>138 のリンク先を参考にしてたんだけど、
いつだったかFileHandle使わないものに書き換えたらexeサイズが100kb以上減った気がする
あとPARで作ったexeの拡張子zipにしたら普通に解凍できる
それでいろいろ調べられそうだけど、面倒だからやってない
『先頭が空白以外なら表示』 という簡単なことすらできないのはなぜ。。。 $aaa = "DSAFSA"; if ( $aaa =~ /^[A-Z]/ ) { print } これで表示されない。。。 $aaa = "DSAFSA"; if ( $aaa =~ /^\S/ ) { print } これでもだめ。。。 どうなってるの・゜・(ノд`)・゜・
ミスったそらなんも出ない。。。 もう人間の性質だけど質問すると事故解決してします。。。
>>145 printの段階でデフォルト変数に何も入って無いから
$_ = "DSAFSA";
if ( /^[A-Z]/ ) { print }
若しくは
$aaa = "DSAFSA";
if ( $aaa =~ /^[A-Z]/ ) { print $aaa }
print $aaa if $aaa =~ /^[^\s]/;
>>145 > 『先頭が空白以外なら表示』
> という簡単なことすらできないのはなぜ。。。
お前の知能が足りないから。
【依頼】 plファイルの置いてあるディレクトリ以下の全てのテキストファイルを検索して、 divタグの属性"class"の属性値を全て列挙するプログラムを作っていただけませんか? できれば重複無しの方がいいのですが、重複してもいいです。 無理なようなら、スクリプトの教材を紹介していただきたいです。
151 :
デフォルトの名無しさん :2005/09/27(火) 20:38:26 0
ちょっと質問です。 Net::Telnet::Ciscoを使ってA(PC)→B(ルータ)へ ログインした際にTerminal Typeをvt100に設定したいの ですが何か特別な設定が必要なのでしょうか? ご存じの方いらっしゃいましたら よろしくお願い致します。
教えていただきたいのですが、 型グロブを使って引数を扱おうとおもい 単純なものを書いたのですが 下のエラーがでてしまいどうしてよいかこまっています。 引数には単純なハッシュを入れる予定です。 どなたかご指導して頂けませんでしょうか。 Variable "%ABC" is not imported at Test.pm line 8. Global symbol "%ABC" requires explicit package name at Test.pm line 8. #!/usr/bin/perl use strict; sub test { local(*ABC) = @_; print keys(%ABC); } 1;
>>150 find . -type f | xargs perl -ne 'if(/<div.*?class=(.*?)[ >]/){print $1,"\n"}' | sort | uniq
厳密に"perlで"とは指定されてないからシェルスクリプトで作ってやったぜ。
perlは使ってやってるから、
お前にやる気があるなら純Perlスクリプトの参考にはなるだろ。
154 :
GiantLeaves ◆6fN.Sojv5w :2005/09/27(火) 21:21:04 0
[
>>150 ]に関して、Perlでどうやってファイルを読み込むのか?
同じディレクトリにあるファイルを読み込むのならできる。
ディレクトリの再帰検索もできるのかな?
>>152 らくだ本によれば、strict 'vars' は、「myで宣言されている」
「完全修飾されている」「輸入されている」のいずれにも該当しない
ような変数にアクセスすると、コンパイル時エラーを発生させる、
とある。%ABCは、その何れにも該当しない。
型グロブを使うのを止めて、リファレンスを使うのが最適であると
思われる。
157 :
GiantLeaves ◆6fN.Sojv5w :2005/09/27(火) 23:04:04
talk:
>>153 [
>>150 ]をbashなどに通して実行するのもまだ成功していないが、それより、余計な引用符が付いてきたりしないか?
>>152 sub test {
local(*ABC) = @_;
our %ABC; # 追加
print keys(%ABC);
}
とかじゃ駄目だった?
159 :
153 :2005/09/27(火) 23:33:02
御指摘の通りだが'と"がこんがらがって エスケープがひどいことになるのでめどくなって投げた。 実用上はそんなに問題ねえだろ、という手抜き精神が重要ってことだ。
ここにも我流記号を使うあの気違いが来た
sub testに間違いなくハッシュが渡されるなら
sub test {
>>152 my %ABC = @_;
print keys(%ABC);
}
で、良いと思うのだが。
localで型グロブなんて何年前のソース読んで勉強してるんだ?
>perlcc -o test.exe test.pl active perlに標準で付いてるperlccなのですが、 ライブラリが足りないと怒られます Note (probably harmless): No library found for oldnames.lib Note (probably harmless): No library found for kernel32.lib Note (probably harmless): No library found for user32.lib Note (probably harmless): No library found for gdi32.lib Note (probably harmless): No library found for winspool.lib Note (probably harmless): No library found for comdlg32.lib Note (probably harmless): No library found for advapi32.lib Note (probably harmless): No library found for shell32.lib Note (probably harmless): No library found for ole32.lib Note (probably harmless): No library found for oleaut32.lib Note (probably harmless): No library found for netapi32.lib Note (probably harmless): No library found for uuid.lib Note (probably harmless): No library found for ws2_32.lib Note (probably harmless): No library found for mpr.lib Note (probably harmless): No library found for winmm.lib Note (probably harmless): No library found for version.lib Note (probably harmless): No library found for odbc32.lib Note (probably harmless): No library found for odbccp32.lib Note (probably harmless): No library found for msvcrt.lib これらのライブラリを入手したいのですがどうすればいいでしょうか?
>>162 perlcc はどうせ使い物にならないから
諦めなされ。
>>161 それだとhashをリストにばらしてからまた再度作るようになって
要素数が多いとオーバーヘッドが馬鹿にならんよ。お前もどういう
ソース読んで勉強してるんだ(w
>>151 $telnet->cmd('terminal-type vt100');
とかいう話ではなくて?
168 :
デフォルトの名無しさん :2005/09/28(水) 10:59:47
>>167 $telnet = new Net::Telnet::Cisco(Host => "xxx.xxx.xxx.xxx")
もしくは
$telnet->login(loginName => "user")
の時点で設定したいのです。
一般的なtelnetコマンドはセッション開始時にヘッダ部に
Terminal Typeが入ってるみたいなのですが…
日付連番を考えているんですが、timeで取っていらない部分を削った後、番号を 付けたいのですが 2005/09/28 → 20050928 → 2005092801(後付けで番号を入れる) 何かうまい書き方ないですかね。 ご教授お願い致します。
>>168 Net::Telnet の TELOPT_TTYPE で出来ない?
今手元に好き勝手できる Cisco ルータがないから試せないけど。
>>169 やりたいことが上手く伝わってこない。
my $date = '2005/09/28';
$date =~ s,/,,g;
my $result = $date . sprintf('%02d', $num);
こういう話じゃなさそうだが…。
172 :
デフォルトの名無しさん :2005/09/28(水) 12:08:31
>>170 レスありがとうございます。
Net::Telnetのドキュメントなど色々みたのですが
いまいちTELOPT_TTYPE(@EXPORT_OK)の設定方法が
よくわからなくて…
こいつにvt100設定すればいいのかなぁ?
>170>171 ありがとうございます。 素直に連結しようかと思います。
>>169 素直に
$seq = 1; ←連番
@t = localtime(time);
$result = sprintf("%04d%02d%02d%02d", $t[5] + 1900, $t[4] + 1, $t[3], $seq);
じゃダメなの?
176 :
デフォルトの名無しさん :2005/09/28(水) 13:32:49
>>175 無事Terminal Typeの設定ができました。
レス下さったみなさん、ありがとうございましたm(_ _)m
177 :
デフォルトの名無しさん :2005/09/28(水) 13:57:56
文中に複数ある「;」を全て「\;」に変換するスクリプトを書きたいのですが どうしたらいいでしょうか? うまい置換式が思い浮かばなくて・・・
s/;/\\;/g;
179 :
デフォルトの名無しさん :2005/09/28(水) 14:35:15
>うまい置換式が思い浮かばなくて・ こういう嘘つきにはレスすんなよ
181 :
デフォルトの名無しさん :2005/09/28(水) 15:39:53
早く書いてくり。
185 :
183 :2005/09/28(水) 17:24:47
>>184 は、俺じゃないよ
酷い・。・゚(ノД`)゚・。・ウワーン
>>183 #!/usr/bin/env perl
print "Content-Type: application/octet-stream\r\n\r\n" . `cat hogehoge.pdf`;
で駄目なん?
187 :
GiantLeaves ◆6fN.Sojv5w :2005/09/28(水) 19:02:31
[
>>150 ]に関して。
div要素のclass属性の属性値を書き出すのだったら、
DOM (Document Object Model) の方がやりやすい。
JavaScriptで
document.getElementsByTagName("div");
をやって、全アイテムについて、該当する属性の属性値を書き出せばいいのだから。
ディレクトリの再帰検索を誰か解説してください。
use strict; use warnings; use HTML::Parser; use File::Find; my @class = (); my $parser = HTML::Parser->new( 'api_version' => 3, 'report_tags' => [qw/div/], 'start_h' => [ sub { push(@class, $_[0]->{'class'}) if $_[0]->{'class'} }, 'attr' ], ); my @file = (); find({ 'wanted' => sub { -f && m/\.html$/ && push(@file, $_) }, 'no_chdir' => 1 }, @ARGV); foreach my $file_name (@file) { $parser->parse_file($file_name); } { my %class_history = (); foreach my $class (grep { ! $class_history{$_}++ } @class) { print $class, "\n"; } }
find_class.pl とかで保存して、 $ ./find_class.pl foo/ bar/baz/ とかで。
190 :
デフォルトの名無しさん :2005/09/29(木) 01:11:41
ActivePerlがインストールされていないパソコン(出先でインストールできない等)でperlを実行するにはどうしたらいいのでしょうか? USBメモリに入れて持ち運ぶ方法はないですか?
鯖にうp。
193 :
GiantLeaves ◆6fN.Sojv5w :2005/09/29(木) 11:43:48
talk:
>>192 素直にActivePerlなどのインタプリタをインストールした方がいいような気もする。他人に渡すのならまた話は別だが。
194 :
GiantLeaves ◆6fN.Sojv5w :2005/09/29(木) 11:45:24
195 :
GiantLeaves ◆6fN.Sojv5w :2005/09/29(木) 11:46:08
talk:
>>190 Windowsに入っているのは、JScriptとVBScriptを動かせるエンジンなので注意。
誇大妄想は誇大妄想らしく仰々しいsignatureつけとけ
>>193 talk talk 五月蝿いし見にくいYO。
文字列の一括置換を行いたいのですが、 特定のタグに囲まれたものだけを対象にかけたいと考えています。 ただ、 ・対象となる文字列の点数 ・置換前、置換後の文字は任意 という条件があるため、下のような状況の場合、 どうやって正規表現を組むか、悩んでいます。 <tuv> A A A </tuv> ↓AをAAに一括処理 <tuv> AA AA AA </tuv> tuvタグで挟まれた文字列を変数に抜き出し ↓ 変数に対して、A→AAの一括置換 ↓ 元の文字列と差し替え という方法がベストなのでしょうか?
ぱっと見て何してるかわかりやすく書くとすれば s/>([^><]+)</&hoge($1)/eg; sub hoge { my $set = shift; $set =~ s/A/AA/g; return $set; } こんな感じ?
201 :
デフォルトの名無しさん :2005/09/29(木) 15:52:30
テキストエディタに学校でも使ってる秀丸エディタを使おうと思ったんですが有料ソフトでした みなさんお金払って使ってるんでしょうか、それともメモ帳を?
>>201 世の中には秀丸とメモ帳しか無いとでも思っているのか?
>>200 sageろヴォケ
スレ違いなので学校で先生に同じ質問しろ。
204 :
200 :2005/09/29(木) 16:12:00
>>202 いろいろ探してみます
>>203 これでいいですか?掲示板のしくみよく分からなくてすみません
>>204 スレ違い。どこの学校だ? 情報リテラシに読み書きも怪しそうだが…
206 :
199 :2005/09/29(木) 16:34:50
俺様ルールのsage厨に構うなよ。 スレ違いよりタチ悪いよ。
学生なら秀丸は無料だったと記憶しているが。
>>208 ソースは? ひょっとして "フリー制度へのお申し込み" の事を
単に無料と呼ぶのなら、誤解の元で迷惑にしかならないが。
結論:秀丸使うやつは金払え
で、いつになったらPerlの話題にもどるのかね?
知らないなら中途半端な話題振るなよ
214 :
デフォルトの名無しさん :2005/09/30(金) 08:30:54
すいません。自分のパソコンにパールを入れたいのですが WindowsMeでもつかえるフリーのパールってありますか??
>>216 そりゃ、サポートサービスやオマケツールに対してのライセンスだろ?
Perl本体そのものはフリーで、個人であろうと企業であろうと無償で使うのは
問題ないから、心配すんな
>>214
>>217 こういう話のときは入手するブツを単位に考えるのが自然じゃね?
>>190 何のモジュールもuseしてなければ、perl.exeとperl5.8.x.dll?さえ
添付してれば動く。
それにバッチファイル付けて知り合いにスクリプトあげたことある。
定期的に、ID/PWを求められるページにログインする事はperlで出来ますかっ?!
何のパスワードだよ
IDとPWを入力を求められる、アクセス制限のかかったページにログイン、という意味でした。
perlとどう関係あるのか小一時間休憩してみたい。。。
>>155 >>158 >>161 助言ありがとうございます。
our
のおかげでハッシュの値は表示できました。
しかし、$ABC{'xxxx'} を表示できません....
226 :
デフォルトの名無しさん :2005/10/01(土) 11:50:29
227 :
デフォルトの名無しさん :2005/10/01(土) 14:08:02
できそうでなかなかできません。どなたか助けてください。 >abc.3 gakjgajgeiajeiagaga >sasa sagageijgeigjeijaiejeiajwjojowjowewgeweeeee >ushi.1 safakljgeijgleijelaijealijeliajelammmziej .... のようなファイルを、abc.3という名前のファイルに >abc.3 gakjgajgeiajeiagaga sasaという名前のファイルに >sasa sagageijgeigjeijaiejeiajwjojowjowewgewe のように、分けてそれぞれ名前をつけるにはどう書けばよいのでしょうか?
open(F,$ARGV[0]); while(<F>){ open(FH,">$1") if(m/^>(.+)/); print FH $_; }
>>227 何がしたくてどういう法則で名前付けたいの?
>>229 マルチファスタファイルの分解でしょうな、きっと。
231 :
227 :2005/10/01(土) 23:37:18
ありがとうございました。 プログラムにするとこんな短くていいのですね。 本当に助かりました。
かなり初心者ですが教えて下さい m(_ _)m 今タイピングゲームを作ってます。 普通に提示した文字を入力してOKかNGかを判断できるとこまではできたのですが、 一定時間以内に入力されなかった時にNGとなるようにしたい。 forkを使ってるんですが、どうもうまく行きませんorz forkは間違ってますか? 他にいい予約語調べたのですがわかません。 入力待ち状態(時間制限)と入力した文字の判断(OK/NG)の同時進行がうまく行かないorz すいませんが教えて頂けませんかm(_ _)m
お前にはムリ
>>225 どうやって引数渡してる?
test( \%foo );
とかしてるんだよね?
こっちじゃ問題なく動くよ。
Windows上のActivePerlではalarmとかうまく働かないな。 よくわからんけど。
ActivePerlのインストーラ起動したら 「指定されたサービスは既に存在します。」 とか言われて起動すらできないんですが・・・ OSはWindows98SEです。 解決方法を教えてください。
>>235 Perlのバージョン依存らしい。
5.8以降だとalarmも実装されているそうな。
238 :
デフォルトの名無しさん :2005/10/03(月) 12:00:07
初心者です。 perlで一つのプログラムを複数(大量)のファイルに対してかけるときは どういったやり方があるのでしょうか? どなたか教えてください。
なんだって─────!!!!
241 :
デフォルトの名無しさん :2005/10/03(月) 13:45:06
>>238 複数のファイルを処理するように書くといいです。
242 :
238 :2005/10/03(月) 14:05:16
シェルスクリプトがよくわかっていないのかもしれませんが、 例えば、すべて頭にSTEPという文字列がつくファイルを一度に大量に 処理するときには,シェルでperl プログラム STEP*という使い方は できないようですが、どうすればよいのでしょうか? プログラムは$ARGV[0]でファイルを読み込んでいます。
UNIXのシェルスクリプトなら for i in STEP*; do perl プログラム $i done でできると思う
>>242 > シェルスクリプトがよくわかっていないのかもしれませんが
うん、その通りだ。
STEP* というのは、Perlに渡された段階で複数のファイル名に展開されてるんだよ。
だから、Perl側で($ARGVをshiftせずに)$ARGV[0] しか見てないのなら、
最初の1つしか処理できないのは当然。
>>242 perlを起動すると、配列 @ARGV に、引数の一覧が入っている。
で、$ARGV[0]は配列@ARGVの先頭の要素な。
だから、
今のプログラムの処理のメインループを以下の構造で囲めば、
望み通りのことができると思うぞ。
while(@ARGV){
...
shift(@ARGV);
}
いい加減ラクダ本卒業してPerldocだけで理解できるようになりたい。 仕事場までラクダ本持っていくのめんどくさい。
>>246 まずラクダ本を持っていくのをやめるところからはじめよ。
1つ前のラクダ本を持ってるけど、最新のは2巻になって 百科事典みたいに分厚くなったので、買い替えをためらってる…。
何が増えたの?
俺は赤ラクダ本もってるけど、 本が壊れる(背の部分が割れてページが抜けてくる)まで読んだ。 青ラクダがなかなか日本で出なかったので、perldocとCPANモジュール読みまくり。 黒豹は英語で読んだ。 で、青ラクダ出たときには、読むべきところが少なくて(赤ラクダとそう大して変わらん)、 そのままになってる。perldocで十分だな。個人的には。
251 :
236 :2005/10/03(月) 20:58:08
うん、まあ、無視されるだろうとは思ってたよ。 前は普通にインストールできたんだけどね。
252 :
デフォルトの名無しさん :2005/10/03(月) 21:02:40
検索したいパターンが行の中のランダムな位置にある場合、ある検索したい パターンにマッチしていたら表示するというのはどうやるのでしょうか? 位置が決まっていれば、/\w+\s(\w+)/などのように、正規表現を使ってできるのですが、 この場合は何を使えばよいのでしょうか?
253 :
238 :2005/10/03(月) 21:05:52
ちょいと英語で言ってくれんか
255 :
デフォルトの名無しさん :2005/10/03(月) 21:15:38
質問です 条件分岐であっちこっちにgotoするような処理が必要なpgを書いてるんですが、gotoはあまり無暗に 使うべきではないというような記述をちらほら見かけます で、なるべく機能をサブルーチン化して呼び出す事で実現しているんですが、 エラー処理などでサブルーチン内の何でもないような所に飛ぶ必要が出てきました (例えば単に関数を呼び出すだけの所や、if文の頭など) こういった場合はgotoを使うのも止む無しといったところなんでしょうか? それとも飛ぶ必要があるところは全て関数化するとか、無理やりwhile(1){} とか if文をwhileで置き換えてループ化してnext、last等で書くほうがスマートなんでしょうか、、、?
gotoは「まったく使わない」でもやっていけると思う
257 :
デフォルトの名無しさん :2005/10/03(月) 21:17:54
32進に変換するルーチン教えてけれ
>>255 うむ、gotoは存在しない。
いいな? gotoは存在しないぞ。
ま た goto厨 か
260 :
255 :2005/10/03(月) 21:28:51
即レスありがとうございます なんか触れちゃいけない話題だったみたいですね それでは無しの方向でいってみます
261 :
デフォルトの名無しさん :2005/10/03(月) 21:29:57
>>252 > パターンにマッチしていたら表示するというのはどうやるのでしょうか?
なにを表示するの?
>>252 > この場合は何を使えばよいのでしょうか?
正規表現
264 :
デフォルトの名無しさん :2005/10/04(火) 03:23:55
>>257 バグ有りだが。
sub num32en {
local($before,$after,$num,@num32) = @_;
@num32 = ( 0..9, A..V );
while($before > 9){
$num = $before;
$before = int($num / 32);
$after = $num32[$num%32] . $after;
}
$after = $before . $after if $before != 0;
return $after;
}
265 :
GiantLeaves ◆6fN.Sojv5w :2005/10/04(火) 06:43:39
talk:
>>188-189 私のActivePerl環境でもできた。しかし、どおりで私には作れなかったわけだ。
>>265 その talk: っての、ウザいよ。
大昔からコンピュータやってますよ〜、って自慢したいの?
267 :
GiantLeaves ◆6fN.Sojv5w :2005/10/04(火) 08:03:45
>>266 > 大昔からコンピュータやってますよ〜、って自慢したいの?
失礼な。大昔からやってるやつは、こんな変なものはつけない。
とりあえずトリップ変えるのだけはやめてちょうだいね。
>>266 それ皮肉のつもりなんだろうけど、ガキんちょのやっかみにしか見えない。
どーでもいいんだけど皮肉の使い方違ってね?
272 :
デフォルトの名無しさん :2005/10/04(火) 10:45:52
若者の掲示板2chにジジイが混じってるようだな
273 :
ジジイ :2005/10/04(火) 11:02:08
昔、8086が出たとき、メモリ空間が640kバイト使えるっつーんで 感動した。8080に比べれば、無尽蔵とも言えるメモリ空間だ。 その一方、640kバイトものアセンブラのプログラムを誰が 書けるんだろうと心配もした。 それを、640Mバイトでは足りないから1Gバイトにしようなどと、 全く、今の若いもんは.....ぶつぶつぶつ
>>273 いやいやまだまだ。
俺なんて8080から入ったんだけど、当時のマシンはROMが4KB、RAMが256Bだったよ。
それで、ミニコンのような立派な操作パネルがついてた。
メモリは当時ものすごく高くて、フル実装なんてとてもできたもんじゃない。
CPUチップも10万したし、ROMの書込みは専門業者に依頼して、1チップ2万。
あ〜年取ったな〜、フガフガ
脱線気味だが昔はキーボードで感動したらしいね。
じじいといったら、メインフレーマー。
コンソールに上がってくるリプライを溜めとったら バッファがあふれてシステムが落ちてしもうてのう。
脱線しすぎ
280 :
デフォルトの名無しさん :2005/10/04(火) 14:10:32
5メガHDDなんて高嶺の花で、まじ宝石の様な存在だった
>>277 ここではそうなのか?
話違うけど、マイコン時代のSE と言えばネ申だった。
今は経験2年でSE 名乗らせる会社もあるようだな。
SE のレベルも落ちたもんだ・・・
そういうおれはシニアエンジニア・・・
N88-BASIC内臓98にあこがれてました。
PDP-11の実機に憧れるぜ
俺は MEGUMI に憧れています。
クロック 8MHz のマシンが発売された時は こんな速いパソコンがあるのかと思ったもんなー
HDDが普及しはじめた頃って1MBあたり1万円ていう感じだったな 20MBで20万円 俺はまだ当分フロッピーでいいや
TK-40のことかー
高校の頃、父と相談して540MBのSCSIの外付けHDDを3万出して買いました。 マシンスペックは20286 12MHz メモリ640kB 3.5インチFDDx2 ~~~~~ ~~~~~~ これが16年前は40万だった。
ずれたorz
老若男女問わずスレ違いは許さん。
それもそうだな。 DOSの頃はどのPerl使ってた? 俺iperl.exe
何が書いてあるかさっぱりわからないけど面白いから 続けて↓
294 :
デフォルトの名無しさん :2005/10/04(火) 23:15:10
DOSの頃って?
あれだろ、KABAちゃんが黙ってた頃
とりあえずラクダ本買って挫折した頃
どうやったら言語の習得で挫折なんかできるんだろう。 そりゃあ、なかなか掴めなくて戸惑うことはあるけどさ。
>>297 そっとしておいてやれよ。
下には下がいるんだよ。
perl で書かれた関数群をライブラリとして、 C++ のコードの中から呼ぶにはどうしたら良いでしょうか?
perldoc perlcall
301 :
300 :2005/10/05(水) 10:12:38
ありがとうございました。逝ってきます。
302 :
299 :2005/10/05(水) 10:13:11
番号間違えた… ありがとうございました。逝ってきます。
303 :
デフォルトの名無しさん :2005/10/05(水) 12:48:52
>>299-302 このような会話は時々見受けられるのだが。
Win32の環境で実際にやって見せてくれる人はいないのだ
ろうか、といつも思う。
Win32かどうか分からないし…。 UNIX系なら別に問題ないからなぁ。
CPANからClass::Fieldsを入れる時にmake testでエラーになってしまうのですが 何が問題かが良くわかりません。 > t/bugs............FAILED test 3 > Failed 1/3 tests, 66.67% okay こんな感じになってるのですが、こういう場合どこを見れば原因がわかるのでしょうか
active perl .plファイルを右クリ->perl command line interpreter でDOS窓がすぐに閉じます。 閉じないようにするにはどうすればいいでしょうか。
DOS窓から実行する
>>307 一番最後にダミーで標準入力から一行読込むようにすれば
>>307 @echo off
perl %1
echo.
pause
こんな感じのバッチ作って、フォルダオプションのファイルの種類で
.plのアクションに「実行」「さっきのバッチ "%1"」を登録。
そんで「右クリ→実行」ってやってる。
pl2batしたものの最後にpauseを入れる
312 :
デフォルトの名無しさん :2005/10/06(木) 03:57:41
質問です HTMLの中のリンクを変えるPerlを組みたいのですが… <A href="./test.html">ほげほげ</A> ↓ <A href="./hoge.cgi?n=1&p=test.html">ほげほげ</A> という感じにしたいのです。 <A href="〜">〜</A>を検索する事はできるのですが、 その先がわかりません。 どなたか、ご教示おねがいします。
眠いので適当 s/<A\shref="([^"]+)">(.+)<\/A>/<A\shref="$1\?n=1\&test\.html">$2</A>/;
初期画面のソースは for ($daypr=1;$daypr <= 30;$daypr++) { 〜(中略) print <<_html_; <input type="text" name="in$daypr">(30個のスカラー) _html_ } これを<input type="text" name="in[$daypr"]> にして配列変数に入れることは出来ないんですかね・・・。 30個の4桁の数字入力したデータを処理して出力したいんですけど、 for ($daypr=1;$daypr <= 30;$daypr++) { 〜(中略) $AA = substr($in[$daypr],-4,-2); $AB = substr($in[$daypr],-2); print <<_html_; <td><font size="2">$AA:$AB</font></td> _html_ } としても処理した数字がでないです。 本当は $in1 、$in2 〜 $in30 と書き続ければ出来ないこともないですが、FOR文内で $AA = substr($in$daypr,-4,-2); ソース上で$dayprだけを展開できれば・・・↓ $AA = substr($in1,-4,-2); 処理上で↓ $AA = substr(1234,-4,-2); #$AAは12 $dayprの部分だけ一時的に数字にできれば 解決すると思うんですけど、いろいろやってもうんともすんとも動きません・・・。 分かる方居ましたらご教示おねがいします。
>>314 君の文章もスパゲッティコード並みに読みにくいな。
>>314 問題が再現する最短のソースを載せるべし。
>>314 妹が出てくるところまで読んだ
たぶんeval
>>315-318 説明読みにくくてすみませんでした。
${'in'.$daypr}でいけました。
本当にありがとうございます。
320 :
312 :2005/10/06(木) 19:10:02
すみません。
>>313 のをそのまま入れたのですが
構文エラーが出てしまいます。
$temp =~ s/<A\shref="([^"]+)">(.+)<\/A>/<A\shref="$1\?n=1\&test\.html">$2</A>/;
最後のところ </A>/; → <\/A>/;
・゜・</A`> ウワーン
>>321 それは気付いて直しましたが、やはりエラーが出てしまいます。
Bareword found where operator expected at test.cgi line 5, near "s/(.+)<\/a>/$2(.+)<\/a>/$2
( ゚д゚) …。
ごめんなさい。ファイルの保存を忘れてたみたいで、
>>321 で実行できました。
$test = qq(<a href="./test.html">ほげほげ</a>);
$test =~ s/<a\shref="([^"]+)">(.+)<\/a>/<a\shref="$1\?n=1\&test\.html">$2<\/a>/;
print $test;
で、結果は
<ashref="./test.html?n=1&test.html">ほげほげ</a>
となってしまいましたが、
$test =~ s/<a\shref="([^"]+)">(.+)<\/a>/<a href="\.\/hoge\.cgi\?n=1\&p=$1">$2<\/a>/;
とする事で、目的の
<a href="./hoge.cgi?n=1&p=./test.html">ほげほげ</a>
に変換する事ができました。ありがとうございます。
ネットの愚劣に底は無し!
ハッシュに配列の参照を突っ込んだときに、 配列の参照を一発で取り出すにはどうしたらよいのでしょーか? @tmp = (1, 2, 3); %buf = ('tmp' => \@tmp); # 2段階で取り出す $tmp = $buf{tmp}; @foo = @$tmp; # ホントは一発で取り出したい @baa = @$buf{tmp}; # こんな感じに
@baa = @{$buf{tmp}};
332 :
デフォルトの名無しさん :2005/10/07(金) 15:13:54
先行宣言のあるなしについて質問させてください。 1) 以下のソースで3行目のサブルーチンの先行宣言を止めると mainsub の引数が参照渡しではなくなってしないます。 2) 先行宣言を止めたままで mainsub(\%Hash) の様に呼び出すと参照渡しをしてくれます。 3) 先行宣言をした状態で mainsub(\%Hash) と呼び出すとエラー (... main::mainsub must be hash...) となります。 先行宣言と、引数での'\'の使い方、参照渡しの三つ巴のからみがどうなっているのか解かりません。 なにとぞご教授願います。 --------------------------------------------------- #!/bin/perl sub mainsub (\%); my %Hash = (); mainsub(%Hash); while (($key, $value) = each(%Hash)) { print "$key = $value\n"; } sub mainsub (\%) { my ($ref) = @_; $ref->{mainsub} = "I am mainsub"; }
333 :
332 :2005/10/07(金) 15:27:36
上記質問の補足です。 「perlのサブルーチンの引数は参照渡し」であることから先行宣言を止めるとなぜmainsubの中で 値の設定ができなくなってしまうのか? 先行宣言を止めた場合とした場合でなにがちがうのか? 引数で'\'をつけて明示的に参照を指定した場合、subには参照の参照が渡っているんかいな?!
……
>>332 ラクダ本の6.4プロトタイプをよく読め。なければ
perlsub(1)でもいい。
mainsubの例でいうと、プロトタイプがなければ
呼び出し側で mainsub(\%hoge) のように自分で
リファレンスとって渡さなければいけないのを
sub mainsub(\%)とあらかじめ宣言しておくことで
mainsub(%hoge)と書けるようにする(というかこう
書かないとだめ)ためのもの。
Cのプロトタイプの型チェックなんかとは役割が
違うので混同しないように。
336 :
デフォルトの名無しさん :2005/10/07(金) 21:28:13
localtimeで現在の日時を表示できますよね。 例えば1日前や2日前、1ヶ月前の日時を表示させるにはどうすればよいでしょうか? Perl初心者の為、お願いします。
337 :
332 :2005/10/07(金) 21:51:02
>>335 なるほど。
同じようなことを、モジュールにして試してみたりしてみましたが、モジュールにした場合は暗黙で先行宣言と
同様になるようすね。
ありがとうございました。
>>336 localtime(time() - 24 * 60 * 60)
>>336 localtime関数は、引数が与えられた場合、
渡された時間情報をlocal time zoneとして(つまり時差などの変換を行って)、
年月日、時分秒などの九つの情報に変換する。ということまでは解ってるかな。
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime(time);
そこまで解っていれば、時刻情報がどのように扱われているか、
ということを知ればすぐにわかると思う。
Perlでは(というよりPOSIX規格では)時間情報は
「紀元 (1970年1月1日00:00:00 UTC) からの経過秒数」として
表されることになっている。
ここまでくれば自分で式を作れると思うから考えてみてくれ。
ちなみに現在時刻の取得はtime関数な
・・・と書いてたら一足遅かったorz
>336 localtime() の後に操作するなら ($sec, $mon, $hour, $mday, $mon,...) = localtime(time) $mday = $mday - 1; # 1日前 --$mon; # 1ヶ月前 って感じか。 でも、2・4・6・9・11月は31日がないし閏年も考慮しないと いけないので面倒か。 あるいは、 localtime(time - $N * 60 * 60 * 24) # 掛け算の部分は計算しておいてもいいね として呼んで $N 日前の値を取り出すこともできるけど、 月単位の操作はやっぱり1ヶ月が何日かを考慮して $N を設定しないとだね。 $t = time; localtime($t) で値を1度取ってからそのヒト月が何日か調べてもう一度 localtime($t - $N * 60 * 60 * 24) するのがよいかな。
Time::Local
343 :
デフォルトの名無しさん :2005/10/07(金) 22:23:15
336です。 皆様、ありがとうございました。 いろいろ試してみます。
Time::Piece を使う手もあるな。 month_last_day や is_leap_year なんて メソッドが用意されている。
open( FILTER, "| $command" ); print FILTER $text; close( FILTER ); のようなスクリプトで、$command の exit status はどうやって調べるのでしょうか?
$? $? >> 8
あ、入力待ちになった場合、close() した後じゃないと取れないかも。試してないけど
349 :
346 :2005/10/08(土) 18:23:18
>>347 「? オレは 8 じゃないんだが...」 と思いましたが perlvar 読んで了解しました。
ありがとうございました。
m(_ _)m ; # これって正規表現だよな
m(゚д゚)m; # ホントダ!
353 :
デフォルトの名無しさん :2005/10/09(日) 03:08:55
ああ、スマソ 下のコードバグあった・・・ マッチした範囲にタグが含まれない場合、 それよりも前に<があっても対処できてない・・・ きっちりやるには正規表現一個じゃやっぱり難しそうな気がする。 # 他の人任せた
357 :
デフォルトの名無しさん :2005/10/09(日) 08:34:41
初歩的質問ですみません。Perlで挿入ソートをしたいです。 sort関数を使うのではなく、自分で挿入ソートのアルゴリズムを作る。 次のようにしましたが駄目です。どこが悪くてこうなってるのか教えてください。 #!C:\Perl\bin\perl print "5つの数を挿入ソート。\n"; print "Aを入力してください。\n"; $num1=<STDIN>; chop ($num1); #省略してますが、同じやり方でB、C、D、Eも$num2から$num5に入れてます。 @list=("dummy",$num1,$num2,$num3,$num4,$num5); $n=6; for($i=1;$i<=$n;$i++) { $j=$i; while($j>=1 and $list[$j-1] > $list[$j]) { $tmp=$list[$j]; $list[$n]=$list[$n-1]; $list[$n-1]=$tmp; $j--; } } print "$list[1] $list[2] $list[3] $list[4] $list[5]";
・文字列の比較に算術演算子を使わない ・配列の先頭に代入する場合はunshift関数(速い?) ・要素数は$#hogeやscalar @hoge、スカラー変数に代入する場合などは@hogeだけでも可 ・forで配列を0から順番に回すならforeachを使う 今扱っている要素番号は$_に入っている
359 :
357 :2005/10/09(日) 12:53:26
>>358 ありがとうございます。
ソートの件は自己解決しましたが、perlプログラミングなりの作法があるんだなと
自分の勉強不足を痛感しますた。
perlに引数を渡す方法を教えてください
perl [option] mona
perl [option] hoge1 hoge2 hoge3... 引数は@ARGVに格納される。 $ARGV[0]→hoge1 $ARGV[1]→hoge2 $ARGV[2]→hoge3
スクリプトの消失について
記憶の消失について
わが人生、消失しようとも悔い無し
ぐぐれば?
Perlで2GBのテキストをソートってできますか? メモリ2GBも無いです。
>>368 swapが十分あればできないことはないかもしれんが、組み込みのsort関数
一発でやるのはつらいだろう。こういうときの常套手段は、適当な部分に
わけてソートしたものをいくつかの中間ファイルに書き出して、最後に
それを読みながらひとつにマージするわけだが、既にSort::Externalと
いうモジュールがあるのでプログラミングの勉強でなければそれを使う
のが楽だろう。
あるいは比較条件が難しくなければperlにこだわらずsortコマンド使う
方がてっとりばやいかもな。
370 :
368 :2005/10/10(月) 11:55:27
>>369 ありがとうございます!
Sort::External調べてみます。
@hogeの中に入ってる値を10個毎に表示したいのですが。 いい方法が分かりません。 えろい人教えてください。
foreach (1 .. @array) { if ($_%10 == 0) { print $array[$_-1]; } }
何をもっていい方法なのか。 10個ごとときまっているのなら2次元配列にしたほうが楽だと思うけど。
>>371 my @hoge = ('00'..'27');
# @hoge が破壊されない
for (my $i = 0; $i <= $#hoge; $i += 10) {
print join(', ', @hoge[ $i .. $i + 9 ]), "\n";
}
# @hoge が破壊される
print join(', ', splice @hoge, 0, 10), "\n" while @hoge;
>>372 それは10個「おき」にでは無かろうか。
371 がどちらを望んでるのかははっきりしないけど。
print join(', ', @hoge[ grep !($_ % 10), 0..$#hoge ]), "\n";
for (my $i = 0; $i <= $#hoge; $i += 10) { print "$hoge[$i], " }
>372 >374 100件くらいの不定長のリストを渡して、 10件毎に集計、表示ってのがやりたか ったのです。 374さんのが素敵な感じです。 ありがとございます。
普通に。 print map {$a[$_*10]} 1..int(@a/10);
Perlでハッシュの配列を使ってて疑問に思ったのですが $data[0]{'date'} = "20050204" $data[0]{'title'} = "hoge" $data[1]{'date'} = "20051001" $data[1]{'title'} = "test" $data[2]{'date'} = "20040403" $data[2]{'title'} = "abcd" こういうデータがあったとして'date'をキーにして ソートする場合は、どうしたら良いのでしょうか? 1次的なハッシュや配列はsort関数でできたのですが 上記のような場合はわかりません。 それと、このようなデータ形式を扱うのは Perlでは良く使われるのでしょうか? それともあまり使われないのでしょうか?
378 :
377 :2005/10/11(火) 05:13:18
追加ですが、自力でソートルーチンを書いて ソートする事はできます。疑問なのはsort関数等みたいな Perlの標準的な機能を使ってできないか?って事です。 よろしくおねがいします。
>>377 sort { $$a{'date'} <=> $$b{'date'} } @data
配列の中にはハッシュへの無名リファレンスが入ってるってところがミソ
あ、二つ目の質問に答え忘れた Perlでは非常に良く使われるデータ構造だと思うよ
ところで、回答を書いていて思ったのだけど->と$$の使い分けってどうするべきなんだろう。 こういうときは->を使ったほうが解りやすくなるかな? sort { $a->{'date'} <=> $b->{'date'} } @data 三連投スマソ
$$a{data}よりも$a->{data}の方が読みやすいと思うから 普段は->を使うけど、@$array_refくらいならまた別。
>>377 perldoc -f sort
いろいろ例があるよ。
@array = ( { 'aaa' => 1 }, { 'bbb' => 2 }, { 'ccc' => 3 } ); 上記の様な無名ハッシュの配列から値を取り出すには、$array[0]{aaa} などで取り出せますが、 each関数を使用してキーと値を取り出す場合、引数にはどのように指定すれば良いのでしょうか? ($key, $val) = each(%$array[0]) という風に指定してもエラーが出てしまいます。
>>384 ブレースで囲めばよいと思うけどな…
($key, $val) = each(%{ $array[0] })
386 :
デフォルトの名無しさん :2005/10/12(水) 09:44:38
PerlでLDAPを使うとしたらどのモジュールが一番いいんでしょうか? PerLDAPやperl-ldapがあるようですが、よく使われてるのは どれですか?
>>386 PerLDAP は保守が止まってる。
perldap-1.4 - 03 Sep 1999 - Leif Hedstrom
perl-ldap-0.33 - 25 Apr 2005 - Graham Barr
LDAP を必要とするモジュール (例えば DBD::LDAP とか) は軒並 perl-ldap に
依存しているので、こっちにしておいた方が無難。
あるマシンもしくはネットワークに割り当てられた グローバルIPを取得するにはどうしたらいいですか?
>>388 もうちょっと状況を詳しく書いた方がいいんじゃない?
perlとは少しズレるんですが、 jcode.plを使用して正規表現で「ひらがなのみ」にマッチさせる場合、書式はどんな風になるんでしょうか? /[ぁ-ん]+/ みたいな感じだとひらがなに漢字が混じっていてもマッチしてしまいます。
>>390 とりあえずsjisと仮定すれば、それじゃ
[\x82\x9F-\x82\xF1]
となって\x82、\x9F-\x82、\xF1にマッチしてるぞっと。
詳しく説明しようかと思ったけど
bホ (\x82\x82\xCE)なんてパターンを考えてたら疲れたorz
use encodingはどうだろ
Perl5.8のUnicodeは非常にbuggyなのでお勧めできない。 特に正規表現。 ちょっとうまく動かないからデバッガで動かしたら、 デバッグ時だけマッチしなかったり、Perl自体死んだり。 長めのスクリプト書いてると、デバッグできなくて結構悲惨な目に遭う。 「漢字だけにマッチ」とかやりたいときはencoding関係なしで utf8でやってるな。 (\xe4[\xb8-\xbf][\x80-\xff]|[\xe5-\xe9][\x80-\xbf][\x80-\xbf]) って感じで。
ActivePerlの場合、 use encoding 'shiftjis'; と書いただけで、 デバッガを動かすと即死するもんな〜 Bug DBにも登録されてるけど、全く直す気なしなのか?
平仮名なら (\xe3(\x81[\x81-\xbf]]|\x82[\x80-\x93])) かな。
398 :
394 :2005/10/12(水) 22:31:09
>>395 それのこと。それが使い物にならない。
95%は動くけど、実用レベルじゃない。
5.8.7になるまでこの状態ってことは、誰もロクに使ってないんだろうな…。
そもそもマルチバイト圏じゃないと必要ないというのもあるけど、
考え方が難解&使い方が煩雑すぎるのもあるんだろうな。
一応、自分はencoding使ってだいたいのことはできるようになったけど、
デバッガが使えない&人に通じない、という二つの理由で
動いたらもうけもの、ぐらいの気持ちで作る自分用の短いスクリプトにしか
使わないな。
>>391 あ、言葉足らずですみません。Jcode.plで「eucに変換して」ってことです。
eucなら[ぁ-ん]でマッチしますよね?
ただ、「ひらがなだけ」というのがどうも上手くいかないのです。
そもそもマルチバイト文字はカタログ化してしまうので、encodings なんか
使わんな。
>>398 > 95%は動くけど、実用レベルじゃない。
再現性のある具体例を出さないと、FUD と言われても文句は言えないな。
>>387 ありがとうございます。
perl-ldapを使うことにします。
403 :
394 :2005/10/13(木) 01:48:03
>>401 なんだこの基地害。いきなり人のことを疑って。
bugs.perl.orgかbugs.activestate.comでも見てろ。
---------- あ い う ---------- のような改行2つに正規表現をマッチさせるにはどうしたらいいでしょう? s/\n\n/ /g; s/\n$^\n/ /g; とかでは置換してくれませんでした ActivePerl 5.8.7です
/m
ちゃんと \n\n でmatchするだろ? そういうふうに $_ にちゃんと入ってれば。 perl -e '$_="A\n\nB\n\nC\n\n"; s/\n\n/X/g; print' 行末が \r\n だったりすれば正規化や別のパターンが必要なだけ。 まあ /m は ^, $ に関しては確認するとして…
410 :
デフォルトの名無しさん :2005/10/13(木) 16:22:58
質問です。 サブルーチンの中じゃないところでマッチングさせて サブルーチンの中で$1とか$2とかいう記号をつかうことはできますか?
411 :
デフォルトの名無しさん :2005/10/13(木) 16:37:17
試してみてくれ
perldoc perlvarして$<digits>のところを読めばわかるがダイナミックスコープで ブロック抜けるまで有効。 $<digits> Contains the subpattern from the corresponding set of capturing parentheses from the last pattern match, not counting patterns matched in nested blocks that have been exited already. (Mnemonic: like \digits.) These variables are all read-only and dynamically scoped to the current BLOCK. 例: "foo1" =~ /(.*)/; f(1); { "foo2" =~ /(.*)/; f(2); } f(3); sub f { my($n) = @_; print "$n: $1\n"; }
実行結果: 1: foo1 2: foo2 3: foo1
414 :
406 :2005/10/13(木) 20:22:24
色々試したけど正規表現が悪いのではないのかもしれないのでどこが悪いか指摘お願いします hoge.pl ---------- while(<>) { s/\n\n/ /g; print; } ---------- test1.txt ---------- あ い う ---------- これで perl hoge.pl <test1.txt >test2.txt をやってもtest1と同じものがtest2にでてしまうだけなのです hoge.plの置換の部分は s/\n\n/ /m; s/\x0D\x0A/\n/g; tr/\x0D\x0A/\n\n/; s/\n\n/ /g; と試しても同じでした
>>414 もうなんつか、それ以前の問題。
my $n = join('', <>);
$n =~ s/\n\n/ /mg;
print $n;
型グロブってどんな時に便利なんですか?
417 :
409 :2005/10/13(木) 21:23:29
やっぱりなあ… $_ に一行ずつ(一つ目の\n(?OR \r\n)まで)しか 入れてないのに、$_ に \n\n が入ってるわけ無いだろ… 行単位以外の入力もいろいろやりかたあるけど、 perl以前にアルゴリズム勉強し直し?
419 :
デフォルトの名無しさん :2005/10/14(金) 00:07:35
>>417 > perl以前にアルゴリズム勉強し直し?
それ以前に、不具合がどこで起きているのか調査した
形跡が皆無なのが問題。
アルゴリズムじゃなくってPerlの勉強し直しでよくね。 Perlならではのアルゴリズムだし…とマジレスしてみる。
>>414 これでいい?
{
local $/ = "";
chomp, print $_, " " while <>;
}
いや何がしたいかわかってない可能性が大きいのでアルゴリズムというより 論理能力の問題かも。 目的の一部として単に空白行を削除するだけなら、421などより初心者定石的に、 perl -e 'while(<>){next if/^$/; print;}' a.txt perl -ne 'next if /^$/;print' a.txt とするだろうし。
423 :
422 :2005/10/14(金) 04:01:28
すまん、空白行削除だけじゃなく、何故だか行の連結もするのね(?) /^$/の検査の後に s/\n$/ / なりを入れるとか好きなように。
424 :
406 :2005/10/14(金) 09:29:40
精進しますorz ありがとん
local $/; $_ = <>; s/\n\n/ /sg; print;
いやさぁ $/ をいじる方法はドキュメントにも載ってるtipsで皆飽きてるのでは。 入力量や処理を見積もれない場合(人)には有害だし。
>>426 ドキュメントに載っていない TIPS や飽きられていない FAQ って何だ。
perl -l40pe 'BEGIN { $/ = "\n\n" }' test1.txt > test2.txt
428 :
デフォルトの名無しさん :2005/10/14(金) 21:05:49
変数の値が数値であるかを判定したいのですが、どうすればよいですか。 例) $Num = 1.23e45 ; ※もちろん指数も数値として判定する。
>>429 sub is_numeral {
$_[-1] =~ /^\s*([+\-]?\d*\.?\d*(?:[Ee][+\-]?\d+)?)/;
$1 =~ /^[+\-]?\.?\d/ ? 1 : 0;
}
俺は Regexp::Common でも推しておくか。 use Regexp::Common qw/number/; $num =~ m/^$RE{num}{real}$/;
434 :
デフォルトの名無しさん :2005/10/15(土) 04:02:16
$1とか$2とかをカラにするにはどうすればいいんですか?
>>429 $a = 1.23e45; は当然としても、$b = '1.20e2'; などの文字列を
「数値」と判定するつもりなのかどうか、(数値として演算可能ではあるけれど)
いまひとつ、安易には設問の意をとれないのだが…
>>434 何もキャプチャーしないマッチを成功させれば全部undefになるよ。
"a" =~ /a/ とか。
>>427 ようするにそういう1-linerも必死な厨もお約束どうりつまらんだけなわけ。
>>437 全然「ようされて」いませんね。回答せずに逃げるのは痛いです :-P
で、ドキュメントに載っていない TIPS や飽きられていない FAQ って何なんですか?
>>438 驚いた。回答も何も、必死厨、頭悪いなあ。
「ドキュメントに載っていない TIPS や飽きられていない FAQ」なんて
アホ捏造して食い下がってるのは自分自身だけだろ
($/="" じゃなくて $/="\n\n" なのもイヤ)
440 :
デフォルトの名無しさん :2005/10/15(土) 18:08:08
nifty の cgi でperl::magickは使えますか?
>>440 >>1 > CGIについての質問は板違いです。
nifty のサポートに聞くのが筋では?
ダウンロードカウンタースクリプトのシバンの直後に挿入している一部です。 # ユーザーエージェントでロボット除外 $flag = 0; $ua = $ENV{'HTTP_USER_AGENT'}; @block=( "googlebot",# Googleロボットの除外 "msnbot"# MSNロボットの除外 ); foreach $block(@block){ if ($ua =~m/^$block/){ # ロボットならフラグをセット $flag = 1; } } # ロボット判定 if($flag eq 1){ exit(); } と書いたのですが、IEからのアクセスでも500が出てしまいます。 何故でしょう? ちなみにこの部分をコメントアウトすれば正常に動作します。 文字コードはSHIFT_JIS改行コードはWindows形式(CR+LFだっけ?)です。 よろしくお願い致します。
>>442 何故でしょう、って、その部分の code片の動作だけでは異常は無いんでしょ?
単に環境にあわせてdebug作業を工夫する能力が足りない、というのと、
>>1 すら理解できない、という基礎能力の不足が、最大の原因だと思う。
>>CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
>>CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
>>CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするので
あほだ
文字コードをEUCでもダメ? 文字コードをEUCでもダメ? 文字コードをEUCでもダメ? 文字コードをEUCでもダメ? 文字コードをEUCでもダメ?
>>444 Perlスクリプトか否かは、まったく問題になってないのだが、
何が言いたいの?
そうか、いわゆる CGIじゃない可能性も皆無ではないからなあ、って、
>文字コードをEUCでもダメ?
ここで笑うとこなの?
WindowsXP SP2 active perl 5.8.7(windows版) をインストールして、 インストールディレクトリで、 .\perl.exe -e 'printf("AAA\r\n")' とやっても、何も表示されない(空白行が出力されておしまい)んですが、 よくわかりません。何をチェックしたらよいでしょうか。
\rは要らないんじゃない?
コマンドプロンプトでで''で括るのはサポートされない
451 :
448 :2005/10/15(土) 21:03:20
>>449 \r ありでも無しでもファイルに書き出して perl file.pl とやるとうまくいきますね。
>>450 う〜ん、そうなんですか。確かにファイルに書き出すと問題無いです。orz
452 :
448 :2005/10/15(土) 21:05:38
以下のようにしたらできた… OTZ perl -e printf(\"AAA\") AAA
>>452 >>450 の補足。cwd.exe の事は知らんが、command.com では
コマンドの引数を括るのに ' は使えず " しか使えない。
perl 以前にシェルの問題。 perl -e "printf('A A A')" なら通るし、
bash や csh のようなまともなシェルなら ' でも括れる。
>>452 の例が通るのは、-e オプションのパラメータに空白文字
やパースエラーになるクォート文字が含まれず、一つの引数と
正常に認識されるから。
あと print で済む事に printf は使わないのが Perl 流。
454 :
448 :2005/10/15(土) 22:11:03
>>453 ちなみに上の例はコマンドプロンプト上(cmd.exe)でした。
勉強になります。
ありがとうございます。
455 :
デフォルトの名無しさん :2005/10/15(土) 22:16:10
Error.pmをuseしてtryブロックの中で throw Error::IO(-text => "Oops!"); とするとエラーになるのですが何故ですか? 以下エラー内容です。 Can't locate object method "throw" via package "Error::IO" (perhaps you forgo t to load "Error::IO"?) at xxx.pl line xx.
>>455 確かにドキュメントにはError::IOの文字があるけど、
PRE-DEFINED ERROR CLASSESにも、ソースにもError::IOなんて無いな・・・
@Error::IO::ISA = qw(Error::Simple);
とかやって作ってやら無いといけないみたいね
457 :
デフォルトの名無しさん :2005/10/16(日) 16:14:38
教えてください。 リファレンスをハッシュのキーに使うと HASH(0x80f6460) や SomeObject=HASH(0x80f6460) などの文字列に成り下がってしまいます。 それはそれで別段構わないのですが、 この文字列(メモリ上のアドレス??)の一意性って保証されるのでしょうか?
>>457 リファレンスをハッシュのキーに使わなくてはならないようなシチュエーションが知りたい。
0を挿入しようと思ったんですが 例えば s/(〜)(〜)/\10\2/ とかだと\10と認識されてしまって\1と\2の間に0をいれるってことが出来ないのですが こういうときはどうやって\10ではなく\1と0と認識させるんですか?
460 :
457 :2005/10/16(日) 18:50:29
>>458 あるオブジェクトを他のオブジェクトと関連づけるために
ハッシュが使えないかな?と思った次第です。
たとえば業務系のアプリだと
ある受注オブジェクト(Order)に対して出荷オブジェクト(Delivery)が
複数関連づけられている場合 = 分納出荷されているというような場合
my $o1 = Order->new(id => 1);
my $d1 = Delivery->new(id => 1);
my $d2 = Delivery->new(id => 2);
my $orders = { $o1 => [$d1, $d2] };
みたいな書き方ができると便利かな?と思ったわけです。
まあ、たとえばの話です。まだプログラム始めた訳じゃないです。
この場合、$o1 は "Order=HASH(0x80f6460)"みたいな文字列でハッシュキーに
なるわけですが、もし$o1のプロパティにいろいろ重いデータを突っ込んで行ったあげく
$o1のアドレスが別の場所に再アロケートされてしまうことがあると
後で $orders->{$o1} と参照しても undefが返ってきてしまいますし
間違った値が返されることもあるかもな、と思いまして質問させて頂きました。
>>459 普通は s/()()/${1}0$2/ だろうなあ。
>>460 "Order=HASH(0x...)" のままだと、bless しなおされたらアウトじゃないか。
使うんなら = よりも後の部分だな。
オブジェクトの文字列表現をキーに使うのは、Attribute::Handlers でも
やってるから問題ないように思うけど、保証されてるかどうかは知らん。
463 :
457 :2005/10/16(日) 19:50:34
>>462 ありがとうございます。
リブレスされたら確かにそうですね。
465 :
デフォルトの名無しさん :2005/10/16(日) 20:06:31
perlのCursesモジュールを勉強しようと思っているのですが なにかよいページご存じないですか? (できれば日本語がよいです) ググってみたのですがphysonやrubyのものばかりで perlではあまり使われていないのかなあ‥
466 :
デフォルトの名無しさん :2005/10/16(日) 20:22:03
Perlでデータを保存する場合CSV形式以外はできないんでしょうか?
467 :
デフォルトの名無しさん :2005/10/16(日) 20:33:06
Perlでデータを保存する場合CSVやTSV形式以外はできないんでしょうか?
469 :
デフォルトの名無しさん :2005/10/16(日) 20:52:23
Tie::RefHash
470 :
457 :2005/10/16(日) 21:11:46
>>469 おお!まさにこれです!
試してみます。スペシャルサンクス。
471 :
デフォルトの名無しさん :2005/10/17(月) 00:23:12
10/17 10/18 予定 10/19 のようになっているテキストファイルの10/18の予定の下に予定を追加するスクリプトの書き方が分からないのですが教えていただけませんか? 引数で予定を突っ込む感じにしたいのですが・・ open Yotei, "yotei.txt"; while (<Yotei>) { if (/$ARGV[0]\/05/) { $line = <Yotei>; while ($line !~ /\d\d?\/\d\d?\/05/){ print $line; last if !($line = <Yotei>); } last; } } close Yotei; で表示は出来るとこまで行き着いたのですが、そっから、予定のしたの行に新規の予定をぶっこむやりかたが分からなくなっています
472 :
デフォルトの名無しさん :2005/10/17(月) 00:24:37
if (/$ARGV[0]\/05/) { → if (/$ARGV[0]/) {
>>471 全部ハッシュか配列に読み込んで、目的の行を追加して、ファイルに書き出す。
474 :
デフォルトの名無しさん :2005/10/17(月) 02:17:52
>>473 どうもです
まだperl勉強したてでいまいちハッシュを理解出来ていないので勉強しなおしてきます
$○×△なんかとどう違うのかが理解できなくて苦笑
475 :
デフォルトの名無しさん :2005/10/17(月) 11:56:11
>>468 Perlでファイルにデータを書き込むプログラムはCSV以外に見たことないので
>>475 正確にはファイルハンドルへ出力。
ファイルハンドルはファイルであったり、STDOUTだったり、ソケットだったり。
もしかしてCGIだけでPerlを語ってる?
>>477 CGIだってバイナリファイル(画像とか)吐き出したりすることもあるでそ。(重箱すまん)
479 :
ryu :2005/10/17(月) 15:31:05
ちょっとお力添えくださいm(__)m
今、簡単な掲示板をPerlで作っているのですが、
手順として
1.記事を書いて送信ボタンをクリック
↓
2.確認ページ(書き直す場合は戻るリンクをクリック、OKな場合は、書き込むボタンクリック
↓
3.書き込み完了画面(掲示板へ戻るリンクで掲示板へ)
↓
4.掲示板
という流れをしたいのですが、ここでお聞きしたいことが2つありまして
まず1つ目は
・手順1で送信ボタンをクリックした際に、例えば、内容に何も入力せずに送信したのに
if($act_result == 0){}のなかの入力チェックをとおってくれないので
その解決法。
(何も入力していなくても、確認ページへ飛んでしまう。)
return 0;を返す前に、&write_confirm()ルーチンを実行しいるのが問題なのかな・・?
2つ目は、
手順2で記事を書いたあと送信ボタンをクリックで確認ページへ飛んで記事を
修正したい為、戻るリンクをクリックして、トップを表示したときに入力した内容が
消えてしまっているのですが、それを解決する方法がわかりません。
解りにくいかもしれませんが、お願いします。
以下ソースです。
ttp://imbbs1.net4u.org/1/sr3_bbss/4874isimin/63_1.txt
480 :
デフォルトの名無しさん :2005/10/17(月) 15:55:18
1つのページに画像を送信するフォームとテキストだけを送信するフォームがあるんだけど 画像を送信する場合のタグは<FORM METHOD="POST" action="aaa.cgi" enctype="multipart/form-data">で テキストだけを送信する場合は<FORM METHOD="POST" action="aaa.cgi">タグを使ってます それでPerlの場合はmultipart/form-dataで送信されたのかまたは普通のテキスト送信なのかどうかをaaa.cgiで判断する方法ってあるんでしょうか?
> &write_confirm()ルーチンを実行しいるのが問題なのかな・・? &write_confirm() で、ものすごい勢いで exit されているわけだが。
482 :
ryu :2005/10/17(月) 16:03:08
>>481 ご指摘ありがとうございます。
やっぱりこのexit;ダメですよねorz
と、思い、このexit関数をコメントアウトしたら、確認画面の直ぐ下に
エラー表示まで出てしまうという・・。どうしたらいいのか。。
>>482 ちょっと落ち着け。
なんで入力確認が終わってないのに書きこみ画面を出力しちゃってるんだ?
perl 以前の問題だよ。
484 :
ryu :2005/10/17(月) 16:18:33
orz
485 :
ryu :2005/10/17(月) 16:26:59
>>483 落ち着きます;
書き込み確認画面を出す前に入力チェックをしたいのですが、
それがうまくできないのですfrtgyふじこlp;;lp;@
今のままだとreturn 0;とする前にwrite_confirm();
が出てきてるから、こうなるのはあたりまえといえばあたりまえなんですが・・。
>>485 > 今のままだとreturn 0;とする前にwrite_confirm();
> が出てきてるから、こうなるのはあたりまえといえばあたりまえなんですが・・。
答え出てるじゃん。
487 :
ryu :2005/10/17(月) 16:38:54
はい; んで、 if($FORM_DATA{'action'} eq 'confirm'){ #確認画面 return 0; &write_confirm($name,$mail,$url,$title,$message,$color); }el(ry と単純に順番を入れ替えたら、入力チェックはするのですが、 チェックを全部とおるような書き込みをすると 書き込み画面を表示せず、即座に書き込んでしまいます_| ̄|○ ちなみにネタじゃないです。
> return 0; > &write_confirm($name,$mail,$url,$title,$message,$color); だから 落 ち 着 け って。 これだと &write_confirm は絶対呼び出されないってば。 全体的なフローを一から見直すことをお勧めする。
ネタ以外の何者にも見えんわ
>>478 >>477 はアスキーかバイナリかなんて言ってないように見えるけど。
でもって、バイナリ吐き出すのもCGIとは限らん罠。
491 :
デフォルトの名無しさん :2005/10/17(月) 21:05:31
pm使えない環境でpm使おうとするとき みなさんどーしてまふ?
493 :
デフォルトの名無しさん :2005/10/17(月) 21:47:59
pm使えない環境なんてあるの?どんな環境?
495 :
デフォルトの名無しさん :2005/10/17(月) 21:51:01
pm使えない環境でpm使えたらそれはpm使えない環境じゃないじゃん。 矛盾だ。
497 :
デフォルトの名無しさん :2005/10/17(月) 22:42:57
なぁんだ釣りか♪
499 :
デフォルトの名無しさん :2005/10/17(月) 22:47:50
なあんだ粘着か♪
501 :
デフォルトの名無しさん :2005/10/17(月) 23:13:13
502 :
デフォルトの名無しさん :2005/10/17(月) 23:30:50
つまり使える環境なのに「使えない環境で〜」とか 質問で嘘ついてたってわけですね。
503 :
デフォルトの名無しさん :2005/10/17(月) 23:33:25
粘着質は優秀なエンジニアの証:)
505 :
デフォルトの名無しさん :2005/10/17(月) 23:43:47
なら粘着がんばれ。 オレは教えてもらったとーり今から勉強する。 他の相手見つけろ。
┐(´ー`)┌
池沼はスルーしろ。
粘着は優秀なプログラマにして無能なエンジニアの証
すみません、質問させていただきます。 @b の各要素を @a の各要素と正規表現で比較し、マッチしなかった @b の要素を表示させたいのですが、どんな方法がありますでしょうか。 イメージとしては、 @a = (1, 3, 1); @b = (a0, b1, c2, a0, b1, c2); 結果として、 a0 c2 を出力したいです。よろしくお願いします。
さっぱりわからんw
>>509 my @a = qw(1 3 1 .);
my @b = qw(a0 b1 c2 a0 b1 c2 1 2 3.4 2);
my %dup;
my $regex = join '|', map quotemeta, grep !$dup{$_}++, @a;
undef %dup;
print join "\n", grep !$dup{$_}++ && !/$regex/, @b;
513 :
509 :2005/10/18(火) 02:31:03
>>512 おぉぉぉ、すごい、ありがとうございます。
つたない説明も理解していただき、本当にありがとうございます!
すごいというか、暗号だな これがPerlじゃなかったら悪いプログラムの見本みたいだw
>>509 理解しやすいよう、いくぶんか分かりやすく。
my @a = qw(1 3 1);
my @b = qw(a0 b1 c2 a0 b1 c2);
my $a = join('|', map { quotemeta($_) } @a);
my @result = grep { !/$a/ } @b;
print "@result";
---
重複した要素を除いて最適化したもの。
local %_;
my @a = grep { !$dup{$_}++ } qw(1 3 1);
%_ = ();
my @b = grep { !$dup{$_}++ } qw(a0 b1 c2 a0 b1 c2);
my $a = join('|', map { quotemeta($_) } @a);
my @result = grep { !/$a/ } @b;
print "@result";
下のもの、訂正。 local %_; my @a = grep { !$_{$_}++ } qw(1 3 1); %_ = (); my @b = grep { !$_{$_}++ } qw(a0 b1 c2 a0 b1 c2); my $a = join('|', map { quotemeta($_) } @a); my @result = grep { !/$a/ } @b; print "@result";
quotemetaなんて便利なもんがあるの知らんかった
518 :
デフォルトの名無しさん :2005/10/18(火) 06:51:03
$hoge =~ s/((?:\{)*(?: )*(?:")*)([^<>\n]+?)(<a .*?>).*?<\/a>/$1$3$2<\/a>/g; リンクタグの前の文字列にリンクをつけたいんです。 たとえば、うううう<a href="〜">ああああ</a>とあったら、 <a href="〜">うううう</a>と書き替えたいんです。 だけど、 や{にリンクがつくのは避けたいのです。 それで、上の文で、 のほうはつかないようにできたのですが、 {のほうには、どうやってもついてしまいます。 どなたか助けてください。
(?:{)*とかっこでくくってるのはただの苦し紛れです
520 :
デフォルトの名無しさん :2005/10/18(火) 07:52:33
>>518 $hoge =~ s!([^<>{ \n]+)(<a .*?>).*?(</a>)!$2$1$3</a>!g;
521 :
520 :2005/10/18(火) 07:58:01
ん? もしかしてマルチバイト文字の中に{が入ってると上手くいかないのかな? そーゆーときはEUC-JPとかに変換して処理しませう。
522 :
519 :2005/10/18(火) 08:43:23
>>515-516 解説ありがとうございます。
はずかしながら、map と quotemeta を始めて知りました。
すごい便利ですね。今後活用します!
map
map は,リスト中の各要素を「式」または「ブロック」で
評価した結果からなるリストを返す関数である。
grep 同様,各要素は $_ で参照できる。
quotemeta
引数からすべての正規表現のメタ文字をバックスラッシュで
エスケープしたものを返す。
523 :
509 :2005/10/18(火) 08:44:06
>509のやつ、こんなのしか書けなかった どうみても>512のほうがよくできてるよな… my @a = qw(1 3 1); my @b = qw(a0 b1 c2 a0 b1 c2); my @a_reg = (); push @a_reg, qr/$_/ foreach @a; my @temp = (); CHECK: foreach my $test (@b) { foreach my $reg (@a_reg) { next CHECK if $test =~ /$reg/; } push @temp, $test; } my %seen = (); my @nomatch = (); foreach (@temp) { push @nomatch, $_ unless $seet{$_}++; } print "@nomatch";
map や grep って、覚えたての頃はそればっかり使いたくなるよね。
こういうのはイテレータって呼んでいいの?
全然別モンだろ
Perlのプログラミングでデザインパターン使ってますか?
>>528 ごく普通に使ってるよ。
CPAN にあるデザパタ系のユーティリティクラスは正直使い勝手が悪いので、
自分でイチから書いたけど。
530 :
デフォルトの名無しさん :2005/10/18(火) 22:25:59
Perl6まだーん?
_∧_∧_∧_∧_∧_∧_∧_∧_ デケデケ | | ドコドコ < Perl6まだぁ〜!? > ☆ ドムドム |_ _ _ _ _ _ _ _ _ _| ☆ ダダダダ! ∨ ∨ ∨ ∨ ∨ ∨ ∨ ∨ ∨ ドシャーン! ヽ オラオラッ!! ♪ =≡= ∧_∧ ☆ ♪ / 〃(・∀・ #) / シャンシャン ♪ 〆 ┌\と\と.ヾ∈≡∋ゞ || γ ⌒ヽヽコ ノ || || ΣΣ .|:::|∪〓 || ♪ ./|\人 _.ノノ _||_. /|\ ドチドチ!
webprogに書き込んだのですが、違うような気がしたので移動宣言してこちらにきました レンタル鯖がaaacafeでmySQLは使えるのですが、鯖にDBIモジュールがないようなのです。 レンタル鯖のCGIで接続したい場合、どういった方法を取ればいいのでしょうか。 CGI自体はローカル起動、ローカルのMySQL、ローカル起動、レンタル鯖のMySQLで正しく動くので、スクリプト上のエラーではないと思います。 DBI.pmを追ってみたのですが全然整理できませんでした。 ヒントでもあればお願いします。
PHPでも使ってください
>>532 DBIモジュールがないとわかってるのならインスコすればいいような...
>>532 DBI確認できないだけでなんてこっちに移動するんだか…
自分でプロパイダかサーバ(or perl)自身に問い合わせて確認すれ。
か、自分で API組むか組み込めよ。
536 :
デフォルトの名無しさん :2005/10/19(水) 11:21:53
それが初心者クオリティ
レン鯖だったら乗り換えればいい。
オンラインゲームのサーバー状態を取得したいのですが、Net::Pingを使えば可能でしょうか? 具体的にはHalf-Life:Counter-Strike1.6の鯖でポートは27015番です。
>>538 サーバー状態が何かにもよるがtcpでconnectできりゃいいだけなら
Net::Pingで調べられる。デフォルトのechoポート以外を使う方法は
SYNOPSYSのプログラム例にある。しかしこのくらいマニュアル読め
ばわかると思うのだが....
ありがとうございます
こんなゴミ言語よく使い続けますね^^
Perlがゴミ言語だなんて…
>>541 (´・ω・) カワイソス
きっとひどく汚いソースしか見る機会が無かったんだねテラカワイソス(´・ω・`)
544 :
デフォルトの名無しさん :2005/10/19(水) 18:35:44
Net::FTP 使ってディレクトリをrmdirで削除しようとすると「ディレクトリが空じゃあない!!」って怒られたんだけどディレクトリの中身の有無にかかわらずディレクトリ削除ってできないのですか?
>>544 perldocより
If "RECURSE" is *true* then "rmdir" will attempt to delete everything inside the directory.
rmdir($dir, 1);
で良いんじゃなかろか。試してないけれど
>>544 ftp的にできないので(鯖によるかもしれんが普通できない)、
Net::FTP使って再帰的にディレクトリ掘って中のファイルやディレクトリを順に消してくしかない。
547 :
デフォルトの名無しさん :2005/10/19(水) 20:34:29
548 :
デフォルトの名無しさん :2005/10/19(水) 22:37:44
>>547 >
>>546 > やっぱそれしか無いのかなぁ。
Net::FTPのrmdirというメソッドにそのコードが入っているから
コピるといいよ。
ある人に「ファイルを open する時には必ず返り値をチェックするのに close で返り値をチェックしないのはなぜ?」 と質問されました。 「チェックしてもいいけど、もしcloseでエラーが起きたとき、 どういう処理をすればいいと思う?」 と説明しましたが、ちょっと不安になりました。。 close も返り値をチェックした方が良いのでしょうか? もちろん、スクリプトの目的に依存するのはわかりますが、 こんな時には close もチェックしたほうが良いといった具体例はあるでしょうか? 一般的に返り値のチェックに関しては、私は経験的に ・ファイル、ネットワーク周りのIOが発生する関数、 ・system, のような関数には必ず返り値をチェックするようにしています。 でも、use もpmファイルを読み込んでいますが、これをチェック したことはありません。 どんなときに返り値をチェックするか、初心者に説明しやすい一般的な基準は 無いでしょうか?
同じファイルハンドル名で次のopenが成功すれば、前のopenは強制closeだから、とかだったはず。メモリの占有とかまでは知らない。
>>549 そのファイルへの書き込みが完了したことを確実に確認
する必要があって、且つNFSなどネットワーク越しの操作と
なっている可能性がある場合。
蛇足なんだけど、質問に答えている人はほとんどSEやPG?
学生とか。
>>552 様々に決まってるダロ。
また、SEやPGが必ずしも知識を持っているわけではナイ。
研究者
アマチュア無線部の部長に50マッカ
頭のおかしいのが一人でカキコしてるのか・・・。
俺窓際部長
最近、部長には仕事がないんじゃないかと思う今日この頃です。 事故が起きても謝りに行くのは課長だし… 社員からは「部長、仕事してねーよ」とか言われてます。 私だって好きで部長になった訳じゃないのです。本当はバリバリ 仕事したいのに…
567 :
デフォルトの名無しさん :2005/10/20(木) 23:49:23
568 :
デフォルトの名無しさん :2005/10/21(金) 00:13:53
初心者の質問ですみません。 ($sec,$min,$hour)=localtime(time)[0..2]; のような構文がけられます。 )[ のとこがダメっていわれます。どうなってるの? ちなみにcygwin/ Perl 5.8.7だとうまくいくけど、Soralis9/SunOS 5.9 / Perl 5.8.7だとダメです。
569 :
デフォルトの名無しさん :2005/10/21(金) 00:27:31
原因はわからないですが (localtime(time))[0..2] ってやると上手くいきますね Mac OS X 10.4.2 の Perl5.8.6です
>>568 cygwin版では 処理の優先順位が違うのかな?
ちなみに
perl, v5.8.4 built for i386-linux-thread-multi
perl, v5.8.7 built for MSWin32-x86-multi-thread
でも () で array にする必要あり。
>>543 最近perlを学習し始めたんですが、perlで書かれたプログラムで
きれいなソースのやつを教えてもらえませんか。
>>572 最近、Perlを学習し始めたのなら、きれいなソースを見たってしかたないだろ。
もっと勉強してから出直してこい。
>>572 「きれいなソース」とは、どういう意味で言ってる?
コーディングスタイルのこと?
それとも、様々なテクニックを駆使した芸術的なコードのこと?
初心者なら、後者はまだ不要。
本屋で売っているPerl入門書で、まずはみっちり勉強することだ。
どんな本でも良いが、それとは別に“ラクダ本”は必ず買っとけ。
Perlのバイブルだし、設計思想なども学ぶことができる。
>>572 cpanに行けばPer Hackerが書いたスクリプトが
沢山あるからみてみることをお勧めする
逆に汚い例は日本の巷に溢れるCGIスクリプトだな。
当然綺麗なものも中にはあるんだろうが、悪い例に毒されたものが多すぎる…
ところで標準モジュールなんかを見ると、インデントが1レベルなら4桁のスペースだが、 2レベルになるとタブでインデントしてあったりするんだが、何を使うとこうなるんだろ・・・ 普段タブ幅を4でやってるからそのままじゃ読みにくくてかなわん
emacsであんま考えないでやるとそうなる。
>>578 そうなのか・・・Un*x環境ではVim派な漏れ
# vim:set ts=4 sts=4 sw=4 tw=0:
>>579 一時的にタブ幅の設定を8に変えるか(ts=8)、expand(1)などで
自分好みにおきかえたファイルを別に作るかだろうな。
581 :
572 :2005/10/21(金) 12:21:33
>>573-576 お返事どうもです。
ええっと、言葉が足りなかったですね。他の言語での経験はあります。
あと、「きれい」とは「保守しやすい」という意味で使ってました。
必要に駆られて、perlを勉強することになったのですが、ソース読みながら
勉強したほうが早いので、おススメのがあれば、と聞いてみました。
CPANを探してみることにします。
e-book版が安かったから、ApressのJames Lee"Beginning Perl, Second Edition"
を使って勉強しています。自分にはちと初心者向けすぎて冗長な感じがしますが、
読みやすく、ハマりそうなところもきちんと説明してあって、良い本だと思いました。
精進します。それでは。
>>582 漏れも分からん。
原文ではSpace after last parenthesis matching on current line.とあるから、丸括弧のことだろうが…
>>582-583 外してる可能性が高いが、
if( EXPR ){ ... } と書かず
if (EXPR) { ... } と書け、という事では無かろうか。
if (!$override && ($self->{'.fieldnames'}->{$name} || defined($self->param($name)) ) ) { の2行目の後から3つ目のカッコのあとに入れたスペースのようなもののことではないかと。 (上の例ははlib/CGI.pmの中から抜き出したものです)
>>582 (a + (b +
(c + d)_))
_ の箇所にスペースを入れろ、ということだと思われるが
587 :
586 :2005/10/21(金) 13:57:48
ああ、かぶってしまった
ぐぐっても見つけられなかったので、お力添えを perlの配列変数の添え字を7ケタにすると500エラーになってしまうのですが これはこういうものですか、それとも鯖依存でしょうか? $test[0] = test; print "content-type:text/html\n\n"; print "$test[0]"; は動くけど $test[1234567] = test; print "content-type:text/html\n\n"; print "$test[1234567]"; はエラーになる
$test[1234567] = test; とした時点で1234567要素分の配列のためのメモリ領域がとられるから、 制限がケチだとメモリ使い杉でエラーになるかもな。
>>588 このスレに書くならせめて「500エラー」じゃなくてエラーメッセージを調べて書こうな。
配列ってのは基本的に連続したデータのためのものだから、
連続したデータじゃないなら連想配列を使うべし。
連続したデータなら…そんな大きなデータを扱わなくても良いように設計を見直すべし。
>>589 即レス感謝です。
恥ずかしながらyyyymmddをそのまま添え字にして動かしてました
1900と1足してなかったから今まで何とか動いてただけかorz
593 :
588 :2005/10/21(金) 17:44:08
>>590 ハイ、大反省デス
昨日まで動いてたのが突然動かなくなったのでパニくってました
早速見直しおば
594 :
デフォルトの名無しさん :2005/10/21(金) 20:30:50
Perlでレンタルサーバーで自分が設置できるスペースの残り容量の調べれ方を教えてお
>>594 鯖屋との契約内容次第だろ。
鯖屋にメールしる。
597 :
デフォルトの名無しさん :2005/10/22(土) 14:06:39
>>596 Perlで残り容量調べれないとこれ以上書き込めませんっていうメッセージ出せない
>>597 > Perlで残り容量調べれ
るようにしているかは鯖屋次第。
$zz = '○○○○'; print "変数から実行\n $zz"; ○○○○の中だけ、いじれる場合に【print "123"】とか実行させることは できないでしょうか? $zzに色々関数を入れたいんですが・・・
eval?
$zz = 'eval(print "123")'; print "変数から実行\n $zz"; [出力] 変数から実行 eval(print "123") ※注 ○○○○の中だけなので、 【print "変数から実行\n】の後ろに認識する「ダブルコーテーション」を 入れることができれば・・・無理かなぁ
あほか
脆弱性作ろうとしてるのか? つーか、'使えばすぐ出来るだろ。
604 :
デフォルトの名無しさん :2005/10/22(土) 21:32:09
文字列中の、キーワードと完全一致する単語を数えたい。 下みたいなコードを書いて一応期待通りに動いていますが、もっとスマートな方法ありませんか? なお、単語はスペースで区切られていて、hoge は hogehoge とは一致しないものとします。 my $KEY = 'hoge'; #キーワード my $str = 'hoge hogehoge foo hoge bar hoge'; my $count = 0; while($str =~ s/(^$KEY\s|\s$KEY\s|\s$KEY$)//) { $count ++; } print "ans = $count\n";
605 :
604 :2005/10/22(土) 21:38:59
訂正。置換はスペースへの置換でした。 こうしないと、カウント失敗するパターンがあるので。 (' a hoge hoge' とか) 正) while($str =~ s/(^$KEY\s|\s$KEY\s|\s$KEY$)/ /) { $count ++; }
>>604 こんなもんかな。
my $KEY = 'hoge'; #キーワード
my $str = 'hoge hogehoge foo hoge bar hoge';
my %count;
foreach (split(/\s+/, $str)) {$count{$_}++ }
print "ans = $count{$KEY}\n";
printf "ans = %d\n", scalar m|\b$KEY\b|g; でもよさそうな?
>>607 始めそう思ったが駄目なはず。
@a = ($str =~ /\b$KEY\b/og); $count = scalar(@a);
破壊してよいなら、リファレンスマニュアル的に
$count = ($str =~ s/\b$KEY\b//og);
609 :
608 :2005/10/22(土) 22:40:22
いや、FAQ的にはこれでできてた。 $count = () = $str =~ /\b$KEY\b/og;
>>608 あれま、、、浅はかだったかぁ。。。
printf "ans = %dn", scalar map 1, $str =~ m|b$KEYb|og;'
これだと出てくるのかぁ(汗)
611 :
604 :2005/10/22(土) 22:45:23
どうもです。一応破壊はしてもかまわないです。
ところで、
>>607 の m|\b$KEY\b|g; はどういう処理ですか?
基本構文っぽいけど、見たことない。
>>609 ああ、なるほど。いったん配列で受けるのか。
これは応用でいろいろ使えそうですね。
えっと printf "ans = %d\n", scalar(() = $str =~ m|\b$KEY\b|og);
>>611 …スマートどうこう垂れるなら、マニュアル,FAQぐらいひけよ。
608,609 はそこにそのまま載っている。
614 :
デフォルトの名無しさん :2005/10/23(日) 01:06:44
print system(ping 10.1.1.1); の出力が0とか1になるのですが、ちゃんとしたpingとかの リプライを出力するにはどうしたらよいのでしょうか? よろしくお願いいたします。
`
617 :
デフォルトの名無しさん :2005/10/23(日) 01:43:30
656 printで解決をしたいです!
何したいのかよく分からないけど、 pingの出力をファイルに書き出して、 それを読むのもだめ?
`ping 10.1.1.1`
>>614 print `ping -c 3 10.1.1.1`;
621 :
デフォルトの名無しさん :2005/10/23(日) 10:41:58
#!/usr/bin/perl $host = '127.0.0.1'; $a = system("ping $host"); print "ping -c $host"; print $a; $aにpingの結果を入力し、その中からtime<1msの部分を抜き出す プログラムを作りたいのです。 が、print $a; の出力が0とかになるので、そこを直したいです。
$a = ` ping $host `;
623 :
デフォルトの名無しさん :2005/10/23(日) 11:22:28
>>622 ありがとうざいます。
その中からTimeのところを抜き出したいのですが、
ヒントをください。
NOTFILEDIRECTORYになってしまいます。
よろしくお願いいたします。
#!/usr/bin/perl
$host = '127.0.0.1';
$a = ` ping $host `;
print $a;
$b = `grep time $a`;
624 :
デフォルトの名無しさん :2005/10/23(日) 11:52:50
Linux> ping -n 127.0.0.1 Pinging 127.0.0.1 with 32 bytes of data: Reply from 127.0.0.1: bytes=32 time<1ms TTL=128 Reply from 127.0.0.1: bytes=32 time<1ms TTL=128 Linux>exit Windows>telnet 10.1.1.1 Username: Password: Unix> ping -n 2 127.0.0.1 Pinging 127.0.0.1 with 32 bytes of data: Reply from 127.0.0.1: bytes=32 time<5ms TTL=128 Reply from 127.0.0.1: bytes=32 time<5ms TTL=128 Unix>exit 上記のようなログがあり その中からpingのリプライのtime<xmsをリストするプログラムを教えてください 出力としては Linuxtime<1ms Unixtime<5ms にしたいです。 よろしくお願いいたします。
>>624 2行のReplyが1行になってるけど、timeは平均するの?
627 :
625 :2005/10/23(日) 12:13:55
#
>>624 テキトーに書いてみた。
my $time = 0;
my $time_count = 0;
while ($line = <>) {
if ($line =~ m/>.*?ping/) {
print "ping\n";
$time = 0;
$time_count = 0;
} elsif ($line =~ m/Reply[^<]+<(\d+)ms/) {
print "reply\n";
$time += $1;
$time_count++;
} elsif ($line =~ m/^(.*?)\s*>\s*exit/) {
print "exit\n";
my $name = $1;
next if $time_count == 0;
my $ms = $time / $time_count;
print $name, "<", $ms, "ms\n"
}
}
なんでNet::Ping使わないの?
system と ``の使い方も解らん奴にモジュールの使い方説明するのも めんどくさいから
630 :
デフォルトの名無しさん :2005/10/23(日) 20:13:29
ありがとうございます。
631 :
デフォルトの名無しさん :2005/10/23(日) 23:24:12
階乗の計算をするプログラムを組めと言われて、頑張って作りました。 答えの出力方法が分からないのですが、どうやれば良いのでしょうか? use strict; print "整数値を入力してください:\n"; chomp(my $number = <STDIN>); factorial($number); sub factorial { my $number = shift @_; return undef if $number < 0; # 無効な値 return 1 if $number == 0; return ($number * factorial($number-1)); }
print factorial($number), "\n"; じゃないの?
633 :
デフォルトの名無しさん :2005/10/23(日) 23:29:28
うわ、凄いミスしてました・・・。 ""の使い方間違っていました。 ありがとうございます! プログラムって面白いですね。
>>633 > プログラムって面白いですね。
そう思うなら早めにPerlから他の言語に鞍替えしなさい
635 :
デフォルトの名無しさん :2005/10/24(月) 01:40:03
すまん、普通に質問するわ。 モジュールの解説本(邦もの)で良いやつ紹介して。
階乗は再帰呼出の説明のためによく使われるが、 本当に再帰呼出を使うのはヴァカがすることです。 $ans *= $num-- while $num > 0;
Perlではね。
638 :
デフォルトの名無しさん :2005/10/24(月) 02:29:43
Perlをよく使われる方に質問です。
今HP自動巡回で使う wgetを使用してHPのhtmlファイルを集めています。
そこで、対象のアドレスが
http://www. 〜〜〜〜〜/k494949/ になっており
0〜999999までを集めるために繰り返し文を作成したのですが、エラーになってしまいます。
!#C:Perl
for($i=0;$i<=999999;$i++){
system("wget
http:// 〜〜〜〜〜〜〜.jp/k$i/");
このように、アドレスの数字の部分を変数にして回したいのですが
どうすればこのスクリプトは動きますか??
文法エラーだと出力されて、for と++)の近くが怪しいと出ています。
どなたかお力をお借りしたいです。
}
#!C:Perl
for($i=0;$i<=999999;$i++){
system("wget
http:// 〜〜〜〜〜〜〜.jp/k$i/");
}
これで大丈夫(^^)
集めているのはhtmlじゃないくせに… 迷惑だからやめろといいたいが、やるならせめて wget -w 5 …としてやってください で、 !#C:Perl がおかしいと思う
641 :
デフォルトの名無しさん :2005/10/24(月) 02:58:49
>639 返答ありがとうございます。 今試してみたのですが、うまくいっているようです(^^) あとできればもう一つ質問なんですが、得られたhtmlファイルが〜.html.1 〜.html.2という風に同ディレクトリに作成されます。 これをk494949.htmlまたは494949.htmlとアドレス通りのファイル名にした と考えています。 このやり方もご教授願えないでしょうか? >640 htmlファイルを集めて、文字パターンを使ったマッチングで必要な 文字を抜き出して、CSVファイルを作ろうとしています。
for ($i = 1; $i <= 494949; $i++) { rename("index.html.$i", "k$i.html"); }
643 :
デフォルトの名無しさん :2005/10/24(月) 14:02:18
Perlでファイルを指定したディレクトリに移動させるのはUNIXコマンド使えない鯖では どうやればいいんですか?
>>643 File::Copy でも使えば?
なんなら rename でも。
Cのヘッダ見ながら構造体用のpackテンプレートを 書いてて嫌になったんだけど、.hを通すとそれっぽい テンプレートにしてくれるツールとかないすかね。
647 :
デフォルトの名無しさん :2005/10/24(月) 16:02:18
>>642 ありがとうございました。うまく変換することができました。
やっぱりリファレンス本が必要ですね。
助かりました。
648 :
デフォルトの名無しさん :2005/10/24(月) 16:19:30
Windows2000にActivePerl 5.8.7.813をインストールしたんだけど、 system関数が機能しません。 何故でしょうか?教えて下さい。 ちなみにパスは通っています。
650 :
デフォルトの名無しさん :2005/10/24(月) 16:33:42
エラーはでませんが、実行されていない事は確実です。 perldoc -f system を実行すると、 Can't spawn "cmd.exe":No such file or directory at C:/Perl/lib/Pod/Perldoc.pm line1515. とエラーがでました。 何度か再インストールも行いました。 色々調べましたが、原因不明です。 お願いします。
>>650 c:\windows\system32にパスが通ってないんじゃない?
perlにはパス通したけどシステムのパスはずしちゃったってオチ?
652 :
デフォルトの名無しさん :2005/10/24(月) 16:48:21
環境変数も確認したのですが、 PATHにはC:\Perl\bin\が通っており、 ComSpecにはC:\WINNT\system32\cmd.exeが通っております。 PATH=C:\Perl\bin\;C:\WINNT\system32\ とすれば良いのでしょうか? 環境変数を変更した後って再起動が必要でしたっけ?
653 :
デフォルトの名無しさん :2005/10/24(月) 16:48:33
>>644 File::Copy使えない環境だとどうすればいいですか?
>>652 >PATH=C:\Perl\bin\;C:\WINNT\system32\
>とすれば良いのでしょうか?
それでやってみなよ。
コマンドプロンプトの再起動だけでいい。
# 当方XPなのでC:\windowsとか言って失礼
>>653 mkdir() して rename() でいいのでは?
>>654 仰る通りでした。本当にありがとうございました。
大変感謝しております。
657 :
655 :2005/10/24(月) 16:57:08
>>653 と思ったのだが、 File::Copy 使えないって、どんな環境の Perl だとそうなるの?
659 :
デフォルトの名無しさん :2005/10/24(月) 17:17:49
>>654 さん
ちなみにActivePerlってC:\Program Filesにインストールしても、
パスを通してやれば、ちゃんと動くんでしょうか?
半角スペースが入っているとダメでしたっけ?
660 :
644 :2005/10/24(月) 17:19:05
>>653 書き方が分かりづらかったね。
File::Copy 使うか、モジュールが使えない環境なら rename でも用は足りるだろ、といいたかった。
>>659 動くだろうけど、絶対問題が起こらないとは言い切れないな。
>>661 さん
わかりました、やってみます。
本当に色々とありがとうございました。
663 :
デフォルトの名無しさん :2005/10/25(火) 20:48:13
ログファイルを監視するスクリプトを作ろうとしてるのですが closeで止まってしまいます。 どうしたら動いてくれますか? ---------------------------------- open FH, "tail -f /var/log/messages |"; sleep 1; close FH; ----------------------------------
開いて閉じるだけじゃそりゃ何も動かないだろ
>646 Convert::Binary::C
PerlでDDNSクライアントを作っているのですが、 while(1)で永久ループさせるのってアリですか?
>>667 単なるプログラミングの一般論としてはアリ。
ただしレン鯖とかだと常駐モノは禁止されてることもある。
669 :
663 :2005/10/25(火) 22:58:21
>>666 ログファイルのローテートに対応するために、
open FH, "tail --follow=name --retry /var/log/messages |";
としてtailコマンドを使いたかったんですけど、この目的のためには
File::Tailしかないのかなぁ?
>>669 だからなぜFHをcloseするのかと...
普通に読み出せばええやん。
>663 while(<FH>)
672 :
デフォルトの名無しさん :2005/10/26(水) 01:39:50
phpとの違いが知りたいです
674 :
デフォルトの名無しさん :2005/10/26(水) 02:14:23
Perlと関係ないって? それなら、どこで聞けばいいかな・・・
動的に作成した画像をWindowsのウィンドウ上に表示しようとしています。 現在はPerlMagick+Win32::GUIを使い、 【PerlMagickで画像作成&png等書き出し→ Win32::GUI::DIBitmapでpng等読み込み&bmp保存→ Win32::GUI::Bitmapで読み込み】 としているのですが、一時ファイルを使わない方法を探しています。 勉強中なので同じ処理ができるかどうかわかりませんが、もしGDやTkで可能でしたら教えてください。
677 :
663 :2005/10/26(水) 11:50:18
もう少し詳しく言うと、子プロセスのtailが終了してくれず、 straceでみるとwait4で止まったままです。 下記のスクリプトは問題箇所だけを抽出しましたが、print文は 実行されません。 ---------------------------------- open FH, "tail -f /var/log/messages |"; #ログの処理 sleep 1; close FH; print "end\n"; ----------------------------------
678 :
デフォルトの名無しさん :2005/10/26(水) 13:14:31
>>677 openからPID獲って、closeする前SIGINTでも撃ち込めばいいんじゃないの?
>>663 >>677 EOF フラグを消す必要がある。
see perl cookbook 3rd ed.
open FH, "/var/log/messages" or die $!;
for (;;) {
while (<FH>) { #ログの処理 }
sleep $SOMETIME;
seek( FH, 0, 1 ); # EOF フラグをクリア
}
s/3rd ed/1st ed/ sorry.
>>667 > PerlでDDNSクライアントを作っているのですが、
もうあるよ
682 :
デフォルトの名無しさん :2005/10/26(水) 17:38:21
ぜひ教えてください。 かたかなとひらがなを判別することは できるんでしょうか?? 全角半角まではたどり着いたのですが、 カタカナでなかったらエラー、としたいのです。 よろしくお願いします。
\p{InKatakana}
うお、直リンしちゃった・・・スマソ
686 :
デフォルトの名無しさん :2005/10/26(水) 20:32:36
scalarコンテキストでの readline はファイルの最初の行から一行ずつ順番に読み出しますが、 逆に、ファイルの最後のの行から一行ずつ、逆順に読み出す為にはどうしたら良いでしょうか。
>>686 File::ReadBackwards
689 :
デフォルトの名無しさん :2005/10/26(水) 21:11:31
>>684 うおおおおおおおお!
ありがとうございます!!
大変助かりました!!!!
>>690 そんなに難しいもんじゃないので自作しても良いかと♪
www.perl.org落ちてる?
>>693 やっぱり? 俺もさっき繋がらなかったヨー
695 :
デフォルトの名無しさん :2005/10/26(水) 23:07:39
Perlの話じゃないかも、なのですが… コンソールから $ hoge.pl [Enter] と生手打ちで起動されたか、 あるいは Cronなどから無人で起動されたかを スクリプト内から判断する方法ってないでしょうか? すんません、よかったら教えてください。
697 :
695 :2005/10/26(水) 23:26:40
おおおぅ!ばっちしです。 -t という演算子も初めて知りました。 ありがとうございます。
PerlでDDNSクライアント作りました。 理由はMyDNSで使えるものが無かったからです。 DDNSサーバによって認証方法がまちまちなので 認証実行部分はクラス化してStrategyパターンで プラグイン可能にしてあります。
そうですか
700 :
デフォルトの名無しさん :2005/10/27(木) 07:49:32
マトリクスの中の値の大きさでソートするには、どうすればいいでしょうか? 今のところ、ハッシュで二次元配列を作り、その値を<=>でソートするような事 しかイメージできていないのですが、これだと、$aと$bをどう使いまわせばいい のか思いつきません。このような方法か、二次元配列以外の方法で、解決する方 法がありましたら、御教授ください。 よろしくお願いします。
my $abc = pack('B16', '0000000000000000'); のabcの中身はどうすれば確認できるでしょうか? printなどを試してみましたが、うまく行かなかったので お教えください。
print unpack('B16', $abc), "\n";
>703 ありがとうございます。 うまく出力できました。
705 :
デフォルトの名無しさん :2005/10/27(木) 14:57:29
my $id = pack('B16', '0000000000000000'); my $flg_binary = sprintf("%d%04d%d%d%d%d%03d%d", 0, 0, 0, 0, 1, 0, 0, 0); my $flg = pack("B16", $flg_binary); my $question_count = pack('n', 1); my $response_count = pack('n', 0); my $auth_count = pack('n', 0); my $ext_count = pack('n', 0); my $query_name = "wwwyahoocojp"; my $query_type = pack('n', 1); my $query_class = pack('n', 1); my $question = $query_name.$query_type.$query_class; my $request = $id.$flg.$question_count.$response_count.$auth_count.$ext_count.$question; というプログラムで最後の行の$requestの中身が知りたいのですが、 print "request = $request\n"; と最後に追加して実行すると下記のように表示されます。 request = wwwyahoocojp プログラムの流れを見ていると、 もっといろいろ付加されているように思われるのですが、 $query_nameの値しか反映されておりません。 どこに問題があるか分かる方いらっしゃいますか。 分かるようでしたら教えてください。よろしくお願いします。
706 :
デフォルトの名無しさん :2005/10/27(木) 15:06:55
CPAN 誕生日なのかな。
>>705 sub hd { join ' ', map uc unpack('H2', $_), split //, $_[0] }
my %data = (
id => '0000000000000000',
flg => [ 0,0,0,0,1,0,0,0 ],
question_count => 1,
response_count => 0,
auth_count => 0,
ext_count => 0,
query_name => 'wwwyahoocojp',
query_type => 1,
query_class => 1,
);
my $request = join '', (
pack(B16 => $data{'id'}),
pack(B16 => sprintf '%d%04d%d%d%d%d%03d%d', @{$data{'flg'}}),
pack(n => $data{'question_count'}),
pack(n => $data{'response_count'}),
pack(n => $data{'auth_count'}),
pack(n => $data{'ext_count'}),
$data{'query_name'},
pack(n => $data{'query_type'}),
pack(n => $data{'query_class'}),
);
print hd($request);
>>705 単に表示可能な文字列ではないだけだと思うが。
709 :
デフォルトの名無しさん :2005/10/27(木) 16:16:19
>707
>708
実行してみたところ、下記のように表示されましたが、
もうしわけありません、理解できませんでしたorz。
00 00 01 00 00 01 00 00 00 00 00 00 77 77
77 79 61 68 6F 6F 63 6F 6A 70 00 01 00 01
今やろうとしているのは
http://x68000.q-e-d.net/~68user/net/sample/resolver-1.pl の、DNSクライアントをCに移植させたいと思っています。
$requestの中身を表示させたかったのは
この中身がDNSパケットのデータそのものではないかと思い、
これが分かれば、そのデータをそのまま決め打ちしてDNSサーバにデータを
送っても名前解決をしてくれないかなと思ったからです。
最終的には決めうちではなく、
入力されたデータにきちんと対応するようにしたいのですが、
pack('B16', ...)に相当するC言語の処理の仕方が分からないなどの問題があり、
とりあえず決め打ちさせてみようと思いました。
ここら辺のお話が分かるようでしたらご教授願えればと思います。
よろしくお願いします。
わかるけどその16進ダンプを見て理解できないレベルの奴に その辺の基礎から教えるのは疲れるからやだな。いろいろ 勉強してから出直してくれ...
711 :
デフォルトの名無しさん :2005/10/27(木) 16:36:55
>710 たしかにそのとおりですね。 perlはほとんど触ったことが無いのでもっとperlの勉強をやらないとだめですね。 一応16進ダンプの中身は分かるのですが。 00 00がid 01 00がflg 00 01がquestion_count 00 00がresponse_count 00 00がauth_count 00 00がext_count 77 77 77 79 61 68 6F 6F 63 6F 6A 70がwwwyahoocojp 01がquery_type 01がquery_class でも作っていただいたソース自体が理解できてないorz。
>>713 > if($keitaiso[$i] ne "EOS"){
> $len[$i] = length($keitaiso[$i]);
> $mojisuu[$k] = $mojisuu[$k] + $len[$i];
ここは読んで字の如しじゃないの?
もし EOS でなければ、
文字数 += $keitaiso[$i] の文字数
EOS は end of string の略とかでは。
読みにくいコードだこと
>>716 だよなあ。それに use strict とかしろっつー見本というか、のっけからコレだし。
> open(FP1,$chfname) || die "can't open $chname\n";
>>713 ああああああああああああああああああああ!
こうゆうソースを見ると、無性に書き直したくなる。
$mojisuu[$k] += length($keitaiso[$i]) if $keitaiso[$i] ne "EOS";
>>713 その先は、結果の出力。
中身が数値の $rank[$gyou] が文字列 "99" と等しい時に出力を抑制しているので、
数値から文字列への変換フォーマットには注意が必要やね。
みなさんすいません。まだperl習って1ヶ月くらいなもんでf^^; いろいろ意見ありがとうございますm(__)m
>>720 他のソース(もっときれいなやつ)で勉強しなされ。
お前が次にする質問はこうだっッ! 「きれいなソースはどこに行けば見れますか?」 あえて言うが川合-Hippo2000-孝典氏のソースを推薦する。
>712 いろいろとご指導ありがとうございます。 その後>707のソースを>709の該当部分に移植して、 どんなドメイン名を渡したら、どんな16進の値が格納されるか分かりました。 格納される値についても理解できました。 例 「www.yahoo.co.jp」を渡すと 00000100000100000000000003777777057961686F6F02636F026A700000010001 「infoseek.jp」を渡すと 00000100000100000000000008696E666F7365656B026A700000010001 もっともCに移植する際に必要なものは、この16進の値ではなく その一歩前の値のような気がするのですが、 それをどう移植すればよいか分からずorz
>>724 そもそもな話だけど、そんなリバースエンジニアリングみたいなセコいことせずに、
DNS の規格に当たった方が良いような気がする。
もっと言うと、巷にころがってる既存の DNS のリゾルバライブラリを探した方が、
楽してマトモなモノができるような気がする。
教えてください。 これからperlを勉強しようと、WinXPに最新のActivePerlを 入れてみました。 でよくあるプログラムのように、先頭に #!c:/perl/bin/Perl.exe とやってprintとか適当にやってみたら実行できましたが、 この先頭の#!の行を取り除いても実行できてしまいました。 先頭のPerlの指定はなぜいらないのでしょうか? どのようなときに必要なのですか?
728 :
デフォルトの名無しさん :2005/10/27(木) 23:56:50
シュワルツ変換ってなんですか? 「シュワルツ変換」とか「シュワルツ変換とは」でgoogleしてみたのですが、 以下のようなコードが出てきて、何をやっているかはわかるんだけど、これのうち、 どの考え方のことをシュワルツ変換と呼ぶのかがわかりません。 @data = map {$_->[0]} sort {$a->[2] <=> $b->[2]} map {[$_, split /,/]} @data; map とか sort とかを多段で使うことを言うのでしょうか。 (そうではないという気はしているんですが。うまく言えない。)
>>726 windows 上では 拡張子と実行ファイルが関連付けられているので
その1行目は不要。
.html ファイルをダブルクリックしたら
windows 上だったらブラウザが起動したりするのと同じ仕組み。
>>728 ラクダ本かperl cookbook に詳しく書かれてる。参考まで。
732 :
726 :2005/10/28(金) 00:29:21
>>729 ありがとうございました。
たしかにそうですね。
Windows上でもWebサーバに拡張子cgiでおく時なんかに先頭の行が
必要になってくるんですね。
ANHTTPDではWindowsのパス優先な設定があったのは覚えてるけど、Apacheもあるんかいな?
モジュールの解説は利用するけど、コーディングを参考にしたことは、無い。
736 :
デフォルトの名無しさん :2005/10/28(金) 02:08:13
テキストフォームから送信されたデータをPerlで保存するのに そのまんまのデータを書き込む方法しか知らないので ファイルを見られたら何が保存されているかすぐわかっちゃうので WINDOWSのアプリのデータファイルみたいに読めないような形式で保存したいんだけど Perlではこういう形式では保存できないんでしょうか?
pack('c'、$value);とか
>>736 確かに、Windowsのアプリのデータって言ったら
>>737 のように
大半は単にバイナリデータとして保存されてるだけが
それだけじゃちょっと知識がある人が見ればすぐに分かるが。
文字列データはそのまま格納されてるしな。
そういう目的ならCrypt::CBCとか使って暗号化でもすれば?
>>707 ロゴのAの文字がケーキに変わってたのか。いまさら気づいた
740 :
デフォルトの名無しさん :2005/10/28(金) 04:37:26
$hogeの値が、もしもaかbかcかdならば if ($hoge eq 'a' |$hoge eq 'b' |$hoge eq 'c' |$hoge eq 'd') これ、もっとシンプルな書き方ありませんか?
if ($hoge =~ /^([a-d])$/) {}
>>741 ありがとうございます。
'a','b','c','d'のほうに|,ORをかける方法ありませんか?
if ($hoge =~ /^(?:a|b|c|d)$/) {}
ありがとうとざいます。 やっぱマッチ使わないと駄目か。。
>>744 マッチングを使いたくないならサブルーチン作っとけば?
sub in_array ($@) {
my $val = shift;
$val eq $_ && return 1 for @_;
0;
}
if (in_array($hoge, 'a', 'b', 'c', 'd'))
ところで|じゃビット演算だぞ。論理演算なら||にしないと
746 :
700 :2005/10/28(金) 08:17:59
教えてください。 Perlのプログラムからシステムコマンドを実行できますよね。 `perldoc`; こんな感じで。 でも `perldoc -u -t`; みたいにオプション指定でスペースが含まれてしまうと、 コマンドがちゃんと実行されないようです。 変数には取り込めるようですが・・・。 スペースが含まれてるとだめなのでしょうか?それとも何か 方法があるのでしょうか?
>>748 そりゃ大いにあなたの何か勘違いでしょう。
ちなみにいちおう system()と ``(qx//)は違うものですよ。(マニュアル参照)
perl -e 'system "echo A B C"'
perl -e '`echo A B C`'
perl -e 'print `echo A B C`'
>>742 %match = ( a => 1, b => 1, c => 1, d => 1);
if ($match{$hoge}) {
}
じゃ駄目なの?
そんなんなんでもいいんだが、 $hoge == 'a' OR 'b' OR 'c' OR 'd' とかでも書けるのがシンプルなんだと想いたいだけと思われ。
use Quantum::Superpositions; if ($hoge == any('a', 'b', 'c', 'd')) { ... }
ログを取る為モジュールってありませんか?
Log::Log4perl
use constantで定数定義を羅列したファイルがあって、 それをrequireしたファイルで使うことってできないのでしょうか?
756 :
748 :2005/10/29(土) 11:55:17
>>749 レスどうもです。
ようやくわかりました。
逆クォートは出力を取り込むときなんかに使うみたいですね。
単にコマンド実行したい場合は、そうやっちゃいけないと、
リャマにありました。
>>755 言ってるコトが微妙にわからんけど、requireじゃなくてuseで呼び出すのでは?
えーと、て言うかよくわからんので、俺なりの答え。
1:定数定義は、定数を使ってる所より先にコンパイラにお見せする。
2:名前空間(パッケージ)がちゃんと同じになるように気をつける。
3:同じプロセス内である。
これを満たせば大丈夫かと。
↑うざい
ユーザ名からuidを得るのに `id -u ユーザ名` または passwdファイルを見る 以外の方法があれば教えてください。
>>764 >>765 どもですー。
passwdファイルを見るっていうのは自分でopenなどする処理を書くという意味です。
隠蔽してくれるならそれでOK。
>>766 隠蔽って言葉の使い方間違えてるんじゃあるまいか。
素直に、ユーザ名からuidを得る為のAPIかライブラリ、コード片を教えてください、
自分ではきれいに書けないので、とでも言うほうが話が通じるだろうに。
つか、
>>764 にそのものズバリ教えてもらっているのに、マニュアルや
リファレンスをまともに見たことも見る気も一度も無いのバレバレだよ。
(ドキュメントはいっさい隠蔽されました?)
764に教えてもらったのを765のアドレスで確認して二人にお礼をいったのですが。 隠蔽の意味はどうだか知りませんが、/etc/passwdから読むぐらいの処理は自分でもかけますよ。 「perl ユーザ名 uid」とか適当にぐぐったけど見つからなかったので質問しました。 マニュアルをどう探せばよかったのか教えてもらえれば役に立つと思います。
あ、グーグルでは2ページ目にでていたようです
ヒアドキュメントの終了子を変数で制御してみたいのですが 無理なんでしょうか? print <<"$EOM"; abc def ghi jkl mno
A.pl の中に、package A1; package B1; と2種類の自作パッケージを書いたのですが、 use A1; はよくて、use B1 の方は INC に無いと怒られてしまいます。 2つのpackageの定義はどうしたらよいでしょうか?
>>770 eval使やできなくはないと思うが、普通そんなことしたいと思わないぞ。
仮にそれが必要だったとしたら、設計間違ってる気がする。
>>768 まさしく、
>マニュアルやリファレンスをまともに見たことも見る気も一度も無いのバレバレだよ。
>(ドキュメントはいっさい隠蔽されました?)
そのものというわけですね。
771氏が丁寧に書いてくれてるけど、ドキュメントも読めないでぐぐればすむと
勘違いしてるリテラシの低さに気がつかないままの人も少なくないのかsigh.
>>/etc/passwdから読むぐらいの処理は自分でもかけますよ。
プチワロタ
>>770 だいたい例えば終端が ghi ならその後構文エラーだろ。
そんな仕掛け、まあ必要でもないしほとんど意味無いよな。
print <<"$EOM";
abc
def
ghi
jkl
mno
ユーザとuidの対応がpasswdファイル読めばわかるという ところには誰もつっこまないのか?
>>777 その前に、NISクライアントはどうする?
/etc/passwdなんか見たって、役に立つ情報は何もないぞw
理解してないだろからそのレベルで突っ込んでも虚し過ぎるのが明白
780 :
770 :2005/10/30(日) 14:24:15
>>771 ,774,776
どもです。
まあまあ。
ヒアドキュメントに書いたSQLをDBIに投げることをよくやってるのですが
「ある条件の場合はWHERE句以降いらない」とか、逆に「AND でつないで条件追加」
とかそんな感じの処理がよく出てくるわけです。
制御が複雑になってくると、だんだん見た目にごちゃごちゃしてきちゃうんだけれども
ヒアドキュメント自体は分かりやすい仕組みだし、これで通せればそれに越したことはない。
変数かなにかで終端位置を制御できればなんかできるかなぁ〜?
と思いまして、そういうところです。
>>780 根本的に、設計思想が間違ってる。
かの有名な「プログラム書法」でも読むことだな。
782 :
770 :2005/10/30(日) 15:59:56
>>781 え?なんでですか? Perlの設計思想のこと?
ラクできるならラクしたいですよね。
無い物ねだりだったみたいだけれど…
(つまり、それ用のプリプロセッサでも書きなさいということなんでしょうかね)
>>780 まあ間違っとるとまで判断材料ないけど、センスは無いよなぁ。
終端位置を制御(??)したって解決になりゃしなかろうに。
手書きSQLと同じベタで書けば、あたかも見通しが良さそうな気がするだけだろうが、
ヒアドキュメントでベタに点在すれば、構造見難くごたつくのはあたりまえ。
設計思想はおいておくとして、Perlでの実装方法としてはこういうのはどうだろう sub join_range($@) { my $range = shift; join('', @_[@$range]) } print join_range([0..1], <<FOO, <<BAR, <<BAZ); hogehoge FOO fugafuga BAR piyopiyo BAZ
>>782 なら、SQL文のタネになる文字列をヒアドキュメントで読み込んでおき、
条件に応じてその文字列を編集するというのが普通の考え方だろう。
786 :
785 :2005/10/30(日) 16:25:03
例えば、以下の例では、$sql_orgをそのまま使う、 「--caseA」のみを消す、さらに「--caseB」を消す、 という使い方ができる。 $sql_org = <<'__EOS__'; SELECT * FROM PRODUCTS --caseA WHERE CATEGORY = 'DISK' --caseA --caseB AND PRICE > 1000 __EOS__
787 :
770 :2005/10/30(日) 16:30:12
>>784 わっ!すばらしい。配列/リストで制御するのですね。ばっちり!
サンクスです。こんな感じにしてみました。
my $sql = join '', (<<"--> BASE", <<"--> EXTEND1", <<"--> EXTEND2", )[0..2];
SELECT * FROM hoge
--> BASE
WHERE a = 1
--> EXTEND1
AND b= 2
--> EXTEND2
これならヒアドキュメント全体をそのまま切り取ってsqlplusなどでテストできますし
いちいちクエリを文字列に落としてからテストする手間がはぶけますよ。
ありがとうございます。
>> 785
確かにふつうはそうなんでしょうが…、もっとPerl的な解決法が
あるんじゃなかろうかと思ってたのです。
788 :
770 :2005/10/30(日) 16:38:12
>>786 サンクスです!カキコ中にかぶってしまったようです。すんません。
$sql_origを作ったあと
$sql_orig =~ s/--caseA//g if ($case eq 'A');
という感じにするわけですね。これもいいなあ。ありがとうございます。
ヒアドキュメントにしなくても この場合ならフォーマット使って3項演算子使えばいいんじゃないの? printf ( '%s%s%s%s', $hoge, $Hage, $fuge $nullpo ); どちらにしろ設計やり直したほうがよさ毛だけどね。
ま、Perlプログラマらしくていいんじゃないの
791 :
770 :2005/10/30(日) 18:06:50
>>789 どもです。いや、sprintfで3項演算子とかだと
その部分を切り取った場合にSQL互換じゃなくなるので
いまいちです。
(→整形しなければそのままクエリとして流してテストできないので)
HTTPSによるソケット通信の方法をご教授ください。
>>794 ? それはshプログラマの様に保守的という意味でか?
787のは下手に変数切り貼りするより、ずっと保守性向上しているように見えるが。
796 :
デフォルトの名無しさん :2005/10/30(日) 20:27:24
データを書き込むときのファイルロックの方法ってflock以外では 1:ロック用ファイルがなければopen関数でロック用ファイルを作る(あればデータを書き込まない) 2:ファイルのデータを全部読み出し配列に格納する 3:書き込むデータを配列に追加 4:配列のデータをopen関数で全部ファイルに書き込む 5ロック用ファイルの削除 でも問題ないんでしょうか??
>>796 >5ロック用ファイルの削除
する前に何らかの事情でプログラムが dieしたとき困ると思うけどな。
END{ }かなにかにロックをクリーンアップする仕組みも入れておいた方がいいよ。
その他の問題は別としても。
他にシグナルに落とされた場合も考えて ハンドラ設定した方がよいか。
>>796 それじゃ完全なロックになって無いな
1のところはこういう感じの実装だろう
return if -e $lock; # 戻るなりsleepするなり
open LOCK "> $lock";
close LOCK;
しかし、二つのプロセスがこういう順番で動いたときを考えて欲しい
proc1: return if -e $lock;
proc2: return if -e $lock;
proc1: open LOCK "> $lock";
proc2: open LOCK "> $lock";
これでは、ファイルが作られる前に双方共にチェックを通過してしまうため、ちゃんとロックされない。
一般的にはmkdirとかsymlinkとかを使って、作ることが出来なかったらロック中、という方法を使う。
参考:
http://homepage1.nifty.com/glass/tom_neko/web/web_04.html
そういやロック用のモジュールってあんまり聞かないな CPANで探してみたらLockFile-Simpleってのがあったけれど、 オブジェクト一つがロック一つに対応しているんじゃないあたりとかどうもしっくり来ない… 良い感じに抽象化されたモジュール無いかな
文字列連結演算子'.'ってprint関数で使う分にはカンマ','を使うのと 違いありませんよね?
>>793 ヘッダに色々付け加えたいのでそれではできませんでした。
printで使うカンマは配列として扱われるから、連結ではない。
809 :
デフォルトの名無しさん :2005/10/30(日) 22:35:29
>>808 > HTTPS使って、POSTでヘッダに X-2ch-UAをつけるのは無理なんでしょうか。
無理ってどういう意味だよ
LWP::UserAgent $ua->default_header( $field => $value ) これでよさげな・・・
>>805 まぁ内部的にはそうなのかもしれませんが、出力される結果は
同じになるのではないかと・・・。
>>812 文字列を連結してから print するよりも、print したいものをコンマで
区切って与えた方が速いことがある。<中略> これに反して、
アーキテクチャと値によっては、連結したほうが速い場合もある。
-- 駱駝本 2nd Edition 8.3.1 時間の効率を上げるためのヒント より
sub foo { @_ }
print foo('bar', 'baz'), "\n"; # リストコンテキストなので barbaz
print foo('bar', 'baz') . "\n"; # スカラーコンテキストなので 2
print 'foo', my $bar = 'bar', 'baz'; # コンマならこういう書き方も可能
>>813 なるほどねぇ。
やっぱり違いますね。コンマと連結とじゃあ・・・。
ところでサブルーチンですが、組み込み関数のように&なしで
呼び出す場合、起動よりも前でサブルーチンを定義していなきゃ
いけないと本にあったのですが、起動より後に定義してあっても
&なしで普通にコールできたのですが、このあたりはあいまいですか?
&があったほうが個人的にはみやすいかな。 知らない関数かと思ってリファレンス引いちゃうよorz
>>816 > &があったほうが個人的にはみやすいかな。
> 知らない関数かと思ってリファレンス引いちゃうよorz
熟達者は、「知らない関数は無い」という域に突入することで、
そのような混乱から無縁でいられる。
関数一覧を舐めるように読むのが彼らの楽しみである。
()つけるなら&いらないって話じゃなかったのか。 てことは&つけなくて呼び出すときは、渡すものが無くてもhoge();と書けって事?
sub foo() {〜}ってプロトタイプつきで宣言しておけば単純に foo; で呼び出せる。
>>820 「使う前」に宣言してさえあればプロトタイプの有無に関係無くそう呼べる。
sub foo { print 'foo' }
foo;
sub bar;
bar;
sub bar { print 'bar' }
なるほど、勉強になりました。 今後は意識して書くようにします。
>>821 やべ、プロトタイプいるんだと思い込んでたorz
普段、先頭でプロトタイプ付きで宣言して、コードの最後で本体を書いてるからか。
824 :
デフォルトの名無しさん :2005/10/31(月) 06:26:06
んなもん鯖側の設定しだいだし
826 :
814 :2005/10/31(月) 07:59:52
みなさん、ありがとうございました。 &は定義の位置や宣言の有無にかかわらず、省けるんですね。 カッコ省略は前方に定義や宣言がいるわけですね。
>>814 ,826
それらとは無関係に & が省略できないコンテキストは存在する。
マニュアルの内容も確認できない奴が、仕様が曖昧だとか、
そんな中途半端な覚え方なぞする必要はまったく無いし有害だ。
Perl6っていいですか?
過去スレで
sub absolute($)
{
my $str = shift;
my $ret;
$str =~ s/^"//;
$str =~ s/"$//;
if($str =~ m,^/,) { return qq("$server$str"); } elsif($str =~ m,^
http://, ) { return qq("$str"); } else { return qq("$base$str"); }
}
ってのを発見して使いたいなと思ったのですが、サーバー名とベース名をURLから切り分けるのが何故かうまくいきません
$url = '
http://www.example.com/files/test.html ';
$url =~,(
http://[^/]*/ )(.*),;
$server = $1;
$base = $2;
とした場合、$baseにtest.htmlも含まれてしまいます。
これの正しい正規表現はどうなるのでしょうか?宜しくお願いします。
(^_^)/
834 :
824 :2005/10/31(月) 16:32:12
そのサーバーの設定を知るにはどうすればいいんですか? ファイルネームなしで突っ込むとファイルを取ってこれないんです。
>>834 それを知る方法は無い、といわれてるんだが
Apache以外知らないが、Apacheの場合はhttpd.confは元より、
.htaccessに関しても外部からはアクセスできないようになっていることが多い。
そのサーバーのパスワードが知りたいんですがどうすれば良いんですか?
と同じくらい愚問だということだ
まあ、index.htmlとかindex.phpとかありがちなものに対してHEADリクエストを送ってみるという手はあるかもね
836 :
デフォルトの名無しさん :2005/10/31(月) 16:44:22
じゃあ、ブラウザはどうやってとってきてんですか? 3xxコード出てますか?
>>836 何か間違えたんじゃないか?DirectoryIndexの処理はサーバ側で行われる
/path/の形でリクエストを送ればサーバからは普通に返ってくるぞ?
どうやってそのウェブページをPerlで取得しようとしてるのか書いてみれば
誰かアドバイスをくれるかもね
>>836 まあperl以前の話だから他で勉強しなおしてこいよ。
(RFC読むとかさ。wgetか telnetで server responseでも見れ)
839 :
デフォルトの名無しさん :2005/10/31(月) 18:51:28
>>836 > じゃあ、ブラウザはどうやってとってきてんですか?
> 3xxコード出てますか?
それを調べることができるのはお前だけ。
>>832 ありがとうございます。
かなり使いたかったので真剣に読んで見ましたが英語が得意ではないためにあまり使い方が理解出来ませんでした。すいません。
yukiwikiを設置しようとしているのですが うまくいきません pcheck.cgiでチェックすると [Mon Oct 31 21:46:15 2005] wiki.cgi: Can't locate Yuki/RSS.pm in @INC (@INC contains: . /usr/local/lib/perl5/site_perl/5.8.4/mach /usr/local/lib/perl5/site_perl/5.8.4 /usr/local/lib/perl5/site_perl/5.005 /usr/local/lib/perl5/site_perl /usr/local/lib/perl5/5.8.4/BSDPAN /usr/local/lib/perl5/5.8.4/mach /usr/local/lib/perl5/5.8.4) at wiki/wiki.cgi line 18. [Mon Oct 31 21:46:15 2005] wiki.cgi: BEGIN failed--compilation aborted at wiki/wiki.cgi line 18. Content-type: text/html Software error: Can't locate Yuki/RSS.pm in @INC (@INC contains: . /usr/local/lib/perl5/site_perl/5.8.4/mach /usr/local/lib/perl5/site_perl/5.8.4 /usr/local/lib/perl5/site_perl/5.005 /usr/local/lib/perl5/site_perl /usr/local/lib/perl5/5.8.4/BSDPAN /usr/local/lib/perl5/5.8.4/mach /usr/local/lib/perl5/5.8.4) at wiki/wiki.cgi line 18. BEGIN failed--compilation aborted at wiki/wiki.cgi line 18. というメッセージがでます 18行目はuse Yuki::RSS;となっているのですがどうすればうまくいくでしょうか?
844 :
841 :2005/10/31(月) 22:23:48
移動します ありがとうございました
845 :
デフォルトの名無しさん :2005/10/31(月) 23:34:35
TLS をうまく扱うパッケージって何かないかしら? IO::Sockt::INET でオープンしたソケットに対して操作したいんだけど。
SSL通信を行うと Client-SSL-Warning: Peer certificate not verified と怒られてしまいました。IDとPasswordはあっています。 どうしてかわかりません。教えてください。
848 :
デフォルトの名無しさん :2005/11/01(火) 12:15:50
ActivePerl 5.8.7にて open(LIST, "dir /b log|"); という文が dir: /b: No such file or directory とエラーを吐いてしまいます。 logディレクトリにあるファイルの一覧をパイプ経由で開きたいのですが 正常に動かそうとするにはどう書けばいいんでしょうか?
open(LIST, "dir \\b log|"); じゃない?
>>848 なんつーか・・・もしかしてUn*x系のシステムでそのコマンドを実行しようとしてるんじゃあるまいね?
って、ActivePerlなんだからWindows環境かorzスマソ 奇妙だね…
>>848 open LIST, 'dir -B log |' or die $!;
パスの通った場所にWindows標準以外のdirコマンドが置かれてたりしないか
854 :
852 :2005/11/01(火) 13:01:37
あぁ、そういや Cygwin のが入ってるわ。
>>852 はナシ。
855 :
848 :2005/11/01(火) 13:05:29
open(LIST, "cmd.exe /c dir /b log|"); としたら通りました… ちょっと前まではこんなことしなくても動いてたんですけど。 何故なんでしょう?
857 :
848 :2005/11/01(火) 13:12:34
>>853 ビンゴでした。先日cygwinをインストールしたのが原因のようです。
cygwinにdirコマンドなんてあったんだ…。
cmd.exeの方を優先するように出来ないのかなあ。
>>857 pathが通った場所においておくということ自体、それを何所からでも使えるようにしたいということなのだから、
dir.exeを消すか、またはCygwin内のみpathが通るような場所に置くべきじゃないかな
# スレ違いスマソ
859 :
デフォルトの名無しさん :2005/11/01(火) 13:52:42
あるファイルにデータを用意しておいて、Web上にあるフォームにそのデータを入力し、 その結果をファイルに保存したいのですが、どうしたらいいのかわかりません。 perlの入門書を購入し、cgiの本も購入したのですが、わかりませんでした。 どんな本、または、どんなキーワードで検索すればいいですか?
>>857 perl を使う用途(と Cygwin を入れた意図)によっては
ActivePerl 捨てて、perl 使う作業は cygwin 環境に一本化という手もある。
>>848 のようなパイプ処理がしたいのならなおさら。
>perlの入門書を購入し、cgiの本も購入したのですが、わかりませんでした。 >どんな本、または、どんなキーワードで検索すればいいですか? 致命的だな。 板違いなのはおじさんゆるしてあげるから、他板で聞くときはちゃんと どんな本を買ったかくらい言うんだよ。
>>857 可能なら極力外部コマンドを使わないような方針にするのが良いと思う。
opendirとかしらんのかね...
>>848 864が言ってるopendir 他、glob, DirHandleモジュール、File::Findモジュールとか調べとけ。
>>524 CHECKはPerlの予約語だから使用は控えておけ
既に伸びているスレに来て最初から読んでいく、なんてことはいくらでもあり得る。 レス先以外にも等しく意味を持つ話なら、内容が古くない限り亀上等だし。
>>866 そうだっけ? 全部小文字だと将来予約語とぶつかるかもしれないから
ラベルやファイルハンドルには大文字まぜとけってのは聞いたこと
あるが。
BEGINやENDは知ってても、CHECKやINITを知らない奴は多い。
perldoc
>>872 いや、perldoc でどこに書いているか探せれなかったので聞いてるんですが・・・
>>873 tp://www.google.co.jp/search?num=50&lr=lang_ja&q=perldoc+begin+end+check+init
検索も出来ないのか?
>>874 すんませんでした。
ローカルにある perldoc の内容をインターネットで検索するという
富豪的な発想ができない貧弱な頭なのです・・・
ラベルには関係ないに一票。 まぁ、紛らわしいから俺は使わんけど、安全といえば安全。
goto ラベル のほかに goto 式 もありなので、あるとき突然 ラベルだと思って書いてた文字列が式になっちゃった、という ことを避けるには小文字だけの名前を使うなということに なっている。たぶん式になるような予約語は小文字だけという 方針があって、大文字のBEGINやCHECKは式にはならない ので区別がつくからかまわんってことなんだろうな。 876同様、オレも見かけ上まぎらわしいと思うのでそういうの は避けるけど、後から追加されるのはどうしようもないなぁ。
サブルーチンとラベルの区別が付かない程度の習熟度で
CHECK() の存在を知っていてこれらのルーチンを不注意で
呼び出しちゃうんじゃないかと心配する子というのは相当に
歪な学び方をしていると思う。
<q cite="
http://search.cpan.org/~nwclark/perl-5.8.7/pod/perlmod.pod#BEGIN,_CHECK,_INIT_and_END ">
One should note that these code blocks don't really exist
as named subroutines (despite their appearance).
</q>
#!/usr/local/bin/perl
use strict;
BEGIN { print "1\n"; my $rv = 'BEGIN' }
sub BEGIN { print "2\n"; my $rv = 'BEGIN' }
my $i = 6;
BEGIN: {
++$i < 10 || last BEGIN;
eval { goto &BEGIN } || print $@;
eval { goto BEGIN() } || print $@;
print "$i\n";
eval { goto BEGIN } || print $@;
}
__END__
>>867 1ヶ月ネット無し生活だったもので。。。
881 :
デフォルトの名無しさん :2005/11/02(水) 22:01:16
perlをWindowsで動かすには、どうしたらいいのでしょうか? Windowsでperlのプログラムを作成できる環境が欲しいのですが。
882 :
デフォルトの名無しさん :2005/11/02(水) 22:03:40
「perl windows インストール」といったキーワードでググれ。
CGI.pmの質問はここで良いんですよね? 間違ってたらすみません. 簡単なメモを作りたいのですが,テキストエリアからのフォームデータを $memo = $cgi -> param(memo); というように取得すると,テキストエリアでの改行が無視されます. 配列で受け取ってもダメでした.改行(空改行も)受けとるにはどうすれば良いのでしょうか. どうかアドバイスをお願いします.
>>884 自信ないけど、$memoをhtmlとして表示するなら改行を<br>にしなきゃ
あとWebProgにもPerlスレあるよ
>>884 WEBプログラミング板のほうが良いかと。
>>884 受け取れない、無視されるって、どういう意味?
「改行コードの入ったプレーンテキストを、HTML形式のデータの一部としてブラウザに
表示させようとすると、ブラウザが改行を無視して表示する。」という意味だったら、
それはHTMLの規約。普通にテキストエディタでHTMLファイルを作ったときにも、
改行は無視されるはずだよ。
詳しくはWebProg板で聞いたほうがいいと思う。
オライリーの正規表現という本は読んでおいたほうがいいですか?
>>885-887 なるほど!改行が<BR>になることを忘れていました.
的確なアドバイスありがとうございました.
これからWebProgのほうでもっといたしてきます.
890 :
デフォルトの名無しさん :2005/11/03(木) 22:42:02
perl 5.8.7なんですけど、デフォルトの乱数列と同じ乱数列を得るために、 srandに何を与えたら良いでしょう? srand(time^$$)とかsrand(time^($$+(15<<$$)))とかは同じにならなかったので 疑問に思いました。おねがいします
srandは初期値を与えるものですが、 Perlデフォルトの初期値はおろか、 Perl自身にはデフォルトの乱数計算式もありません。 計算式は環境に依存します。
もう一度書きますが、 5.5あたり以上から、明示的なsrandの指定がない場合、初期値はランダムに自動生成されます。 また乱数列もPerlがインストールされている環境に依存し、 デフォルトと言うのは初めから存在しません。
単に同じ乱数列がほしいのだったらsrandに1でも与えればいいと思う。
> 明示的なsrandの指定がない場合、初期値はランダムに自動生成されます。 そのランダムはどうやって算出するの?
愚劣極まるすれ違いっぷりに笑った
XML::RSS使ってRSS生成したいんですけどスカラー変数の値を○の部分に 代入するにはどうすればいいでしょうか? use XML::RSS; use strict; my $rss = new XML::RSS (version => '1.0'); $rss->channel( title => "○○○", link => "○○○○", description => "○○○○○", dc => { 以下略
(゚Д゚ )ハァ?
>>898 " " を除いてそこに書く。
小物が釣られましたよー。
901 :
898 :2005/11/04(金) 11:45:12
>>899 >>900 説明不足でした。というか、うまく説明できない。
たぶん変数に問題があるんだと思うんですけど。
CGI エラー - Content-Type ヘッダが正しくありません。
CGI 出力メッセージ:
Variable "$text" is not imported at C:\Program Files\httpd142n\cgi-bin\perl2.cgi
line 73.
Global symbol "$text" requires explicit package name at C:\Program Files\httpd14
2n\cgi-bin\perl2.cgi line 73.
Execution of C:\Program Files\httpd142n\cgi-bin\perl2.cgi aborted due to compila
tion errors.
>>895 もう、rand()の話はやめな。
キミの目的は解っている。
どこかのサーバと同じ乱数を生成して、何かのセキュリティを破ろうとしているのだろう。
キミが知りたいことは、Perlのソースコードを読めば解る。
他の人には興味の無いことだから、ここで質問しても無駄だ。
903 :
895 :2005/11/04(金) 14:21:40
すみません。 今、ローカルPCにPerlを入れて、Apache起動でPerlを動かしているのですが、 Perl文法にエラーがあった場合、エラーログに残ると思いますが、 これがどのあたりでエラー出てるか(〜.cgiの200行目あたりって感じ)を出す事は出来るでしょうか?
ここでよくPerlのドキュメントを確認しなさいと言う人がいますが、 あれってみなさん英語を読んでるのでしょうか? 日本語のものってあるのでしょうか?
>>905 このスレのテンプレを 1000 回読め。
それでも分からなかったらもう一度来い。
>>904 スレ違い。apache スレへ。
>>905 英語。中学を出ていないのなら・・・ あまり役に立たないが、excite 等で
翻訳サービスあり。
908 :
デフォルトの名無しさん :2005/11/04(金) 15:29:11
>>904 普通出てると思う。自分で試してみたの?
その行にエラーがあるとは限らないけどね。
909 :
デフォルトの名無しさん :2005/11/04(金) 15:43:09
>>905 > ここでよくPerlのドキュメントを確認しなさいと言う人がいますが、
> あれってみなさん英語を読んでるのでしょうか?
こういうののドキュメントに使われているのは、英語のサブセットでしかない。
英語が読めなくても読める。
中学英語レベルじゃ読めないだろ。
中学英語レベルで読めると思うぞ Perlのドキュメントすら読めないとなると、 よほど中学時代さぼってたんだな
中学英語ってthis is a penとかhow old are you?のレベルだぞ
中学英語で基本文型と 8 品詞習っちまうんだから、そっから先は辞書引きゃ 分かるだろうがよ。
ヒント:地方差 塾行かなかったら知らないままだったよ
厚生省指導の学習要領すらこなさない学校があるのは初耳だ。
ああ、関西だからな
自然言語だから習得には何千時間もかかるし、授業受けただけの学習量で 読もうというのなら高卒はおろか大卒でも読めない人はいるだろうな。 そういうことではなく、中学で習う程度で素地はあるわけだから あとは読もうという気の問題だ。 プログラム言語でも同じ。 独学でやる人が多いと思うが、習っただけでは「できません」という人と、 それをもとにやっていける人がいる。
s/プログラム言語/プログラミング言語/ まぁ、読もうと思えば当然努力は必要ってこった。
中学だと仮定法やんないけどな。
だから、このスレの住人にどうしろって言いたいのさ? 英語ができないなら、自分で勉強するしか無いんだよ。 Perlに関する英語なら、解らないことはこのスレで質問 すればいいだろう。
sub test(%dat) { $dat{name} = "hiro"; $dat{addr} = "jp"; } my %dat; $dat{name} = "takashi"; $dat{addr} = "cn"; print "1:$dat{name} / $dat{addr}\n"; &test(%dat) print "2:$dat{name} / $dat{addr}\n"; ―と言うソースコードで、 1:takashi / cn 2:hiro / jp ―と言う結果を得たいのですが、2:hiro / jpが出力されてきません。 要はハッシュ(連想配列)を参照渡しし、サブルーチン内で変更された 結果をprintしたいのですが。
>>922 > sub test(%dat)
ここCとかと混同してるね。
とりあえずperlsubとperlrefを読んで見るといいよ
・プロトタイプ
・引数の受けかた
・リファレンス(参照)
の三点について調べるべし
>>920 つ English板
ここで質問するように、英語についてはそちらで質問可
Test::Inline 2.x で、inline2test 使ってるんだけど、check_count=2 に してもテスト数が no_plan になってしまう。どうすればいいの?
>>920 > 中学だと仮定法やんないけどな。
文学作品には当然のようにじゃんじゃん出てくる仮定法は、幸いなことに、
ビジネス文書や技術書には出てこないよ。
(英語の技術書を読んでいると、技術的な説明は簡単に理解できるのに、
各章の始めに書いてあるジョークのたぐいは、何がなにやら分からない。)
幸いなことに、プログラムの本は、技術的な説明の英文と、サンプルの
ソースを見れば、英語力が乏しくてもたいてい理解できる。
理想形が取り扱い説明書だからね。 んでも、理屈が必要な本はそれなりにめんどくさい。 あと、MSDNでその関数仕様に不具合があると英語が不自然にややこしくなる。
あれ?仮定法って中3でやってなかったっけ?
世代によっても違いそうだな
>>913 はゆとり教育世代か?
はいはい。スレ違いの英語力早熟自慢大会は終わり。 俺なんて受験勉強するまで英文なんて読めませんでしたから。 そんなもん必要になったら勉強すりゃいいんだよ。
というわけで、
>>905 への答えは
Perl を勉強してて詰ったら、ドキュメントを読め。
ドキュメントが英語で困ったら、英語を学べ。
…でよろしいか?
中学時代は英語は50点ばっかりだった俺が、外人の女と付き合 いはじめた時、英語を分かりたかったんでいろんなもの読んだ。 その中、中学3年間の教科書なぞ5日間読破で、しかもがっちり 理解できた。 おれスゲーと思ったぞ。(なぜこれが3年間も掛か るんだ、ともちょっと思った) つまり、必要に駆られて死ぬ気でやると、思ったより意外といける。
はいはい
他人が何かを上手くやった話が ホントに嫌いだなお前らw
はいはい
まあNEETには辛い話題かもしれんなw
はいはい ↓次のPerlについての質問どうぞ
はいはい
「はい」は一回!
ふぁ〜い
飛影はそんな返事しない!
飛影、来て!
943 :
デフォルトの名無しさん :2005/11/06(日) 01:17:43
イク〜
なんだおまいら
忘れない内に
>>2-3 の変更案。
・クックブックは第二版が出てURLが変わっている。
・cpan.jp と perldoc.com は死んでる?
・[モジュール]と[テクニック]は混ぜちゃっていいと思う。
>>946 のPerlプログラミング講座
はアサマシすぎる。
こういう収入目的のサイトはテンプレに入れない方がいいな。
>>948 一次情報が書いてあるサイトと、それを補う情報のあるサイト、
あと FAQ に対して「ココ見とけ」と示せるサイトを小数精鋭で
挙げた方が使い易いリンク集になると思う。 Smart! のように
大半のページがドキュメントの抜粋でできているサイトは、
本物のドキュメントの在り処を書いておけば敢えて挙げる
必要は無いと思う。
>>949 私がそのサイト (の移転前のサイト) を挙げた者ですが、単に
・リャマ本でも敷居が高いと感じるズブの素人が
・オンラインでチュートリアル的に読み進められて
・インストールの方法から巷で配布されているスクリプトを読む
のに困らん程度までは学べて
・「CGI」の解説サイトでは無いサイト
という条件で探したらそこが見つかったってだけで拘りは無いです。
上記条件に該当するもっといいサイトがあったら差し替えて下さい。
951 :
デフォルトの名無しさん :2005/11/06(日) 07:35:54
perlって、マルチスレッド対応のスクリプト書けるんでしょうか? 私んとこにもようやくデュアルコアのCPU使ったマシンが来たんですが、 これをいかす方法がないかな、と思って。 といってもマルチスレッドに対応したスクリプトを書くような 技術もないんですが、メインが整数演算を主とした、単純だけど 時間だけはかかる(数時間〜数日)シミュレーションプログラム なんで、perlで勝手に?マルチスレッドに分割してくれる ようなライブラリでもないかと思いまして・・・甘い?
>>951 マルチスレッドは簡単に書けるよ。
ただ、実装は環境に依存すると思うから、目的の環境でどこまで実装されているかは
保証できないけれど。
>>950 たしかにチュートリアルやリファレンス的なサイトがテンプレにあれば初心者には便利かもね。
広告べたべたのサイトをスレ御用達のようにするのは気が乗らないけれど、
他に候補がなければ仕方なしかな。
ちょっと疑問なのですが $a==undef と $a eq '' は同じ意味でよいのでしょうか?
>>954 いや、例えば $a == '' のとき、前者は false、後者は true だよ。
>>954 undef と空文字列は数値として評価された場合 0 と見做される。
undef は文字列として評価された場合空文字列と見做される。
$a == undef が真になるのは $a の値が 0 と見做される時。
$a eq '' が真になるのは $a が undef もしくは空文字列の時。
ほんとだ。
>>955 はウソです。sorry.
undef 関係で気をつける必要があるケースは、hash の key を消す場合と、
数値と文字列のどちらで評価されるかで真偽値が変わる等かな。
後者は例えば、
$a = '0';
if $a == undef; # true
if $a eq ''; # false
958 :
11 :2005/11/06(日) 11:25:44
問題解決しました。 template-toolkitのプラグインがインストールされているパスを 相対パスで指定かつ、キャッシュディレクトリを相対パスで指定している場合、 2回目以降キャッシュから実行する際にカレントディレクトリが一時的に キャッシュフォルダにchdirされるため相対パスで指定されているプラグインが 読み込めなかったようです。 前回mod_perl環境下で今回はCGIで動かしているのですが原因は同じだと思われます。 解決法は ・キャッシュフォルダを絶対パスにすればchdirされない ・@INCに絶対パスで格納する 等です。 すっきりした
959 :
954 :2005/11/06(日) 11:27:22
>>956-957 ありがとうございます。 0 も undefなのですかぁ。
用途によって使い分けなきゃいけないってことですね。勉強になりました。
960 :
954 :2005/11/06(日) 11:46:53
てか、if文で undef使うと思わぬバグを生む危険性が…。 !$a , $a eq '' を書くようにしようと思います。
そんなあなたにdefined