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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
"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
[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www.site-cooler.com/kwl/perl/

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

[オンラインマニュアル] (追加)
最新のドキュメント: http://search.cpan.org/~nwclark/perl-5.8.7/
perl5.8.xのドキュメント(一部): http://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/~kbk/perl5.005/
日本語ドキュメント検索: http://search.cpan.jp/
perldoc.jp: http://www.perldoc.jp/
Perldoc.com: http://www.perldoc.com/
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と何かを使う?
7デフォルトの名無しさん:2005/09/18(日) 02:42:17
>1乙
スレタイ間違ってるけどな

>6
printf '%.2f', 10/3;
変数に入れるならsprintfで。
8デフォルトの名無しさん:2005/09/18(日) 02:44:47
>>1
乙。
次スレ20にすれば無問題。
9デフォルトの名無しさん:2005/09/18(日) 03:09:00
>>7
サンクス
101:2005/09/18(日) 03:11:33
はっ!
数字消して18入れ直したらしい。
前スレのテンプレをメモ帳にコピーして編集してたから・・・
11デフォルトの名無しさん:2005/09/18(日) 04:52:23
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使用
12デフォルトの名無しさん:2005/09/18(日) 11:00:59
根本的な質問ですいません。CGI:sessionの使い方が(導入方法も?)まったくわからないのですが、
何か良いページや本をご存知の方いますか?
どうやって使うんですか?と聞いて簡単に答えれるものでもないですよね?
13デフォルトの名無しさん:2005/09/18(日) 11:07:47
1412:2005/09/18(日) 11:31:05
サーバによってCGI::sessionがインストールされていないこいうことは多いでしょうか?
たとえば、あるプログラムを作りそれをいろいろ使いまわす時に、サーバによってCGI::sessionが
無かったら困るのですが、どうなのでしょうか?

また、入っていなかった場合はcgiと一緒にCGI/sessionフォルダもアップをし、自分の領域からCGI::sessionを
読み込むとかは許されるのでしょうか?

>>13
ありがとうございます。がんばって読んでみます。英語苦手ですが…
15デフォルトの名無しさん:2005/09/18(日) 13:23:24
16デフォルトの名無しさん:2005/09/18(日) 13:26:37
>>11
キャッシュとか使ってたりする?
17デフォルトの名無しさん:2005/09/18(日) 13:54:35
フヒヒヒヒ!すみません!
18デフォルトの名無しさん:2005/09/18(日) 14:49:52
>>15
古いけどな
191:2005/09/18(日) 15:22:50
>>14
/libディレクトリを作り、そこにCGI::sessionをインストール
利用するスクリプトで
use lib '/lib';
use CGI::session;
20 ◆TWARamEjuA :2005/09/18(日) 15:46:47
>>19
TOPに入れるのか。。。
djb並みだよなぁ♪
21デフォルトの名無しさん:2005/09/18(日) 16:02:41
>>14

CGI::Session - CGIアプリケーションにおける持続的なデータのセッション
http://perldoc.jp/docs/modules/CGI-Session-3.11/Session.pod

Tutorial - CGI::Sessionのさらに広範囲に渡って記述されたマニュアル
http://perldoc.jp/docs/modules/CGI-Session-3.11/Tutorial.pod

ご参考まで。

> また、入っていなかった場合はcgiと一緒にCGI/sessionフォルダもアップをし、
> 自分の領域からCGI::sessionを読み込むとかは許されるのでしょうか?

許すか許さないかは、そりゃ、プロバイダの考え方次第。でも、自作CGIの
使用を許しているプロバイダなら、禁止する理由はないと思うな。

やったことないから安請け合いはできないけど、たぶん自分のディレクトリに
置いても動くと思う。
2221:2005/09/18(日) 16:08:48
あ、既出だったか。失敬。
2311:2005/09/19(月) 00:11:54
>>16
TTのキャッシュでしょうか?もしそうでしたら使用しています。
デバッグの過程でキャッシュを使用しないで検証もしてみたのですが
同様の症状が発生しました。
ちなみにCommaとTruncateJpプラグインを使用して実験すると
CommaがロードされてるとTruncateJpがエラー
TruncateJpがロードされてるとCommaがエラー
という感じです。
発生状況がやや一定ではないので四苦八苦してます
24デフォルトの名無しさん:2005/09/19(月) 01:28:48
>>23
ううむ。再現できないとなんとも。
確実に解決する方法としてはstartup.plでTTのプラグインをロードするってのがあるんだけど。
そのほうが効率もいいし。それじゃ駄目?
2511:2005/09/19(月) 02:01:12
>>23 さん
それで問題ないのですが
mod_perl、perl/CGIどちらでも動くように組んでいるので
動的にロードしてくれる方が美しいかなと思いまして。
今日もハマってみて何か分かったら報告致します。
26デフォルトの名無しさん:2005/09/19(月) 02:06:13
>>25
あ、いや、
テンプレート内でUSEしておいて、
かつstartup.plに書いておけばいいっしょ。
2711: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 とかってなりますよね。どうやって、データを識別したらよいでしょうか???
29デフォルトの名無しさん:2005/09/20(火) 00:50:13
>>28
CGIの作り方なら、WebProg板かWeb制作板で聞いたほうがいいんじゃない?
Perlと無関係とは言わないけど、ブラウザからCGIのプログラムに送りつけられたものを
どう受け取るかというのは、CGI全般の基礎知識だしPerl以外に知っておくべきことが
先にありそうな気がする。
30デフォルトの名無しさん:2005/09/20(火) 11:56:37
>>28
マルチ
31デフォルトの名無しさん:2005/09/20(火) 12:01:19
>>30
書き込み時刻から想像するけど、>>28は、ここで言われて、WebProg板に
移動したんじゃないの? いちおう初心者スレなんで、あんまりカリカリ
しないでのんびりやりましょうや。
32デフォルトの名無しさん:2005/09/20(火) 15:59:18
質問させてください
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...
33デフォルトの名無しさん:2005/09/20(火) 16:47:36
カルシウムパ〜ラ〜
34ヽ(´ー`)ノ ◆.ogCuANUcE :2005/09/20(火) 17:13:26
>>32
HTML::FormatText に
> Formatting of HTML tables and forms is not implemented.
とあるが、それでもいいならイイんじゃね。

> 手製でタグ削除より
単純にタグを削除したいだけなら、HTML::Strip とかはどうよ。
35デフォルトの名無しさん:2005/09/20(火) 17:38:23
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();でいい気もするけど。
少なくとも、その構文では変数に入れる意味が全くない。
37デフォルトの名無しさん:2005/09/20(火) 18:37:16
>>35
少し高度になるけど、
パイプを使えばできるよ。

でも、特に理由がないなら sprintf か、
push あたりでいいのでは。

push の例:

my @res;

push @res, "↑\n";
push @res, "攻撃力2000\n";

print "(^_^) " x 3 ,"\n";
print @res;

−出力結果−
(^_^) (^_^) (^_^)

攻撃力2000
38デフォルトの名無しさん:2005/09/20(火) 19:10:39
>>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分アクセス";
}
3932:2005/09/20(火) 19:22:34
>>34
ありがd
一発で入りました。
色々試してみます。
40デフォルトの名無しさん:2005/09/20(火) 19:26:30
IO::String
41デフォルトの名無しさん:2005/09/20(火) 19:27:39
>>37 さんの様に、全部配列に入れて好きに出力でもいいと思ってて、
C言語なら素直にその方法取りますが、Perlは結構いろいろ
できるみたいなので、こんなのもできるかなー と思いまして。

原始的な命令を繰り返すCに馴れてると、selectでprintの振る舞いが
変わるってのも結構な驚きで、perlって高級言語だなぁ と実感。
42デフォルトの名無しさん:2005/09/20(火) 19:35:31
>>41
> >>37 さんの様に、全部配列に入れて好きに出力でもいいと思ってて、
> C言語なら素直にその方法取りますが、Perlは結構いろいろ
> できるみたいなので、こんなのもできるかなー と思いまして。

技に溺れると、あとで後悔するよ。
43デフォルトの名無しさん:2005/09/20(火) 20:22:19
C++などでは
class hito{
public:
void atama(){ ・・・}
}
void hanasu(hito taro){
・・・
}
main(){
hito sakaki;
hanasu(sakaki);
}

このように関数間でインスタンスを渡すことができますが、perlではどのように
すればよいのでしょうか?

$test=hito->new();
hanasu($test);

これでは失敗しました…。
4412:2005/09/20(火) 20:35:46
CGI::Sessionの件ですが、
CGI/Session.pmファイルも一緒にアップをして、
use CGI::session
で読み込んでくれました。
なんか、サーバ側で普通はインストール(?)をしなくてはい気がするのですが、できてしまいました。何でですかねf(^^;

とにかく、いろいろとありがとうございました。

45デフォルトの名無しさん:2005/09/20(火) 22:12:27
>>42
ストリームと同じ振る舞いをする文字列オブジェクトって
大抵の言語にあるじゃん。
>>35の難点といえば暗黙のグローバルな状態に依存してて
コードの局所性が低いことくらい。
46デフォルトの名無しさん:2005/09/20(火) 22:15:02
>>43
普通にできます。


失敗するコードを出さないとそのくらいしか言えない。
4712: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));

巨大配列だと遅い。奇数の時場合分けする必要がある。
もっと簡単にできそうだけど思いつかん。
51 ◆TWARamEjuA :2005/09/21(水) 19:09:50 BE:4901459-###
my @foo = (1..60);
$Out_Strings = join '', map { sprintf qq|%s%s|, $_ == 0 ? '' : $foo[$_] % 2 ? '+' : '-' , $foo[$_] } (0 .. $#foo);
print $Out_Strings;

長ったらしい、、、
52デフォルトの名無しさん:2005/09/21(水) 19:13:23
私ならこんな感じで普通に書くかな。面白くないけど。

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;
54ヽ(´ー`)ノ ◆.ogCuANUcE :2005/09/21(水) 20:07:58
俺ならこうかな。

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);
55デフォルトの名無しさん:2005/09/21(水) 20:17:48
my @foo = (1..60);
my $str;
my @sign = qw( + - );
$str .= $_ . $sign[ $_ % @sign ] foreach @foo;
print $str;

は?可読性と拡張性で勝負。
5655:2005/09/21(水) 20:21:27
>>54
ケコーンとか言おうとしたら10分も遅れてるじゃん俺
57デフォルトの名無しさん:2005/09/21(水) 20:25:02
$str .= $_.('-', '+')[$_%2] for 1..100;
と書こうとしたらかぶってる上にchop入らねー
5855:2005/09/21(水) 20:37:00
>>51
とりあえず無駄多すぎ

my @foo = (1..60);
print shift @foo;
print map { sprintf "%s%d", $_ % 2 ? '+' : '-' , $_ } @foo;
5955:2005/09/21(水) 20:40:16
print map { $_ % 2 ? "+$_" : "-$_" } @foo;
ラス行もこれでいいと思われ。
2個の引数にsprintfは贅沢。
60デフォルトの名無しさん:2005/09/21(水) 20:41:43
短さで勝負。

my @foo = (1..60);

($_ = join "+",@foo) =~ s/(\d)\+(\d+)\+/$1+$2-/g;
print $_;
61デフォルトの名無しさん:2005/09/21(水) 20:44:19
あ、これで十分か。

($_ = join "+",@foo) =~ s/\+(\d+)\+/+$1-/g;
print $_;
6255:2005/09/21(水) 21:07:04
>>60-61
>>53を読んでその程度に縮めることは出来るとは思ったが、
join後にg置換って、場合によっては重くならないか?

#俺達TIMTOWDIの真っ最中:-)
63デフォルトの名無しさん:2005/09/21(水) 21:19:06
ところでこの問題、与えられるリストは1..2Nだと仮定して
いいのかね?
64デフォルトの名無しさん:2005/09/21(水) 21:20:20
駄目に決まってんじゃん(^^)
65デフォルトの名無しさん:2005/09/21(水) 21:27:37
どうだろう。perlの内部関数だけで完結する分速そうだけど、
配列がデカくなると巨大文字列がメモリをバカ喰いして遅くなるかもね。
66デフォルトの名無しさん:2005/09/21(水) 21:30:47
任意の文字列のリストで通用するという条件にすると、
置換使った奴とか、その要素自体が偶数か奇数かで+-を
切り替えてる奴は使えなくなるよな。

たとえば @foo = qw(1 a -5 +5 xyz) みたいな。
67デフォルトの名無しさん:2005/09/21(水) 21:31:31
>>65
そういうときはベンチですよ
68デフォルトの名無しさん:2005/09/21(水) 21:45:01
>>62
TMTOWTDI ですよ。

@hoge = (1 .. 60);
$flag = !$flag and $_ .= '+' or $_ .= '-' for @hoge;
print substr(join('', @hoge), 0, -1);
6968:2005/09/21(水) 21:47:00
真ん中こっちの方がイイかも

$_ .= $flag = !$flag ? '+' : '-' for @hoge;
7068:2005/09/21(水) 21:47:55
カッコつけ忘れた
71デフォルトの名無しさん:2005/09/21(水) 22:09:29
いかにもPerlらしい、究極のリソース浪費術

@foo = (1..60);
@sep = qw[+ -];
$bar = join '$sep[$count++%@sep]', @foo;
eval qq[print "$bar"];
72デフォルトの名無しさん:2005/09/21(水) 22:33:36
$str .= $_.('-', '+')[$_%2] for 1..100;
chop $str;

これでよくないか
73デフォルトの名無しさん:2005/09/21(水) 22:53:06
74デフォルトの名無しさん:2005/09/21(水) 23:34:00
配列に0追加で 2Nを満たせばいんでないの
75デフォルトの名無しさん:2005/09/22(木) 00:06:16
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
「取得に失敗してタイムアウトした際に」の意味がわからん
78デフォルトの名無しさん:2005/09/22(木) 01:21:05
>>76
do {
 ...
} while ($@ =~ m/Timeout/i);
79デフォルトの名無しさん:2005/09/22(木) 04:47:32
WEBページで日本語とマッチングさせて情報取りたいんですけど、
Perlってプログラム中にそのまんま漢字とか平仮名とか入れて平気でつか?
多分無理だと思うんでつけど、そういう場合ってどうすればいいでつか?
80デフォルトの名無しさん:2005/09/22(木) 04:52:01
>>79
平気でつ
81デフォルトの名無しさん:2005/09/22(木) 05:06:31
>>80
ありがとうございまつ
82デフォルトの名無しさん:2005/09/22(木) 05:43:29
どういたつまつて
83デフォルトの名無しさん:2005/09/22(木) 13:57:48
$list=[\%data1,\%data2,...]
としてデータ構造を作成した場合に
$listが指している要素数を知るにはどうしたらいいんでしょうか

84デフォルトの名無しさん:2005/09/22(木) 14:06:39
scalar @{$list};
じゃだめ?
8583:2005/09/22(木) 14:33:18
>>84
できました!ありがとうございます
86デフォルトの名無しさん:2005/09/22(木) 23:05:59
または
$#$list + 1
87デフォルトの名無しさん:2005/09/22(木) 23:15:58
プオーン
88デフォルトの名無しさん:2005/09/22(木) 23:25:40
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"...
89デフォルトの名無しさん:2005/09/22(木) 23:49:27
>>88
Smalltalkをインストールして
become: の senders を検索しる。
90デフォルトの名無しさん:2005/09/23(金) 00:55:55
>>88
おもしろいこと=newとdeleteの整合性がとれなくなってアボン
91デフォルトの名無しさん:2005/09/23(金) 14:54:55
FTPにて、指定フォルダ以下のファイルorフォルダを全てダウンロードするってどうやったらできます?
Net::FTPでできるの?
教えてください。
92デフォルトの名無しさん:2005/09/23(金) 20:29:23
画像掲示板でこんなのやりたいのです
お願いします

やりたいこと
・アップロードされた画像ファイルを縮小保存したい
条件とか
・画像は汚くてもかまいません
・jpg限定でかまいません
・鯖管じゃないのでimagemagicとかGDとかはナシで
93デフォルトの名無しさん:2005/09/23(金) 20:50:11
何がよろしくお願いしますなのか分からない
94デフォルトの名無しさん:2005/09/23(金) 21:40:04
仲間へのメールを間違えてここに書いちゃったんだよ きっと
9588:2005/09/23(金) 21:45:51
>>89
なるほどSmalltalkですか。いかにもありそう。
後で調べて見ます。
96デフォルトの名無しさん:2005/09/24(土) 01:56:04
97デフォルトの名無しさん:2005/09/24(土) 03:14:32
何でstdio使う関数とstdio使わない関数を一緒に使っちゃ駄目なの?
98デフォルトの名無しさん:2005/09/24(土) 07:50:42
>>97
スレ違い。
99デフォルトの名無しさん:2005/09/24(土) 10:47:01
技術評論社の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レコード目を出力する事は出来ないのでしょうか?

全くの初心者なのでやさしく教えてください。
100デフォルトの名無しさん:2005/09/24(土) 11:14:57
101デフォルトの名無しさん:2005/09/24(土) 11:30:47
>>100 よくわかりません。

現在80ページ付近を勉強してるのですが、先に進めない訳じゃないんです。
学習が進めばこの項目は出てくると思うのですが、現状でその考え方を知っておきたいんです。
102デフォルトの名無しさん:2005/09/24(土) 12:52:16
>>99
Perl の勉強を始めようかと思って、たまたまこのスレを覗いた Perl 経験ゼロの
俺が想像で教えてみる。役に立たなかったら、すみません。

たぶん、<IN_FILE> という部分で、ファイルの中身を"一行毎に"読み込むんでしょう。
なんで <IN_FILE> で一行読めるのか?は知りませんが....
まあ、とにかくそういう構文なハズ。

二行目以降が出力されないのは、繰り返し処理を使ってないからでしょうね。
単純に $record = <IN_FILE>; で一行読み込んできて、その結果を表示している
だけだから、一行目しか出ないと。

ちょっと検索してみた結果、以下の記述で全ての行を出力できそうな気がします。
% >>99のプログラムの3〜4行目を以下の記述で置き換える。

while (<IN_FILE>) {
  print $_;
}

上記は「一行ごとにファイルを読み込んで、行が続く限り、繰り返し出力せよ」
というプログラムです。(たぶん合っていると思う)

ちなみに、「$_」 はデフォルト変数とかいうものらしい。
自動的に <IN_FILE> の結果が代入されるんでしょう。おそらく、ですが。
103デフォルトの名無しさん:2005/09/24(土) 13:05:53
>>102
> なんで <IN_FILE> で一行読めるのか?は知りませんが....
行入力演算子。

> 二行目以降が出力されないのは、繰り返し処理を使ってないからでしょうね
>>100
104デフォルトの名無しさん:2005/09/24(土) 13:17:11
>>102 ありがとう
全て出力するなら@recordでできるのですが、>>102さんが言っている、
>なんで <IN_FILE> で一行読めるのか?の所が納得できないのです。
何かしらオプションをつける事により、2行目だけを読み込んで出力も可能なのか?
それとも1行目だけしか不可能で、2行目を出力するには別のプログラムが必要なのか?
で引っ掛かってるんですよねぇ。
   
105デフォルトの名無しさん:2005/09/24(土) 13:22:46
>>103 行入力演算子でぐぐったら解決しました!ありがとう!
106デフォルトの名無しさん:2005/09/24(土) 13:37:25
俺はスカラーコンテキストやらリストコンテキストなるものを知らなかったなぁ。
$ は変数に付けるお約束の記号、ぐらいに思ってた...恥ずかしいな。

ま、千里の道も一歩から。たまたまこのスレ覗いて良かった。
107デフォルトの名無しさん:2005/09/24(土) 14:21:25
>>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() は書かない人が多いかも。
108デフォルトの名無しさん:2005/09/24(土) 15:18:05
>>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);
を試した所旨く動作しないのですが・・
109デフォルトの名無しさん:2005/09/24(土) 15:20:58
>>108
あ、ごめん。$file じゃなくて $in_file でした。
エラーが起きないと追加した部分は動作しません。
試しに、$in_file を存在しないファイル名に変えてみてください。
110デフォルトの名無しさん:2005/09/24(土) 15:37:05
おお!できました。
この方が分かり易いですね。
ありがとう、勉強になりました。
111デフォルトの名無しさん:2005/09/24(土) 17:41:45
>>98
すみませんでした。
112デフォルトの名無しさん:2005/09/25(日) 01:35:28
@line=<IN_FILE>
とかしてファイルを全て読み込んでから処理するのではなく、
指定行だけ配列に読み込むことって出来ませんでしょうか?
メモリをあまり使いたくないのですが・・・。
113デフォルトの名無しさん:2005/09/25(日) 01:53:08
>>112
1行ずつ読んで希望の行が出てくるまで読み飛ばせば
メモリは食わないよ。

行が固定長であるとか、各行の先頭位置が別に保存してある
とかならいきなり希望の行の頭にseekして読めるけど。

114デフォルトの名無しさん:2005/09/25(日) 01:56:17
一応、
$i=0;
while(<IN_FILE>){
if ( $i >= 20000 && $i < 30000 ){
$line[$i - 20000] = $_;
}
elsif ( $i >= 30000 ){
last;
}
else {
$i++:
}
}
とか考えてみたんですが、これだと何万行もあるファイルの場合
結構かかりますよねぇ・・・
115デフォルトの名無しさん:2005/09/25(日) 02:47:04
>>114
「行」、つまり可変長レコードは、どこからどこまでが一つのレコード
なのか実際に読み込まないと分からない。だから何万行あろうが、
頭から一行ずつ数えていくしかない。

my $target = 5; # 希望の行
my $line;
do { $line = <IN_FILE> } until $. == $target;
116ヽ(´ー`)ノ ◆.ogCuANUcE :2005/09/25(日) 02:55:46
>>114
$. (ドット)を使え。man perlvar。

どっちにしろファイルでは頭から読んで逐一調べないと無理。改行の数を
数えないといけないから。

どうしても速く処理したいんなら、DB に突っ込むとかキャッシュを持つとか、
工夫するしかないんでないかな。
117デフォルトの名無しさん:2005/09/25(日) 03:02:22
>>113
>>115
>>116
初心者の質問に答えて下さりありがとうございます。
「メモリ消費を抑えつつ高速化」ってのは難しいですね。
行ごとののバイト数は決まってないのでseekはできませんが、
$.かぁ・・・利用してみます。
118デフォルトの名無しさん:2005/09/25(日) 03:21:10
用途に分けてファイルを分けるのが一番かな?
行ごとに処理とかいっても、改行文字ごとに区切ってるだけだし。
119デフォルトの名無しさん:2005/09/25(日) 04:15:34
行頭位置を別ファイルにインデックスとして記録するか、だな
120デフォルトの名無しさん:2005/09/25(日) 06:05:54
>>114
DB_FileのRECNO
121デフォルトの名無しさん:2005/09/25(日) 06:55:29
>>112
配一行一行の長さが不確定なら、プログラムにとっては、どう転んでも順に読んでいく
しかないから、特に実行時間の節約になるわけでもないし・・・
あ、これは普通のプレーンなテキストファイルの場合ね。

もし、今後も、同じファイルについて何度も「特定の行だけ狙ってを読む」予定があるなら、
>>120さんのレスにあるように、手元のファイルをまずDF_Fileモジュールを使って、
移し変えたら?

http://perldoc.jp/docs/modules/DB_File-1.805/DB_File.pod

> DB_RECNO
> DB_RECNOは固定長と可変長の両方のフラットなテキスト・ファイルを、 DB_HASHや
> DB_BTREEと同じキー/値の組のインターフェースを使って扱える ようにします。
> この場合、キーはレコード(行)番号になります。
122デフォルトの名無しさん:2005/09/25(日) 07:16:34
っていうか、一歩下がって、何をしたいのかを書いてみた方が
いいような。
123デフォルトの名無しさん:2005/09/25(日) 15:41:01
>>117
>「メモリ消費を抑えつつ高速化」ってのは難しいですね。

キミのレベルでは杞憂だよ。
本当にメモリ量や速度が問題になるプログラムを
書けるようになってから心配すればいい。
124デフォルトの名無しさん:2005/09/25(日) 18:01:13
>>119 の方法ならシーク2回で頭出しできるし、
又は、 >>120 のを使うかだな。
125デフォルトの名無しさん:2005/09/25(日) 18:31:17
空白を埋め込んで各行のサイズを揃えるってのはどうよ。
126 ◆TWARamEjuA :2005/09/25(日) 18:35:55 BE:3920966-###
>>125
ブサイクかも。。。@定長行
127デフォルトの名無しさん:2005/09/26(月) 00:01:19
>>125
フィールド長を固定にする訳ね。
それはそれでありだけど、フィールド長が制限される罠。
容量も余計に必要だし。
128デフォルト名無しさん:2005/09/26(月) 17:36:12
質問があるのだが・・。チェックボックスでデータを受け取って
HTMLの確認画面に反映させるプログラムを作っているのだが
行き詰った・・・。

例えば、course1,course2,course3とあってcourse1とcourse3がチェックされたら
course2のところが空白で反映される。

ex.)HTML出力画面
course1

course3

こんな感じになるんだよな。

この空白を詰めて

  course1
course3
みたいな風に出力する方法ないもんかね?
129128: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";
}

130デフォルトの名無しさん:2005/09/26(月) 17:47:24
>>128
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 http://pc8.2ch.net/php/ )
131128:2005/09/26(月) 17:49:11
>>130
ごめん、板違いなんだ・・・。知らんかった。じゃ、聞きなおしてくる。
132デフォルトの名無しさん:2005/09/26(月) 17:54:21
しつもーん

Perl/TkモジュールでGUI組めるって知ったんだけども、
それって配布したらexeだけで動くの?
それとも、exeの方でもPerl+Perl/Tkが必要なのかな。
133デフォルトの名無しさん:2005/09/26(月) 17:56:45
>>132
そのexeをどうやって作るかによる。
Perlと関連モジュールをパックしてしまえばexeのみで動くし、
または単なるローダならソース及びモジュール群も必要になるだろう
GUI == exeと考えているなら大間違い
134デフォルトの名無しさん:2005/09/26(月) 18:02:45
>>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
136デフォルトの名無しさん:2005/09/26(月) 21:02:12
>>135
8進数に8も9もない板違い。
137デフォルトの名無しさん:2005/09/26(月) 23:45:52
板違いで失礼しました。
m(_ _)m
138デフォルトの名無しさん:2005/09/27(火) 02:03:56
>>134
Win32::GUI::Loft + PARで、十数キロバイトのちょっとしたツールが
3Mくらいになってるね。

参考: ttp://namazu.org/~satoru/diary/20040717.html
139デフォルトの名無しさん:2005/09/27(火) 03:05:15
UPXで最大圧縮すると確か200kbくらいになったよ<PAR
ただし動かない。
140デフォルトの名無しさん:2005/09/27(火) 03:21:38
>>139
UPXって使ってなさそうなデータを取り除く機能無かったっけ
それが一緒にパックしたモジュールなんかを取り払っちゃってるとか
141デフォルトの名無しさん:2005/09/27(火) 06:09:31
>>139
意味ねー
142デフォルトの名無しさん:2005/09/27(火) 06:20:44
>>140
取り除く?そんなことしたら、upx -d で元に戻らんじゃないか?
143デフォルトの名無しさん:2005/09/27(火) 06:44:31
先生大変です
PARでexe化したものをupx -> upx -dしたら元に戻りませんでした
144デフォルトの名無しさん:2005/09/27(火) 15:06:50
当初>>138のリンク先を参考にしてたんだけど、
いつだったかFileHandle使わないものに書き換えたらexeサイズが100kb以上減った気がする

あとPARで作ったexeの拡張子zipにしたら普通に解凍できる
それでいろいろ調べられそうだけど、面倒だからやってない
145デフォルトの名無しさん:2005/09/27(火) 18:56:41
『先頭が空白以外なら表示』
という簡単なことすらできないのはなぜ。。。

$aaa = "DSAFSA";
if ( $aaa =~ /^[A-Z]/ ) { print }

これで表示されない。。。

$aaa = "DSAFSA";
if ( $aaa =~ /^\S/ ) { print }

これでもだめ。。。
どうなってるの・゜・(ノд`)・゜・
146デフォルトの名無しさん:2005/09/27(火) 18:58:02
ミスったそらなんも出ない。。。
もう人間の性質だけど質問すると事故解決してします。。。
147デフォルトの名無しさん:2005/09/27(火) 18:59:57
>>145
printの段階でデフォルト変数に何も入って無いから
$_ = "DSAFSA";
if ( /^[A-Z]/ ) { print }
若しくは
$aaa = "DSAFSA";
if ( $aaa =~ /^[A-Z]/ ) { print $aaa }
148デフォルトの名無しさん:2005/09/27(火) 19:42:39
print $aaa if $aaa =~ /^[^\s]/;
149デフォルトの名無しさん:2005/09/27(火) 20:02:19
>>145
> 『先頭が空白以外なら表示』
> という簡単なことすらできないのはなぜ。。。

お前の知能が足りないから。
150デフォルトの名無しさん:2005/09/27(火) 20:36:16 0
【依頼】
plファイルの置いてあるディレクトリ以下の全てのテキストファイルを検索して、
divタグの属性"class"の属性値を全て列挙するプログラムを作っていただけませんか?
できれば重複無しの方がいいのですが、重複してもいいです。
無理なようなら、スクリプトの教材を紹介していただきたいです。
151デフォルトの名無しさん:2005/09/27(火) 20:38:26 0
ちょっと質問です。

Net::Telnet::Ciscoを使ってA(PC)→B(ルータ)へ
ログインした際にTerminal Typeをvt100に設定したいの
ですが何か特別な設定が必要なのでしょうか?

ご存じの方いらっしゃいましたら
よろしくお願い致します。
152デフォルトの名無しさん:2005/09/27(火) 20:53:50 0
教えていただきたいのですが、

型グロブを使って引数を扱おうとおもい
単純なものを書いたのですが
下のエラーがでてしまいどうしてよいかこまっています。
引数には単純なハッシュを入れる予定です。
どなたかご指導して頂けませんでしょうか。

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;
153デフォルトの名無しさん:2005/09/27(火) 21:00:15 0
>>150
find . -type f | xargs perl -ne 'if(/<div.*?class=(.*?)[ >]/){print $1,"\n"}' | sort | uniq

厳密に"perlで"とは指定されてないからシェルスクリプトで作ってやったぜ。
perlは使ってやってるから、
お前にやる気があるなら純Perlスクリプトの参考にはなるだろ。
154GiantLeaves ◆6fN.Sojv5w :2005/09/27(火) 21:21:04 0
[>>150]に関して、Perlでどうやってファイルを読み込むのか?
同じディレクトリにあるファイルを読み込むのならできる。
ディレクトリの再帰検索もできるのかな?
155デフォルトの名無しさん:2005/09/27(火) 22:12:51 ID:0
>>152
らくだ本によれば、strict 'vars' は、「myで宣言されている」
「完全修飾されている」「輸入されている」のいずれにも該当しない
ような変数にアクセスすると、コンパイル時エラーを発生させる、
とある。%ABCは、その何れにも該当しない。

型グロブを使うのを止めて、リファレンスを使うのが最適であると
思われる。
156デフォルトの名無しさん:2005/09/27(火) 22:59:13
>>150
>>154
File::Find使えよ
157GiantLeaves ◆6fN.Sojv5w :2005/09/27(火) 23:04:04
talk:>>153 [>>150]をbashなどに通して実行するのもまだ成功していないが、それより、余計な引用符が付いてきたりしないか?
158デフォルトの名無しさん:2005/09/27(火) 23:09:31
>>152
sub test {
local(*ABC) = @_;
our %ABC; # 追加
print keys(%ABC);
}

とかじゃ駄目だった?
159153:2005/09/27(火) 23:33:02
御指摘の通りだが'と"がこんがらがって
エスケープがひどいことになるのでめどくなって投げた。

実用上はそんなに問題ねえだろ、という手抜き精神が重要ってことだ。
160デフォルトの名無しさん:2005/09/28(水) 00:40:04
ここにも我流記号を使うあの気違いが来た
161デフォルトの名無しさん:2005/09/28(水) 01:40:33
sub testに間違いなくハッシュが渡されるなら
sub test {
>>152
my %ABC = @_;
print keys(%ABC);
}
で、良いと思うのだが。
localで型グロブなんて何年前のソース読んで勉強してるんだ?
162デフォルトの名無しさん:2005/09/28(水) 02:42:08
>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
これらのライブラリを入手したいのですがどうすればいいでしょうか?
163デフォルトの名無しさん:2005/09/28(水) 04:02:23
>>162
perlcc はどうせ使い物にならないから
諦めなされ。
164デフォルトの名無しさん:2005/09/28(水) 06:32:46
>>162
またお前か
165デフォルトの名無しさん:2005/09/28(水) 08:17:28
>>161
それだとhashをリストにばらしてからまた再度作るようになって
要素数が多いとオーバーヘッドが馬鹿にならんよ。お前もどういう
ソース読んで勉強してるんだ(w
166デフォルトの名無しさん:2005/09/28(水) 08:28:18
>>162
お前は自民党のタイゾーか
167ヽ(´ー`)ノ ◆.ogCuANUcE :2005/09/28(水) 10:07:56
>>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が入ってるみたいなのですが…
169デフォルトの名無しさん:2005/09/28(水) 11:35:02
日付連番を考えているんですが、timeで取っていらない部分を削った後、番号を
付けたいのですが

2005/09/28 → 20050928 → 2005092801(後付けで番号を入れる)

何かうまい書き方ないですかね。
ご教授お願い致します。

170ヽ(´ー`)ノ ◆.ogCuANUcE :2005/09/28(水) 11:41:26
>>168
Net::Telnet の TELOPT_TTYPE で出来ない?
今手元に好き勝手できる Cisco ルータがないから試せないけど。

>>169
やりたいことが上手く伝わってこない。

my $date = '2005/09/28';
$date =~ s,/,,g;

my $result = $date . sprintf('%02d', $num);

こういう話じゃなさそうだが…。
171デフォルトの名無しさん:2005/09/28(水) 12:05:59
>>169
素直にtimeの戻り値を連結すれ。
172デフォルトの名無しさん:2005/09/28(水) 12:08:31
>>170
レスありがとうございます。

Net::Telnetのドキュメントなど色々みたのですが
いまいちTELOPT_TTYPE(@EXPORT_OK)の設定方法が
よくわからなくて…

こいつにvt100設定すればいいのかなぁ?
173デフォルトの名無しさん:2005/09/28(水) 12:10:53
>170>171
ありがとうございます。
素直に連結しようかと思います。
174デフォルトの名無しさん:2005/09/28(水) 12:11:32
>>169
素直に

$seq = 1; ←連番
@t = localtime(time);
$result = sprintf("%04d%02d%02d%02d", $t[5] + 1900, $t[4] + 1, $t[3], $seq);

じゃダメなの?
175デフォルトの名無しさん:2005/09/28(水) 12:23:19
176デフォルトの名無しさん:2005/09/28(水) 13:32:49
>>175
無事Terminal Typeの設定ができました。

レス下さったみなさん、ありがとうございましたm(_ _)m
177デフォルトの名無しさん:2005/09/28(水) 13:57:56
文中に複数ある「;」を全て「\;」に変換するスクリプトを書きたいのですが
どうしたらいいでしょうか?
うまい置換式が思い浮かばなくて・・・
178デフォルトの名無しさん:2005/09/28(水) 14:04:23
s/;/\\;/g;
179デフォルトの名無しさん:2005/09/28(水) 14:35:15
>>178
どうもありがとうございます
180デフォルトの名無しさん:2005/09/28(水) 15:04:57
>うまい置換式が思い浮かばなくて・

こういう嘘つきにはレスすんなよ
181デフォルトの名無しさん:2005/09/28(水) 15:39:53
>>180
半島に帰れ!!!
182デフォルトの名無しさん:2005/09/28(水) 15:41:28
>>180の言うことはもっとも。
>>181カエレ
183デフォルトの名無しさん:2005/09/28(水) 16:36:28
http://bekkoame.okweb.ne.jp/kotaeru.php3?q=1481001
漏れもこの質問者と同じ相談なんだけど、その回答者の中で、
「クリックした時の挙動はブラウザによるので、
たとえば全てのOS、ブラウザでダウンロードをさせたいとなると
CGIで処理するしかないと思います。
CGIと言ってもPerlなら4,5行程度でできます。」
と書いてあったんだけど、このPerl4,5行を詳しい人、書いてくり。
184デフォルトの名無しさん:2005/09/28(水) 16:58:26
早く書いてくり。
185183:2005/09/28(水) 17:24:47
>>184は、俺じゃないよ
酷い・。・゚(ノД`)゚・。・ウワーン
186ヽ(´ー`)ノ ◆.ogCuANUcE :2005/09/28(水) 17:44:19
>>183
#!/usr/bin/env perl
print "Content-Type: application/octet-stream\r\n\r\n" . `cat hogehoge.pdf`;

で駄目なん?
187GiantLeaves ◆6fN.Sojv5w :2005/09/28(水) 19:02:31
[>>150]に関して。
div要素のclass属性の属性値を書き出すのだったら、
DOM (Document Object Model) の方がやりやすい。
JavaScriptで
document.getElementsByTagName("div");
をやって、全アイテムについて、該当する属性の属性値を書き出せばいいのだから。
ディレクトリの再帰検索を誰か解説してください。
188ヽ(´ー`)ノ ◆.ogCuANUcE :2005/09/28(水) 20:10:50
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";
}
}
189ヽ(´ー`)ノ ◆.ogCuANUcE :2005/09/28(水) 20:13:05
find_class.pl とかで保存して、

$ ./find_class.pl foo/ bar/baz/

とかで。
190デフォルトの名無しさん:2005/09/29(木) 01:11:41
ActivePerlがインストールされていないパソコン(出先でインストールできない等)でperlを実行するにはどうしたらいいのでしょうか?
USBメモリに入れて持ち運ぶ方法はないですか?
191デフォルトの名無しさん:2005/09/29(木) 01:33:10
鯖にうp。
192デフォルトの名無しさん:2005/09/29(木) 01:51:23
193GiantLeaves ◆6fN.Sojv5w :2005/09/29(木) 11:43:48
talk:>>192 素直にActivePerlなどのインタプリタをインストールした方がいいような気もする。他人に渡すのならまた話は別だが。
194GiantLeaves ◆6fN.Sojv5w :2005/09/29(木) 11:45:24
talk:>>190 どうにかしてWSHを使う。
195GiantLeaves ◆6fN.Sojv5w :2005/09/29(木) 11:46:08
talk:>>190 Windowsに入っているのは、JScriptとVBScriptを動かせるエンジンなので注意。
196デフォルトの名無しさん:2005/09/29(木) 13:38:53
誇大妄想は誇大妄想らしく仰々しいsignatureつけとけ
197デフォルトの名無しさん:2005/09/29(木) 14:21:16
>>193
talk talk 五月蝿いし見にくいYO。
198デフォルトの名無しさん:2005/09/29(木) 15:19:32
>>193
Re:より糞
199デフォルトの名無しさん:2005/09/29(木) 15:36:56
文字列の一括置換を行いたいのですが、
特定のタグに囲まれたものだけを対象にかけたいと考えています。

ただ、
・対象となる文字列の点数
・置換前、置換後の文字は任意

という条件があるため、下のような状況の場合、
どうやって正規表現を組むか、悩んでいます。

<tuv> A A A </tuv>
↓AをAAに一括処理
<tuv> AA AA AA </tuv>

tuvタグで挟まれた文字列を変数に抜き出し

変数に対して、A→AAの一括置換

元の文字列と差し替え

という方法がベストなのでしょうか?
200デフォルトの名無しさん:2005/09/29(木) 15:52:27
ぱっと見て何してるかわかりやすく書くとすれば
s/>([^><]+)</&hoge($1)/eg;
sub hoge { my $set = shift; $set =~ s/A/AA/g; return $set; }
こんな感じ?
201デフォルトの名無しさん:2005/09/29(木) 15:52:30
テキストエディタに学校でも使ってる秀丸エディタを使おうと思ったんですが有料ソフトでした
みなさんお金払って使ってるんでしょうか、それともメモ帳を?
202デフォルトの名無しさん:2005/09/29(木) 16:03:08
>>201
世の中には秀丸とメモ帳しか無いとでも思っているのか?
203デフォルトの名無しさん:2005/09/29(木) 16:09:41
>>200 sageろヴォケ
スレ違いなので学校で先生に同じ質問しろ。
204200:2005/09/29(木) 16:12:00
>>202いろいろ探してみます

>>203これでいいですか?掲示板のしくみよく分からなくてすみません
205デフォルトの名無しさん:2005/09/29(木) 16:18:39
>>204
スレ違い。どこの学校だ? 情報リテラシに読み書きも怪しそうだが…
206199:2005/09/29(木) 16:34:50
>>200
ありがとうございます。なんとか理解できました。

>>203
ageてるのは、>>201のようですが…
よく見てくださいね。
207デフォルトの名無しさん:2005/09/29(木) 23:20:21
俺様ルールのsage厨に構うなよ。
スレ違いよりタチ悪いよ。
208デフォルトの名無しさん:2005/09/29(木) 23:29:10
学生なら秀丸は無料だったと記憶しているが。
209デフォルトの名無しさん:2005/09/29(木) 23:54:21
>>208
ソースは? ひょっとして "フリー制度へのお申し込み" の事を
単に無料と呼ぶのなら、誤解の元で迷惑にしかならないが。
210デフォルトの名無しさん:2005/09/30(金) 03:40:54
>>209
どう違うんだ?
211デフォルトの名無しさん:2005/09/30(金) 06:43:55
結論:秀丸使うやつは金払え
212デフォルトの名無しさん:2005/09/30(金) 07:00:48
で、いつになったらPerlの話題にもどるのかね?
213デフォルトの名無しさん:2005/09/30(金) 07:29:28
知らないなら中途半端な話題振るなよ
214デフォルトの名無しさん:2005/09/30(金) 08:30:54
すいません。自分のパソコンにパールを入れたいのですが
WindowsMeでもつかえるフリーのパールってありますか??
215デフォルトの名無しさん:2005/09/30(金) 08:50:18
>>214
http://www.activestate.com/Products/ActivePerl/

#ちなみに、フリーでないPerlってあるのかな?
216デフォルトの名無しさん:2005/09/30(金) 09:05:41
>>215
あんたが貼ったリンク先
217デフォルトの名無しさん:2005/09/30(金) 09:53:03
>>216
そりゃ、サポートサービスやオマケツールに対してのライセンスだろ?
Perl本体そのものはフリーで、個人であろうと企業であろうと無償で使うのは
問題ないから、心配すんな >>214
218デフォルトの名無しさん:2005/09/30(金) 10:04:04
>>217
こういう話のときは入手するブツを単位に考えるのが自然じゃね?


219デフォルトの名無しさん:2005/09/30(金) 12:10:48
>>190
何のモジュールもuseしてなければ、perl.exeとperl5.8.x.dll?さえ
添付してれば動く。
それにバッチファイル付けて知り合いにスクリプトあげたことある。
220デフォルトの名無しさん:2005/09/30(金) 18:45:37
定期的に、ID/PWを求められるページにログインする事はperlで出来ますかっ?!
221デフォルトの名無しさん:2005/09/30(金) 18:49:25
何のパスワードだよ
222デフォルトの名無しさん:2005/09/30(金) 18:51:20
IDとPWを入力を求められる、アクセス制限のかかったページにログイン、という意味でした。
223デフォルトの名無しさん:2005/09/30(金) 20:27:41 BE:1306962-###
perlとどう関係あるのか小一時間休憩してみたい。。。
224デフォルトの名無しさん:2005/09/30(金) 21:22:57
>>220
スレ違い
225デフォルトの名無しさん:2005/10/01(土) 02:14:40
>>155>>158>>161
助言ありがとうございます。
our
のおかげでハッシュの値は表示できました。
しかし、$ABC{'xxxx'} を表示できません....
226デフォルトの名無しさん:2005/10/01(土) 11:50:29
>>220
>定期的に、ID/PWを求められるページにログインする事はperlで出来ますかっ?!

「定期的に」という意味が不明だが、多分、
LWP::UserAgentを使えばできるんじゃないかな。
http://www.hio.jp/translation/perldoc/lib/LWP/UserAgent.html

これ見て解らないときは、Webプログラム板のスレ↓で質問したほうがいいね。

Perlコーディング初心者質問スレ Part 43
http://pc8.2ch.net/test/read.cgi/php/1123777607/l50
227デフォルトの名無しさん:2005/10/01(土) 14:08:02
できそうでなかなかできません。どなたか助けてください。

>abc.3
gakjgajgeiajeiagaga
>sasa
sagageijgeigjeijaiejeiajwjojowjowewgeweeeee
>ushi.1
safakljgeijgleijelaijealijeliajelammmziej
....
のようなファイルを、abc.3という名前のファイルに
>abc.3
gakjgajgeiajeiagaga
sasaという名前のファイルに
>sasa
sagageijgeigjeijaiejeiajwjojowjowewgewe
のように、分けてそれぞれ名前をつけるにはどう書けばよいのでしょうか?
228デフォルトの名無しさん:2005/10/01(土) 14:15:34
open(F,$ARGV[0]);
while(<F>){
open(FH,">$1") if(m/^>(.+)/);
print FH $_;
}
229デフォルトの名無しさん:2005/10/01(土) 15:15:11
>>227
何がしたくてどういう法則で名前付けたいの?
230デフォルトの名無しさん:2005/10/01(土) 21:02:50
>>229
マルチファスタファイルの分解でしょうな、きっと。
231227:2005/10/01(土) 23:37:18
ありがとうございました。
プログラムにするとこんな短くていいのですね。
本当に助かりました。
232デフォルトの名無しさん:2005/10/02(日) 02:24:55
かなり初心者ですが教えて下さい m(_ _)m
今タイピングゲームを作ってます。
普通に提示した文字を入力してOKかNGかを判断できるとこまではできたのですが、
一定時間以内に入力されなかった時にNGとなるようにしたい。
forkを使ってるんですが、どうもうまく行きませんorz
forkは間違ってますか?
他にいい予約語調べたのですがわかません。
入力待ち状態(時間制限)と入力した文字の判断(OK/NG)の同時進行がうまく行かないorz
すいませんが教えて頂けませんかm(_ _)m
233デフォルトの名無しさん:2005/10/02(日) 03:17:23
お前にはムリ
234デフォルトの名無しさん:2005/10/02(日) 03:38:41
>>225
どうやって引数渡してる?

test( \%foo );

とかしてるんだよね?
こっちじゃ問題なく動くよ。
235デフォルトの名無しさん:2005/10/02(日) 05:53:35
Windows上のActivePerlではalarmとかうまく働かないな。
よくわからんけど。
236デフォルトの名無しさん:2005/10/02(日) 19:03:53
ActivePerlのインストーラ起動したら
「指定されたサービスは既に存在します。」
とか言われて起動すらできないんですが・・・
OSはWindows98SEです。
解決方法を教えてください。
237デフォルトの名無しさん:2005/10/02(日) 19:32:29
>>235
Perlのバージョン依存らしい。
5.8以降だとalarmも実装されているそうな。
238デフォルトの名無しさん:2005/10/03(月) 12:00:07
初心者です。
perlで一つのプログラムを複数(大量)のファイルに対してかけるときは
どういったやり方があるのでしょうか?

どなたか教えてください。
239デフォルトの名無しさん:2005/10/03(月) 12:04:01
なんだって─────!!!!
240デフォルトの名無しさん:2005/10/03(月) 13:31:22
>>238
シェルスクリプトかバッチファイル
241デフォルトの名無しさん:2005/10/03(月) 13:45:06
>>238
複数のファイルを処理するように書くといいです。
242238:2005/10/03(月) 14:05:16
シェルスクリプトがよくわかっていないのかもしれませんが、

例えば、すべて頭にSTEPという文字列がつくファイルを一度に大量に
処理するときには,シェルでperl プログラム STEP*という使い方は
できないようですが、どうすればよいのでしょうか?

プログラムは$ARGV[0]でファイルを読み込んでいます。
243デフォルトの名無しさん:2005/10/03(月) 14:09:03
UNIXのシェルスクリプトなら
for i in STEP*; do
perl プログラム $i
done
でできると思う
244デフォルトの名無しさん:2005/10/03(月) 14:40:47
>>242
> シェルスクリプトがよくわかっていないのかもしれませんが
うん、その通りだ。
STEP* というのは、Perlに渡された段階で複数のファイル名に展開されてるんだよ。
だから、Perl側で($ARGVをshiftせずに)$ARGV[0] しか見てないのなら、
最初の1つしか処理できないのは当然。
245デフォルトの名無しさん:2005/10/03(月) 15:24:06
>>242
perlを起動すると、配列 @ARGV に、引数の一覧が入っている。
で、$ARGV[0]は配列@ARGVの先頭の要素な。

だから、
今のプログラムの処理のメインループを以下の構造で囲めば、
望み通りのことができると思うぞ。

while(@ARGV){
...
shift(@ARGV);
}
246デフォルトの名無しさん:2005/10/03(月) 15:35:29
いい加減ラクダ本卒業してPerldocだけで理解できるようになりたい。
仕事場までラクダ本持っていくのめんどくさい。
247デフォルトの名無しさん:2005/10/03(月) 15:42:59
>>246
まずラクダ本を持っていくのをやめるところからはじめよ。
248デフォルトの名無しさん:2005/10/03(月) 15:48:28
1つ前のラクダ本を持ってるけど、最新のは2巻になって
百科事典みたいに分厚くなったので、買い替えをためらってる…。
249デフォルトの名無しさん:2005/10/03(月) 15:53:59
何が増えたの?
250デフォルトの名無しさん:2005/10/03(月) 17:22:45
俺は赤ラクダ本もってるけど、
本が壊れる(背の部分が割れてページが抜けてくる)まで読んだ。
青ラクダがなかなか日本で出なかったので、perldocとCPANモジュール読みまくり。
黒豹は英語で読んだ。

で、青ラクダ出たときには、読むべきところが少なくて(赤ラクダとそう大して変わらん)、
そのままになってる。perldocで十分だな。個人的には。
251236:2005/10/03(月) 20:58:08
うん、まあ、無視されるだろうとは思ってたよ。
前は普通にインストールできたんだけどね。
252デフォルトの名無しさん :2005/10/03(月) 21:02:40
検索したいパターンが行の中のランダムな位置にある場合、ある検索したい
パターンにマッチしていたら表示するというのはどうやるのでしょうか?

位置が決まっていれば、/\w+\s(\w+)/などのように、正規表現を使ってできるのですが、
この場合は何を使えばよいのでしょうか?

253238:2005/10/03(月) 21:05:52
>>243
>>244
>>245

ありがとうございました。
参考にしてやってみたらできました!
254デフォルトの名無しさん:2005/10/03(月) 21:06:27
ちょいと英語で言ってくれんか
255デフォルトの名無しさん:2005/10/03(月) 21:15:38
質問です

条件分岐であっちこっちにgotoするような処理が必要なpgを書いてるんですが、gotoはあまり無暗に
使うべきではないというような記述をちらほら見かけます

で、なるべく機能をサブルーチン化して呼び出す事で実現しているんですが、
エラー処理などでサブルーチン内の何でもないような所に飛ぶ必要が出てきました
(例えば単に関数を呼び出すだけの所や、if文の頭など)

こういった場合はgotoを使うのも止む無しといったところなんでしょうか?

それとも飛ぶ必要があるところは全て関数化するとか、無理やりwhile(1){} とか
if文をwhileで置き換えてループ化してnext、last等で書くほうがスマートなんでしょうか、、、?
256デフォルトの名無しさん:2005/10/03(月) 21:16:43
gotoは「まったく使わない」でもやっていけると思う
257デフォルトの名無しさん:2005/10/03(月) 21:17:54
32進に変換するルーチン教えてけれ
258デフォルトの名無しさん:2005/10/03(月) 21:20:43
>>255
うむ、gotoは存在しない。
いいな? gotoは存在しないぞ。
259デフォルトの名無しさん:2005/10/03(月) 21:27:05
ま た goto厨 か
260255:2005/10/03(月) 21:28:51
即レスありがとうございます
なんか触れちゃいけない話題だったみたいですね
それでは無しの方向でいってみます
261デフォルトの名無しさん:2005/10/03(月) 21:29:57
>>255
つかperlの話題じゃない気がす
262デフォルトの名無しさん:2005/10/03(月) 21:40:17
>>252
> パターンにマッチしていたら表示するというのはどうやるのでしょうか?

なにを表示するの?
263デフォルトの名無しさん:2005/10/03(月) 22:13:56
>>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;
}
265GiantLeaves ◆6fN.Sojv5w :2005/10/04(火) 06:43:39
talk:>>188-189 私のActivePerl環境でもできた。しかし、どおりで私には作れなかったわけだ。
266デフォルトの名無しさん:2005/10/04(火) 07:49:01
>>265
その talk: っての、ウザいよ。
大昔からコンピュータやってますよ〜、って自慢したいの?
267GiantLeaves ◆6fN.Sojv5w :2005/10/04(火) 08:03:45
talk:>>266 りんごを食べたい。
268デフォルトの名無しさん:2005/10/04(火) 08:45:25
>>266
> 大昔からコンピュータやってますよ〜、って自慢したいの?

失礼な。大昔からやってるやつは、こんな変なものはつけない。
269デフォルトの名無しさん:2005/10/04(火) 09:41:08
とりあえずトリップ変えるのだけはやめてちょうだいね。
270デフォルトの名無しさん:2005/10/04(火) 10:10:56
>>266
それ皮肉のつもりなんだろうけど、ガキんちょのやっかみにしか見えない。
271デフォルトの名無しさん:2005/10/04(火) 10:33:50
どーでもいいんだけど皮肉の使い方違ってね?
272デフォルトの名無しさん:2005/10/04(火) 10:45:52
若者の掲示板2chにジジイが混じってるようだな
273ジジイ:2005/10/04(火) 11:02:08
昔、8086が出たとき、メモリ空間が640kバイト使えるっつーんで
感動した。8080に比べれば、無尽蔵とも言えるメモリ空間だ。
その一方、640kバイトものアセンブラのプログラムを誰が
書けるんだろうと心配もした。
それを、640Mバイトでは足りないから1Gバイトにしようなどと、
全く、今の若いもんは.....ぶつぶつぶつ
274デフォルトの名無しさん:2005/10/04(火) 11:02:56
>>272
× 若者の掲示板
○ バカ者の掲示板
275ジジイ2:2005/10/04(火) 12:52:48
>>273
いやいやまだまだ。
俺なんて8080から入ったんだけど、当時のマシンはROMが4KB、RAMが256Bだったよ。
それで、ミニコンのような立派な操作パネルがついてた。
メモリは当時ものすごく高くて、フル実装なんてとてもできたもんじゃない。
CPUチップも10万したし、ROMの書込みは専門業者に依頼して、1チップ2万。
あ〜年取ったな〜、フガフガ
276デフォルトの名無しさん:2005/10/04(火) 13:04:11
脱線気味だが昔はキーボードで感動したらしいね。
277デフォルトの名無しさん:2005/10/04(火) 13:21:46
じじいといったら、メインフレーマー。
278デフォルトの名無しさん:2005/10/04(火) 13:56:16
コンソールに上がってくるリプライを溜めとったら
バッファがあふれてシステムが落ちてしもうてのう。
279デフォルトの名無しさん:2005/10/04(火) 14:07:50
脱線しすぎ
280デフォルトの名無しさん:2005/10/04(火) 14:10:32
5メガHDDなんて高嶺の花で、まじ宝石の様な存在だった
281じじい No5:2005/10/04(火) 14:32:10
>>277
ここではそうなのか?

話違うけど、マイコン時代のSE と言えばネ申だった。
今は経験2年でSE 名乗らせる会社もあるようだな。
SE のレベルも落ちたもんだ・・・
そういうおれはシニアエンジニア・・・
282デフォルトの名無しさん:2005/10/04(火) 15:01:21
>>280
俺はFDDに憧れたなあ…
283デフォルトの名無しさん:2005/10/04(火) 15:23:11
N88-BASIC内臓98にあこがれてました。
284デフォルトの名無しさん:2005/10/04(火) 15:34:01
PDP-11の実機に憧れるぜ
285デフォルトの名無しさん:2005/10/04(火) 15:42:18
俺は MEGUMI に憧れています。
286デフォルトの名無しさん:2005/10/04(火) 16:39:19
クロック 8MHz のマシンが発売された時は
こんな速いパソコンがあるのかと思ったもんなー
287デフォルトの名無しさん:2005/10/04(火) 16:58:03
HDDが普及しはじめた頃って1MBあたり1万円ていう感じだったな
20MBで20万円
俺はまだ当分フロッピーでいいや
288 ◆TWARamEjuA :2005/10/04(火) 20:12:49 BE:2613683-###
TK-40のことかー
289デフォルトの名無しさん:2005/10/04(火) 20:37:15
高校の頃、父と相談して540MBのSCSIの外付けHDDを3万出して買いました。
マシンスペックは20286 12MHz メモリ640kB 3.5インチFDDx2
           ~~~~~   ~~~~~~
これが16年前は40万だった。
290デフォルトの名無しさん:2005/10/04(火) 20:43:20
ずれたorz
291デフォルトの名無しさん:2005/10/04(火) 21:11:16
老若男女問わずスレ違いは許さん。
292デフォルトの名無しさん:2005/10/04(火) 22:33:11
それもそうだな。
DOSの頃はどのPerl使ってた?
俺iperl.exe
293デフォルトの名無しさん:2005/10/04(火) 22:53:09
何が書いてあるかさっぱりわからないけど面白いから

続けて↓
294デフォルトの名無しさん:2005/10/04(火) 23:15:10
DOSの頃って?
295デフォルトの名無しさん:2005/10/04(火) 23:17:17
あれだろ、KABAちゃんが黙ってた頃
296デフォルトの名無しさん:2005/10/05(水) 00:08:25
とりあえずラクダ本買って挫折した頃
297デフォルトの名無しさん:2005/10/05(水) 00:17:05
どうやったら言語の習得で挫折なんかできるんだろう。
そりゃあ、なかなか掴めなくて戸惑うことはあるけどさ。
298デフォルトの名無しさん:2005/10/05(水) 01:15:41
>>297
そっとしておいてやれよ。

下には下がいるんだよ。
299デフォルトの名無しさん:2005/10/05(水) 01:56:54
perl で書かれた関数群をライブラリとして、
C++ のコードの中から呼ぶにはどうしたら良いでしょうか?
300デフォルトの名無しさん:2005/10/05(水) 02:15:12
perldoc perlcall
301300:2005/10/05(水) 10:12:38
ありがとうございました。逝ってきます。
302299:2005/10/05(水) 10:13:11
番号間違えた…
ありがとうございました。逝ってきます。
303デフォルトの名無しさん:2005/10/05(水) 12:48:52
>>299-302
このような会話は時々見受けられるのだが。
Win32の環境で実際にやって見せてくれる人はいないのだ
ろうか、といつも思う。
304デフォルトの名無しさん:2005/10/05(水) 12:56:38
Win32かどうか分からないし…。
UNIX系なら別に問題ないからなぁ。
305デフォルトの名無しさん:2005/10/05(水) 16:53:30
CPANからClass::Fieldsを入れる時にmake testでエラーになってしまうのですが
何が問題かが良くわかりません。
> t/bugs............FAILED test 3
> Failed 1/3 tests, 66.67% okay
こんな感じになってるのですが、こういう場合どこを見れば原因がわかるのでしょうか
306デフォルトの名無しさん:2005/10/05(水) 17:02:14
>>305
t/bugs

307デフォルトの名無しさん:2005/10/05(水) 17:11:20
active perl
.plファイルを右クリ->perl command line interpreter
でDOS窓がすぐに閉じます。
閉じないようにするにはどうすればいいでしょうか。
308デフォルトの名無しさん:2005/10/05(水) 17:26:55
DOS窓から実行する
309デフォルトの名無しさん:2005/10/05(水) 19:04:17
>>307
一番最後にダミーで標準入力から一行読込むようにすれば
310デフォルトの名無しさん:2005/10/05(水) 21:07:26
>>307
@echo off
perl %1
echo.
pause
こんな感じのバッチ作って、フォルダオプションのファイルの種類で
.plのアクションに「実行」「さっきのバッチ "%1"」を登録。
そんで「右クリ→実行」ってやってる。
311デフォルトの名無しさん:2005/10/05(水) 21:10:29
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>を検索する事はできるのですが、
その先がわかりません。

どなたか、ご教示おねがいします。
313デフォルトの名無しさん:2005/10/06(木) 04:56:19
眠いので適当
s/<A\shref="([^"]+)">(.+)<\/A>/<A\shref="$1\?n=1\&test\.html">$2</A>/;
314デフォルトの名無しさん:2005/10/06(木) 08:39:57
初期画面のソースは
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の部分だけ一時的に数字にできれば
解決すると思うんですけど、いろいろやってもうんともすんとも動きません・・・。
分かる方居ましたらご教示おねがいします。
315デフォルトの名無しさん:2005/10/06(木) 10:15:07
>>314
君の文章もスパゲッティコード並みに読みにくいな。
316デフォルトの名無しさん:2005/10/06(木) 10:22:03
>>314
問題が再現する最短のソースを載せるべし。
317デフォルトの名無しさん:2005/10/06(木) 13:50:44
>>314
妹が出てくるところまで読んだ
たぶんeval
318デフォルトの名無しさん:2005/10/06(木) 14:07:49
>>314
${'in'.$daypr}
319デフォルトの名無しさん:2005/10/06(木) 15:35:31
>>315-318

説明読みにくくてすみませんでした。
${'in'.$daypr}でいけました。
本当にありがとうございます。
320312:2005/10/06(木) 19:10:02
すみません。>>313のをそのまま入れたのですが
構文エラーが出てしまいます。

$temp =~ s/<A\shref="([^"]+)">(.+)<\/A>/<A\shref="$1\?n=1\&test\.html">$2</A>/;
321デフォルトの名無しさん:2005/10/06(木) 19:25:35
最後のところ
</A>/;  → <\/A>/;
322デフォルトの名無しさん:2005/10/06(木) 19:32:15
・゜・</A`> ウワーン
323デフォルトの名無しさん:2005/10/06(木) 19:36:53
>>321
それは気付いて直しましたが、やはりエラーが出てしまいます。

Bareword found where operator expected at test.cgi line 5, near "s/(.+)<\/a>/$2(.+)<\/a>/$2
324デフォルトの名無しさん:2005/10/06(木) 19:40:53
( ゚д゚) …。
325デフォルトの名無しさん:2005/10/06(木) 19:46:05
ごめんなさい。ファイルの保存を忘れてたみたいで、
>>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>
に変換する事ができました。ありがとうございます。
326デフォルトの名無しさん:2005/10/06(木) 19:46:20
ネットの愚劣に底は無し!
327デフォルトの名無しさん:2005/10/06(木) 22:44:21
>>325
一言多いと言われたことがあるだろw
328デフォルトの名無しさん:2005/10/07(金) 00:11:44
>>327
おまえもなーw
329デフォルトの名無しさん:2005/10/07(金) 12:10:43
ハッシュに配列の参照を突っ込んだときに、
配列の参照を一発で取り出すにはどうしたらよいのでしょーか?

@tmp = (1, 2, 3);
%buf = ('tmp' => \@tmp);

# 2段階で取り出す
$tmp = $buf{tmp};
@foo = @$tmp;

# ホントは一発で取り出したい
@baa = @$buf{tmp}; # こんな感じに
330デフォルトの名無しさん:2005/10/07(金) 12:16:53
@baa = @{$buf{tmp}};
331デフォルトの名無しさん:2005/10/07(金) 12:19:10
>>330
ありがとお。
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";
}
333332:2005/10/07(金) 15:27:36
上記質問の補足です。

「perlのサブルーチンの引数は参照渡し」であることから先行宣言を止めるとなぜmainsubの中で
値の設定ができなくなってしまうのか?
先行宣言を止めた場合とした場合でなにがちがうのか?
引数で'\'をつけて明示的に参照を指定した場合、subには参照の参照が渡っているんかいな?!
334デフォルトの名無しさん:2005/10/07(金) 15:30:20
……
335デフォルトの名無しさん:2005/10/07(金) 16:03:26
>>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初心者の為、お願いします。
337332:2005/10/07(金) 21:51:02
>>335
なるほど。
同じようなことを、モジュールにして試してみたりしてみましたが、モジュールにした場合は暗黙で先行宣言と
同様になるようすね。
ありがとうございました。
338デフォルトの名無しさん:2005/10/07(金) 22:05:19
>>336
localtime(time() - 24 * 60 * 60)
339デフォルトの名無しさん:2005/10/07(金) 22:09:26
>>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
340デフォルトの名無しさん:2005/10/07(金) 22:16:09
>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)
するのがよいかな。
341 ◆TWARamEjuA :2005/10/07(金) 22:17:55 BE:1960092-###
Time::Local
342 ◆TWARamEjuA :2005/10/07(金) 22:19:31 BE:1742382-###
>>341
何か勘違いしていたかも(照)
343デフォルトの名無しさん:2005/10/07(金) 22:23:15
336です。
皆様、ありがとうございました。
いろいろ試してみます。
344デフォルトの名無しさん:2005/10/07(金) 22:57:01
Time::Piece を使う手もあるな。
month_last_day や is_leap_year なんて
メソッドが用意されている。
345デフォルトの名無しさん:2005/10/08(土) 01:45:55
346デフォルトの名無しさん:2005/10/08(土) 07:02:47
open( FILTER, "| $command" );
print FILTER $text;
close( FILTER );

のようなスクリプトで、$command の exit status はどうやって調べるのでしょうか?
347デフォルトの名無しさん:2005/10/08(土) 08:52:07
$?
$? >> 8
348デフォルトの名無しさん:2005/10/08(土) 08:56:53
あ、入力待ちになった場合、close() した後じゃないと取れないかも。試してないけど
349346:2005/10/08(土) 18:23:18
>>347
「? オレは 8 じゃないんだが...」 と思いましたが perlvar 読んで了解しました。
ありがとうございました。
350デフォルトの名無しさん:2005/10/09(日) 01:04:58
?
? >>8
351デフォルトの名無しさん:2005/10/09(日) 01:33:08
m(_ _)m ; # これって正規表現だよな
352デフォルトの名無しさん:2005/10/09(日) 02:47:03
m(゚д゚)m; # ホントダ!
353デフォルトの名無しさん:2005/10/09(日) 03:08:55
タグの中に入っていないURLを置換するにはどうすればいいのでしょうか。
$hoge=~s#(?<!<[^>]+)http://hoge.cgi#http://age.jpg#;
は無理でした。
((?<!<[^>]+)が固定長じゃないから)
354デフォルトの名無しさん:2005/10/09(日) 03:42:56
>>353
$hoge=~s#(?<!["'])http://hoge.cgi/#http://age.jpg#g;
このあたりで妥協するってのはどう?
もしくは、
$hoge=~s#((?:<.*?>)?[^<]*?)http://hoge.cgi/#$1http://age.jpg#g;
かな。もうちょっと綺麗にならないものか・・・
355デフォルトの名無しさん:2005/10/09(日) 04:07:21
ああ、スマソ 下のコードバグあった・・・
マッチした範囲にタグが含まれない場合、
それよりも前に<があっても対処できてない・・・

きっちりやるには正規表現一個じゃやっぱり難しそうな気がする。
# 他の人任せた
356 ◆TWARamEjuA :2005/10/09(日) 07:42:55 BE:5336677-###
s[(?!href|src|cite)="?(http://hoge.cgi)][http://age.jpg];
なんてどうだろう・・・
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]";
358デフォルトの名無しさん:2005/10/09(日) 12:28:44
・文字列の比較に算術演算子を使わない
・配列の先頭に代入する場合はunshift関数(速い?)
・要素数は$#hogeやscalar @hoge、スカラー変数に代入する場合などは@hogeだけでも可
・forで配列を0から順番に回すならforeachを使う
 今扱っている要素番号は$_に入っている
359357:2005/10/09(日) 12:53:26
>>358
ありがとうございます。
ソートの件は自己解決しましたが、perlプログラミングなりの作法があるんだなと
自分の勉強不足を痛感しますた。
360デフォルトの名無しさん:2005/10/09(日) 14:14:20
perlに引数を渡す方法を教えてください
361デフォルトの名無しさん:2005/10/09(日) 15:17:10
perl [option] mona
362デフォルトの名無しさん:2005/10/09(日) 19:45:11
perl [option] hoge1 hoge2 hoge3...

引数は@ARGVに格納される。

$ARGV[0]→hoge1
$ARGV[1]→hoge2
$ARGV[2]→hoge3
363デフォルトの名無しさん:2005/10/09(日) 22:42:54
スクリプトの消失について
364デフォルトの名無しさん:2005/10/09(日) 22:52:53
記憶の消失について
365デフォルトの名無しさん:2005/10/10(月) 02:52:45
わが人生、消失しようとも悔い無し
366デフォルトの名無しさん:2005/10/10(月) 07:29:17
>>357
挿入ソープってなに?
367デフォルトの名無しさん:2005/10/10(月) 07:56:43
ぐぐれば?
368デフォルトの名無しさん:2005/10/10(月) 10:23:51
Perlで2GBのテキストをソートってできますか?
メモリ2GBも無いです。
369デフォルトの名無しさん:2005/10/10(月) 10:51:19
>>368
swapが十分あればできないことはないかもしれんが、組み込みのsort関数
一発でやるのはつらいだろう。こういうときの常套手段は、適当な部分に
わけてソートしたものをいくつかの中間ファイルに書き出して、最後に
それを読みながらひとつにマージするわけだが、既にSort::Externalと
いうモジュールがあるのでプログラミングの勉強でなければそれを使う
のが楽だろう。

あるいは比較条件が難しくなければperlにこだわらずsortコマンド使う
方がてっとりばやいかもな。
370368:2005/10/10(月) 11:55:27
>>369
ありがとうございます!
Sort::External調べてみます。
371デフォルトの名無しさん:2005/10/10(月) 18:01:21
@hogeの中に入ってる値を10個毎に表示したいのですが。
いい方法が分かりません。


えろい人教えてください。
372デフォルトの名無しさん:2005/10/10(月) 18:11:42
foreach (1 .. @array) { if ($_%10 == 0) { print $array[$_-1]; } }
373デフォルトの名無しさん:2005/10/10(月) 18:14:21
何をもっていい方法なのか。
10個ごとときまっているのなら2次元配列にしたほうが楽だと思うけど。
374デフォルトの名無しさん:2005/10/10(月) 18:28:51
>>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], " }
375デフォルトの名無しさん:2005/10/10(月) 18:56:26
>372
>374

100件くらいの不定長のリストを渡して、
10件毎に集計、表示ってのがやりたか
ったのです。

374さんのが素敵な感じです。
ありがとございます。
376デフォルトの名無しさん:2005/10/11(火) 02:46:07
普通に。
print map {$a[$_*10]} 1..int(@a/10);
377デフォルトの名無しさん:2005/10/11(火) 05:10:14
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では良く使われるのでしょうか?
それともあまり使われないのでしょうか?
378377:2005/10/11(火) 05:13:18
追加ですが、自力でソートルーチンを書いて
ソートする事はできます。疑問なのはsort関数等みたいな
Perlの標準的な機能を使ってできないか?って事です。

よろしくおねがいします。
379デフォルトの名無しさん:2005/10/11(火) 05:54:34
>>377
sort { $$a{'date'} <=> $$b{'date'} } @data
配列の中にはハッシュへの無名リファレンスが入ってるってところがミソ
380デフォルトの名無しさん:2005/10/11(火) 05:56:13
あ、二つ目の質問に答え忘れた
Perlでは非常に良く使われるデータ構造だと思うよ
381デフォルトの名無しさん:2005/10/11(火) 06:12:02
ところで、回答を書いていて思ったのだけど->と$$の使い分けってどうするべきなんだろう。
こういうときは->を使ったほうが解りやすくなるかな?
sort { $a->{'date'} <=> $b->{'date'} } @data
三連投スマソ
382デフォルトの名無しさん:2005/10/11(火) 12:24:55
$$a{data}よりも$a->{data}の方が読みやすいと思うから
普段は->を使うけど、@$array_refくらいならまた別。
383デフォルトの名無しさん:2005/10/11(火) 17:01:42
>>377
perldoc -f sort

いろいろ例があるよ。
384デフォルトの名無しさん:2005/10/11(火) 22:35:00
@array = (
    { 'aaa' => 1 },
    { 'bbb' => 2 },
    { 'ccc' => 3 }
);

上記の様な無名ハッシュの配列から値を取り出すには、$array[0]{aaa} などで取り出せますが、
each関数を使用してキーと値を取り出す場合、引数にはどのように指定すれば良いのでしょうか?
($key, $val) = each(%$array[0]) という風に指定してもエラーが出てしまいます。
385デフォルトの名無しさん:2005/10/11(火) 22:47:22
>>384
ブレースで囲めばよいと思うけどな…
($key, $val) = each(%{ $array[0] })
386デフォルトの名無しさん:2005/10/12(水) 09:44:38
PerlでLDAPを使うとしたらどのモジュールが一番いいんでしょうか?
PerLDAPやperl-ldapがあるようですが、よく使われてるのは
どれですか?
387ヽ(´ー`)ノ ◆.ogCuANUcE :2005/10/12(水) 13:32:24
>>386
PerLDAP は保守が止まってる。

perldap-1.4 - 03 Sep 1999 - Leif Hedstrom
perl-ldap-0.33 - 25 Apr 2005 - Graham Barr

LDAP を必要とするモジュール (例えば DBD::LDAP とか) は軒並 perl-ldap に
依存しているので、こっちにしておいた方が無難。
388デフォルトの名無しさん:2005/10/12(水) 20:55:50
あるマシンもしくはネットワークに割り当てられた
グローバルIPを取得するにはどうしたらいいですか?
389デフォルトの名無しさん:2005/10/12(水) 21:05:57
>>388
もうちょっと状況を詳しく書いた方がいいんじゃない?
390デフォルトの名無しさん:2005/10/12(水) 21:24:07
perlとは少しズレるんですが、
jcode.plを使用して正規表現で「ひらがなのみ」にマッチさせる場合、書式はどんな風になるんでしょうか?
/[ぁ-ん]+/ みたいな感じだとひらがなに漢字が混じっていてもマッチしてしまいます。
391デフォルトの名無しさん:2005/10/12(水) 21:34:08
>>390
jcode.plはマッチに関しては何も面倒は見てくれないよ。
ユニコードにするか、

http://www.din.or.jp/~ohzaki/perl.htm

あたりを参考にがんばるかどっちかだろう。
392デフォルトの名無しさん:2005/10/12(水) 21:51:44
>>390
とりあえずsjisと仮定すれば、それじゃ
[\x82\x9F-\x82\xF1]
となって\x82、\x9F-\x82、\xF1にマッチしてるぞっと。

詳しく説明しようかと思ったけど
bホ (\x82\x82\xCE)なんてパターンを考えてたら疲れたorz
393デフォルトの名無しさん:2005/10/12(水) 22:05:36
use encodingはどうだろ
394デフォルトの名無しさん:2005/10/12(水) 22:15:14
Perl5.8のUnicodeは非常にbuggyなのでお勧めできない。
特に正規表現。

ちょっとうまく動かないからデバッガで動かしたら、
デバッグ時だけマッチしなかったり、Perl自体死んだり。
長めのスクリプト書いてると、デバッグできなくて結構悲惨な目に遭う。

「漢字だけにマッチ」とかやりたいときはencoding関係なしで
utf8でやってるな。
(\xe4[\xb8-\xbf][\x80-\xff]|[\xe5-\xe9][\x80-\xbf][\x80-\xbf])
って感じで。
395デフォルトの名無しさん:2005/10/12(水) 22:21:44
>>394
これはまだ使い物になりませんか。
http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html#standard
396デフォルトの名無しさん:2005/10/12(水) 22:22:32
ActivePerlの場合、
use encoding 'shiftjis'; と書いただけで、
デバッガを動かすと即死するもんな〜
Bug DBにも登録されてるけど、全く直す気なしなのか?
397デフォルトの名無しさん:2005/10/12(水) 22:25:56
平仮名なら (\xe3(\x81[\x81-\xbf]]|\x82[\x80-\x93])) かな。
398394:2005/10/12(水) 22:31:09
>>395
それのこと。それが使い物にならない。
95%は動くけど、実用レベルじゃない。

5.8.7になるまでこの状態ってことは、誰もロクに使ってないんだろうな…。
そもそもマルチバイト圏じゃないと必要ないというのもあるけど、
考え方が難解&使い方が煩雑すぎるのもあるんだろうな。

一応、自分はencoding使ってだいたいのことはできるようになったけど、
デバッガが使えない&人に通じない、という二つの理由で
動いたらもうけもの、ぐらいの気持ちで作る自分用の短いスクリプトにしか
使わないな。
399デフォルトの名無しさん:2005/10/12(水) 22:56:49
>>391
あ、言葉足らずですみません。Jcode.plで「eucに変換して」ってことです。
eucなら[ぁ-ん]でマッチしますよね?
ただ、「ひらがなだけ」というのがどうも上手くいかないのです。
400デフォルトの名無しさん:2005/10/12(水) 23:07:03
>>399
>>392
EUCでも同じこと。1バイト目と2バイト目が分かれて認識されてる
加えてEUCはShiftJISよりも1バイト目と2バイト目の範囲が被ってるから、
余計に1バイトずれたい値にマッチしてしまう
EUCやSJISの構造に関してはこのあたりを参考に
ttp://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/CCGI/kanjicod.html
401デフォルトの名無しさん:2005/10/13(木) 00:51:14
そもそもマルチバイト文字はカタログ化してしまうので、encodings なんか
使わんな。

>>398
> 95%は動くけど、実用レベルじゃない。
再現性のある具体例を出さないと、FUD と言われても文句は言えないな。
402デフォルトの名無しさん:2005/10/13(木) 01:46:00
>>387
ありがとうございます。
perl-ldapを使うことにします。
403394:2005/10/13(木) 01:48:03
>>401
なんだこの基地害。いきなり人のことを疑って。
bugs.perl.orgかbugs.activestate.comでも見てろ。
404デフォルトの名無しさん:2005/10/13(木) 02:35:05
>>403
そんな言い方すんなってば。
405デフォルトの名無しさん:2005/10/13(木) 04:12:08
406デフォルトの名無しさん:2005/10/13(木) 08:30:09
----------






----------
のような改行2つに正規表現をマッチさせるにはどうしたらいいでしょう?
s/\n\n/ /g;
s/\n$^\n/ /g;
とかでは置換してくれませんでした
ActivePerl 5.8.7です
407デフォルトの名無しさん:2005/10/13(木) 08:46:28
/m
408デフォルトの名無しさん:2005/10/13(木) 09:03:37
409デフォルトの名無しさん:2005/10/13(木) 10:14:07
ちゃんと \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
試してみてくれ
412デフォルトの名無しさん:2005/10/13(木) 16:49:36
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";
}
413デフォルトの名無しさん:2005/10/13(木) 17:28:26
実行結果:

1: foo1
2: foo2
3: foo1
414406: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;
と試しても同じでした
415ヽ(´ー`)ノ ◆.ogCuANUcE :2005/10/13(木) 20:53:48
>>414
もうなんつか、それ以前の問題。

my $n = join('', <>);

$n =~ s/\n\n/ /mg;

print $n;
416デフォルトの名無しさん:2005/10/13(木) 21:19:09
型グロブってどんな時に便利なんですか?
417409:2005/10/13(木) 21:23:29
やっぱりなあ… $_ に一行ずつ(一つ目の\n(?OR \r\n)まで)しか
入れてないのに、$_ に \n\n が入ってるわけ無いだろ…
行単位以外の入力もいろいろやりかたあるけど、
perl以前にアルゴリズム勉強し直し?
418デフォルトの名無しさん:2005/10/13(木) 22:16:56
419デフォルトの名無しさん:2005/10/14(金) 00:07:35
>>417
> perl以前にアルゴリズム勉強し直し?

それ以前に、不具合がどこで起きているのか調査した
形跡が皆無なのが問題。
420デフォルトの名無しさん:2005/10/14(金) 00:11:05
アルゴリズムじゃなくってPerlの勉強し直しでよくね。
Perlならではのアルゴリズムだし…とマジレスしてみる。

421デフォルトの名無しさん:2005/10/14(金) 01:28:08
>>414
これでいい?

{
  local $/ = "";
  chomp, print $_, " " while <>;
}
422デフォルトの名無しさん:2005/10/14(金) 03:54:38
いや何がしたいかわかってない可能性が大きいのでアルゴリズムというより
論理能力の問題かも。
目的の一部として単に空白行を削除するだけなら、421などより初心者定石的に、
perl -e 'while(<>){next if/^$/; print;}' a.txt
perl -ne 'next if /^$/;print' a.txt
とするだろうし。
423422:2005/10/14(金) 04:01:28
すまん、空白行削除だけじゃなく、何故だか行の連結もするのね(?)
/^$/の検査の後に s/\n$/ / なりを入れるとか好きなように。
424406:2005/10/14(金) 09:29:40
精進しますorz
ありがとん
425デフォルトの名無しさん:2005/10/14(金) 19:05:16
local $/;
$_ = <>;
s/\n\n/ /sg;
print;
426デフォルトの名無しさん:2005/10/14(金) 20:11:36
いやさぁ $/ をいじる方法はドキュメントにも載ってるtipsで皆飽きてるのでは。
入力量や処理を見積もれない場合(人)には有害だし。
427デフォルトの名無しさん:2005/10/14(金) 20:52:55
>>426
ドキュメントに載っていない TIPS や飽きられていない FAQ って何だ。

perl -l40pe 'BEGIN { $/ = "\n\n" }' test1.txt > test2.txt
428デフォルトの名無しさん:2005/10/14(金) 21:05:49
一気読みslurpingに関する考察
http://www.sysarch.com/Perl/slurp_article.html
429デフォルトの名無しさん:2005/10/14(金) 21:47:40
変数の値が数値であるかを判定したいのですが、どうすればよいですか。
例)
$Num = 1.23e45 ;
※もちろん指数も数値として判定する。


430デフォルトの名無しさん:2005/10/14(金) 22:31:34
>>429
sub is_numeral {
  $_[-1] =~ /^\s*([+\-]?\d*\.?\d*(?:[Ee][+\-]?\d+)?)/;
  $1 =~ /^[+\-]?\.?\d/ ? 1 : 0;
}
431ヽ(´ー`)ノ ◆.ogCuANUcE :2005/10/14(金) 22:45:06
俺は Regexp::Common でも推しておくか。

use Regexp::Common qw/number/;

$num =~ m/^$RE{num}{real}$/;
432デフォルトの名無しさん:2005/10/14(金) 22:55:58
>>430
>>431
ありがとん。
433デフォルトの名無しさん:2005/10/15(土) 01:00:49
434デフォルトの名無しさん:2005/10/15(土) 04:02:16
$1とか$2とかをカラにするにはどうすればいいんですか?
435デフォルトの名無しさん:2005/10/15(土) 05:48:03
>>429
$a = 1.23e45; は当然としても、$b = '1.20e2'; などの文字列を
「数値」と判定するつもりなのかどうか、(数値として演算可能ではあるけれど)
いまひとつ、安易には設問の意をとれないのだが…
436デフォルトの名無しさん:2005/10/15(土) 05:54:58
>>434
何もキャプチャーしないマッチを成功させれば全部undefになるよ。

"a" =~ /a/ とか。
437デフォルトの名無しさん:2005/10/15(土) 06:26:10
>>427
ようするにそういう1-linerも必死な厨もお約束どうりつまらんだけなわけ。
438デフォルトの名無しさん:2005/10/15(土) 07:33:52
>>437
全然「ようされて」いませんね。回答せずに逃げるのは痛いです :-P

で、ドキュメントに載っていない TIPS や飽きられていない FAQ って何なんですか?
439デフォルトの名無しさん:2005/10/15(土) 18:00:07
>>438
驚いた。回答も何も、必死厨、頭悪いなあ。
「ドキュメントに載っていない TIPS や飽きられていない FAQ」なんて
アホ捏造して食い下がってるのは自分自身だけだろ
($/="" じゃなくて $/="\n\n" なのもイヤ)
440デフォルトの名無しさん:2005/10/15(土) 18:08:08
nifty の cgi でperl::magickは使えますか?
441ヽ(´ー`)ノ ◆.ogCuANUcE :2005/10/15(土) 18:23:14
>>440
>>1
> CGIについての質問は板違いです。

nifty のサポートに聞くのが筋では?
442デフォルトの名無しさん:2005/10/15(土) 18:36:17
ダウンロードカウンタースクリプトのシバンの直後に挿入している一部です。

# ユーザーエージェントでロボット除外
$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だっけ?)です。
よろしくお願い致します。
443デフォルトの名無しさん:2005/10/15(土) 18:53:32
>>442
何故でしょう、って、その部分の code片の動作だけでは異常は無いんでしょ?
単に環境にあわせてdebug作業を工夫する能力が足りない、というのと、
>>1すら理解できない、という基礎能力の不足が、最大の原因だと思う。
>>CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
>>CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
>>CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするので
444デフォルトの名無しさん:2005/10/15(土) 19:17:57
>>443
どっから見てもPerlスクリプトと思うが。

>>442
文字コードをEUCでもダメ?
445デフォルトの名無しさん:2005/10/15(土) 19:21:12
あほだ
446デフォルトの名無しさん:2005/10/15(土) 19:28:33
文字コードをEUCでもダメ?
文字コードをEUCでもダメ?
文字コードをEUCでもダメ?
文字コードをEUCでもダメ?
文字コードをEUCでもダメ?
447デフォルトの名無しさん:2005/10/15(土) 20:35:02
>>444
Perlスクリプトか否かは、まったく問題になってないのだが、
何が言いたいの?
そうか、いわゆる CGIじゃない可能性も皆無ではないからなあ、って、
>文字コードをEUCでもダメ?
ここで笑うとこなの?
448デフォルトの名無しさん:2005/10/15(土) 20:53:47
WindowsXP SP2

active perl 5.8.7(windows版) をインストールして、
インストールディレクトリで、

.\perl.exe -e 'printf("AAA\r\n")'

とやっても、何も表示されない(空白行が出力されておしまい)んですが、
よくわかりません。何をチェックしたらよいでしょうか。
449デフォルトの名無しさん:2005/10/15(土) 20:58:31
\rは要らないんじゃない?
450デフォルトの名無しさん:2005/10/15(土) 21:00:14
コマンドプロンプトでで''で括るのはサポートされない
451448:2005/10/15(土) 21:03:20
>>449
\r ありでも無しでもファイルに書き出して perl file.pl とやるとうまくいきますね。

>>450
う〜ん、そうなんですか。確かにファイルに書き出すと問題無いです。orz
452448:2005/10/15(土) 21:05:38
以下のようにしたらできた… OTZ

perl -e printf(\"AAA\")
AAA
453デフォルトの名無しさん:2005/10/15(土) 21:20:56
>>452
>>450 の補足。cwd.exe の事は知らんが、command.com では
コマンドの引数を括るのに ' は使えず " しか使えない。
perl 以前にシェルの問題。 perl -e "printf('A A A')" なら通るし、
bash や csh のようなまともなシェルなら ' でも括れる。

>>452 の例が通るのは、-e オプションのパラメータに空白文字
やパースエラーになるクォート文字が含まれず、一つの引数と
正常に認識されるから。

あと print で済む事に printf は使わないのが Perl 流。
454448: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.
456デフォルトの名無しさん:2005/10/16(日) 06:23:03
>>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)
などの文字列に成り下がってしまいます。
それはそれで別段構わないのですが、
この文字列(メモリ上のアドレス??)の一意性って保証されるのでしょうか?
458デフォルトの名無しさん:2005/10/16(日) 18:10:03
>>457
リファレンスをハッシュのキーに使わなくてはならないようなシチュエーションが知りたい。
459デフォルトの名無しさん:2005/10/16(日) 18:48:28
0を挿入しようと思ったんですが
例えば
s/(〜)(〜)/\10\2/
とかだと\10と認識されてしまって\1と\2の間に0をいれるってことが出来ないのですが
こういうときはどうやって\10ではなく\1と0と認識させるんですか?
460457: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が返ってきてしまいますし
間違った値が返されることもあるかもな、と思いまして質問させて頂きました。
461デフォルトの名無しさん:2005/10/16(日) 19:04:52
>>459
普通は s/()()/${1}0$2/ だろうなあ。
462ヽ(´ー`)ノ ◆.ogCuANUcE :2005/10/16(日) 19:08:42
>>460
"Order=HASH(0x...)" のままだと、bless しなおされたらアウトじゃないか。
使うんなら = よりも後の部分だな。

オブジェクトの文字列表現をキーに使うのは、Attribute::Handlers でも
やってるから問題ないように思うけど、保証されてるかどうかは知らん。
463457:2005/10/16(日) 19:50:34
>>462
ありがとうございます。
リブレスされたら確かにそうですね。
464デフォルトの名無しさん:2005/10/16(日) 19:52:32
>>461
いけました
ありがとうございました
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形式以外はできないんでしょうか?
468デフォルトの名無しさん:2005/10/16(日) 20:38:25
>>467
そう考える根拠は何でしょうか?
469デフォルトの名無しさん:2005/10/16(日) 20:52:23
Tie::RefHash
470457: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]/) {
473デフォルトの名無しさん:2005/10/17(月) 01:13:58
>>471
全部ハッシュか配列に読み込んで、目的の行を追加して、ファイルに書き出す。
474デフォルトの名無しさん:2005/10/17(月) 02:17:52
>>473
どうもです
まだperl勉強したてでいまいちハッシュを理解出来ていないので勉強しなおしてきます
$○×△なんかとどう違うのかが理解できなくて苦笑
475デフォルトの名無しさん:2005/10/17(月) 11:56:11
>>468
Perlでファイルにデータを書き込むプログラムはCSV以外に見たことないので
476デフォルトの名無しさん:2005/10/17(月) 14:34:12
>>475
ただの経験不足かと(煽りではなく)
477デフォルトの名無しさん:2005/10/17(月) 15:03:36
>>475
正確にはファイルハンドルへ出力。
ファイルハンドルはファイルであったり、STDOUTだったり、ソケットだったり。
もしかしてCGIだけでPerlを語ってる?
478デフォルトの名無しさん:2005/10/17(月) 15:30:23
>>477
CGIだってバイナリファイル(画像とか)吐き出したりすることもあるでそ。(重箱すまん)
479ryu: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で判断する方法ってあるんでしょうか?

481デフォルトの名無しさん:2005/10/17(月) 15:59:05
> &write_confirm()ルーチンを実行しいるのが問題なのかな・・?

&write_confirm() で、ものすごい勢いで exit されているわけだが。
482ryu:2005/10/17(月) 16:03:08
>>481
ご指摘ありがとうございます。
やっぱりこのexit;ダメですよねorz

と、思い、このexit関数をコメントアウトしたら、確認画面の直ぐ下に
エラー表示まで出てしまうという・・。どうしたらいいのか。。
483デフォルトの名無しさん:2005/10/17(月) 16:13:36
>>482
ちょっと落ち着け。

なんで入力確認が終わってないのに書きこみ画面を出力しちゃってるんだ?
perl 以前の問題だよ。
484ryu:2005/10/17(月) 16:18:33
orz
485ryu:2005/10/17(月) 16:26:59
>>483

落ち着きます;

書き込み確認画面を出す前に入力チェックをしたいのですが、
それがうまくできないのですfrtgyふじこlp;;lp;@
今のままだとreturn 0;とする前にwrite_confirm();
が出てきてるから、こうなるのはあたりまえといえばあたりまえなんですが・・。
486デフォルトの名無しさん:2005/10/17(月) 16:32:55
>>485
> 今のままだとreturn 0;とする前にwrite_confirm();
> が出てきてるから、こうなるのはあたりまえといえばあたりまえなんですが・・。

答え出てるじゃん。
487ryu:2005/10/17(月) 16:38:54
はい;

んで、
if($FORM_DATA{'action'} eq 'confirm'){ #確認画面
return 0;
&write_confirm($name,$mail,$url,$title,$message,$color);
}el(ry

と単純に順番を入れ替えたら、入力チェックはするのですが、
チェックを全部とおるような書き込みをすると
書き込み画面を表示せず、即座に書き込んでしまいます_| ̄|○
ちなみにネタじゃないです。
488デフォルトの名無しさん:2005/10/17(月) 16:53:08
> return 0;
> &write_confirm($name,$mail,$url,$title,$message,$color);

だから 落 ち 着 け って。
これだと &write_confirm は絶対呼び出されないってば。

全体的なフローを一から見直すことをお勧めする。
489デフォルトの名無しさん:2005/10/17(月) 17:02:48
ネタ以外の何者にも見えんわ
490デフォルトの名無しさん:2005/10/17(月) 18:07:57
>>478

>>477はアスキーかバイナリかなんて言ってないように見えるけど。
でもって、バイナリ吐き出すのもCGIとは限らん罠。
491デフォルトの名無しさん:2005/10/17(月) 21:05:31
pm使えない環境でpm使おうとするとき
みなさんどーしてまふ?
492酩酊 ◆TWARamEjuA :2005/10/17(月) 21:31:56 BE:1089825-###
>>491
よく判らないのでよく判りません♪
493デフォルトの名無しさん:2005/10/17(月) 21:47:59
>>492
あ、そ
494デフォルトの名無しさん:2005/10/17(月) 21:49:58
pm使えない環境なんてあるの?どんな環境?
495デフォルトの名無しさん:2005/10/17(月) 21:51:01
>>494
色々
496デフォルトの名無しさん:2005/10/17(月) 22:30:26
pm使えない環境でpm使えたらそれはpm使えない環境じゃないじゃん。
矛盾だ。
497デフォルトの名無しさん:2005/10/17(月) 22:42:57
>>496
言葉遊びでもしたいの?
498酩酊 ◆TWARamEjuA :2005/10/17(月) 22:43:48 BE:436122-###
なぁんだ釣りか♪
499デフォルトの名無しさん:2005/10/17(月) 22:47:50
なあんだ粘着か♪
500デフォルトの名無しさん:2005/10/17(月) 23:06:48
>>491-499
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlmod.html#Perl_Modules

<q cite="http://perldoc.jp/docs/perl/5.6.1/perlvar.pod">
配列 @INC には、do EXPR、require、use によってライブラリファイルを
探すときに評価する場所のリストが納められています。
</q>

BEGIN { unshift @INC, '/your/lib/path' }
use YourLib;
501デフォルトの名無しさん:2005/10/17(月) 23:13:13
>>500
ありがと
502デフォルトの名無しさん:2005/10/17(月) 23:30:50
つまり使える環境なのに「使えない環境で〜」とか
質問で嘘ついてたってわけですね。
503デフォルトの名無しさん:2005/10/17(月) 23:33:25
>>502
しつこいね粘着
504デフォルトの名無しさん:2005/10/17(月) 23:41:20
粘着質は優秀なエンジニアの証:)
505デフォルトの名無しさん:2005/10/17(月) 23:43:47
なら粘着がんばれ。
オレは教えてもらったとーり今から勉強する。
他の相手見つけろ。
506デフォルトの名無しさん:2005/10/17(月) 23:50:28
┐(´ー`)┌
507デフォルトの名無しさん:2005/10/18(火) 00:54:57
池沼はスルーしろ。
508デフォルトの名無しさん:2005/10/18(火) 01:06:04
粘着は優秀なプログラマにして無能なエンジニアの証
509デフォルトの名無しさん:2005/10/18(火) 02:06:30
すみません、質問させていただきます。

@b の各要素を @a の各要素と正規表現で比較し、マッチしなかった
@b の要素を表示させたいのですが、どんな方法がありますでしょうか。

イメージとしては、

@a = (1, 3, 1);
@b = (a0, b1, c2, a0, b1, c2);

結果として、
a0
c2
を出力したいです。よろしくお願いします。

510デフォルトの名無しさん:2005/10/18(火) 02:17:03
>>509
イメージ意味不明
511デフォルトの名無しさん:2005/10/18(火) 02:20:56
さっぱりわからんw
512デフォルトの名無しさん:2005/10/18(火) 02:27:36
>>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;
513509:2005/10/18(火) 02:31:03
>>512
おぉぉぉ、すごい、ありがとうございます。
つたない説明も理解していただき、本当にありがとうございます!
514デフォルトの名無しさん:2005/10/18(火) 04:06:31
すごいというか、暗号だな
これがPerlじゃなかったら悪いプログラムの見本みたいだw
515デフォルトの名無しさん:2005/10/18(火) 04:46:13
>>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";
516デフォルトの名無しさん:2005/10/18(火) 04:48:13
下のもの、訂正。

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";
517デフォルトの名無しさん:2005/10/18(火) 05:12:34
quotemetaなんて便利なもんがあるの知らんかった
518デフォルトの名無しさん:2005/10/18(火) 06:51:03
$hoge =~ s/((?:\{)*(?: )*(?:")*)([^<>\n]+?)(<a .*?>).*?<\/a>/$1$3$2<\/a>/g;

リンクタグの前の文字列にリンクをつけたいんです。
たとえば、うううう<a href="〜">ああああ</a>とあったら、
<a href="〜">うううう</a>と書き替えたいんです。
だけど、 や{にリンクがつくのは避けたいのです。
それで、上の文で、 のほうはつかないようにできたのですが、
{のほうには、どうやってもついてしまいます。
どなたか助けてください。
519デフォルトの名無しさん:2005/10/18(火) 06:57:25
(?:{)*とかっこでくくってるのはただの苦し紛れです
520デフォルトの名無しさん:2005/10/18(火) 07:52:33
>>518
$hoge =~ s!([^<>{ \n]+)(<a .*?>).*?(</a>)!$2$1$3</a>!g;
521520:2005/10/18(火) 07:58:01
ん?
もしかしてマルチバイト文字の中に{が入ってると上手くいかないのかな?
そーゆーときはEUC-JPとかに変換して処理しませう。
522519:2005/10/18(火) 08:43:23
>>515-516
解説ありがとうございます。

はずかしながら、map と quotemeta を始めて知りました。
すごい便利ですね。今後活用します!

map
map は,リスト中の各要素を「式」または「ブロック」で
評価した結果からなるリストを返す関数である。
grep 同様,各要素は $_ で参照できる。

quotemeta
引数からすべての正規表現のメタ文字をバックスラッシュで
エスケープしたものを返す。
523509:2005/10/18(火) 08:44:06
>>522
名前間違えました。orz
524デフォルトの名無しさん:2005/10/18(火) 09:05:55
>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";
525デフォルトの名無しさん:2005/10/18(火) 10:57:10
map や grep って、覚えたての頃はそればっかり使いたくなるよね。
526デフォルトの名無しさん:2005/10/18(火) 12:33:22
こういうのはイテレータって呼んでいいの?
527デフォルトの名無しさん:2005/10/18(火) 13:13:21
全然別モンだろ
528デフォルトの名無しさん:2005/10/18(火) 21:28:39
Perlのプログラミングでデザインパターン使ってますか?
529デフォルトの名無しさん:2005/10/18(火) 21:52:10
>>528
ごく普通に使ってるよ。

CPAN にあるデザパタ系のユーティリティクラスは正直使い勝手が悪いので、
自分でイチから書いたけど。
530デフォルトの名無しさん:2005/10/18(火) 22:25:59
Perl6まだーん?
531デフォルトの名無しさん:2005/10/18(火) 22:41:44
                _∧_∧_∧_∧_∧_∧_∧_∧_
     デケデケ      |                         |
        ドコドコ   <   Perl6まだぁ〜!?           >
   ☆      ドムドム |_  _  _ _ _ _ _ _ _ _|
        ☆   ダダダダ! ∨  ∨ ∨ ∨ ∨ ∨ ∨ ∨ ∨
  ドシャーン!  ヽ         オラオラッ!!    ♪
         =≡= ∧_∧     ☆
      ♪   / 〃(・∀・ #)    / シャンシャン
    ♪   〆  ┌\と\と.ヾ∈≡∋ゞ
         ||  γ ⌒ヽヽコ ノ   ||
         || ΣΣ  .|:::|∪〓  ||   ♪
        ./|\人 _.ノノ _||_. /|\
         ドチドチ!
532デフォルトの名無しさん:2005/10/18(火) 23:13:00
webprogに書き込んだのですが、違うような気がしたので移動宣言してこちらにきました

レンタル鯖がaaacafeでmySQLは使えるのですが、鯖にDBIモジュールがないようなのです。
レンタル鯖のCGIで接続したい場合、どういった方法を取ればいいのでしょうか。
CGI自体はローカル起動、ローカルのMySQL、ローカル起動、レンタル鯖のMySQLで正しく動くので、スクリプト上のエラーではないと思います。

DBI.pmを追ってみたのですが全然整理できませんでした。
ヒントでもあればお願いします。
533デフォルトの名無しさん:2005/10/18(火) 23:20:41
PHPでも使ってください
534デフォルトの名無しさん:2005/10/18(火) 23:24:53
>>532
DBIモジュールがないとわかってるのならインスコすればいいような...
535デフォルトの名無しさん:2005/10/19(水) 00:19:43
>>532
DBI確認できないだけでなんてこっちに移動するんだか…
自分でプロパイダかサーバ(or perl)自身に問い合わせて確認すれ。
か、自分で API組むか組み込めよ。
536デフォルトの名無しさん:2005/10/19(水) 11:21:53
それが初心者クオリティ
537デフォルトの名無しさん:2005/10/19(水) 12:43:11
レン鯖だったら乗り換えればいい。
538デフォルトの名無しさん:2005/10/19(水) 15:32:52
オンラインゲームのサーバー状態を取得したいのですが、Net::Pingを使えば可能でしょうか?
具体的にはHalf-Life:Counter-Strike1.6の鯖でポートは27015番です。
539デフォルトの名無しさん:2005/10/19(水) 15:58:50
>>538
サーバー状態が何かにもよるがtcpでconnectできりゃいいだけなら
Net::Pingで調べられる。デフォルトのechoポート以外を使う方法は
SYNOPSYSのプログラム例にある。しかしこのくらいマニュアル読め
ばわかると思うのだが....



540デフォルトの名無しさん:2005/10/19(水) 17:57:59
ありがとうございます
541デフォルトの名無しさん:2005/10/19(水) 18:01:41
こんなゴミ言語よく使い続けますね^^
542デフォルトの名無しさん:2005/10/19(水) 18:07:35
Perlがゴミ言語だなんて…
>>541(´・ω・) カワイソス
543デフォルトの名無しさん:2005/10/19(水) 18:14:47
きっとひどく汚いソースしか見る機会が無かったんだねテラカワイソス(´・ω・`)
544デフォルトの名無しさん:2005/10/19(水) 18:35:44
Net::FTP 使ってディレクトリをrmdirで削除しようとすると「ディレクトリが空じゃあない!!」って怒られたんだけどディレクトリの中身の有無にかかわらずディレクトリ削除ってできないのですか?
545デフォルトの名無しさん:2005/10/19(水) 18:45:08
>>544
perldocより
If "RECURSE" is *true* then "rmdir" will attempt to delete everything inside the directory.
rmdir($dir, 1);
で良いんじゃなかろか。試してないけれど
546デフォルトの名無しさん:2005/10/19(水) 18:47:41
>>544
ftp的にできないので(鯖によるかもしれんが普通できない)、
Net::FTP使って再帰的にディレクトリ掘って中のファイルやディレクトリを順に消してくしかない。
547デフォルトの名無しさん:2005/10/19(水) 20:34:29
>>545
ダメでした。

>>546
やっぱそれしか無いのかなぁ。
548デフォルトの名無しさん:2005/10/19(水) 22:37:44
>>547
> >>546
> やっぱそれしか無いのかなぁ。

Net::FTPのrmdirというメソッドにそのコードが入っているから
コピるといいよ。
549デフォルトの名無しさん:2005/10/20(木) 09:44:50
ある人に「ファイルを open する時には必ず返り値をチェックするのに
close で返り値をチェックしないのはなぜ?」 と質問されました。

「チェックしてもいいけど、もしcloseでエラーが起きたとき、
どういう処理をすればいいと思う?」
と説明しましたが、ちょっと不安になりました。。
close も返り値をチェックした方が良いのでしょうか?
もちろん、スクリプトの目的に依存するのはわかりますが、
こんな時には close もチェックしたほうが良いといった具体例はあるでしょうか?

一般的に返り値のチェックに関しては、私は経験的に
・ファイル、ネットワーク周りのIOが発生する関数、
・system,
のような関数には必ず返り値をチェックするようにしています。
でも、use もpmファイルを読み込んでいますが、これをチェック
したことはありません。
どんなときに返り値をチェックするか、初心者に説明しやすい一般的な基準は
無いでしょうか?


550デフォルトの名無しさん:2005/10/20(木) 10:01:31
同じファイルハンドル名で次のopenが成功すれば、前のopenは強制closeだから、とかだったはず。メモリの占有とかまでは知らない。
551デフォルトの名無しさん:2005/10/20(木) 10:11:26
>>549
そのファイルへの書き込みが完了したことを確実に確認
する必要があって、且つNFSなどネットワーク越しの操作と
なっている可能性がある場合。
552デフォルトの名無しさん:2005/10/20(木) 16:18:02
蛇足なんだけど、質問に答えている人はほとんどSEやPG?
553デフォルトの名無しさん:2005/10/20(木) 16:33:18
>>552
NEET
554デフォルトの名無しさん:2005/10/20(木) 19:03:27
学生とか。
555デフォルトの名無しさん:2005/10/20(木) 19:52:00
>>552
日本語勉強しる
556デフォルトの名無しさん:2005/10/20(木) 19:54:22
>>552
眼鏡っ娘女子中学生
557デフォルトの名無しさん:2005/10/20(木) 20:03:09
>>552
様々に決まってるダロ。
また、SEやPGが必ずしも知識を持っているわけではナイ。
558デフォルトの名無しさん:2005/10/20(木) 20:09:18
>>552
匿名掲示板でんなことわかるかい!
559デフォルトの名無しさん:2005/10/20(木) 20:17:23
研究者
560デフォルトの名無しさん:2005/10/20(木) 20:19:09
>>552
まず、お前の身分から言ってみろ
561デフォルトの名無しさん:2005/10/20(木) 22:21:50
>>560
部長だが何かね?
562デフォルトの名無しさん:2005/10/20(木) 22:28:49
>>561
どうせ宴会部長だろ?w
563デフォルトの名無しさん:2005/10/20(木) 22:37:55
アマチュア無線部の部長に50マッカ
564デフォルトの名無しさん:2005/10/20(木) 22:54:21
頭のおかしいのが一人でカキコしてるのか・・・。
565デフォルトの名無しさん:2005/10/20(木) 23:12:50
俺窓際部長
566デフォルトの名無しさん:2005/10/20(木) 23:24:44
最近、部長には仕事がないんじゃないかと思う今日この頃です。
事故が起きても謝りに行くのは課長だし…
社員からは「部長、仕事してねーよ」とか言われてます。
私だって好きで部長になった訳じゃないのです。本当はバリバリ
仕事したいのに…
567デフォルトの名無しさん:2005/10/20(木) 23:49:23
どうせチャレンジ部の部長だろ?
ttp://www.geocities.jp/c_hallenge/
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です
570デフォルトの名無しさん:2005/10/21(金) 01:29:35
571デフォルトの名無しさん:2005/10/21(金) 01:56:26
>>568
cygwin版では 処理の優先順位が違うのかな?

ちなみに

perl, v5.8.4 built for i386-linux-thread-multi
perl, v5.8.7 built for MSWin32-x86-multi-thread

でも () で array にする必要あり。
572デフォルトの名無しさん:2005/10/21(金) 07:24:30
>>543
最近perlを学習し始めたんですが、perlで書かれたプログラムで
きれいなソースのやつを教えてもらえませんか。
573デフォルトの名無しさん:2005/10/21(金) 08:08:37
>>572
最近、Perlを学習し始めたのなら、きれいなソースを見たってしかたないだろ。
もっと勉強してから出直してこい。
574デフォルトの名無しさん:2005/10/21(金) 10:04:39
575デフォルトの名無しさん:2005/10/21(金) 10:29:24
>>572
「きれいなソース」とは、どういう意味で言ってる?
コーディングスタイルのこと?
それとも、様々なテクニックを駆使した芸術的なコードのこと?
初心者なら、後者はまだ不要。

本屋で売っているPerl入門書で、まずはみっちり勉強することだ。
どんな本でも良いが、それとは別に“ラクダ本”は必ず買っとけ。
Perlのバイブルだし、設計思想なども学ぶことができる。
576デフォルトの名無しさん:2005/10/21(金) 10:30:06
>>572
cpanに行けばPer Hackerが書いたスクリプトが
沢山あるからみてみることをお勧めする

逆に汚い例は日本の巷に溢れるCGIスクリプトだな。
当然綺麗なものも中にはあるんだろうが、悪い例に毒されたものが多すぎる…
577デフォルトの名無しさん:2005/10/21(金) 10:46:52
ところで標準モジュールなんかを見ると、インデントが1レベルなら4桁のスペースだが、
2レベルになるとタブでインデントしてあったりするんだが、何を使うとこうなるんだろ・・・
普段タブ幅を4でやってるからそのままじゃ読みにくくてかなわん
578デフォルトの名無しさん:2005/10/21(金) 11:18:36
emacsであんま考えないでやるとそうなる。
579デフォルトの名無しさん:2005/10/21(金) 11:25:21
>>578
そうなのか・・・Un*x環境ではVim派な漏れ
# vim:set ts=4 sts=4 sw=4 tw=0:
580デフォルトの名無しさん:2005/10/21(金) 11:52:54
>>579
一時的にタブ幅の設定を8に変えるか(ts=8)、expand(1)などで
自分好みにおきかえたファイルを別に作るかだろうな。

581572:2005/10/21(金) 12:21:33
>>573-576
お返事どうもです。
ええっと、言葉が足りなかったですね。他の言語での経験はあります。
あと、「きれい」とは「保守しやすい」という意味で使ってました。

必要に駆られて、perlを勉強することになったのですが、ソース読みながら
勉強したほうが早いので、おススメのがあれば、と聞いてみました。
CPANを探してみることにします。

e-book版が安かったから、ApressのJames Lee"Beginning Perl, Second Edition"
を使って勉強しています。自分にはちと初心者向けすぎて冗長な感じがしますが、
読みやすく、ハマりそうなところもきちんと説明してあって、良い本だと思いました。

精進します。それでは。
582デフォルトの名無しさん:2005/10/21(金) 12:25:45
>>574
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlstyle.html

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

だけ意味が分からなかった。どういう意味なんだろう。
583デフォルトの名無しさん:2005/10/21(金) 13:04:34
>>582
漏れも分からん。
原文ではSpace after last parenthesis matching on current line.とあるから、丸括弧のことだろうが…
584デフォルトの名無しさん:2005/10/21(金) 13:24:16
>>582-583
外してる可能性が高いが、
if( EXPR ){ ... } と書かず
if (EXPR) { ... } と書け、という事では無かろうか。
585デフォルトの名無しさん:2005/10/21(金) 13:48:56
if (!$override && ($self->{'.fieldnames'}->{$name} ||
defined($self->param($name)) ) ) {

の2行目の後から3つ目のカッコのあとに入れたスペースのようなもののことではないかと。
(上の例ははlib/CGI.pmの中から抜き出したものです)
586デフォルトの名無しさん:2005/10/21(金) 13:56:22
>>582

(a + (b +
    (c + d)_))

_ の箇所にスペースを入れろ、ということだと思われるが
587586:2005/10/21(金) 13:57:48
ああ、かぶってしまった
588デフォルトの名無しさん:2005/10/21(金) 17:04:59
ぐぐっても見つけられなかったので、お力添えを
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]";

はエラーになる
589デフォルトの名無しさん:2005/10/21(金) 17:29:24
$test[1234567] = test;

とした時点で1234567要素分の配列のためのメモリ領域がとられるから、
制限がケチだとメモリ使い杉でエラーになるかもな。

590デフォルトの名無しさん:2005/10/21(金) 17:36:00
>>588
このスレに書くならせめて「500エラー」じゃなくてエラーメッセージを調べて書こうな。

配列ってのは基本的に連続したデータのためのものだから、
連続したデータじゃないなら連想配列を使うべし。
連続したデータなら…そんな大きなデータを扱わなくても良いように設計を見直すべし。
591デフォルトの名無しさん:2005/10/21(金) 17:38:54
>>585-586
なるほど、納得
592デフォルトの名無しさん:2005/10/21(金) 17:42:27
>>589
即レス感謝です。
恥ずかしながらyyyymmddをそのまま添え字にして動かしてました
1900と1足してなかったから今まで何とか動いてただけかorz
593588:2005/10/21(金) 17:44:08
>>590
ハイ、大反省デス
昨日まで動いてたのが突然動かなくなったのでパニくってました

早速見直しおば
594デフォルトの名無しさん:2005/10/21(金) 20:30:50
Perlでレンタルサーバーで自分が設置できるスペースの残り容量の調べれ方を教えてお
595デフォルトの名無しさん:2005/10/21(金) 22:09:53
>>592
ヒント:連想配列
596デフォルトの名無しさん:2005/10/22(土) 01:02:59
>>594
鯖屋との契約内容次第だろ。
鯖屋にメールしる。
597デフォルトの名無しさん:2005/10/22(土) 14:06:39
>>596
Perlで残り容量調べれないとこれ以上書き込めませんっていうメッセージ出せない
598デフォルトの名無しさん:2005/10/22(土) 14:52:38
>>597
> Perlで残り容量調べれ
るようにしているかは鯖屋次第。
599デフォルトの名無しさん:2005/10/22(土) 17:17:36
$zz = '○○○○';

print "変数から実行\n $zz";


○○○○の中だけ、いじれる場合に【print "123"】とか実行させることは
できないでしょうか?
$zzに色々関数を入れたいんですが・・・
600デフォルトの名無しさん:2005/10/22(土) 17:21:59
eval?
601デフォルトの名無しさん:2005/10/22(土) 17:33:25
$zz = 'eval(print "123")';

print "変数から実行\n $zz";


[出力]
変数から実行
eval(print "123")

※注 ○○○○の中だけなので、
【print "変数から実行\n】の後ろに認識する「ダブルコーテーション」を
入れることができれば・・・無理かなぁ
602デフォルトの名無しさん:2005/10/22(土) 17:35:42
あほか
603デフォルトの名無しさん:2005/10/22(土) 20:10:14
脆弱性作ろうとしてるのか?
つーか、'使えばすぐ出来るだろ。
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";
605604:2005/10/22(土) 21:38:59
訂正。置換はスペースへの置換でした。
こうしないと、カウント失敗するパターンがあるので。 (' a hoge hoge' とか)

正) while($str =~ s/(^$KEY\s|\s$KEY\s|\s$KEY$)/ /) { $count ++; }
606デフォルトの名無しさん:2005/10/22(土) 21:59:07
>>604
こんなもんかな。

my $KEY = 'hoge'; #キーワード
my $str = 'hoge hogehoge foo hoge bar hoge';
my %count;
foreach (split(/\s+/, $str)) {$count{$_}++ }
print "ans = $count{$KEY}\n";
607酩酊 ◆TWARamEjuA :2005/10/22(土) 22:03:36 BE:3920966-###
printf "ans = %d\n", scalar m|\b$KEY\b|g;
でもよさそうな?
608デフォルトの名無しさん:2005/10/22(土) 22:25:25
>>607
始めそう思ったが駄目なはず。
@a = ($str =~ /\b$KEY\b/og); $count = scalar(@a);
破壊してよいなら、リファレンスマニュアル的に
$count = ($str =~ s/\b$KEY\b//og);
609608:2005/10/22(土) 22:40:22
いや、FAQ的にはこれでできてた。
$count = () = $str =~ /\b$KEY\b/og;
610酩酊 ◆TWARamEjuA :2005/10/22(土) 22:40:39 BE:2614638-###
>>608
あれま、、、浅はかだったかぁ。。。

printf "ans = %dn", scalar map 1, $str =~ m|b$KEYb|og;'
これだと出てくるのかぁ(汗)
611604:2005/10/22(土) 22:45:23
どうもです。一応破壊はしてもかまわないです。

ところで、
>>607 の m|\b$KEY\b|g; はどういう処理ですか? 

基本構文っぽいけど、見たことない。
612デフォルトの名無しさん:2005/10/22(土) 22:49:53
>>609
ああ、なるほど。いったん配列で受けるのか。
これは応用でいろいろ使えそうですね。
613デフォルトの名無しさん:2005/10/22(土) 22:52:25
えっと 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とかの
リプライを出力するにはどうしたらよいのでしょうか?

よろしくお願いいたします。
615デフォルトの名無しさん:2005/10/23(日) 01:31:51
`
616デフォルトの名無しさん:2005/10/23(日) 01:37:10
>>614
printがいらないのでは?
617デフォルトの名無しさん:2005/10/23(日) 01:43:30
656
printで解決をしたいです!
618デフォルトの名無しさん:2005/10/23(日) 01:52:43
何したいのかよく分からないけど、
pingの出力をファイルに書き出して、
それを読むのもだめ?
619デフォルトの名無しさん:2005/10/23(日) 01:55:32
`ping 10.1.1.1`
620デフォルトの名無しさん:2005/10/23(日) 03:39:22
>>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とかになるので、そこを直したいです。
622デフォルトの名無しさん:2005/10/23(日) 10:57:04
$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
にしたいです。
よろしくお願いいたします。
625デフォルトの名無しさん:2005/10/23(日) 11:58:08
>>624
2行のReplyが1行になってるけど、timeは平均するの?
626デフォルトの名無しさん:2005/10/23(日) 12:13:16
>>604
split
627625: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"
  }
}
628デフォルトの名無しさん:2005/10/23(日) 12:21:01
なんでNet::Ping使わないの?
629デフォルトの名無しさん:2005/10/23(日) 13:19:27
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));
}
632デフォルトの名無しさん:2005/10/23(日) 23:25:48
print factorial($number), "\n";
じゃないの?
633デフォルトの名無しさん:2005/10/23(日) 23:29:28
うわ、凄いミスしてました・・・。
""の使い方間違っていました。

ありがとうございます!
プログラムって面白いですね。
634デフォルトの名無しさん:2005/10/23(日) 23:31:33
>>633
> プログラムって面白いですね。

そう思うなら早めにPerlから他の言語に鞍替えしなさい
635デフォルトの名無しさん:2005/10/24(月) 01:40:03
すまん、普通に質問するわ。
モジュールの解説本(邦もの)で良いやつ紹介して。
636デフォルトの名無しさん:2005/10/24(月) 02:10:29
階乗は再帰呼出の説明のためによく使われるが、
本当に再帰呼出を使うのはヴァカがすることです。

$ans *= $num-- while $num > 0;
637デフォルトの名無しさん:2005/10/24(月) 02:16:20
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 と++)の近くが怪しいと出ています。
どなたかお力をお借りしたいです。


}
639デフォルトの名無しさん:2005/10/24(月) 02:39:20
#!C:Perl
for($i=0;$i<=999999;$i++){
system("wget http://〜〜〜〜〜〜〜.jp/k$i/");
}

これで大丈夫(^^)
640デフォルトの名無しさん:2005/10/24(月) 02:41:15
集めているのは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ファイルを作ろうとしています。
642デフォルトの名無しさん:2005/10/24(月) 05:39:23
for ($i = 1; $i <= 494949; $i++) {
rename("index.html.$i", "k$i.html");
}
643デフォルトの名無しさん:2005/10/24(月) 14:02:18
Perlでファイルを指定したディレクトリに移動させるのはUNIXコマンド使えない鯖では
どうやればいいんですか?
644デフォルトの名無しさん:2005/10/24(月) 14:09:50
>>643
File::Copy でも使えば?

なんなら rename でも。
645デフォルトの名無しさん:2005/10/24(月) 14:51:23
ところで過去ログの1箱目途中までしかないな。途中でpc3に鯖移転してる模様
http://pc3.2ch.net/tech/kako/1017/10177/1017736187.html
646デフォルトの名無しさん:2005/10/24(月) 15:49:53
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関数が機能しません。

何故でしょうか?教えて下さい。
ちなみにパスは通っています。
649デフォルトの名無しさん:2005/10/24(月) 16:25:48
>>648
なんてエラーでるの?
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.
とエラーがでました。

何度か再インストールも行いました。
色々調べましたが、原因不明です。
お願いします。
651デフォルトの名無しさん:2005/10/24(月) 16:41:07
>>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使えない環境だとどうすればいいですか?
654デフォルトの名無しさん:2005/10/24(月) 16:50:33
>>652
>PATH=C:\Perl\bin\;C:\WINNT\system32\
>とすれば良いのでしょうか?
それでやってみなよ。
コマンドプロンプトの再起動だけでいい。

# 当方XPなのでC:\windowsとか言って失礼
655デフォルトの名無しさん:2005/10/24(月) 16:55:05
>>653
mkdir() して rename() でいいのでは?
656デフォルトの名無しさん:2005/10/24(月) 16:56:08
>>654
仰る通りでした。本当にありがとうございました。
大変感謝しております。
657655:2005/10/24(月) 16:57:08
>>653
と思ったのだが、 File::Copy 使えないって、どんな環境の Perl だとそうなるの?
658デフォルトの名無しさん:2005/10/24(月) 17:00:07
>>657
無料鯖のCGIとか?
659デフォルトの名無しさん:2005/10/24(月) 17:17:49
>>654さん
ちなみにActivePerlってC:\Program Filesにインストールしても、
パスを通してやれば、ちゃんと動くんでしょうか?
半角スペースが入っているとダメでしたっけ?
660644:2005/10/24(月) 17:19:05
>>653
書き方が分かりづらかったね。

File::Copy 使うか、モジュールが使えない環境なら rename でも用は足りるだろ、といいたかった。
661デフォルトの名無しさん:2005/10/24(月) 17:25:30
>>659
動くだろうけど、絶対問題が起こらないとは言い切れないな。
662デフォルトの名無しさん:2005/10/24(月) 17:45:27
>>661さん
わかりました、やってみます。
本当に色々とありがとうございました。
663デフォルトの名無しさん:2005/10/25(火) 20:48:13
ログファイルを監視するスクリプトを作ろうとしてるのですが
closeで止まってしまいます。
どうしたら動いてくれますか?
----------------------------------
open FH, "tail -f /var/log/messages |";
sleep 1;
close FH;
----------------------------------
664デフォルトの名無しさん:2005/10/25(火) 21:09:46
開いて閉じるだけじゃそりゃ何も動かないだろ
665デフォルトの名無しさん:2005/10/25(火) 21:19:40
>646
Convert::Binary::C
666デフォルトの名無しさん:2005/10/25(火) 22:00:45
>>663
perldoc -q tail
667デフォルトの名無しさん:2005/10/25(火) 22:28:02
PerlでDDNSクライアントを作っているのですが、
while(1)で永久ループさせるのってアリですか?
668デフォルトの名無しさん:2005/10/25(火) 22:41:13
>>667
単なるプログラミングの一般論としてはアリ。

ただしレン鯖とかだと常駐モノは禁止されてることもある。
669663:2005/10/25(火) 22:58:21
>>666
ログファイルのローテートに対応するために、
open FH, "tail --follow=name --retry /var/log/messages |";
としてtailコマンドを使いたかったんですけど、この目的のためには
File::Tailしかないのかなぁ?
670デフォルトの名無しさん:2005/10/25(火) 23:18:00
>>669
だからなぜFHをcloseするのかと...
普通に読み出せばええやん。

671デフォルトの名無しさん:2005/10/26(水) 01:07:16
>663
while(<FH>)
672デフォルトの名無しさん:2005/10/26(水) 01:39:50
phpとの違いが知りたいです
673デフォルトの名無しさん:2005/10/26(水) 02:05:59
>>672
1 は読んだ?
674デフォルトの名無しさん:2005/10/26(水) 02:14:23
Perlと関係ないって?
それなら、どこで聞けばいいかな・・・
675デフォルトの名無しさん:2005/10/26(水) 02:43:07
>>674
1 は読んだ?
676デフォルトの名無しさん:2005/10/26(水) 08:00:11
動的に作成した画像をWindowsのウィンドウ上に表示しようとしています。
現在はPerlMagick+Win32::GUIを使い、
【PerlMagickで画像作成&png等書き出し→
Win32::GUI::DIBitmapでpng等読み込み&bmp保存→
Win32::GUI::Bitmapで読み込み】
としているのですが、一時ファイルを使わない方法を探しています。
勉強中なので同じ処理ができるかどうかわかりませんが、もしGDやTkで可能でしたら教えてください。
677663: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でも撃ち込めばいいんじゃないの?
679デフォルトの名無しさん:2005/10/26(水) 13:20:11
>>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 フラグをクリア
}
680デフォルトの名無しさん:2005/10/26(水) 13:21:21
s/3rd ed/1st ed/

sorry.
681デフォルトの名無しさん:2005/10/26(水) 14:21:58
>>667
> PerlでDDNSクライアントを作っているのですが、

もうあるよ
682デフォルトの名無しさん:2005/10/26(水) 17:38:21
ぜひ教えてください。
かたかなとひらがなを判別することは
できるんでしょうか??
全角半角まではたどり着いたのですが、
カタカナでなかったらエラー、としたいのです。
よろしくお願いします。
683デフォルトの名無しさん:2005/10/26(水) 17:44:42
\p{InKatakana}
684デフォルトの名無しさん:2005/10/26(水) 17:49:30
こっちも参照
http://www.din.or.jp/~ohzaki/perl.htm#Character
>>390-辺りにも同様の質問があるのでこちらも参考に
685デフォルトの名無しさん:2005/10/26(水) 17:50:41
うお、直リンしちゃった・・・スマソ
686デフォルトの名無しさん:2005/10/26(水) 20:32:36
scalarコンテキストでの readline はファイルの最初の行から一行ずつ順番に読み出しますが、
逆に、ファイルの最後のの行から一行ずつ、逆順に読み出す為にはどうしたら良いでしょうか。
687デフォルトの名無しさん:2005/10/26(水) 20:55:46
>>686
File::ReadBackwards
688デフォルトの名無しさん:2005/10/26(水) 21:06:32
689デフォルトの名無しさん:2005/10/26(水) 21:11:31
>>684
うおおおおおおおお!
ありがとうございます!!
大変助かりました!!!!
690デフォルトの名無しさん:2005/10/26(水) 21:50:04
>>681
MyDNSで使えるクライアントある?
691酩酊 ◆TWARamEjuA :2005/10/26(水) 22:25:01 BE:1633853-###
>>690
そんなに難しいもんじゃないので自作しても良いかと♪
692デフォルトの名無しさん:2005/10/26(水) 22:51:06
>>691
話をループさせてるな。
693デフォルトの名無しさん:2005/10/26(水) 22:53:08
www.perl.org落ちてる?
694デフォルトの名無しさん:2005/10/26(水) 22:59:11
>>693
やっぱり? 俺もさっき繋がらなかったヨー
695デフォルトの名無しさん:2005/10/26(水) 23:07:39
Perlの話じゃないかも、なのですが…
コンソールから
$ hoge.pl [Enter]
と生手打ちで起動されたか、
あるいは Cronなどから無人で起動されたかを
スクリプト内から判断する方法ってないでしょうか?
すんません、よかったら教えてください。
696デフォルトの名無しさん:2005/10/26(水) 23:14:58
697695:2005/10/26(水) 23:26:40
おおおぅ!ばっちしです。
-t という演算子も初めて知りました。
ありがとうございます。
698デフォルトの名無しさん:2005/10/26(水) 23:30:36
PerlでDDNSクライアント作りました。
理由はMyDNSで使えるものが無かったからです。
DDNSサーバによって認証方法がまちまちなので
認証実行部分はクラス化してStrategyパターンで
プラグイン可能にしてあります。
699デフォルトの名無しさん:2005/10/26(水) 23:43:13
そうですか
700デフォルトの名無しさん:2005/10/27(木) 07:49:32
マトリクスの中の値の大きさでソートするには、どうすればいいでしょうか?
今のところ、ハッシュで二次元配列を作り、その値を<=>でソートするような事
しかイメージできていないのですが、これだと、$aと$bをどう使いまわせばいい
のか思いつきません。このような方法か、二次元配列以外の方法で、解決する方
法がありましたら、御教授ください。
よろしくお願いします。
701デフォルトの名無しさん:2005/10/27(木) 09:47:56
702デフォルトの名無しさん:2005/10/27(木) 11:50:01
my $abc = pack('B16', '0000000000000000');
のabcの中身はどうすれば確認できるでしょうか?
printなどを試してみましたが、うまく行かなかったので
お教えください。
703ヽ(´ー`)ノ ◆.ogCuANUcE :2005/10/27(木) 12:21:31
print unpack('B16', $abc), "\n";
704デフォルトの名無しさん:2005/10/27(木) 14:39:33
>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
Net::FTP::Recursiveのrget使って指定フォルダ以下全てのファイルandフォルダをGetって処理をやりたいんだけど
なぜか空のディレクトリだけスルーされてしまう。中身の入ったディレクトリandファイルは全てGetできてます。
わかる人いますか?なんかオプションの指定とかでできるのかな?
$ftp -> rget;
707デフォルトの名無しさん:2005/10/27(木) 15:28:35
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);
708デフォルトの名無しさん:2005/10/27(木) 15:36:09
>>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言語の処理の仕方が分からないなどの問題があり、
とりあえず決め打ちさせてみようと思いました。


ここら辺のお話が分かるようでしたらご教授願えればと思います。
よろしくお願いします。
710デフォルトの名無しさん:2005/10/27(木) 16:22:13
わかるけどその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。
712デフォルトの名無しさん:2005/10/27(木) 18:02:27
>>711
707じゃないけど。>>705は単発の変数使いまくりだからハッシュでまとめてる。
「=>」は左辺を文字列として認識するカンマ。
「 . 」でちまちま連結してるところはjoin ''で一気に連結。
flgは無名配列のリファレンス取って後でデリファレンスしてる。
packはテンプレートの対応表見ればすぐできそう。
ttp://www.rfs.jp/sitebuilder/perl/05/func/pack.html
713デフォルトの名無しさん:2005/10/27(木) 20:04:39
http://oxygen.sakura.ne.jp/uploader/images/113041077000.txt

にperlのプログラムです。文の要約をするプログラムなのですが、真ん中らへんの
if($keitaiso[$i] ne "EOS"){
$len[$i] = length($keitaiso[$i]);
$mojisuu[$k] = $mojisuu[$k] + $len[$i];
の部分と
$moji = 0;
$gyou = 0;
と書かれているとこより下の部分が何をやっているのかよくわからないのですが、
だれか解説してくれませんか?
714デフォルトの名無しさん:2005/10/27(木) 20:10:54
715デフォルトの名無しさん:2005/10/27(木) 20:24:55
>>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デフォルトの名無しさん:2005/10/27(木) 20:29:26
読みにくいコードだこと
717デフォルトの名無しさん:2005/10/27(木) 20:44:39
>>716
だよなあ。それに use strict とかしろっつー見本というか、のっけからコレだし。

> open(FP1,$chfname) || die "can't open $chname\n";
718デフォルトの名無しさん:2005/10/27(木) 20:47:36
>>713
ああああああああああああああああああああ!
こうゆうソースを見ると、無性に書き直したくなる。

$mojisuu[$k] += length($keitaiso[$i]) if $keitaiso[$i] ne "EOS";
719デフォルトの名無しさん:2005/10/27(木) 21:09:20
>>713
その先は、結果の出力。
中身が数値の $rank[$gyou] が文字列 "99" と等しい時に出力を抑制しているので、
数値から文字列への変換フォーマットには注意が必要やね。
720デフォルトの名無しさん:2005/10/27(木) 21:12:24
みなさんすいません。まだperl習って1ヶ月くらいなもんでf^^;
いろいろ意見ありがとうございますm(__)m
721デフォルトの名無しさん:2005/10/27(木) 21:59:27
>>720
他のソース(もっときれいなやつ)で勉強しなされ。
722デフォルトの名無しさん:2005/10/27(木) 22:35:09
お前が次にする質問はこうだっッ!

「きれいなソースはどこに行けば見れますか?」

あえて言うが川合-Hippo2000-孝典氏のソースを推薦する。
723デフォルトの名無しさん:2005/10/27(木) 22:41:49
>>722
本人自薦乙
724デフォルトの名無しさん:2005/10/27(木) 22:41:52
>712
いろいろとご指導ありがとうございます。

その後>707のソースを>709の該当部分に移植して、
どんなドメイン名を渡したら、どんな16進の値が格納されるか分かりました。
格納される値についても理解できました。


「www.yahoo.co.jp」を渡すと
00000100000100000000000003777777057961686F6F02636F026A700000010001

「infoseek.jp」を渡すと
00000100000100000000000008696E666F7365656B026A700000010001

もっともCに移植する際に必要なものは、この16進の値ではなく
その一歩前の値のような気がするのですが、
それをどう移植すればよいか分からずorz
725デフォルトの名無しさん:2005/10/27(木) 22:47:06
>>724
そもそもな話だけど、そんなリバースエンジニアリングみたいなセコいことせずに、
DNS の規格に当たった方が良いような気がする。
もっと言うと、巷にころがってる既存の DNS のリゾルバライブラリを探した方が、
楽してマトモなモノができるような気がする。
726デフォルトの名無しさん:2005/10/27(木) 22:55:27
教えてください。
これからperlを勉強しようと、WinXPに最新のActivePerlを
入れてみました。
でよくあるプログラムのように、先頭に
#!c:/perl/bin/Perl.exe
とやってprintとか適当にやってみたら実行できましたが、
この先頭の#!の行を取り除いても実行できてしまいました。
先頭のPerlの指定はなぜいらないのでしょうか?
どのようなときに必要なのですか?
727デフォルトの名無しさん:2005/10/27(木) 23:26:14
728デフォルトの名無しさん:2005/10/27(木) 23:56:50
シュワルツ変換ってなんですか?

「シュワルツ変換」とか「シュワルツ変換とは」でgoogleしてみたのですが、
以下のようなコードが出てきて、何をやっているかはわかるんだけど、これのうち、
どの考え方のことをシュワルツ変換と呼ぶのかがわかりません。

@data = map {$_->[0]}
sort {$a->[2] <=> $b->[2]}
map {[$_, split /,/]} @data;

map とか sort とかを多段で使うことを言うのでしょうか。
(そうではないという気はしているんですが。うまく言えない。)
729デフォルトの名無しさん:2005/10/27(木) 23:56:54
>>726
windows 上では 拡張子と実行ファイルが関連付けられているので
その1行目は不要。

.html ファイルをダブルクリックしたら
windows 上だったらブラウザが起動したりするのと同じ仕組み。
730デフォルトの名無しさん:2005/10/28(金) 00:09:22
>>728
ラクダ本かperl cookbook に詳しく書かれてる。参考まで。
731デフォルトの名無しさん:2005/10/28(金) 00:14:18
732726:2005/10/28(金) 00:29:21
>>729
ありがとうございました。
たしかにそうですね。
Windows上でもWebサーバに拡張子cgiでおく時なんかに先頭の行が
必要になってくるんですね。
733デフォルトの名無しさん:2005/10/28(金) 00:38:23
ANHTTPDではWindowsのパス優先な設定があったのは覚えてるけど、Apacheもあるんかいな?
734デフォルトの名無しさん:2005/10/28(金) 01:29:22
>>722
http://www.hippo2000.info/perl/tsvg.htm
これがオススメのソースだって?センス疑うぜ。本人乙。
735デフォルトの名無しさん:2005/10/28(金) 01:34:46
モジュールの解説は利用するけど、コーディングを参考にしたことは、無い。
736デフォルトの名無しさん:2005/10/28(金) 02:08:13
テキストフォームから送信されたデータをPerlで保存するのに
そのまんまのデータを書き込む方法しか知らないので
ファイルを見られたら何が保存されているかすぐわかっちゃうので
WINDOWSのアプリのデータファイルみたいに読めないような形式で保存したいんだけど
Perlではこういう形式では保存できないんでしょうか?
737デフォルトの名無しさん:2005/10/28(金) 02:19:12
pack('c'、$value);とか
738デフォルトの名無しさん:2005/10/28(金) 02:50:12
>>736
確かに、Windowsのアプリのデータって言ったら>>737のように
大半は単にバイナリデータとして保存されてるだけが
それだけじゃちょっと知識がある人が見ればすぐに分かるが。
文字列データはそのまま格納されてるしな。
そういう目的ならCrypt::CBCとか使って暗号化でもすれば?
739デフォルトの名無しさん:2005/10/28(金) 03:18:23
>>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')

これ、もっとシンプルな書き方ありませんか?
741デフォルトの名無しさん:2005/10/28(金) 04:50:08
if ($hoge =~ /^([a-d])$/) {}
742デフォルトの名無しさん:2005/10/28(金) 05:07:45
>>741
ありがとうございます。
'a','b','c','d'のほうに|,ORをかける方法ありませんか?
743デフォルトの名無しさん:2005/10/28(金) 05:10:44
if ($hoge =~ /^(?:a|b|c|d)$/) {}
744デフォルトの名無しさん:2005/10/28(金) 05:30:49
ありがとうとざいます。
やっぱマッチ使わないと駄目か。。
745デフォルトの名無しさん:2005/10/28(金) 05:33:02
>>744
マッチングを使いたくないならサブルーチン作っとけば?
sub in_array ($@) {
my $val = shift;
$val eq $_ && return 1 for @_;
0;
}
if (in_array($hoge, 'a', 'b', 'c', 'd'))

ところで|じゃビット演算だぞ。論理演算なら||にしないと
746700:2005/10/28(金) 08:17:59
>>701
どうもありがとうございました。
747デフォルトの名無しさん:2005/10/28(金) 11:08:35
>>734
オマエならそのコードどう書くね?
748デフォルトの名無しさん:2005/10/28(金) 20:52:19
教えてください。
Perlのプログラムからシステムコマンドを実行できますよね。
`perldoc`;
こんな感じで。
でも
`perldoc -u -t`;
みたいにオプション指定でスペースが含まれてしまうと、
コマンドがちゃんと実行されないようです。
変数には取り込めるようですが・・・。
スペースが含まれてるとだめなのでしょうか?それとも何か
方法があるのでしょうか?
749デフォルトの名無しさん:2005/10/28(金) 23:41:17
>>748
そりゃ大いにあなたの何か勘違いでしょう。
ちなみにいちおう system()と ``(qx//)は違うものですよ。(マニュアル参照)
perl -e 'system "echo A B C"'
perl -e '`echo A B C`'
perl -e 'print `echo A B C`'
750デフォルトの名無しさん:2005/10/29(土) 00:25:51
>>742
%match = ( a => 1, b => 1, c => 1, d => 1);
if ($match{$hoge}) {
}

じゃ駄目なの?
751デフォルトの名無しさん:2005/10/29(土) 00:42:13
そんなんなんでもいいんだが、
$hoge == 'a' OR 'b' OR 'c' OR 'd'
とかでも書けるのがシンプルなんだと想いたいだけと思われ。
752デフォルトの名無しさん:2005/10/29(土) 01:42:08
use Quantum::Superpositions;
if ($hoge == any('a', 'b', 'c', 'd')) { ... }
753デフォルトの名無しさん:2005/10/29(土) 01:56:02
ログを取る為モジュールってありませんか?
754ヽ(´ー`)ノ ◆.ogCuANUcE :2005/10/29(土) 02:25:10
Log::Log4perl
755デフォルトの名無しさん:2005/10/29(土) 04:36:11
use constantで定数定義を羅列したファイルがあって、
それをrequireしたファイルで使うことってできないのでしょうか?
756748:2005/10/29(土) 11:55:17
>>749
レスどうもです。
ようやくわかりました。
逆クォートは出力を取り込むときなんかに使うみたいですね。
単にコマンド実行したい場合は、そうやっちゃいけないと、
リャマにありました。
757デフォルトの名無しさん:2005/10/29(土) 12:27:37
758デフォルトの名無しさん:2005/10/29(土) 12:38:55
>>755
Exporter
759デフォルトの名無しさん:2005/10/29(土) 13:58:45
>>755
Explorer
760デフォルトの名無しさん:2005/10/29(土) 18:06:48
>>755
言ってるコトが微妙にわからんけど、requireじゃなくてuseで呼び出すのでは?

えーと、て言うかよくわからんので、俺なりの答え。
1:定数定義は、定数を使ってる所より先にコンパイラにお見せする。
2:名前空間(パッケージ)がちゃんと同じになるように気をつける。
3:同じプロセス内である。

これを満たせば大丈夫かと。
761デフォルトの名無しさん:2005/10/29(土) 19:29:27
>>755
Explorer
762デフォルトの名無しさん:2005/10/29(土) 21:23:34
↑うざい
763デフォルトの名無しさん:2005/10/29(土) 22:06:22
ユーザ名からuidを得るのに
`id -u ユーザ名` または passwdファイルを見る
以外の方法があれば教えてください。
764デフォルトの名無しさん:2005/10/29(土) 22:53:47
>>763
getpwnam
765デフォルトの名無しさん:2005/10/29(土) 22:55:01
>>763
ユーザ名と UID の対応表は passwd ファイルなんだから、
それを見ずに得るのは無理なんじゃないか?
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_getpwnam_NAME
766デフォルトの名無しさん:2005/10/29(土) 23:14:35
>>764 >>765
どもですー。
passwdファイルを見るっていうのは自分でopenなどする処理を書くという意味です。
隠蔽してくれるならそれでOK。
767デフォルトの名無しさん:2005/10/30(日) 00:26:27
>>766
隠蔽って言葉の使い方間違えてるんじゃあるまいか。
素直に、ユーザ名からuidを得る為のAPIかライブラリ、コード片を教えてください、
自分ではきれいに書けないので、とでも言うほうが話が通じるだろうに。
つか、>>764 にそのものズバリ教えてもらっているのに、マニュアルや
リファレンスをまともに見たことも見る気も一度も無いのバレバレだよ。
(ドキュメントはいっさい隠蔽されました?)
768デフォルトの名無しさん:2005/10/30(日) 00:48:41
764に教えてもらったのを765のアドレスで確認して二人にお礼をいったのですが。
隠蔽の意味はどうだか知りませんが、/etc/passwdから読むぐらいの処理は自分でもかけますよ。
「perl ユーザ名 uid」とか適当にぐぐったけど見つからなかったので質問しました。
マニュアルをどう探せばよかったのか教えてもらえれば役に立つと思います。
769デフォルトの名無しさん:2005/10/30(日) 00:54:21
あ、グーグルでは2ページ目にでていたようです
770デフォルトの名無しさん:2005/10/30(日) 01:25:29
ヒアドキュメントの終了子を変数で制御してみたいのですが
無理なんでしょうか?

print <<"$EOM";
abc
def
ghi
jkl
mno
771デフォルトの名無しさん:2005/10/30(日) 01:38:22
>>768-769
Perl の事はググる前にマニュアル (perldoc) 読むか CPAN 探すか
した方がいいよ。UNIX 系 OS なら man perl とか man perldoc すれば
どのマニュアルページに何が載ってるかとか効率的な探し方とか
分かるし、ActivePerl ならインストールしたディレクトリに HTML 化
されたマニュアル群が入ってる。オンラインマニュアルの在り処は
>>2 に書いてある。

>>770
普通はできない。それができて嬉しい事って思いつかないんだけど、
どうしたいの?
http://search.cpan.org/~nwclark/perl-5.8.7/pod/perlfilter.pod
772デフォルトの名無しさん:2005/10/30(日) 02:39:02
A.pl の中に、package A1; package B1; と2種類の自作パッケージを書いたのですが、
use A1; はよくて、use B1 の方は INC に無いと怒られてしまいます。

2つのpackageの定義はどうしたらよいでしょうか?
773デフォルトの名無しさん:2005/10/30(日) 02:48:36
774デフォルトの名無しさん:2005/10/30(日) 03:18:15
>>770
eval使やできなくはないと思うが、普通そんなことしたいと思わないぞ。
仮にそれが必要だったとしたら、設計間違ってる気がする。
775デフォルトの名無しさん:2005/10/30(日) 05:16:37
>>768
まさしく、
>マニュアルやリファレンスをまともに見たことも見る気も一度も無いのバレバレだよ。
>(ドキュメントはいっさい隠蔽されました?)
そのものというわけですね。
771氏が丁寧に書いてくれてるけど、ドキュメントも読めないでぐぐればすむと
勘違いしてるリテラシの低さに気がつかないままの人も少なくないのかsigh.
>>/etc/passwdから読むぐらいの処理は自分でもかけますよ。
プチワロタ
776デフォルトの名無しさん:2005/10/30(日) 05:23:12
>>770
だいたい例えば終端が ghi ならその後構文エラーだろ。
そんな仕掛け、まあ必要でもないしほとんど意味無いよな。
print <<"$EOM";
abc
def
ghi
jkl
mno
777デフォルトの名無しさん:2005/10/30(日) 06:53:55
ユーザとuidの対応がpasswdファイル読めばわかるという
ところには誰もつっこまないのか?
778デフォルトの名無しさん:2005/10/30(日) 06:56:37
>>777
その前に、NISクライアントはどうする?
/etc/passwdなんか見たって、役に立つ情報は何もないぞw
779デフォルトの名無しさん:2005/10/30(日) 07:42:16
理解してないだろからそのレベルで突っ込んでも虚し過ぎるのが明白
780770:2005/10/30(日) 14:24:15
>>771,774,776
どもです。
まあまあ。
ヒアドキュメントに書いたSQLをDBIに投げることをよくやってるのですが
「ある条件の場合はWHERE句以降いらない」とか、逆に「AND でつないで条件追加」
とかそんな感じの処理がよく出てくるわけです。
制御が複雑になってくると、だんだん見た目にごちゃごちゃしてきちゃうんだけれども
ヒアドキュメント自体は分かりやすい仕組みだし、これで通せればそれに越したことはない。
変数かなにかで終端位置を制御できればなんかできるかなぁ〜?
と思いまして、そういうところです。
781デフォルトの名無しさん:2005/10/30(日) 15:19:00
>>780
根本的に、設計思想が間違ってる。
かの有名な「プログラム書法」でも読むことだな。
782770:2005/10/30(日) 15:59:56
>>781
え?なんでですか? Perlの設計思想のこと?
ラクできるならラクしたいですよね。
無い物ねだりだったみたいだけれど…
(つまり、それ用のプリプロセッサでも書きなさいということなんでしょうかね)
783デフォルトの名無しさん:2005/10/30(日) 16:07:31
>>780
まあ間違っとるとまで判断材料ないけど、センスは無いよなぁ。
終端位置を制御(??)したって解決になりゃしなかろうに。
手書きSQLと同じベタで書けば、あたかも見通しが良さそうな気がするだけだろうが、
ヒアドキュメントでベタに点在すれば、構造見難くごたつくのはあたりまえ。
784デフォルトの名無しさん:2005/10/30(日) 16:08:56
設計思想はおいておくとして、Perlでの実装方法としてはこういうのはどうだろう

sub join_range($@) {
my $range = shift;
join('', @_[@$range])
}
print join_range([0..1], <<FOO, <<BAR, <<BAZ);
hogehoge
FOO
fugafuga
BAR
piyopiyo
BAZ
785デフォルトの名無しさん:2005/10/30(日) 16:11:01
>>782
なら、SQL文のタネになる文字列をヒアドキュメントで読み込んでおき、
条件に応じてその文字列を編集するというのが普通の考え方だろう。
786785: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__
787770: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的な解決法が
あるんじゃなかろうかと思ってたのです。
788770:2005/10/30(日) 16:38:12
>>786
サンクスです!カキコ中にかぶってしまったようです。すんません。
$sql_origを作ったあと
$sql_orig =~ s/--caseA//g if ($case eq 'A');
という感じにするわけですね。これもいいなあ。ありがとうございます。
789デフォルトの名無しさん:2005/10/30(日) 17:50:43
ヒアドキュメントにしなくても
この場合ならフォーマット使って3項演算子使えばいいんじゃないの?
printf (
'%s%s%s%s',
$hoge,
$Hage,
$fuge
$nullpo
);
どちらにしろ設計やり直したほうがよさ毛だけどね。
790デフォルトの名無しさん:2005/10/30(日) 17:59:38
ま、Perlプログラマらしくていいんじゃないの
791770:2005/10/30(日) 18:06:50
>>789
どもです。いや、sprintfで3項演算子とかだと
その部分を切り取った場合にSQL互換じゃなくなるので
いまいちです。
(→整形しなければそのままクエリとして流してテストできないので)
792デフォルトの名無しさん:2005/10/30(日) 18:10:30
HTTPSによるソケット通信の方法をご教授ください。
793デフォルトの名無しさん:2005/10/30(日) 18:24:52
>>792
HTTPSつかってGETしたりPOSTしたりはLWPでできるけどこれじゃ駄目かい?
http://digit.que.ne.jp/work/index.cgi?Perl%A5%E2%A5%B8%A5%E5%A1%BC%A5%EB%2FLWP
794デフォルトの名無しさん:2005/10/30(日) 19:13:19
>>787-788
うわぁ…。保守性とか全く考えてない気がするんだが。
795デフォルトの名無しさん:2005/10/30(日) 20:07:21
>>794
? それはshプログラマの様に保守的という意味でか?
787のは下手に変数切り貼りするより、ずっと保守性向上しているように見えるが。
796デフォルトの名無しさん:2005/10/30(日) 20:27:24
データを書き込むときのファイルロックの方法ってflock以外では
1:ロック用ファイルがなければopen関数でロック用ファイルを作る(あればデータを書き込まない)
2:ファイルのデータを全部読み出し配列に格納する
3:書き込むデータを配列に追加
4:配列のデータをopen関数で全部ファイルに書き込む
5ロック用ファイルの削除
でも問題ないんでしょうか??
797デフォルトの名無しさん:2005/10/30(日) 20:34:29
>>796
>5ロック用ファイルの削除
する前に何らかの事情でプログラムが dieしたとき困ると思うけどな。
END{ }かなにかにロックをクリーンアップする仕組みも入れておいた方がいいよ。
その他の問題は別としても。
798デフォルトの名無しさん:2005/10/30(日) 20:36:21
他にシグナルに落とされた場合も考えて
ハンドラ設定した方がよいか。
799デフォルトの名無しさん:2005/10/30(日) 20:37:45
>>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
800デフォルトの名無しさん:2005/10/30(日) 21:36:00
そういやロック用のモジュールってあんまり聞かないな
CPANで探してみたらLockFile-Simpleってのがあったけれど、
オブジェクト一つがロック一つに対応しているんじゃないあたりとかどうもしっくり来ない…
良い感じに抽象化されたモジュール無いかな
801デフォルトの名無しさん:2005/10/30(日) 21:40:48
文字列連結演算子'.'ってprint関数で使う分にはカンマ','を使うのと
違いありませんよね?
802デフォルトの名無しさん:2005/10/30(日) 21:49:35
>>801
$, == ""である時だけね
803デフォルトの名無しさん:2005/10/30(日) 21:51:04
>>802
eqだろ
804デフォルトの名無しさん:2005/10/30(日) 21:51:43
>>793
ヘッダに色々付け加えたいのでそれではできませんでした。
805デフォルトの名無しさん:2005/10/30(日) 21:53:50
printで使うカンマは配列として扱われるから、連結ではない。
806デフォルトの名無しさん:2005/10/30(日) 22:03:34
807デフォルトの名無しさん:2005/10/30(日) 22:08:22
>>804
ええと、避けてる選択肢に間して掘り下げて聞いて悪いんだけど、
HTTP::RequestにHTTP::Headersを喰わせるんじゃ出来ないのかな
use HTTP::Request;
use HTTP::Headers;
my $h = new HTTP::Headers;
$h->header("Hoge-Hoge" => "hoge");
my $req = new HTTP::Request GET => 'http://example.com/', $h;

これが駄目ならIO::Socket::SSLとかを使ってシコシコ書くしか無いだろうな…
808デフォルトの名無しさん:2005/10/30(日) 22:25:07
>>806
>>807
http://kage.monazilla.org/system_DOLIB100.html
この処理をperlにやらせたいんですが、
HTTPS使って、POSTでヘッダに X-2ch-UAをつけるのは無理なんでしょうか。
809デフォルトの名無しさん:2005/10/30(日) 22:35:29
>>796
> データを書き込むときのファイルロックの方法ってflock以外では

「Perlの排他制御」
http://homepage1.nifty.com/glass/tom_neko/web/web_04.html
810デフォルトの名無しさん:2005/10/30(日) 22:38:14
>>808
> HTTPS使って、POSTでヘッダに X-2ch-UAをつけるのは無理なんでしょうか。

無理ってどういう意味だよ
811酩酊 ◆TWARamEjuA :2005/10/30(日) 22:41:53 BE:2613964-###
LWP::UserAgent
$ua->default_header( $field => $value )
これでよさげな・・・
812デフォルトの名無しさん:2005/10/30(日) 23:15:27
>>805
まぁ内部的にはそうなのかもしれませんが、出力される結果は
同じになるのではないかと・・・。
813デフォルトの名無しさん:2005/10/30(日) 23:53:42
>>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'; # コンマならこういう書き方も可能
814デフォルトの名無しさん:2005/10/31(月) 00:44:46
>>813
なるほどねぇ。
やっぱり違いますね。コンマと連結とじゃあ・・・。

ところでサブルーチンですが、組み込み関数のように&なしで
呼び出す場合、起動よりも前でサブルーチンを定義していなきゃ
いけないと本にあったのですが、起動より後に定義してあっても
&なしで普通にコールできたのですが、このあたりはあいまいですか?
815デフォルトの名無しさん:2005/10/31(月) 00:57:51
>>814
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlsub.html
> サブルーチンは、“&”というプリフィックスを付けて呼び出すことができます。
> 最近のPerlでは“&”は省略可能であり、サブルーチンがあらかじめ宣言されている場合には括弧も省略できます。
あらかじめ宣言されている場合は、括弧が省略できる
&はリファレンスじゃなければ通常は省けるよ
816デフォルトの名無しさん:2005/10/31(月) 01:00:45
&があったほうが個人的にはみやすいかな。
知らない関数かと思ってリファレンス引いちゃうよorz
817デフォルトの名無しさん:2005/10/31(月) 01:13:23
818デフォルトの名無しさん:2005/10/31(月) 02:00:52
>>816
> &があったほうが個人的にはみやすいかな。
> 知らない関数かと思ってリファレンス引いちゃうよorz

熟達者は、「知らない関数は無い」という域に突入することで、
そのような混乱から無縁でいられる。

関数一覧を舐めるように読むのが彼らの楽しみである。
819デフォルトの名無しさん:2005/10/31(月) 02:23:38
()つけるなら&いらないって話じゃなかったのか。
てことは&つけなくて呼び出すときは、渡すものが無くてもhoge();と書けって事?
820デフォルトの名無しさん:2005/10/31(月) 02:29:44
sub foo() {〜}ってプロトタイプつきで宣言しておけば単純に
foo;
で呼び出せる。
821デフォルトの名無しさん:2005/10/31(月) 02:35:37
>>820
「使う前」に宣言してさえあればプロトタイプの有無に関係無くそう呼べる。

sub foo { print 'foo' }
foo;
sub bar;
bar;
sub bar { print 'bar' }
822デフォルトの名無しさん:2005/10/31(月) 02:42:37
なるほど、勉強になりました。
今後は意識して書くようにします。
823デフォルトの名無しさん:2005/10/31(月) 02:45:48
>>821
やべ、プロトタイプいるんだと思い込んでたorz
普段、先頭でプロトタイプ付きで宣言して、コードの最後で本体を書いてるからか。
824デフォルトの名無しさん:2005/10/31(月) 06:26:06
http://yahoo.co.jpのような、/で終わるようなアドレスにアクセスして、indexのファイル名を取得するにはどうすればいいんでしょうか?
825デフォルトの名無しさん:2005/10/31(月) 07:44:18
んなもん鯖側の設定しだいだし
826814:2005/10/31(月) 07:59:52
みなさん、ありがとうございました。
&は定義の位置や宣言の有無にかかわらず、省けるんですね。
カッコ省略は前方に定義や宣言がいるわけですね。
827デフォルトの名無しさん:2005/10/31(月) 09:07:37
>>814,826
それらとは無関係に & が省略できないコンテキストは存在する。
マニュアルの内容も確認できない奴が、仕様が曖昧だとか、
そんな中途半端な覚え方なぞする必要はまったく無いし有害だ。
828デフォルトの名無しさん:2005/10/31(月) 09:59:08
Perl6っていいですか?
829デフォルトの名無しさん:2005/10/31(月) 10:17:15
過去スレで
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も含まれてしまいます。
これの正しい正規表現はどうなるのでしょうか?宜しくお願いします。
830デフォルトの名無しさん:2005/10/31(月) 10:32:30
>>829
ちょっとは考えようや
$url =~,(http://[^/]*/)(.*)([^/]*),;
831デフォルトの名無しさん:2005/10/31(月) 10:36:34
>>824
/ で終わってないやん
832デフォルトの名無しさん:2005/10/31(月) 14:13:56
なんにそんな処理を使うのか良くわからんのだが、こういうことか
$url =~ m,(http://.*?)(/.*/),;

absoluteって絶対パスにするって意味じゃないのか?それ不完全なわけだが
URIモジュールのabsメソッドで使ったほうが簡単そうな予感
http://search.cpan.org/~gaas/URI-1.35/URI.pm
URI->new('../file')->abs('/base/');
833デフォルトの名無しさん:2005/10/31(月) 15:40:17
(^_^)/
834824:2005/10/31(月) 16:32:12
そのサーバーの設定を知るにはどうすればいいんですか?
ファイルネームなしで突っ込むとファイルを取ってこれないんです。
835デフォルトの名無しさん:2005/10/31(月) 16:42:26
>>834
それを知る方法は無い、といわれてるんだが
Apache以外知らないが、Apacheの場合はhttpd.confは元より、
.htaccessに関しても外部からはアクセスできないようになっていることが多い。
そのサーバーのパスワードが知りたいんですがどうすれば良いんですか?
と同じくらい愚問だということだ

まあ、index.htmlとかindex.phpとかありがちなものに対してHEADリクエストを送ってみるという手はあるかもね
836デフォルトの名無しさん:2005/10/31(月) 16:44:22
じゃあ、ブラウザはどうやってとってきてんですか?
3xxコード出てますか?
837デフォルトの名無しさん:2005/10/31(月) 16:52:17
>>836
何か間違えたんじゃないか?DirectoryIndexの処理はサーバ側で行われる
/path/の形でリクエストを送ればサーバからは普通に返ってくるぞ?

どうやってそのウェブページをPerlで取得しようとしてるのか書いてみれば
誰かアドバイスをくれるかもね
838デフォルトの名無しさん:2005/10/31(月) 17:00:55
>>836
まあperl以前の話だから他で勉強しなおしてこいよ。
(RFC読むとかさ。wgetか telnetで server responseでも見れ)
839デフォルトの名無しさん:2005/10/31(月) 18:51:28
>>836
> じゃあ、ブラウザはどうやってとってきてんですか?
> 3xxコード出てますか?

それを調べることができるのはお前だけ。
840デフォルトの名無しさん:2005/10/31(月) 21:19:44
>>832
ありがとうございます。
かなり使いたかったので真剣に読んで見ましたが英語が得意ではないためにあまり使い方が理解出来ませんでした。すいません。
841デフォルトの名無しさん:2005/10/31(月) 21:49:57
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;となっているのですがどうすればうまくいくでしょうか?
842デフォルトの名無しさん:2005/10/31(月) 22:05:25
>>840
http://homepage3.nifty.com/hippo2000/perltips/URI.html

>>841
多分、Perlの問題というより、設置の仕方の問題
WebProg板の設置関連のスレへどうぞ
843デフォルトの名無しさん:2005/10/31(月) 22:05:38
>>841
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 http://pc8.2ch.net/php/ )
844841:2005/10/31(月) 22:23:48
移動します
ありがとうございました
845デフォルトの名無しさん:2005/10/31(月) 23:34:35
TLS をうまく扱うパッケージって何かないかしら?
IO::Sockt::INET でオープンしたソケットに対して操作したいんだけど。
846デフォルトの名無しさん:2005/11/01(火) 01:37:16
SSL通信を行うと

Client-SSL-Warning: Peer certificate not verified

と怒られてしまいました。IDとPasswordはあっています。
どうしてかわかりません。教えてください。
847デフォルトの名無しさん:2005/11/01(火) 01:54:32
>>846
CA証明書が発行されていないからだろ
848デフォルトの名無しさん:2005/11/01(火) 12:15:50
ActivePerl 5.8.7にて
open(LIST, "dir /b log|");
という文が
dir: /b: No such file or directory
とエラーを吐いてしまいます。

logディレクトリにあるファイルの一覧をパイプ経由で開きたいのですが
正常に動かそうとするにはどう書けばいいんでしょうか?
849デフォルトの名無しさん:2005/11/01(火) 12:38:28
open(LIST, "dir \\b log|");

じゃない?
850デフォルトの名無しさん:2005/11/01(火) 12:44:24
>>848
なんつーか・・・もしかしてUn*x系のシステムでそのコマンドを実行しようとしてるんじゃあるまいね?
851デフォルトの名無しさん:2005/11/01(火) 12:45:29
って、ActivePerlなんだからWindows環境かorzスマソ
奇妙だね…
852デフォルトの名無しさん:2005/11/01(火) 12:48:36
>>848
open LIST, 'dir -B log |' or die $!;
853デフォルトの名無しさん:2005/11/01(火) 12:52:31
パスの通った場所にWindows標準以外のdirコマンドが置かれてたりしないか
854852:2005/11/01(火) 13:01:37
あぁ、そういや Cygwin のが入ってるわ。>>852 はナシ。
855848:2005/11/01(火) 13:05:29
open(LIST, "cmd.exe /c dir /b log|");

としたら通りました…
ちょっと前まではこんなことしなくても動いてたんですけど。

何故なんでしょう?
856デフォルトの名無しさん:2005/11/01(火) 13:07:40
>>855
>>853
多分これ。最近新しく何かソフトをインストールしたりしなかったか?
857848:2005/11/01(火) 13:12:34
>>853
ビンゴでした。先日cygwinをインストールしたのが原因のようです。

cygwinにdirコマンドなんてあったんだ…。
cmd.exeの方を優先するように出来ないのかなあ。
858デフォルトの名無しさん:2005/11/01(火) 13:24:42
>>857
pathが通った場所においておくということ自体、それを何所からでも使えるようにしたいということなのだから、
dir.exeを消すか、またはCygwin内のみpathが通るような場所に置くべきじゃないかな
# スレ違いスマソ
859デフォルトの名無しさん:2005/11/01(火) 13:52:42
あるファイルにデータを用意しておいて、Web上にあるフォームにそのデータを入力し、
その結果をファイルに保存したいのですが、どうしたらいいのかわかりません。
perlの入門書を購入し、cgiの本も購入したのですが、わかりませんでした。
どんな本、または、どんなキーワードで検索すればいいですか?
860デフォルトの名無しさん:2005/11/01(火) 13:54:27
>>857
perl を使う用途(と Cygwin を入れた意図)によっては
ActivePerl 捨てて、perl 使う作業は cygwin 環境に一本化という手もある。
>>848のようなパイプ処理がしたいのならなおさら。
861デフォルトの名無しさん:2005/11/01(火) 13:56:47
>>859
板違い。

WebProg板
http://pc8.2ch.net/php/
862デフォルトの名無しさん:2005/11/01(火) 13:58:51
>perlの入門書を購入し、cgiの本も購入したのですが、わかりませんでした。
>どんな本、または、どんなキーワードで検索すればいいですか?
致命的だな。
板違いなのはおじさんゆるしてあげるから、他板で聞くときはちゃんと
どんな本を買ったかくらい言うんだよ。
863デフォルトの名無しさん:2005/11/01(火) 16:34:50
>>857
可能なら極力外部コマンドを使わないような方針にするのが良いと思う。
864デフォルトの名無しさん:2005/11/01(火) 16:57:27
opendirとかしらんのかね...
865デフォルトの名無しさん:2005/11/01(火) 17:39:29
>>848
864が言ってるopendir 他、glob, DirHandleモジュール、File::Findモジュールとか調べとけ。
866デフォルトの名無しさん:2005/11/01(火) 22:09:55
>>524
CHECKはPerlの予約語だから使用は控えておけ
867デフォルトの名無しさん:2005/11/02(水) 05:00:41
>>866
えらい前のレスチェックしてるんだなぁ
868デフォルトの名無しさん:2005/11/02(水) 06:10:10
既に伸びているスレに来て最初から読んでいく、なんてことはいくらでもあり得る。
レス先以外にも等しく意味を持つ話なら、内容が古くない限り亀上等だし。
869デフォルトの名無しさん:2005/11/02(水) 09:56:32
>>866
そうだっけ? 全部小文字だと将来予約語とぶつかるかもしれないから
ラベルやファイルハンドルには大文字まぜとけってのは聞いたこと
あるが。
870デフォルトの名無しさん:2005/11/02(水) 11:36:20
BEGINやENDは知ってても、CHECKやINITを知らない奴は多い。
871デフォルトの名無しさん:2005/11/02(水) 13:42:11
>>870
そのあたりどこかにまとめて書いてる?
872デフォルトの名無しさん:2005/11/02(水) 13:56:48
perldoc
873デフォルトの名無しさん:2005/11/02(水) 14:20:00
>>872
いや、perldoc でどこに書いているか探せれなかったので聞いてるんですが・・・
874デフォルトの名無しさん:2005/11/02(水) 14:25:18
>>873
tp://www.google.co.jp/search?num=50&lr=lang_ja&q=perldoc+begin+end+check+init

検索も出来ないのか?
875デフォルトの名無しさん:2005/11/02(水) 14:32:29
>>874
すんませんでした。

ローカルにある perldoc の内容をインターネットで検索するという
富豪的な発想ができない貧弱な頭なのです・・・
876デフォルトの名無しさん:2005/11/02(水) 16:45:20
ラベルには関係ないに一票。
まぁ、紛らわしいから俺は使わんけど、安全といえば安全。
877デフォルトの名無しさん:2005/11/02(水) 17:07:49
goto ラベル のほかに goto 式 もありなので、あるとき突然
ラベルだと思って書いてた文字列が式になっちゃった、という
ことを避けるには小文字だけの名前を使うなということに
なっている。たぶん式になるような予約語は小文字だけという
方針があって、大文字のBEGINやCHECKは式にはならない
ので区別がつくからかまわんってことなんだろうな。

876同様、オレも見かけ上まぎらわしいと思うのでそういうの
は避けるけど、後から追加されるのはどうしようもないなぁ。

878デフォルトの名無しさん:2005/11/02(水) 18:22:16
サブルーチンとラベルの区別が付かない程度の習熟度で
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__
879デフォルトの名無しさん:2005/11/02(水) 19:31:24
>>867
1ヶ月ネット無し生活だったもので。。。
880デフォルトの名無しさん:2005/11/02(水) 20:42:31
>>879
よく耐えた!感動した!
881デフォルトの名無しさん :2005/11/02(水) 22:01:16
perlをWindowsで動かすには、どうしたらいいのでしょうか?
Windowsでperlのプログラムを作成できる環境が欲しいのですが。
882デフォルトの名無しさん:2005/11/02(水) 22:03:40
「perl windows インストール」といったキーワードでググれ。
883デフォルトの名無しさん:2005/11/02(水) 22:37:18
>>881-882
>>2 の最初の URL
884デフォルトの名無しさん:2005/11/03(木) 01:30:49
CGI.pmの質問はここで良いんですよね?
間違ってたらすみません.

簡単なメモを作りたいのですが,テキストエリアからのフォームデータを

$memo = $cgi -> param(memo);

というように取得すると,テキストエリアでの改行が無視されます.
配列で受け取ってもダメでした.改行(空改行も)受けとるにはどうすれば良いのでしょうか.
どうかアドバイスをお願いします.
885デフォルトの名無しさん:2005/11/03(木) 01:55:58
>>884
自信ないけど、$memoをhtmlとして表示するなら改行を<br>にしなきゃ
あとWebProgにもPerlスレあるよ
886デフォルトの名無しさん:2005/11/03(木) 02:09:55
>>884
WEBプログラミング板のほうが良いかと。
887デフォルトの名無しさん:2005/11/03(木) 04:43:18
>>884
受け取れない、無視されるって、どういう意味?

「改行コードの入ったプレーンテキストを、HTML形式のデータの一部としてブラウザに
表示させようとすると、ブラウザが改行を無視して表示する。」という意味だったら、
それはHTMLの規約。普通にテキストエディタでHTMLファイルを作ったときにも、
改行は無視されるはずだよ。

詳しくはWebProg板で聞いたほうがいいと思う。
888デフォルトの名無しさん:2005/11/03(木) 08:46:14
オライリーの正規表現という本は読んでおいたほうがいいですか?
889デフォルトの名無しさん:2005/11/03(木) 11:56:23
>>885-887

なるほど!改行が<BR>になることを忘れていました.
的確なアドバイスありがとうございました.
これからWebProgのほうでもっといたしてきます.
890デフォルトの名無しさん:2005/11/03(木) 22:42:02
perl 5.8.7なんですけど、デフォルトの乱数列と同じ乱数列を得るために、
srandに何を与えたら良いでしょう?
srand(time^$$)とかsrand(time^($$+(15<<$$)))とかは同じにならなかったので
疑問に思いました。おねがいします
891デフォルトの名無しさん:2005/11/03(木) 22:47:10
srandは初期値を与えるものですが、
Perlデフォルトの初期値はおろか、
Perl自身にはデフォルトの乱数計算式もありません。

計算式は環境に依存します。

892デフォルトの名無しさん:2005/11/03(木) 23:48:46
>>890
デフォルトの乱数列が欲しいのなら srand を使わなければいいじゃない。
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#Why_aren_t_my_random_numbers_ran
893デフォルトの名無しさん:2005/11/04(金) 01:45:58
もう一度書きますが、
5.5あたり以上から、明示的なsrandの指定がない場合、初期値はランダムに自動生成されます。
また乱数列もPerlがインストールされている環境に依存し、
デフォルトと言うのは初めから存在しません。
894デフォルトの名無しさん:2005/11/04(金) 01:50:30
単に同じ乱数列がほしいのだったらsrandに1でも与えればいいと思う。
895デフォルトの名無しさん:2005/11/04(金) 01:51:26
> 明示的なsrandの指定がない場合、初期値はランダムに自動生成されます。
そのランダムはどうやって算出するの?
896デフォルトの名無しさん:2005/11/04(金) 02:55:52
>>895
rand()


嘘。
897デフォルトの名無しさん:2005/11/04(金) 03:45:11
愚劣極まるすれ違いっぷりに笑った
898デフォルトの名無しさん:2005/11/04(金) 03:58:27
XML::RSS使ってRSS生成したいんですけどスカラー変数の値を○の部分に
代入するにはどうすればいいでしょうか?


use XML::RSS;
use strict;
my $rss = new XML::RSS (version => '1.0');
$rss->channel(
title => "○○○",
link => "○○○○",
description => "○○○○○",
dc => {
 以下略
899デフォルトの名無しさん:2005/11/04(金) 08:43:11
(゚Д゚ )ハァ?
900デフォルトの名無しさん:2005/11/04(金) 10:27:43
>>898
" " を除いてそこに書く。


小物が釣られましたよー。
901898: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.

902デフォルトの名無しさん:2005/11/04(金) 11:48:38
>>895
もう、rand()の話はやめな。
キミの目的は解っている。
どこかのサーバと同じ乱数を生成して、何かのセキュリティを破ろうとしているのだろう。
キミが知りたいことは、Perlのソースコードを読めば解る。
他の人には興味の無いことだから、ここで質問しても無駄だ。
903895:2005/11/04(金) 14:21:40
>>902
私は元質問者じゃないよ。>>894 の答えがあまりに的外れだったからレスしただけだ。
904デフォルトの名無しさん:2005/11/04(金) 14:39:02
すみません。
今、ローカルPCにPerlを入れて、Apache起動でPerlを動かしているのですが、
Perl文法にエラーがあった場合、エラーログに残ると思いますが、
これがどのあたりでエラー出てるか(〜.cgiの200行目あたりって感じ)を出す事は出来るでしょうか?
905デフォルトの名無しさん:2005/11/04(金) 15:03:08
ここでよくPerlのドキュメントを確認しなさいと言う人がいますが、
あれってみなさん英語を読んでるのでしょうか?
日本語のものってあるのでしょうか?
906デフォルトの名無しさん:2005/11/04(金) 15:10:48
>>905
このスレのテンプレを 1000 回読め。
それでも分からなかったらもう一度来い。
907デフォルトの名無しさん:2005/11/04(金) 15:28:50
>>904
スレ違い。apache スレへ。

>>905
英語。中学を出ていないのなら・・・ あまり役に立たないが、excite 等で
翻訳サービスあり。
908デフォルトの名無しさん:2005/11/04(金) 15:29:11
>>904
普通出てると思う。自分で試してみたの?
その行にエラーがあるとは限らないけどね。
909デフォルトの名無しさん:2005/11/04(金) 15:43:09
>>905
> ここでよくPerlのドキュメントを確認しなさいと言う人がいますが、
> あれってみなさん英語を読んでるのでしょうか?

こういうののドキュメントに使われているのは、英語のサブセットでしかない。
英語が読めなくても読める。

910デフォルトの名無しさん:2005/11/04(金) 16:18:04
中学英語レベルじゃ読めないだろ。
911デフォルトの名無しさん:2005/11/04(金) 16:41:57
>>895
/dev/urandom

912デフォルトの名無しさん:2005/11/04(金) 22:38:36
中学英語レベルで読めると思うぞ
Perlのドキュメントすら読めないとなると、
よほど中学時代さぼってたんだな
913デフォルトの名無しさん:2005/11/04(金) 22:42:51
中学英語ってthis is a penとかhow old are you?のレベルだぞ
914デフォルトの名無しさん:2005/11/04(金) 23:01:19
中学英語で基本文型と 8 品詞習っちまうんだから、そっから先は辞書引きゃ
分かるだろうがよ。
915デフォルトの名無しさん:2005/11/04(金) 23:03:08
ヒント:地方差

塾行かなかったら知らないままだったよ
916デフォルトの名無しさん:2005/11/05(土) 00:28:10
厚生省指導の学習要領すらこなさない学校があるのは初耳だ。
917デフォルトの名無しさん:2005/11/05(土) 00:34:47
ああ、関西だからな
918デフォルトの名無しさん:2005/11/05(土) 00:37:52
自然言語だから習得には何千時間もかかるし、授業受けただけの学習量で
読もうというのなら高卒はおろか大卒でも読めない人はいるだろうな。

そういうことではなく、中学で習う程度で素地はあるわけだから
あとは読もうという気の問題だ。

プログラム言語でも同じ。
独学でやる人が多いと思うが、習っただけでは「できません」という人と、
それをもとにやっていける人がいる。
919デフォルトの名無しさん:2005/11/05(土) 00:43:04
s/プログラム言語/プログラミング言語/

まぁ、読もうと思えば当然努力は必要ってこった。
920デフォルトの名無しさん:2005/11/05(土) 01:23:52
中学だと仮定法やんないけどな。
921デフォルトの名無しさん:2005/11/05(土) 02:53:55
だから、このスレの住人にどうしろって言いたいのさ?
英語ができないなら、自分で勉強するしか無いんだよ。
Perlに関する英語なら、解らないことはこのスレで質問
すればいいだろう。
922デフォルトの名無しさん:2005/11/05(土) 03:15:28
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したいのですが。
923デフォルトの名無しさん:2005/11/05(土) 03:21:39
924デフォルトの名無しさん:2005/11/05(土) 03:22:46
>>922
> sub test(%dat)
ここCとかと混同してるね。
とりあえずperlsubとperlrefを読んで見るといいよ
・プロトタイプ
・引数の受けかた
・リファレンス(参照)
の三点について調べるべし
925デフォルトの名無しさん:2005/11/05(土) 03:41:09
>>920
つ English板

ここで質問するように、英語についてはそちらで質問可
926デフォルトの名無しさん:2005/11/05(土) 03:46:30
Test::Inline 2.x で、inline2test 使ってるんだけど、check_count=2 に
してもテスト数が no_plan になってしまう。どうすればいいの?
927デフォルトの名無しさん:2005/11/05(土) 06:02:18
>>920
> 中学だと仮定法やんないけどな。

文学作品には当然のようにじゃんじゃん出てくる仮定法は、幸いなことに、
ビジネス文書や技術書には出てこないよ。

(英語の技術書を読んでいると、技術的な説明は簡単に理解できるのに、
各章の始めに書いてあるジョークのたぐいは、何がなにやら分からない。)

幸いなことに、プログラムの本は、技術的な説明の英文と、サンプルの
ソースを見れば、英語力が乏しくてもたいてい理解できる。
928デフォルトの名無しさん:2005/11/05(土) 09:18:55
理想形が取り扱い説明書だからね。
んでも、理屈が必要な本はそれなりにめんどくさい。
あと、MSDNでその関数仕様に不具合があると英語が不自然にややこしくなる。
929デフォルトの名無しさん:2005/11/05(土) 14:39:51
あれ?仮定法って中3でやってなかったっけ?
世代によっても違いそうだな
>>913はゆとり教育世代か?
930デフォルトの名無しさん:2005/11/05(土) 17:20:56
はいはい。スレ違いの英語力早熟自慢大会は終わり。
俺なんて受験勉強するまで英文なんて読めませんでしたから。
そんなもん必要になったら勉強すりゃいいんだよ。
931デフォルトの名無しさん:2005/11/05(土) 18:45:59
というわけで、>>905 への答えは

Perl を勉強してて詰ったら、ドキュメントを読め。
ドキュメントが英語で困ったら、英語を学べ。

…でよろしいか?
932デフォルトの名無しさん:2005/11/05(土) 18:59:37
中学時代は英語は50点ばっかりだった俺が、外人の女と付き合
いはじめた時、英語を分かりたかったんでいろんなもの読んだ。
その中、中学3年間の教科書なぞ5日間読破で、しかもがっちり
理解できた。 おれスゲーと思ったぞ。(なぜこれが3年間も掛か
るんだ、ともちょっと思った)

つまり、必要に駆られて死ぬ気でやると、思ったより意外といける。
933デフォルトの名無しさん:2005/11/05(土) 19:27:02
はいはい
934デフォルトの名無しさん:2005/11/05(土) 20:19:56
他人が何かを上手くやった話が
ホントに嫌いだなお前らw
935デフォルトの名無しさん:2005/11/05(土) 20:30:06
はいはい
936デフォルトの名無しさん:2005/11/05(土) 22:06:11
まあNEETには辛い話題かもしれんなw
937デフォルトの名無しさん:2005/11/05(土) 22:09:45
はいはい
↓次のPerlについての質問どうぞ
938デフォルトの名無しさん:2005/11/05(土) 23:17:44
はいはい
939デフォルトの名無しさん:2005/11/05(土) 23:20:48
「はい」は一回!
940デフォルトの名無しさん:2005/11/05(土) 23:27:16
ふぁ〜い
941デフォルトの名無しさん:2005/11/05(土) 23:52:53
飛影はそんな返事しない!
942デフォルトの名無しさん:2005/11/06(日) 01:16:39
飛影、来て!
943デフォルトの名無しさん:2005/11/06(日) 01:17:43
イク〜
944デフォルトの名無しさん:2005/11/06(日) 01:31:12
なんだおまいら
945デフォルトの名無しさん:2005/11/06(日) 02:53:30
忘れない内に >>2-3 の変更案。
・クックブックは第二版が出てURLが変わっている。
・cpan.jp と perldoc.com は死んでる?
・[モジュール]と[テクニック]は混ぜちゃっていいと思う。
9462 (案):2005/11/06(日) 02:58:45
[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www.site-cooler.com/kwl/perl/

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

[オンラインマニュアル]
最新のドキュメント: http://search.cpan.org/~nwclark/perl-5.8.7/
perl5.8.x のドキュメント(一部): http://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/~kbk/perl5.005/
perldoc.jp: http://www.perldoc.jp/
9473 (案):2005/11/06(日) 03:02:55
948デフォルトの名無しさん:2005/11/06(日) 05:06:15
ここいいサイトだと思うけどどうだろう?
Smart! http://www.rfs.jp/sitebuilder/perl/

あと次のスレNo20ね。 経緯>>7-10
949デフォルトの名無しさん:2005/11/06(日) 05:31:06
>>946 のPerlプログラミング講座
はアサマシすぎる。
こういう収入目的のサイトはテンプレに入れない方がいいな。
950デフォルトの名無しさん:2005/11/06(日) 06:32:24
>>948
一次情報が書いてあるサイトと、それを補う情報のあるサイト、
あと FAQ に対して「ココ見とけ」と示せるサイトを小数精鋭で
挙げた方が使い易いリンク集になると思う。 Smart! のように
大半のページがドキュメントの抜粋でできているサイトは、
本物のドキュメントの在り処を書いておけば敢えて挙げる
必要は無いと思う。

>>949
私がそのサイト (の移転前のサイト) を挙げた者ですが、単に

・リャマ本でも敷居が高いと感じるズブの素人が
・オンラインでチュートリアル的に読み進められて
・インストールの方法から巷で配布されているスクリプトを読む
 のに困らん程度までは学べて
・「CGI」の解説サイトでは無いサイト

という条件で探したらそこが見つかったってだけで拘りは無いです。
上記条件に該当するもっといいサイトがあったら差し替えて下さい。
951デフォルトの名無しさん:2005/11/06(日) 07:35:54
perlって、マルチスレッド対応のスクリプト書けるんでしょうか?

私んとこにもようやくデュアルコアのCPU使ったマシンが来たんですが、
これをいかす方法がないかな、と思って。

といってもマルチスレッドに対応したスクリプトを書くような
技術もないんですが、メインが整数演算を主とした、単純だけど
時間だけはかかる(数時間〜数日)シミュレーションプログラム
なんで、perlで勝手に?マルチスレッドに分割してくれる
ようなライブラリでもないかと思いまして・・・甘い?
952デフォルトの名無しさん:2005/11/06(日) 08:02:21
953デフォルトの名無しさん:2005/11/06(日) 08:09:29
>>951
マルチスレッドは簡単に書けるよ。
ただ、実装は環境に依存すると思うから、目的の環境でどこまで実装されているかは
保証できないけれど。

>>950
たしかにチュートリアルやリファレンス的なサイトがテンプレにあれば初心者には便利かもね。
広告べたべたのサイトをスレ御用達のようにするのは気が乗らないけれど、
他に候補がなければ仕方なしかな。
954デフォルトの名無しさん:2005/11/06(日) 08:54:19
ちょっと疑問なのですが $a==undef と $a eq '' は同じ意味でよいのでしょうか?
955デフォルトの名無しさん:2005/11/06(日) 09:03:20
>>954
いや、例えば $a == '' のとき、前者は false、後者は true だよ。
956デフォルトの名無しさん:2005/11/06(日) 09:50:29
>>954
undef と空文字列は数値として評価された場合 0 と見做される。
undef は文字列として評価された場合空文字列と見做される。

$a == undef が真になるのは $a の値が 0 と見做される時。
$a eq '' が真になるのは $a が undef もしくは空文字列の時。
957デフォルトの名無しさん:2005/11/06(日) 10:14:37
ほんとだ。>>955 はウソです。sorry.

undef 関係で気をつける必要があるケースは、hash の key を消す場合と、
数値と文字列のどちらで評価されるかで真偽値が変わる等かな。
後者は例えば、

$a = '0';
if $a == undef; # true
if $a eq ''; # false
95811:2005/11/06(日) 11:25:44
問題解決しました。
template-toolkitのプラグインがインストールされているパスを
相対パスで指定かつ、キャッシュディレクトリを相対パスで指定している場合、
2回目以降キャッシュから実行する際にカレントディレクトリが一時的に
キャッシュフォルダにchdirされるため相対パスで指定されているプラグインが
読み込めなかったようです。
前回mod_perl環境下で今回はCGIで動かしているのですが原因は同じだと思われます。
解決法は
・キャッシュフォルダを絶対パスにすればchdirされない
・@INCに絶対パスで格納する
等です。
すっきりした
959954:2005/11/06(日) 11:27:22
>>956-957
ありがとうございます。 0 も undefなのですかぁ。
用途によって使い分けなきゃいけないってことですね。勉強になりました。
960954:2005/11/06(日) 11:46:53
てか、if文で undef使うと思わぬバグを生む危険性が…。
!$a , $a eq '' を書くようにしようと思います。
961デフォルトの名無しさん:2005/11/06(日) 12:03:06
そんなあなたにdefined
962デフォルトの名無しさん
>>961
それだ!