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

このエントリーをはてなブックマークに追加
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/11/06(日) 23:14:26
[プログラミング自体の経験が無い奴はまずココを読め]
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/11/06(日) 23:15:51
4デフォルトの名無しさん:2005/11/06(日) 23:16:33
5デフォルトの名無しさん:2005/11/06(日) 23:17:09
6デフォルトの名無しさん:2005/11/06(日) 23:20:29
>>5 の 19 は

http://pc8.2ch.net/test/read.cgi/tech/1126977805/

の間違いかな
7デフォルトの名無しさん:2005/11/06(日) 23:21:02
>>6
ごめんやっちまった。
8デフォルトの名無しさん:2005/11/07(月) 04:19:33
前スレの埋め方、あれはないだろう?
9デフォルトの名無しさん:2005/11/07(月) 04:21:20
斬新なアイデアでした
10デフォルトの名無しさん:2005/11/07(月) 11:14:17
厨しかいないのかよ
11デフォルトの名無しさん:2005/11/07(月) 11:51:39
「しかいない」には自分が含まれちゃうんだけど、
言葉に刺激が欲しくてつい言っちゃうんだよね、馬鹿はw
12デフォルトの名無しさん:2005/11/07(月) 16:03:51
>>11
おいおい日本語大丈夫か・・・
空主語文に何いってんだが・・・
13デフォルトの名無しさん:2005/11/07(月) 16:22:46
>>11
「(ここには)厨しかいないのかよ」
14デフォルトの名無しさん:2005/11/07(月) 17:06:57
馬鹿は往生際も悪いな
15デフォルトの名無しさん:2005/11/07(月) 18:01:02
日本語も碌に理解してない馬鹿が何いってんだか
16デフォルトの名無しさん:2005/11/07(月) 19:22:42
つまらんことで頑張るね

の割には、こじつけることもできなくなってるみたいだけど
17デフォルトの名無しさん:2005/11/07(月) 19:27:11
上げてる奴はどう見ても全員荒らしです
本当にありがとうございました
18デフォルトの名無しさん:2005/11/07(月) 21:59:42
お前ホントそれ好きだな、
19デフォルトの名無しさん:2005/11/07(月) 22:32:14
perl6はperl5と互換性が無いと聞いたのですが、互換性とはどういった
ことでしょうか?perl5で書いたソースが動かなくなるといった感じですか?
20デフォルトの名無しさん:2005/11/07(月) 22:34:54
>>19
Perl 6は今世紀中にはでないから安心汁
21デフォルトの名無しさん:2005/11/07(月) 22:37:38
そんなに後なの?
22デフォルトの名無しさん:2005/11/07(月) 22:42:46
前スレはスレタイ間違えるし、
このスレは過去スレ貼り間違えるし同じ奴の仕業か?
一度ならず二度三度死ねよ能無しが。
23デフォルトの名無しさん:2005/11/07(月) 23:00:52
Pugs使ってる香具師いる?
24デフォルトの名無しさん:2005/11/07(月) 23:36:02
というかここ本スレで進めるわけ?
25デフォルトの名無しさん:2005/11/07(月) 23:40:21
資源は大切にしようぜ
26デフォルトの名無しさん:2005/11/08(火) 00:18:16
>>24
what do u mean?
27デフォルトの名無しさん:2005/11/08(火) 01:35:22
ここを本スレとします。
28デフォルトの名無しさん:2005/11/08(火) 03:13:38
あと百年近く perl5 でいくわけか
29デフォルトの名無しさん:2005/11/08(火) 04:18:31
perl -MCPAN -e shell
を実行すると
You have an empty /home/teppei/.cpan/sources/MIRRORED.BY,
I'm trying to fetch one
LWP not available
CPAN: Net::FTP loaded ok
Fetching with Net::FTP:
ftp://ftp.perl.org/pub/CPAN/MIRRORED.BY
Timeout at /usr/lib/perl5/5.8/Net/FTP.pm line 503
でとまっちゃうよ
なんでだろ。
PASVじゃないのかな。
30デフォルトの名無しさん:2005/11/08(火) 06:51:55
>>てっぺいさん

対象の鯖が死んでる可能性も。

cpan
o conf init

で再設定してみては。
31デフォルトの名無しさん:2005/11/08(火) 14:16:32
久々にActivePerl 5.8.6から5.8.7にしたらアイコン変わってんのな
32デフォルトの名無しさん:2005/11/08(火) 15:00:13
ああ。あのチンコみたいなやつだろ。
ぶっちゃけ金玉の方が良かった。
33デフォルトの名無しさん:2005/11/08(火) 15:40:49
while (my $name = readdir(DIR)) {
のようにした時、「0」という名前のファイルがあると
$nameが"0"になるにも関わらず、whileが終了しないのは
どうしてなのでしょうか?
34デフォルトの名無しさん:2005/11/08(火) 15:44:09
perl -MO=Deparse
すりゃ分かる
35デフォルトの名無しさん:2005/11/08(火) 15:55:22
>>33
終了するよ
3633:2005/11/08(火) 16:13:10
>>34
ありがとうございます。納得しました。

>>35
終了しないので、試してみて下さい。
37デフォルトの名無しさん:2005/11/08(火) 16:37:05
&abc($test);

print %$test;

sub abc {
my($hash) = @_;
$hash->{'DEF'} = '456';
}

とする場合、"DEF456"と出力されればいいんですが、されません。
最初に
$test->{'ABC'} = '123';
などと初期化しておけば良いのですが、この他にも初期化方法はありませんでしょうか
38デフォルトの名無しさん:2005/11/08(火) 16:41:45
サブルーチン内でmyしたらルーチン終了後あぼーん。
3937:2005/11/08(火) 16:50:39
>>38
ハッシュリファレンスのアドレスを渡そうとしてるのですが・・
40デフォルトの名無しさん:2005/11/08(火) 16:54:01
>>37
初期化なら $test = {};
4137:2005/11/08(火) 16:56:02
>>40
どうもありがとうございます。
それでできました。
42デフォルトの名無しさん:2005/11/08(火) 22:04:13
文字と数字がまざったデータのソート
のやりかたが良く分かりません。

例えば、
「C100,D125,A12,A2,C5,D2」
と言うデータを
「A2,A12,C5,C100,D2,D125」
のようにソートしたいのですが、
数値の昇順、降順ソートである<=>を使用すると
ソートされず(1文字目が文字だから?)
文字の昇順、降順ソートであるcmpを使用すると
「A12,A2,C100,C5,D125,D2」
とソートされます。(文字扱い)

どうすれば良いのでしょうか・・

43デフォルトの名無しさん:2005/11/08(火) 22:21:04
>>42
@example = qw( C100 D125 A12 A2 C5 D2 );
@sorted =
  map { $_->[2] }
    sort { $a->[0] cmp $b->[0]  or  $a->[1] <=> $b->[1] }
      map { [/^(.)(.*)/ , $_] } @example;

後ろのmapの無名配列は [ "C", "100", "C100" ] みたいなデータになる
sort { ... } の ... の戻り値で入れ替えを判断するから1項目($a->[0] cmp $b->[0])が偽(=cmpで0=同値)だった場合orや||で次の判断基準を書く
基本的な構成は「シュワルツ変換」っての
44デフォルトの名無しさん:2005/11/08(火) 23:26:36
文字列の一番最後の文字だけ削除する関数ってありますか?
$foo = "bar";
func($foo);
→$foo = "ba" # 一番最後のrを削除

$foo = "hoge hoge ";
func($foo);
→$foo = "hoge hoge" # 一番最後のスペースを削除

みたいな。
45デフォルトの名無しさん:2005/11/08(火) 23:34:15
>>44
chop
4644:2005/11/08(火) 23:49:29
>>45
どうもありがとうございます。
47デフォルトの名無しさん:2005/11/09(水) 07:24:31
chomp
じゃなかたっけ?
48デフォルトの名無しさん:2005/11/09(水) 07:25:58
両方あるよ
今回はchopが正解
49デフォルトの名無しさん:2005/11/09(水) 07:27:39
50デフォルトの名無しさん:2005/11/09(水) 09:44:01
>>36
readdirについても行入力演算子同様whileの条件の中で単独で使われたときの
暗黙のdefinedが有効になってるということだと思うけど、これについてマニュアルに
書いてありますかね? かなり探したけどみつけられなかった。
51デフォルトの名無しさん:2005/11/09(水) 22:18:28
perlのGCを強制的に実行する方法はないでしょうか。
環境は ActivePerl 5.8.6 811 です。

今、threadsを使ったサーバを書いていて1クライアントごとに1スレッド割り当てています。
スレッド数は10までで制限をかけて、それを超える接続はキューに入れてまたせています。

同時に100クライアントが接続して来た場合に10スレッド平行で処理して、
クライアントとの通信が終了するとスレッドをjoinしているのですが、
メモリが開放されず、仮想メモリの使用量が1Gを超えてしまい困っています。
キューが空になってサーバが暇になるとメモリが一気に開放されているようです。

なんとかスレッドをjoinした時点でメモリを開放したいのですが、GCを動かす方法は
ないでしょうか (sleepはだめでした)。

おとなしくselectを使って1スレッドで処理すべきなのかもしれませんが。
5251:2005/11/09(水) 22:23:54
>>51 に補足。
Thread::Pool を使ってスレッドを再利用しようと思ったのですが、
Thread::Tie の test でこけてしまいました。
さらに以下を見ると動かすのが難しそうなのであきらめました。
ttp://www.donzoko.net/doc/memo/perlithreads.html#etc_tie

自前で簡単なスレッドプールを実装しようと思ったのですが、
スレッド間でソケット(GLOB)をshareする方法が分からずに断念しました。
53デフォルトの名無しさん:2005/11/10(木) 00:20:16
>>52
スレッド開始前にlistenしておけば各スレッドでacceptできるけど、それじゃ駄目なの?
54デフォルトの名無しさん:2005/11/10(木) 01:00:54
>>51じゃないけど、リファレンスぐちゃぐちゃ状態のコードでGB単位のメモリ食いつぶして困ってたら、
ちょうどよさげなものを見つけた。ただでも遅い処理なんでいちいちdestoryしたくなかった。

http://d.hatena.ne.jp/naoya/20051012/1129115986
55デフォルトの名無しさん:2005/11/10(木) 09:01:14
\12,345
のような金額の表記を数値にするにはどうしたらよいでしょうか?
56デフォルトの名無しさん:2005/11/10(木) 09:15:26
>>55
s/[^0-9]//g
57デフォルトの名無しさん:2005/11/10(木) 10:33:07
>>55
$x = '\12,345';
$x =~ tr/0-9//cd;

ぐらいでいいんじゃ。trに慣れてなければs/\D//gでも可。
58デフォルトの名無しさん:2005/11/10(木) 10:51:08
HTML::TreeBuilderで日本語を扱うにはどうすりゃいいの?
http://namazu.org/~tsuchiya/perl/perl-5.8.html
のとおりにやってみたところ、下記のエラーが出てダメだった。
Parsing of undecoded UTF-8 will give garbage when decoding entities
59デフォルトの名無しさん:2005/11/10(木) 12:23:35
>>58
キミは、文字が読めないのかね???
> 未解決の問題
> 日本語を含むコンテンツを HTML::TreeBuilder で処理するには?
> 日本語部分が Unicode の文字実体参照に変換されてしまう.
> :
> as_text() メソッドでの出力は出来るようになった.as_HTML()
> を利用したり, 透過的に処理を行う方法がまだ分からない.

このサイトの作者の言によれば、非常に難しいことであることが解るだろう。
このスレで質問したところで、簡単に回答が得られるわけではない。
HTML::TreeBuilder を誰かが作り直すのを待つか、
キミがHTML::TreeBuilder を作り直すしかあるまい。
60デフォルトの名無しさん:2005/11/10(木) 13:26:14
>>58
まともにutf8とかにしないで、日本語部分を適当に英数字のみをつかってエンコードしてから
食わせてやって出てくるものには逆変換かませばなんとかならんかね。

たとえば、eucに直してから0x80〜0xffの範囲を hoge<16進2ケタ> にするとかさ。hogeは
入力中にあらわれない文字列を適当に選んで。

そうすればHTML::TreeBuilderからはなんだかわからないけど長いスペルの英単語にしか見えない
はずなんで、あまり余計なことはされないんじゃないかと。
6159:2005/11/10(木) 15:15:53
>>60
それがいいかもね。こんな感じかな。

$str = '日本語テキスト';
print "オリジナル $str\n";
$str =~ s/[\p{Han}\p{InHiragana}\p{InKatakana}]/'hoge'.ord($&)/ge;
print "変換後 $str\n";
$str =~ s/hoge([0-9]+)/chr($1)/ge;
print "元に戻す $str\n";

しかし、[\p{Han}\p{InHiragana}\p{InKatakana}]のところは
何とかならんものかな。要するに、マルチバイト文字だけ変換
したいのだが。[^\p{Alphabet}]としてもうまく動いてくれないし。
62デフォルトの名無しさん:2005/11/10(木) 15:31:08
>>61
別に、マルチバイト部分だけ変換でなくても全部変換でいいんじゃね?
全部 base64 してあとで全部元に戻すとかさ。
63デフォルトの名無しさん:2005/11/10(木) 15:49:21
>>61
16進2ケタという元の案ならこんな感じ。

$str = '日本語テキスト';
print "オリジナル $str\n";
$str =~ s/([^\x00-\x7f])/sprintf "hoge%02x", ord($1)/ge;
print "変換後 $str\n";
$str =~ s/hoge([0-9a-f]{2})/chr(hex($1))/ge;
print "元に戻す $str\n";

>>62
htmlタグまで変換しちゃったら、パースできないんじゃないかと...
64デフォルトの名無しさん:2005/11/10(木) 17:27:08
>>59
TreeBuilderのparseでエラーを吐くので、as_HTML()でなくas_text()すら不可能なんすよ。
ActivePerl 5.8.7なんだけど。
65デフォルトの名無しさん:2005/11/10(木) 17:30:13
>>60-63
賢い解答有難うございました、それで行こうと思います。
66デフォルトの名無しさん:2005/11/10(木) 20:42:10
@_ = $a->b();
my $result = shift;

をまとめて記述することは出来ないでしょうか?
ハッシュの場合は警告が出るけど %{ $a->b() }->{hoge} で良いみたいなんですが。
67酩酊 ◆TWARamEjuA :2005/11/10(木) 21:14:23 BE:5880896-###
$a->b() で、return wantarray ? array : scalar; で切り分けてあげると、
my $result = $a->b();
でよさそうな。。。
68デフォルトの名無しさん:2005/11/10(木) 21:17:44
>>66
@{[$a->b()]}[0]
は?
69デフォルトの名無しさん:2005/11/10(木) 21:44:09
>>67 それだと$resultに配列の要素数が入ってしまいました
>>68 できました
70デフォルトの名無しさん:2005/11/10(木) 21:46:42
>>66
(my $result,@_) = $a->b() は?
71デフォルトの名無しさん:2005/11/10(木) 21:48:28
>>67
すみません、勘違いでした。
wantarrayは自分で設定するフラグじゃないんですね、それなら可能でした。
7251:2005/11/10(木) 23:10:23
>>53
おぉ、なんか目からうろこです。
ありがとうございます。明日早速試してみます。
73デフォルトの名無しさん:2005/11/11(金) 11:17:36
初歩的な事ですみませんが、今まで気になっていた事がありまして。
スクリプト最後__END__前によく

1;

って見かけるのですが、これは有っても無くても良い物ですか?
74デフォルトの名無しさん:2005/11/11(金) 11:39:04
>73
モジュールやライブラリなら必須。
モジュールは、真と解釈される値を帰さなくちゃいけないから。
真と解釈されるものならなんでもいいんだけど、普通は1;

普通のプログラムなら無くても大丈夫だけど、俺はそんなの見たこと無いような気が。
75デフォルトの名無しさん:2005/11/11(金) 11:39:20
>>73
perlfunc(1)のrequireの項参照。

> 初期化コードの実行がうまくいったことを示すために、ファイルは真を返さなければなりませんから、
> 真を返すようになっている自信がある場合を除いては、ファイルの最後に 1; と書くのが習慣です。
> 実行文を追加するような場合に備えて、1; と書いておいた方が良いでしょう。

ttp://perldoc.jp/docs/perl/5.6.1/perlfunc.pod
76デフォルトの名無しさん:2005/11/11(金) 12:02:54
require すると無いとエラー吐いたりする.
7773:2005/11/11(金) 12:17:15
ありがとうございます。
モジュール化してrequireしまくりたい感じなので
おまじない的に書いておいた方が良い、という事でしょうか。

普通に文法として「1;」の意味が分からずエラーに見えて仕方なかったので気になっていました。
78デフォルトの名無しさん:2005/11/11(金) 12:32:27
>モジュール化してrequireしまくりたい感じなので
外部スクリプトは全てモジュールだと思ってるなら間違いだから。
79デフォルトの名無しさん:2005/11/11(金) 13:03:13
>>77
本来はエラーの有無を返すべきものだが、ほとんどの場合はサブルーチンや定数を
定義するだけでエラーなどでようもないので1;と書くだけのことが多い。
80デフォルトの名無しさん:2005/11/11(金) 17:44:03
CPAN のインストールについての質問です。
ActivePerl + Cpan (windows2003 sarver)環境です
perlは
ActivePerl-5.8.3.809-MSWin32-x86.msi を使ってインストールしました。

その他、gzip unzip dmake ftp nctcp のパス及び設定を終えました。

perl -MCPAN -e shell

の後、 install Bundle::CPAN を実行すると
幾つかのファイルをフェッチした後、
The bundle file ".\cpan\Bundle\CPAN.pm" may be a broken 。。。

このエラーで先より進めません。
解決策はあるでしょうか?


どなたかご存知の方、ご教授頂けると幸いです

81デフォルトの名無しさん:2005/11/11(金) 17:52:58
ppm
82デフォルトの名無しさん:2005/11/12(土) 19:36:08
Catalystについて語られているスレはないかね?
83デフォルトの名無しさん:2005/11/12(土) 21:49:13
>>82
ここで検索しよう。
http://find.2ch.net/
84デフォルトの名無しさん:2005/11/12(土) 23:39:30
Win XP + Active Perl 5.8.6を使っています。"え" という文字の
ユニコードを10進で(すなわち"12360"と)表示させようとしているの
ですが、下のルーチンではうまくいきません。どうすればよろしいでしょうか?

use utf8;
binmode STDOUT, ":encoding(cp932)";
binmode STDERR, ":encoding(cp932)";
binmode STDIN, ":encoding(cp932)";
use open IO => ":encoding(cp932)";
use Encode;

$char = "え";
printf "%s = %d", $char, encode("utf16", "え");
8584:2005/11/12(土) 23:47:52
>>84 の最後の行間違えました。
(何れにしても正しい値が出ませんが)

printf "%s = %d", $char, ord(encode("utf16", $char));
86デフォルトの名無しさん:2005/11/13(日) 00:26:32
>>84
use utf8してるのでスクリプトはutf8で保存されているとすると
$charにはじめからunicodeで”え"が入っているから

ord($char)

とするだけでいいのではないかと。
87デフォルトの名無しさん:2005/11/13(日) 01:16:46
>>86
説明不足ですみません。utf16ユニコードの値が欲しかったのです。
しかし、自己解決できました。

# 特殊文字を2ちゃんねるに貼り付けるためのスクリプト。
my $str = "㋐㋑㋒㋓㋔";
$str =~ s/([^\x00-\x7f])/sprintf "&#%d;", conv($1)/ge;
print $str;

sub conv{
my $char = shift;
my $charv = encode("utf16", $char);
my $count = 0;
my $code = 0;
while(length $charv){
$byte = ord(chop $charv);
last if $byte == 0xff || $byte == 0xfe;
$code += $byte * 256 ** $count++;
}
return $code;
}
88デフォルトの名無しさん:2005/11/13(日) 01:53:21
>>87
いやそれまわりくどいって。84のprint文を

printf "%s = %d", $char, ord($char);

って書き直してやるだけで結果は

え = 12360

だよ。
89デフォルトの名無しさん:2005/11/13(日) 01:54:49
>> 84

 
printf "%s = %d", $char, encode("utf16", "え"); 



printf "%s = %d\n", $char, unpack "n", encode('utf16be', $char); 
 
なぜかordでできなかった。

encodingによる変換をutf16leにして、unpack "v" でも可。
90デフォルトの名無しさん:2005/11/13(日) 03:40:27
ActivePerl 5.6を使ってます

sub p
{
 print $_[0]->{text}."\n"
}

my @test = ( {'text'=> 'hoge'}, {'text' => 'fuga'} );
p($_) foreach @test; #1
p($test[0]) #2

1の場合はサブルーチンpの中のprintが $_->{text} でもいけるのに
どうして2の場合はキチンと[0]をつけてやらないといけないのでしょうか?
9189:2005/11/13(日) 04:11:30
>>88

ああ、perlfuncのordの項目にあるUnicodeってUTF-8フォーマットの
ことなのか。道理でutf16に変換したらうまくいかんわけだ。
92デフォルトの名無しさん:2005/11/13(日) 04:19:38
>>90
> p($_) foreach @test; #1
> p($test[0]) #2
>
> 1の場合はサブルーチンpの中のprintが $_->{text} でもいけるのに
> どうして2の場合はキチンと[0]をつけてやらないといけないのでしょうか?

え? どう出来たら良いと思ってるの?
93デフォルトの名無しさん:2005/11/13(日) 04:22:34
>>90
その関数だと、
p($test[0]) = p(@test)
94デフォルトの名無しさん:2005/11/13(日) 05:59:52
>>92
引数はひとつであっても常に@_で送られるはずですよね、だから常に[0]をつけてやらないとダメじゃないかなとか思ってました。
省略できるケースは何なんだろうと思いまして。
95デフォルトの名無しさん:2005/11/13(日) 08:03:58
質問です。
ハッシュに色々値を放り込むのと、必要な分だけ変数をこさえるのでは、速度とかメモリ使用の違いはあるのでしょうか。
perldocのデータ型読んでもいまいち分からなかったもので。
96デフォルトの名無しさん:2005/11/13(日) 08:58:04
>>94
レキシカルな変数でなければ引数として渡さなくても同じ名前の変数が
サブルーチン側でも見えてるというだけの話じゃないか。$_と@_は全くの
別物。
97デフォルトの名無しさん:2005/11/13(日) 09:21:29
98デフォルトの名無しさん:2005/11/13(日) 09:45:10
>>95
あまりそういうことは考えずに素直に書いた方がいいと思うよ。
たいして儲からないのに見難くなるのがオチ。
99デフォルトの名無しさん:2005/11/13(日) 09:50:42
>>97
ベンチ取るにもundef混ぜてやればいいのかよく分からないです。方法が間違っていればベンチとっても意味ないと思うし。
>>98
この場合はコードの見易さをとっていいって事ですか?
用途とか、使うときの意味でハッシュに纏めてたりするので、この使い方でいいのかな〜と疑問でした。
100デフォルトの名無しさん:2005/11/13(日) 11:27:40
正規表現にマッチした個数を出す方法を教えてください
101デフォルトの名無しさん:2005/11/13(日) 11:33:46
perlvar
102デフォルトの名無しさん:2005/11/13(日) 11:35:20
違った
103デフォルトの名無しさん:2005/11/13(日) 11:50:12
>>91
むしろ、Encodeの使い方とユニコードの事を間違えてる。
ユニコード,UCS-2,UCS-4とutf8,utf16の混同が一つ。
encodeの出力は単なるバイト列で、決してユニコードにならない事が一つ。

$utf8=encode('utf8',$unicode); # ユニコード文字列からUTF8バイト列に
$unicode=decode('utf8',$utf8); # UTF8バイト列からユニコード文字列に

例えば、"え"の場合length $unicodeは1でlength $utf8は3,
ord $unicodeは12360でord $utf8は227になる。

>>100
s/PATTERN/$&/g とか scalar(()=m/PATTERN/g) とか...
104デフォルトの名無しさん:2005/11/13(日) 13:30:32
>>103
前者(s///g)は$&を使っても括弧と$1を使っても結局ものすごく遅くなるから、
後者(m//g)のほうがいいね。
別の書き方では、 $c++ while(m//g); とか?
105デフォルトの名無しさん:2005/11/13(日) 15:29:59
>>103-104
ためしてみたけどうまくできませんでした
文字列中のabcの数を出したいんですが
$str="wwwabcabcrrrwww";
$str=~s/abc/$&/g;
print"$str";としてもだめでした。
10691:2005/11/13(日) 16:24:38
>>103

突っ込みサンクス。

勘違いしてますた。ところでPerlのソース見ると、
Unicodeって云ってる文字列はUTF-8みたいだけど?

文字列の長さがどうのは、utfフラグがついてるかどうかの
問題だと思うんだがどうだろう。
107デフォルトの名無しさん:2005/11/13(日) 18:46:32
文字列1の中に文字列2が含まれている個数を出す関数を自分で考えました

$aaa=&match_kosuu("aaaaaaaaあああaaaaaaaaああああaaa","aaa");
print "aaaの個数=$aaa";

sub match_kosuu{
local($aaa)=0;
local($str);
$str=$_[0];
$str=~s/$_[1]//g;
$www=length($str);
$aaa=(length($_[0])-$www)/length($_[1]);

return($aaa);
}

108デフォルトの名無しさん:2005/11/13(日) 19:34:19
>>107

$kosuu = () = "aaaaaaaaあああaaaaaaaaああああaaa" =~ /aaa/g;
printf "aaaの個数=$kosuu\n";
109デフォルトの名無しさん:2005/11/13(日) 19:48:13
このスレレベル低杉
110デフォルトの名無しさん:2005/11/13(日) 19:52:03
>>109
では、上級レベルのスレッドへどうぞ。

【Perl上級者コーナーPart01】
http://pc8.2ch.net/test/read.cgi/php/1024741312/l50
111デフォルトの名無しさん:2005/11/14(月) 00:40:15
質問です。ビット演算子を文字列に対して行うという話ですが、
例えば
"123.45" & "67.89"
という演算をしたとしても、文字があらわす数字とは何の関係もなく
文字コードのビット配列で計算してしまうのですよね?
文字列のビット演算の使いどころがわからないのですが、
どういうときに役に立ちますか?
112デフォルトの名無しさん:2005/11/14(月) 01:08:10
pack, unpackが出てくるようなとき?
113デフォルトの名無しさん:2005/11/14(月) 01:15:30
>>108
それでやったけど動作しませんでした
114デフォルトの名無しさん:2005/11/14(月) 01:33:20
>>111
> 質問です。ビット演算子を文字列に対して行うという話ですが、

ビットベクタは事実上文字列という話じゃなくて?
115デフォルトの名無しさん:2005/11/14(月) 01:44:14
>>111
>どういうときに役に立ちますか?
小文字を大文字に変換する最速の方法として使えるかもしれんな。
$foo = "abcdef" & "______";# ABCDEF

>>113
>>108の通りでちゃんと動いたよ。
116デフォルトの名無しさん:2005/11/14(月) 01:55:09
ヒント:ファイルの文字コード
117デフォルトの名無しさん:2005/11/14(月) 10:02:01
値3.987899の小数部分987899を無視して、
3として計算に使いたいんですが、どうすればいいですか?
118デフォルトの名無しさん:2005/11/14(月) 10:18:18
>>115
環境にも依存する可能性はあるが、手元じゃucの方が速いよ。
use Benchmark;

my $s = "abcdef";

timethese(undef,
{
bitand => sub { $foo = $s & "______"; },
uc => sub { $foo = uc $s; },
}
);

結果:
Benchmark: running bitand, uc for at least 3 CPU seconds...
bitand: 4 wallclock secs ( 3.18 usr + 0.00 sys = 3.18 CPU) @ 1126669.50/s (n=3582809)
uc: 4 wallclock secs ( 3.15 usr + 0.04 sys = 3.19 CPU) @ 1647269.91/s (n=5254791)
119ヽ(´ー`)ノ ◆.ogCuANUcE :2005/11/14(月) 10:39:59
>>117
int(3.987899)

>>115
固定長だと話にならんので、文字列長を求めるようにしたらこうなった。

use Benchmark;

my $s = "abcdef";

timethese(undef,
{
bitand => sub { $foo = $s & (length($s) x "_"); },
bitandfix => sub { $foo = $s & "______"; },
uc => sub { $foo = uc $s; },
}
);

Benchmark: running bitand, bitandfix, uc for at least 3 CPU seconds...
bitand: 2 wallclock secs ( 3.02 usr + 0.00 sys = 3.02 CPU) @ 2174994.70/s (n=6568484)
bitandfix: 2 wallclock secs ( 3.05 usr + 0.01 sys = 3.06 CPU) @ 3427579.08/s (n=10488392)
uc: 4 wallclock secs ( 3.01 usr + 0.02 sys = 3.03 CPU) @ 4279167.66/s (n=12965878)
120デフォルトの名無しさん:2005/11/14(月) 12:00:09
>>119
それは、処理前の文の解釈の時間が相対的に大きくなっているだけ。
実際に処理が始まれば、ビット演算のほうが速いことは、文字列を長くすれば解る。
なお、$cpは$sより長くても支障は無いから、最初に充分な長さを確保しておけばよい。

use Benchmark;

my $s = "abcdef"*1000;
my $cp = "_" x 100000;

timethese(undef,
{
bitand => sub { $foo = $s & (length($s) x "_"); },
bitandfix => sub { $foo = $s & $cp; },
uc => sub { $foo = uc $s; },
}
);

Benchmark: running bitand, bitandfix, uc for at least 3 CPU seconds...
bitand: 4 wallclock secs ( 3.08 usr + 0.00 sys = 3.08 CPU) @ 1209622.81/s
(n=3723219)
bitandfix: 3 wallclock secs ( 3.03 usr + 0.00 sys = 3.03 CPU) @ 6406829.76/s
(n=19419101)
uc: 3 wallclock secs ( 3.00 usr + 0.00 sys = 3.00 CPU) @ 4357491.50/s
(n=13076832)
121デフォルトの名無しさん:2005/11/14(月) 12:06:56
げげ。間違えた。orz

>my $s = "abcdef"*1000;
my $s = "abcdef" x 1000;

しかし、結果はより鮮明になった。

Benchmark: running bitand, bitandfix, uc for at least 3 CPU seconds...
bitand: 4 wallclock secs ( 3.06 usr + 0.00 sys = 3.06 CPU) @ 1436996.74/s
(n=4401521)
bitandfix: 2 wallclock secs ( 3.16 usr + 0.00 sys = 3.16 CPU) @ 149609.32/s
(n=472167)
uc: 3 wallclock secs ( 3.20 usr + 0.00 sys = 3.20 CPU) @ 43495.47/s (
n=139316)
122デフォルトの名無しさん:2005/11/14(月) 12:48:05
へー、文字列が長くなると逆転するのか。勉強になった.
123ヽ(´ー`)ノ ◆.ogCuANUcE :2005/11/14(月) 12:58:16
>>120
なる。
124デフォルトの名無しさん:2005/11/14(月) 15:04:46
perl-CGIスクリプト書いて遊んでるんだが
OSをwin2000sp4からWinXPに変えたら動作がえらい遅くなった(それ以外の環境は一緒)。
そんなにOSの差ってあるもんすか?
125デフォルトの名無しさん:2005/11/14(月) 15:57:48
「-w」オプションをつけると
わざと「$dummy」とかに値を捨てたときにも
「used only once: possible typo」
と出てしまうのですがエラーを出さなくする方法はあるのでしょうか?
よろしくお願いします。
126デフォルトの名無しさん:2005/11/14(月) 16:11:18
スコープ宣言する。
127デフォルトの名無しさん:2005/11/14(月) 16:14:22
>>125
・要らない値を作らないようにする my($sec, $min, $hour) = (localtime)[3,4,5];
・undef に捨てる my(undef, undef, $foo) = bar();
・$dummy を二回以上使う
128125:2005/11/14(月) 16:21:27
>>127
『undef に捨てる』
を使いました。ありがとうございます。
129デフォルトの名無しさん:2005/11/14(月) 16:53:16
sendmailで、formを"hoge" <[email protected]>形式で送りたいのですが、どうすればいいんでしょうか?
130デフォルトの名無しさん:2005/11/14(月) 18:00:37
>>129
sendmail のマニュアルと RFC 2822 を読めばいいと思うよ。
何にしろ Perl の話じゃないので次の質問は適切なスレへ移動して下さい。
131103:2005/11/14(月) 18:51:30
>>104
それ(ループを回して数える)が適当かと。
前者(s///g)はリードオンリー値でエラーを出すので後者の方がマシだけど、
後者(m//g)も一時的に配列を作るから。

>>105
=~はパターン結合演算子。結果の入手は代入演算子。

>>106
そのとおり。utfフラグがUnicodeか否かを決定してる。
Unicodeだと文字コードの範囲が0〜0x7FFFFFFFになり、全ての文字幅が1になる。
少なくともそう見えるようになる。不完全だけどね。
132111:2005/11/14(月) 19:53:17
レスどうもです。
>>114
ビットベクタという言葉は知りませんでした・・・
>>115
そういう方法があったんですね。しかし逆に言うとそのぐらい
しか使い道なさそうですね。
133デフォルトの名無しさん:2005/11/14(月) 20:19:47
ラクダ本第3版を買おうか迷っているのですが、今買い時ですかね?
ラクダ本は今回が初めての購入です。すぐに第4版出ると悔しいので。
たかだか5.6→5.8の差分ぐらいで新しい版は出ないですよね?
134デフォルトの名無しさん:2005/11/14(月) 20:22:52
要素が10個あるとして、1つのページに1個ずつ
1 2 3 4 5 >>
というふうに要素を表示させたいのですが、どのようにすればいいですか?

foreach $data (@log) {
     なんたらかんたら
     $count++
}

見たいな感じでまわした後の$countの使い方がわかりません。。
135デフォルトの名無しさん:2005/11/14(月) 20:46:11
>>133
持ってないなら買うべし。ただ 5.6 → 5.8 の差は決して小さくないので、
自分の使っているヴァージョンの perldoc も併読する事が肝要。
136デフォルトの名無しさん:2005/11/14(月) 21:13:35
>>133
気になるならアマゾンでユーズド買うとか。
海外でもまだ第3版だからすぐには出ないはず。
137133:2005/11/14(月) 21:23:05
レスどうもです。ど〜んと買うことにしました。
会社が買ってくれりゃ良かったのですが;;
138デフォルトの名無しさん:2005/11/14(月) 21:28:12
>>134
みんな意地悪で君にレス付けないわけじゃないからな。
意味がわからないだけだからな。
139デフォルトの名無しさん:2005/11/14(月) 21:32:14
print $_ for 0..$#log; というような話なのかなぁ〜
140デフォルトの名無しさん:2005/11/14(月) 21:33:26
>>138に萌え
141デフォルトの名無しさん:2005/11/14(月) 21:52:45
Perlってダブルクォート文字列内で、変数とか展開できるですよね。
なら、文字列連結演算子っているの?という疑問がわいてきませんか?

$a = "abc";
$b = "def";

$renketu = "$a$b";
142デフォルトの名無しさん:2005/11/14(月) 21:57:10
>>141
>>1
"There's more than one way to do it"
143デフォルトの名無しさん:2005/11/14(月) 22:10:13
>>141
文字列連結演算子があれば、
$a .= $b;
みたいなのができる。strcat

$a = "$a$b";
は、"$a$b"を生成してから、$aにstrcpy
144デフォルトの名無しさん:2005/11/14(月) 22:10:21
>>141
$renketu = $a . kansuu() . 'ghi' x 3 . (my $b = 'def');
145デフォルトの名無しさん:2005/11/14(月) 22:30:29
ダブルクウォート内は、暗黙に文字列連結演算子が使われてる。
146デフォルトの名無しさん:2005/11/14(月) 22:32:01
基本的ですみませんが、 my と local は全く同じと考えてよいのでしょうか?
147デフォルトの名無しさん:2005/11/14(月) 22:33:11
>>146
よくないです
148141:2005/11/14(月) 22:37:20
レスどもです
なるほどねぇ
なるほどなるほど
149デフォルトの名無しさん:2005/11/14(月) 22:49:51
150デフォルトの名無しさん:2005/11/15(火) 00:31:55
>>138
Σ(・∀・;)
日本語が通じなくてシカトされていたとは・・・

しばらく日本語研修に行って参ります。ノシ
151デフォルトの名無しさん:2005/11/15(火) 01:32:04
そうじゃなくて説明しなおせよw
152134:2005/11/15(火) 01:47:29
>>151
説明しなおします。

つまり、
ヤフなどの検索エンジンの検索結果のように、
表示すべき内容がたくさんあった時、
いっそのこと1ページに表示する件数を決めて、
複数ページに分けて表示させてしまおうではないか、
という話です。

このように、文節をとにかく繋げてしまう私は日本語力が乏しr(ry
153デフォルトの名無しさん:2005/11/15(火) 02:15:58
>>152
ページ番号が0のとき、 1〜10までを表示
ページ番号が1のとき、11〜20までを表示
・・・
ページ番号が$nのとき、($n*10+1)〜(($n+1)*10)までを表示
って作ればいい。
154デフォルトの名無しさん:2005/11/15(火) 02:59:43
HTML::Pager つうモジュールがあるな。つこたことないけど。
155デフォルトの名無しさん:2005/11/15(火) 06:05:47
>>152
CGIと一言も言ってないけどCGIでしょ?
続けるならWebProg行きなよ
156134:2005/11/15(火) 06:58:28
>>152
出来ました!物凄く感謝してます^−^
157134:2005/11/15(火) 06:59:37
>>152じゃなくて>>153さんです。
158デフォルトの名無しさん:2005/11/15(火) 09:53:43
>>157
おまい、いろいろ不自由なんだな・・・
ガンガレ
159デフォルトの名無しさん:2005/11/15(火) 14:15:26
>>130
レスありがとうございます。Sendmailの本は持っているのですが、よく分かりませんでした。
適切なスレを探しているのですが、よく分かりません。もしよければ、質問できそうなスレを教えて貰えませんか?
160デフォルトの名無しさん:2005/11/15(火) 15:07:14
>>159

くだらねえ質問はここに書き込め! Part 115
http://pc8.2ch.net/test/read.cgi/linux/1131686280/

くだらない質問はここに書き込め!44
http://pc8.2ch.net/test/read.cgi/unix/1128698100/
161デフォルトの名無しさん:2005/11/15(火) 16:15:01
>>159
いや、sendmail本はともかく RFCの確認含めて、基礎的な部分を自分で
調べられない程力不足であれば、人に聞くだけでは怪しいままなので
そういう他のサイトに被害が及びそうなことはやめてくれよ。
162デフォルトの名無しさん:2005/11/15(火) 16:24:56
ちょっと質問してなんとかなるレベルの人ではなさそうだから
まじめにじっくり勉強しろという方が親切だろうな...
163デフォルトの名無しさん:2005/11/15(火) 17:14:59
perlの勉強をしようと思っています。
AN HTTPDで鯖を立て、そこにプログラムを置いて実行するようにしたのですが、動きません。
一瞬読みに行ったような動作はするのですがすぐに終わり、何も変化しません。
詳しい先輩に聞いたら「perlがぶっこわれてんじゃね」といわれたため、入れなおしてみたりいろいろしてみましたが変化ありません。
なぜでしょうか?非常に困っているために解決方法を教えていただきたいのですが・・・
AN HTTPDのver 1.42n
Active Perlのver v5.8.7 built
AN HTTPDの設定 拡張子.pl,.cgi 実行プログラムC:\Perl\bin\perl.exe
よろしくお願いします。
164デフォルトの名無しさん:2005/11/15(火) 17:16:40
>>163
それ、Perl の質問じゃないんじゃないの?
165デフォルトの名無しさん:2005/11/15(火) 17:25:34
>>159
ここで検索しな。
http://find.2ch.net/
sendmail スレもいくつかある。

166デフォルトの名無しさん:2005/11/15(火) 17:35:23
>>164
すみませんでした。別のところいってきまつ
167デフォルトの名無しさん:2005/11/15(火) 19:57:07
myで宣言した変数って、いらなくなったらundefしたほうがいいの?
168デフォルトの名無しさん:2005/11/15(火) 20:10:17
>>167
> myで宣言した変数って、いらなくなったらundefしたほうがいいの?

時と場合による。
169デフォルトの名無しさん:2005/11/15(火) 20:17:29
``でsmbclientを呼び出してwin-unix間でファイル転送するスクリプト書いています。
smbclientが実行される度にコンソールに標準出力が出るのですが、これを表示しないようにすることは可能ですか?
170デフォルトの名無しさん:2005/11/15(火) 20:21:04
171デフォルトの名無しさん:2005/11/15(火) 21:44:12
use strice プラグマについて教えてほしいのですが、
これを指定すると、変数はすべて宣言しなければならないと
いう規制がつきますよね?
宣言とはmyを付けることなのでしょうか?
それにしては、いきなり
$a = "aaa";
とか書いても怒られないんですよね。
どういう解釈をすればいいのでしょうか?
172デフォルトの名無しさん:2005/11/15(火) 21:48:08
>>171
$a と $b だけは特別。 perldoc perlvar 参照。
173デフォルトの名無しさん:2005/11/15(火) 22:00:32
>>168
それもそうだね。ありがとう。
174デフォルトの名無しさん:2005/11/15(火) 22:14:23
>>167
my な変数はできるだけ内側のスコープで宣言しておいて、「要らなくなった時には見えなくなっている」というのがひとつの理想かと思う。
そういう話でなかったらごめん。
175デフォルトの名無しさん:2005/11/15(火) 22:33:56
>>168
> > myで宣言した変数って、いらなくなったらundefしたほうがいいの?
> 時と場合による。

っていうか、そういうことをするのは相当特殊な場合でしょう。
176デフォルトの名無しさん:2005/11/15(火) 22:35:21
myな変数をundefしたとして、その場でメモリって解放されたっけ?
もうPerl忘れたぞ。。
スコープを抜けた時にリファレンスカウンタ調べて解放して行くと記憶してるけど
177名無しさん:2005/11/15(火) 22:43:31
逆にlocalやourで宣言した変数って
決して解放されないって考えた方がよいの?
178デフォルトの名無しさん:2005/11/15(火) 22:47:15
>>177
シンボルテーブルにエントリは残るけど
アロケートしたメモリはundefすれば解放されるんじゃねーの
179デフォルトの名無しさん:2005/11/15(火) 22:48:55
>>177
いや、それもスコープ抜けたときだったと思う。

ちょっと見てみたけど手元の黒豹本では、
リファレウンスカウントがデクリメントされるのは、
When variables (named values) go out of scope,
とある。
この黒豹本、初版で古いけど、今は違うなんて事はないよね。
180デフォルトの名無しさん:2005/11/15(火) 22:49:01
「変数」を開放?
181デフォルトの名無しさん:2005/11/15(火) 23:00:28
{
 my $hoge = 'This is hoge.';
 …
}
# 今や$hogeは解放された。×
# 今や$hogeは消滅した。 ×
# 今や$hogeは逝ってしまった。 ○
182171:2005/11/15(火) 23:05:35
>>172
レスありがとうございます。
なんと、予想もしなかった言語使用にひっかかっていたんですね。
183デフォルトの名無しさん:2005/11/15(火) 23:07:30
>>181
それはプールに戻ったという意味だよね。
その昔、Cで拡張ラリブラリ書いた時に
DESTROYで強制的にメモリ解放させるのは書いた事があるが。
そうじゃなきゃプールに戻るんだったような。
184銀色:2005/11/15(火) 23:09:28
質問させてください。

テキストファイルの処理をしているのですが、
多少の加工をした後に重複した行を削除したいのです。
何かいい方法ありませんでしょうか?
185デフォルトの名無しさん:2005/11/15(火) 23:10:51
意味が分かりません
186銀色:2005/11/15(火) 23:17:44
すみません。
ただ単に重複した行を削除したいと言うことです。

$txt の中に \n で改行されています。

うん。相変わらず説明が下手です。ごめんなさい。
187デフォルトの名無しさん:2005/11/15(火) 23:23:18
適当に連想配列にぶち込んでは如何でしょうか
188デフォルトの名無しさん:2005/11/15(火) 23:35:38
結局解放されたメモリオブジェクトって
OSに返却されないまでも
Perlのプロセス内では再利用されているって
信じちゃっていいんでしょ?! 信じちゃうから。
189デフォルトの名無しさん:2005/11/15(火) 23:45:13
>>188
そういうこと言ってると「malloc() & free()」っていうタイトルで長大なスレッドが・・・
190デフォルトの名無しさん:2005/11/15(火) 23:50:51
>>186
調べる力も身に付けようね。

my %got;
foreach (split /^/, $txt) {
  print unless $got{$_}++;
}
191134:2005/11/16(水) 00:55:24
>>185さん
僕と>>184さんのどちらの方が意味不明ですか?

と、競ってみたりします。

ところで、みなさんはperlとcのどちらが使い勝手が良いと考えていますか?
192デフォルトの名無しさん:2005/11/16(水) 00:59:20
そういうくだらないことなんか気にせずどんどん書け。
それがスクリプトクォリティだろ。
193デフォルトの名無しさん:2005/11/16(水) 01:51:24
マジ良いスレ
194デフォルトの名無しさん:2005/11/16(水) 07:42:15
>>191
ちょうどPerlとCしか使わない(使えない)人間なんだけど
使い勝手って言ったらそりゃPerlでしょ。用途がぜんぜん違うから
比べるのは間違ってるけどね。
195デフォルトの名無しさん:2005/11/16(水) 08:52:52
>>149
ほー 興味深いなぁ。 今まで my と local 適当に使ってた(´・ェ・`)
この説明は、要はこういうことなのかな。

■local は、グローバルの同名(?)変数の内容を待避させ(スタック?)、再利用する。
スコープから外れると、使用していたのを破棄して、待避内容を復帰させる。

■my は、スコープ内で呼ばれると用意されるメモリ空間?
コンパイル時とは言っても、cのstaticとは違うんですよね? package内グローバルだと
staticっぽいですね。



ちょっとちがうかなぁ。
まとめると、大きい変数使ったりスピード求めるには、 my の方がいいのかな?
196デフォルトの名無しさん:2005/11/16(水) 09:08:26
すごい適当なまとめですね
197デフォルトの名無しさん:2005/11/16(水) 09:26:00
>>195
> 大きい変数使ったりスピード求めるには、 my の方がいいのかな?
つか、そもそも用途が全然違うだろ。馬鹿か?
198デフォルトの名無しさん:2005/11/16(水) 09:47:32
つか、>>195 全然ちがうんだが…。本読め。
199195:2005/11/16(水) 09:49:04
>>197
ファイル丸飲みして処理を完結する関数の場合あてはまるんじゃねーか? 馬鹿か?
200195:2005/11/16(水) 09:52:00
>>198 はい、もうちょっと本読むことにします
201デフォルトの名無しさん:2005/11/16(水) 10:24:57
>>199
全然当てはまんない。だから、そもそも用途が違うって。入門書読め。
202195:2005/11/16(水) 14:35:25
>>201 うるせーバカ
203デフォルトの名無しさん:2005/11/16(水) 15:06:02
localはグローバル変数の局所化の宣言。
そりゃ、スコープを抜ければ待避させたデータの再利用が可能だし、
入門書では他のサブルーチンからでも参照できるとか書いてるけど
意図的にそういうスクリプト書く奴の気が知れない。
基本はTMTOWTDIだが、一応正しい使い方はlocalでできてmyでできない宣言。
→型グロブやファイルハンドルの宣言、特殊変数の一時書き換えなど。

myはレキシカル変数の宣言。
スコープの外からリファレンスを使って参照することができるが、基本的にはスコープを抜けると消える。
外から参照されている場合もリファレンス自体が消えた時点で消える。
スコープの外に同名の変数が無く、リファレンス等も用いていないなら挙動は同じといって良い。
きっちり書いてるならundefする必要はないと思われ。
undefされた変数をそれ以降に利用する場合とかはその例外。

これでどう?
204デフォルトの名無しさん:2005/11/16(水) 15:10:09
ちなみに初心者がグローバル変数だと思っているのはmain::パッケージのパッケージ変数。
205デフォルトの名無しさん:2005/11/16(水) 16:44:44
今、入力ファイルが引数またはSTDINで処理しようとしています。

script.pl inputfile
script.pl < inputfile

# script
if ( $ARGV[0] eq "" ) {
$fh = *STDIN;
$f_flag = 0;
} else {
open IN, $IN;
$fh = *IN;
$f_flag = 1;
}

while(<$fh>){
処理
}

$f_flag = 1 なら閉じる

としているのですが
どちらもやりわすれたときの良い対処方法が見つかりません。
どのようにしたらいいでしょうか?
206デフォルトの名無しさん:2005/11/16(水) 17:17:37
> どちらもやりわすれたときの良い対処方法が見つかりません。

これが意味不明なのでなんとも回答のしようがないな。
「どちらもやりわすれた」って何?

それ以前の一般的な話として、

openはよく失敗するので戻り値見るべき

単に標準入力か引数のファイルを読みたいだけなら<>でもいいんじゃねーの?
207デフォルトの名無しさん:2005/11/16(水) 17:20:53
あとひとつ。コマンド引数の有無を調べるのは$ARGV[0] eq ''より
@ARGV == 0の方がいいと思う。
208デフォルトの名無しさん:2005/11/16(水) 17:31:22
確かに意味不明でした。修正します。
今、入力ファイルが引数またはSTDINで処理しようとしています。

使用法A:script.pl inputfile
使用法B:script.pl < inputfile

# script
if ( @ARGV[0] eq 0 ) {
$fh = *STDIN;
$f_flag = 0;
} else {
open IN, $ARGV[0] || die "I can't open";
$fh = *IN;
$f_flag = 1;
}

while(<$fh>){
処理
}
$f_flag = 1 なら閉じる

としているのですが
使用法Aも使わず使用法Bも使わなかった時の良い対処方法が見つかりません。
どのようにしたらいいでしょうか?

>単に標準入力か引数のファイルを読みたいだけなら<>でもいいんじゃねーの?
これは知りませんでした。
今、試しましたがやっぱり使用法AもBもしなかったときは
自動的にスクリプトが終了しないですよね?
どうしたらよいのでしょうか?
209デフォルトの名無しさん:2005/11/16(水) 17:49:55
つ 「使い方をどちらかに統一する」

使用法B:script.pl < inputfile
これって、inputfileがなければ入力待ちになるからなぁ。
どうしてもって言うなら、
一定時間入力が来なかった場合、timeoutさせるようにする。
210デフォルトの名無しさん:2005/11/16(水) 17:55:37
>>208
標準入力をredirectしてなければ端末がつながってるので
そういうものだな。それがredirectの結果つながったものか
どうかは起動されたプログラム側からはわからないので、
ある程度誤判定をするのを覚悟してファイルの種類で
区別するしかないんじゃないだろうか。-f STDINや
-c STDINあたり。

211デフォルトの名無しさん:2005/11/16(水) 18:00:14
>>208
入力を大文字化して表示するスクリプトの例。

#!/usr/local/bin/perl -w
my $input = shift @ARGV or die "Not enough arg.\n";
open IN, '<' . $input or die $!;
print uc while <IN>;
__END__

標準入力を使いたい場合は

script.pl -

のように - を指定。
212デフォルトの名無しさん:2005/11/16(水) 18:01:45
>>210
入力が端末かどうかテストすればええのでは? -t fileno(STDIN) あたり。
213デフォルトの名無しさん:2005/11/16(水) 18:06:47
cat で来たら分からんなぁ
214デフォルトの名無しさん:2005/11/16(水) 18:15:59
$hoge[0]=('a'=>5,'f'=>9,'k'=>8,'d'=>12);
$hoge[1]=('i'=>6,'c'=>2,'g'=>7);
$hoge[2]=('e'=>4,'l'=>3,'b'=>10,'h'=>11,'j'=>13);

上記のような配列@hoge(要素数100以上)があったとして
$hoge[20]〜$hoge[30]までを切り取って上位に詰める(unshift?)
する場合は、どうしたら良いのでしょうか?
現在は、下記のようにしていますが、もっとスマートな方法は
ありますか?

for($i=0,$j=0;$i<@hoge;$i++) {
 if($i>=20&&$i<=30) {
  foreach $key (keys %{$hoge[$i]}) {
   $tmp[$j]{$key} = $hoge[$i]{$key};
  }
  $j++;
 }
}
for($i=0;$i<@hoge;$i++,$j++) {
 if($i<20&&$i>30) {
  foreach $key (keys %{$hoge[$i]}) {
   $tmp[$j]{$key} = $hoge[$i]{$key};
  }
  $j++;
 }
}
215デフォルトの名無しさん:2005/11/16(水) 18:18:52
>>214
ちゃんと読んでないけど
splice()
216デフォルトの名無しさん:2005/11/16(水) 18:29:00
もうちょっと書こうか、相変わらず元のスクリプト読んでないけど、
splice(@hoge, 20, 10);
じゃなかったかな。間違ってたらすまん。

217214:2005/11/16(水) 18:44:45
>>215-216
spliceは、配列に場所を指定して配列を追加したりする時に
使いますよね?でも、この場合は、$hoge[20]〜$hoge[30]まで
を上位に"Copy"では無く"Move"させたいのです。
その場合に元の位置にあったデータは消したいのですが…。
どうすれば良いのでしょうか?
218デフォルトの名無しさん:2005/11/16(水) 18:50:54
>>214
「上位」って何?

俺用語を使わないで、正しい言葉と、分かりやすいサンプルを。
219デフォルトの名無しさん:2005/11/16(水) 18:52:35
>>217
とりあえずマニュアル読もうや。
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_splice_ARRAY_OFFSET_LENGTH_LIST

my @array = (0..40);
unshift @array, splice @array, 20, 10;
print join ',', @array;
220212:2005/11/16(水) 18:57:48
試しに書いてみた。 close するのめんどいので FileHandle 。

# script
use FileHandle;
{
my $fh = (@ARGV == 0) ? *STDIN : new FileHandle $ARGV[0];
die "Can't open" unless defined($fh);
die "Can't input from terminal" if -t fileno $fh;
while(<$fh>){
printf ">>> %s", $_;
}
undef $fh;
};
221デフォルトの名無しさん:2005/11/16(水) 19:05:36
>>217
ひょっとしてこういう事か?
$hoge[$from] から $hoge[$to] として、

@hoge = (0 .. 40);
$d = $to - $from; # 30 - 20
splice(@hoge, $d, $d); # splice(@hoge, 30 - 20, 10);

222221:2005/11/16(水) 19:14:49
ごめん間違えた。こうか。

@hoge = (0 .. 40);
$d = $to - $from; # 30 - 20
splice(@hoge, $from - $d, $d); # splice(@hoge, 20 - (30 - 20), 10);
223デフォルトの名無しさん:2005/11/16(水) 19:16:44
>>221-222
もちつけ、splice(@hoge, $from, $d); # splice(@hoge, 20, 30 - 20); じゃないか?
# これじゃ削除だけだけど

>>214
質問の件はspliceで出来るだろうからちょっとツッコミを。

Perlでの擬似多次元配列は無名配列/無名ハッシュを用いて実現されている。
http://www.kt.rim.or.jp/~kbk/perl5.005/perlref.html
> $hoge[0]=('a'=>5,'f'=>9,'k'=>8,'d'=>12);
これは正しくはこう書く
$hoge[0]={'a'=>5,'f'=>9,'k'=>8,'d'=>12};

で、これを読めば分かるように$hoge[$i]の中身はリファレンスなので、
  foreach $key (keys %{$hoge[$i]}) {
   $tmp[$j]{$key} = $hoge[$i]{$key};
  }
ここは、この場合必要としてるのは浅いコピーだから、
$tmp[$j]=$hoge[$i]とリファレンスをコピーしてやれば十分
224デフォルトの名無しさん:2005/11/16(水) 19:38:55
効率は悪いが、@hoge[0..30]=(@hoge[20..30],@hoge[0..19]); という手もあるね。
225デフォルトの名無しさん:2005/11/16(水) 19:41:24
>>219
ごめんなさいspliceの機能を勘違いしてました。

>>221-222
解答ありがとうございました。
unshift @array, splice @array, 20, 10;
で解決しました。

>>223
色々と為になるご掲示ありがとうございます。
勉強になります。浅いコピーは一発で代入できるんですね。
という事は深いコピー…例えば、#hoge[100][100]{$key}のような
構造の配列では$tmp[$j]=$hoge[$i]とできないという事ですか?
226デフォルトの名無しさん:2005/11/16(水) 19:48:13
>>225
> という事は深いコピー…例えば、#hoge[100][100]{$key}のような
> 構造の配列では$tmp[$j]=$hoge[$i]とできないという事ですか?

っていうか、それだと浅いコピーです。
227デフォルトの名無しさん:2005/11/16(水) 19:51:06
>>225
深いコピーというのは同じものを参照するのではなく、別の写像を作ることを言う。
今回のようにした場合、
$hoge = {'a' => 1};
$fuga = $hoge;
$fuga->{a}='2';
とコピーした先を書き換えると、$hoge->{a}も書き換わってしまう。

$hoge = {'a' => 1};
$fuga = {};
%$fuga = %$hoge;
$fuga->{a}='2';
という風に深いコピーをしてやれば、$hoge->{a}は変わらない。
が、別の領域を用意するということはメモリを余分に使うということであり
必要が無いならやるべきではないな。
228デフォルトの名無しさん:2005/11/16(水) 19:56:04
ディープコピーをするのだと、Cloneというモジュールがあるね。
229227:2005/11/16(水) 20:02:15
>>227
ああ、言い忘れたけれど
$hoge = {'a' => [1,2,3]};
みたいになると
%$fuga = %$hoge;
じゃ[1,2,3]の部分までは深いコピーは出来ないな。
そういう場合は>>228の言っているCloneモジュールを使うべきかな
230デフォルトの名無しさん:2005/11/16(水) 20:10:31
>>225
> という事は深いコピー…例えば、#hoge[100][100]{$key}のような
> 構造の配列では$tmp[$j]=$hoge[$i]とできないという事ですか?
やりたいことにもよるけど、浅いコピーが出来ないのかと訊かれれば、出来ると答える
231デフォルトの名無しさん:2005/11/16(水) 20:18:42
spliceって何て読むの?
スプライス?
いつも口に出す時こまる。
232デフォルトの名無しさん:2005/11/16(水) 20:21:51
>>231
辞書開いて発音記号見れば分かるんだけどな。
http://dictionary.goo.ne.jp/voice/s/02071393.wav
233221:2005/11/16(水) 20:21:53
>>231
それ以外にどんな読み方が、、
234デフォルトの名無しさん:2005/11/16(水) 20:26:43
スプリス
235デフォルトの名無しさん:2005/11/16(水) 20:30:13
>>234
当たり!
236デフォルトの名無しさん:2005/11/16(水) 20:57:12
@hoge=(0,0, ... ,0)とx個0の入った配列を作りたいです。
for文使うのが普通ですか?
237デフォルトの名無しさん:2005/11/16(水) 21:10:45
>>236
演算子のxを使う
@hoge = (0) x 100;
238デフォルトの名無しさん:2005/11/16(水) 21:16:43
>>237
できた!(・∀・)
ありがd
239デフォルトの名無しさん:2005/11/16(水) 21:52:30
配列の要素がすべて1なら真を、そうでなければ偽を返したいです。
for文を使うのが普通でしょうか?
(例)@hoge=(1,1,1,1,1,1)なら真、@huga=(1,0,1,1,1)なら偽
240デフォルトの名無しさん:2005/11/16(水) 21:57:59
sub subete_ichi {
 return scalar(grep($_ != 1, @_)) == 0 ? 0 : 1;
}
241デフォルトの名無しさん:2005/11/16(水) 22:02:59
ごめん逆だった

sub subete_ichi {
 return scalar(grep($_ != 1, @_)) == 0 ? 1 : 0;
}
242デフォルトの名無しさん:2005/11/16(水) 22:09:16
>>239-241
全部調べなくても一つ違えばそこで調べ終わっていい。

sub check { $_ == 1 || return for @_ }
243242:2005/11/16(水) 22:10:19
あー。
sub check { $_ == 1 || return for @_; 1 }
244デフォルトの名無しさん:2005/11/16(水) 22:20:34
一応言いたい事があったので言っとくと
無理に短い、トリッキーなコードを書こうとしないで
後にメンテする人の事も考えてあげて下さい(><)
245デフォルトの名無しさん:2005/11/16(水) 22:21:33
何を言ってるんだお前は
246デフォルトの名無しさん:2005/11/16(水) 22:26:39
これをトリッキーと言ってるような香具師にコードのメンテさせたくはない。
247デフォルトの名無しさん:2005/11/16(水) 22:27:20
if (@hoge==(1,,1)) みたいなわかりやすい書き方ないのかなぁ。
248デフォルトの名無しさん:2005/11/16(水) 22:30:57
これ以上構文糖を増やさんといてください
249銀色:2005/11/16(水) 22:31:04
>>190
適当なところにそのまんまその4行を追加してみたけどダメでした。

3分考えて

  open(FILE, ">$filename") or die;
  #print FILE $txt;
  my %got;
  foreach (split /^/, $txt) {
    print FILE unless $got{$_}++;
  }
  close(FILE);

こうしたらうまくできました。
調べる力の不足もそうですが、それ以前の理解度の不足が…
ちょっとずつ勉強していくのでその時はよろしくです。
250デフォルトの名無しさん:2005/11/16(水) 22:32:21
251デフォルトの名無しさん:2005/11/16(水) 22:36:35
>>246
お前一回WebProg板行ってみろ
252デフォルトの名無しさん:2005/11/16(水) 22:41:10
>>251
イヤだ。勘弁してくれ。
253デフォルトの名無しさん:2005/11/16(水) 22:45:15
>>250
おぉ!こんなのあったのね。
254250:2005/11/16(水) 23:09:26
自分で紹介しといて言うのもなんだけれど、ちゃんと見てみると面白いなこれ
all(@arr) == any(1,2,3,4)
で@arr[のすべて]が1,2,3,4[のどれか]なら、とかもできるのか
# 役に立ちそうだったからとりあえずブックマークしてあった
255デフォルトの名無しさん:2005/11/16(水) 23:15:40
むしろ、メンテのことやトリッキーなコードを気に
するような奴がPerlを使うなと言いたい
そういう人はPythonとJavaを使いなさい
256デフォルトの名無しさん:2005/11/16(水) 23:19:17
ていうか全然トリッキーじゃないから、この場合。
257169:2005/11/16(水) 23:28:36
>170
返事遅くなりましたが、`smbclient 2>&1`で解決しました。
ありがとうございました。
258デフォルトの名無しさん:2005/11/16(水) 23:58:53
>>239
> 配列の要素がすべて1なら真を、そうでなければ偽を返したいです。
> for文を使うのが普通でしょうか?
> (例)@hoge=(1,1,1,1,1,1)なら真、@huga=(1,0,1,1,1)なら偽

List::MoreUtilsに。
259デフォルトの名無しさん:2005/11/17(木) 00:04:32
>>258
all { $_ == 1 } @hoge;

か。
260デフォルトの名無しさん:2005/11/17(木) 00:48:51
perlマスターになるにはラクダ本を通し読みせにゃ
ならんのですかね。今はリファレンスに使っていますが。
全部読んだって人います?
261デフォルトの名無しさん:2005/11/17(木) 00:56:24
あれ読んでもマスター出来ない
とにかく人の書いたソースを読みまくること
262デフォルトの名無しさん:2005/11/17(木) 01:01:51
>>260
全部読んで Perl マスターになったひともいるだろうが、
全部読まずとも Perl マスターになったひとも大勢いるだろう。
263デフォルトの名無しさん:2005/11/17(木) 01:21:53
赤ラクダは全部読んだ。本が壊れるまで。
264デフォルトの名無しさん:2005/11/17(木) 01:23:15
>>239
> 配列の要素がすべて1なら真を、そうでなければ偽を返したいです。
> for文を使うのが普通でしょうか?
> (例)@hoge=(1,1,1,1,1,1)なら真、@huga=(1,0,1,1,1)なら偽

eval(join('==1 && ', @hoge).'==1')? return "1": return "0";
265デフォルトの名無しさん:2005/11/17(木) 01:32:13
ぼくはさんこうえんざんしがとおってもだいきらいです
266デフォルトの名無しさん:2005/11/17(木) 01:37:57
>>264
なんというか・・・突っ込みどころ満載だな・・・
267デフォルトの名無しさん:2005/11/17(木) 01:54:56
わざとじゃなかったら、すごいな。

!index(join('', @hoge), 0);
268デフォルトの名無しさん:2005/11/17(木) 01:56:09
>>244 の気にすべきはこういうコードだ、っていう見本でしょう。
269デフォルトの名無しさん:2005/11/17(木) 02:03:37
>>267
志村ー-1、-1

$tmp+=$_ foreach @hoge; return $tmp==@hoge
270デフォルトの名無しさん:2005/11/17(木) 02:05:15
お、久々に良く伸びてるな。
271デフォルトの名無しさん:2005/11/17(木) 05:10:06
s/置換したい文字列/条件式1つめ ? 条件にあってたら: あってなかったら; それをさらに条件式にかけて ? 条件にあってたら: あってなかったら/e

みたいなことをしたいんですけど、どう表現すればいいですか?
(上の文ではうまくいかないみたいです。)
272デフォルトの名無しさん:2005/11/17(木) 05:42:57
>>271
三項演算子の使い方を調べたらいい
273デフォルトの名無しさん:2005/11/17(木) 05:43:03
>>271
漏れの解釈どおりなら、それでちゃんと動く。
こういうことだと解釈したけれど、違うならもっと具体的に説明を
my $hoge = 'xxx#a#xxx#b#xxx';
$hoge =~ s{#(.*?)#}
{
my $tmp = $1 eq 'a' ? 'hoge' : 'fuga';
$tmp =~ /ho/ ? 'foo' : 'bar'
}eg;
print $hoge;
274デフォルトの名無しさん:2005/11/17(木) 11:50:18
>>203
分かりやすい。ありがとう。
外から参照されてないと消えるってのは知らなかった。
にしてもよく伸びるスレだな。。。
275203:2005/11/17(木) 19:48:58
>>274
いや、消えてくれないとmyの意味ないから。

俺もずっと放置されていて寂しかったよ・・・
レスしてくれて報われた気がする。サンクス
276デフォルトの名無しさん:2005/11/17(木) 20:01:23
rubyでいうところの
% ruby -e 'print [1,2,3,4,5].reverse[0..2], "\n"'
をやりたいのですが、
% perl -e 'print reverse(1,2,3,4,5)[0..2], "\n"'
で怒られてしまいます。

何かナイスな書き方ってありますか?
277デフォルトの名無しさん:2005/11/17(木) 20:10:22
>>276
% perl -e 'print +(reverse(1,2,3,4,5))[0..2], "\n"'
278デフォルトの名無しさん:2005/11/17(木) 20:45:58
このスレ回答早杉ww何人常駐してるんだよw
279デフォルトの名無しさん:2005/11/17(木) 20:46:53
>>278
早い回答に多人数は必要ない。
280デフォルトの名無しさん:2005/11/17(木) 21:14:48
大きなファイルを 1 行ずつ読み込んで処理をしているのですが、
結構時間がかかるので "." をポチポチと画面に表示していこうと
考えました。
とりあえず 500 件毎に "." を出力して、50 個出力したら改行するように
したつもりなのですが、1 つずつ "." が出力されず、
50 個いっぺんに "." が表示されてしまいます。

多分初歩的なことだと思うのですが、助言いただけませんでしょうか。

ソースはこんな感じです。
------------------------------------
#!/usr/bin/perl
$counter = 0;
while (<>) {
  $counter++;
  if ($counter % 5000 == 0) {
    if ($counter % 250000 == 0) {
      print "\n";
    }
    else {
      print ".";
    }
  }
}
------------------------------------
281デフォルトの名無しさん:2005/11/17(木) 21:15:09
教えてほしいです。
if($x = $y)
みたいな、代入式で真偽を判断するケースって
C言語みたいに最終的な$xの値(まぁどっちでもいいか)が
真偽の値になるという考え方でいいのでしょうか。
どうも素直にそう考えていいものか。
配列へリストの代入とかだとどうなるんでしょうか・・・。
if(@m = sort @n)とかは、スカラーコンテキストとして
配列の要素数で真偽を決めるってことでいいのですか?
282デフォルトの名無しさん:2005/11/17(木) 21:22:42
283デフォルトの名無しさん:2005/11/17(木) 21:31:21
>>280
俺はその手の出力は STDERR に出すようにしてるよ。
STDERR ならデフォルトでバッファリングしないので。
284デフォルトの名無しさん:2005/11/17(木) 21:34:06
>>283
エラーじゃない物を標準エラー出力に吐いてるって事?
それはどうかと思うが…
285280:2005/11/17(木) 21:37:33
>>282, 283
即答ありがとうございます。
助かりました!
286デフォルトの名無しさん:2005/11/17(木) 21:41:46
>>284
別に、エラーじゃなきゃ STDERR に出しちゃダメなんて決まりはないし。
ていうか、本来の出力ではない、ヘルプメッセージやプログレスバーなどを、
STDERR に出すプログラムなんてほかにも世の中にはたくさんあるよ。
287デフォルトの名無しさん:2005/11/17(木) 21:46:53
>>286
それもそうか
よく考えたら、この場合エラー出力に吐いて置いた方が返って都合が良いな
288デフォルトの名無しさん:2005/11/17(木) 22:00:12
こういうのは stderr の方がいいね。
stdout への出力は、リダイレクトして使用したりもするし、
こういうのを混ぜると汎用性が下がるしね。
289281:2005/11/17(木) 22:05:33
>>282
レスありがとうございます。やってみます〜
290デフォルトの名無しさん:2005/11/17(木) 22:32:09
>>283
> >>280
> 俺はその手の出力は STDERR に出すようにしてるよ。
> STDERR ならデフォルトでバッファリングしないので。

ファイル転送などの100%のうちの進行具合を計るプログレスメーターは
STDERRに出せば良いが、この手のプログレスメーターは、トータル数を
見るために使うこともあるし、途中に重要な情報を混ぜこむこともある。
"...."ごとファイルに書き込むこともある。

291デフォルトの名無しさん:2005/11/17(木) 22:36:26
>>290
ごめん、言いたいことがわからん。
292デフォルトの名無しさん:2005/11/17(木) 22:54:19
>280
どうでも良いが自分だったら
print SRDERR "." unless $. % 500;
print SRDERR "\n" unless $. % 250000;
と書く。
293デフォルトの名無しさん:2005/11/18(金) 00:26:12
〜 unless $. % ほげ はぱっと見わかりにくいので 〜 if $. % ほげ == 0 の方が好みだな。
294デフォルトの名無しさん:2005/11/18(金) 03:09:25
俺もunless使わない派なんだけどこれってマズいことあるのかな?
295デフォルトの名無しさん:2005/11/18(金) 03:18:06
>>294
ない
296デフォルトの名無しさん:2005/11/18(金) 03:28:57
標準「エラー」出力なんだから、エラーを吐くだけの方が妥当だろう。

-t で端末かどうか調べてプログレスメータを表示するべきかどうか
判断させるのが良いかと。

……なんて固い事考えないで、目的を達成できるように書けばいいか。
その方が Perl 使いらしい。
297276:2005/11/18(金) 09:10:43
>>277
ありがとーございましたー
298デフォルトの名無しさん:2005/11/18(金) 11:16:31
sortして、100個目の内容を取り出したい時に、
一旦何かの配列に入れないでやるにはどうすればいいですか?
299デフォルトの名無しさん:2005/11/18(金) 11:32:22
300デフォルトの名無しさん:2005/11/18(金) 11:40:11
おお、でけたでけた
何、+て
演算子? 関数?
301デフォルトの名無しさん:2005/11/18(金) 12:00:30
>>300
マニュアルを読めば分かることを聞かない。
302デフォルトの名無しさん:2005/11/18(金) 12:45:40
修辞疑問にまで答えようとしなくていいから
303277:2005/11/18(金) 12:58:29
>>301
言えない…回答時にリファレンスへのリンクを貼ろうと探したけれど見つけられなかったなんて言えない…
perlopの中にあったのね。perlsynとかを探してた( ´д`;)
304デフォルトの名無しさん:2005/11/18(金) 16:47:22
Perlモジュールがインストールされてるかされてないかで処理を分けたいんですが

if(もじゅーるあった){}
else{}

↑こんな感じで
なんかいい方法ないでしょうか?
305デフォルトの名無しさん:2005/11/18(金) 16:54:16
>>304
eval
306304:2005/11/18(金) 17:04:37
>>305
回答ありがとうございます。
具体的にはどのようにすれば良いのでしょうか?
自分で色々やってみたのですが、
Can't locate云々とエラーメッセージが出て強制終了されてしまいます
307デフォルトの名無しさん:2005/11/18(金) 17:10:06
>>306
BEGIN {
 eval "use Hoge"; # try
 if ($@) { # catch
  # モジュールが無かった
 } else {
  # モジュールがあった
 }
}
308304:2005/11/18(金) 17:15:17
>>307
ありがとうございます。
解決しました
309デフォルトの名無しさん:2005/11/19(土) 07:46:33
風が止んだ…
310デフォルトの名無しさん:2005/11/19(土) 10:17:04
演算子%について質問です。

%は小数点をどのように処理しているのでしょうか?

5 % 2.99 が 1

5.99 % 2.55 が 1

5.99 % 2 が 1

これって、全て

5 % 2

ということでいいのでしょうか?

よろしくお願いします。
311デフォルトの名無しさん:2005/11/19(土) 10:35:05
>>310
http://perldoc.jp/docs/perl/5.6.1/perlop.pod
Multiplicative Operators の項参照。
312デフォルトの名無しさん:2005/11/19(土) 11:18:31
PurePerlなgzip扱えるモジュールないかな
313デフォルトの名無しさん:2005/11/19(土) 11:45:49
>>312
Compress::Zlib 相当の機能を Pure Perl で実装しているモジュール
という意味なら寡聞にして知らないが、Compress::Zlib や gzip(1) の
Pure Perl なラッパーなら CPAN に色々ある。

Perlモジュールについて
http://pc8.2ch.net/test/read.cgi/php/997829243/
314310:2005/11/19(土) 12:22:15
>>311
該当項を読みましたが、仮定が$a,$bの「整数」となっていて、未だ疑問が
解決いたしません。

詳しい説明をよろしくお願いします。
315310:2005/11/19(土) 13:08:33
http://www.webbasedprogramming.com/Teach-Yourself-Perl-5-in-21-Days/ch4.htm#TheRemainderOperator
を読んで自己解決しました。

お騒がせしてすみませんでした。
316デフォルトの名無しさん:2005/11/19(土) 14:13:35
ここで検証するスクリプトを書ける奴だけが勝ちあがってるんだよな。
317311:2005/11/19(土) 14:19:36
>>314-315
Perl は弱い型の言語なんだから、整数値が期待されるところに
置かれた値は整数値として評価されるし、文字列が期待される
ところに置かれた値は文字列として評価される。

my $chr = ('a'..'z')[ rand 26 ]; # int 不要
"+1.0e2cm" == 100 ? 'eq' : 'ne'; # eq

だからマニュアルに「整数」と書かれているなら、それは仮定では
なくて両オペランドを整数値として評価した上で、という意味になる。
318デフォルトの名無しさん:2005/11/19(土) 14:50:36
>>316
勝ちあがるって…。使えない奴が淘汰されるのは自然の摂理なんじゃないの。
319デフォルトの名無しさん:2005/11/19(土) 15:16:58
どっかのコーディング規約で$_は汚染されている可能性があるから
foreach my $var (@array) {
のように明示して使うというのを見た気がするのですが
みなさんの場合、使い勝手と厳格さを天秤にかけてどっちを選びますか?
自分は$_でも問題ないと思うのですが再帰的なプログラムではまったような記憶もあります。
それとPerlにはpearのコーディング規約みたいなものは無いのでしょうか。
320デフォルトの名無しさん:2005/11/19(土) 16:05:50
>>319
http://www.kt.rim.or.jp/~kbk/perl5.005/perlstyle.html
http://www.kt.rim.or.jp/~kbk/perl5.005/perlsec.html

汚染の可能性は外部から入力された全ての値に潜んで
いるのだから、$_ だけを特別扱いするのはナンセンス。

> 使い勝手と厳格さを天秤にかけてどっちを選びますか?
ケースバイケース。個人的なポリシーでどちらかに揃えると
いうのは自由にしてくれて構わないが、万能解は存在しない。

駱駝本の24章「Perlの常識」(2nd なら8章の2 〜 4)を読む事
をお勧めする。
321デフォルトの名無しさん:2005/11/19(土) 16:22:33
$_ は遅いって聞いたが
322デフォルトの名無しさん:2005/11/19(土) 16:51:03
日本語のテキストを、例えばこのようにフォーマットできるモジュールは
ありませんか?

http://www.watersprings.org/pub/id/draft-dasilva-l2tp-relaysvc-02.txt

とりあえず、タイトルをセンタリングして、章番号、ヘッダ、フッタが
出せればいいのですが。
Text 関係のモジュールをCPAN で調べようとしたのですが、
あまりにもモジュールが沢山ありすぎて滅入ってしまいました。
323デフォルトの名無しさん:2005/11/19(土) 17:24:07
>>322
「メンドいから代わりに探して」と臆面も無く言われてもな。
探すのがイヤなら use encoding して format でシコシコ書けば
いいんじゃね?
http://search.cpan.org/~nwclark/perl-5.8.7/pod/perlform.pod
324デフォルトの名無しさん:2005/11/19(土) 18:17:34
>>318
それは当然として、使えないのに生き残ってる奴は
この程度なら自分で検証くらいできるんじゃないかなと。
325デフォルトの名無しさん:2005/11/19(土) 18:17:48
俺ならnroffに(半手動で)変換するscript書いてrfc2223通りに出力するが。
326デフォルトの名無しさん:2005/11/19(土) 18:55:23
Perlウィザードはforeachもforと書くのれすか?
327デフォルトの名無しさん:2005/11/19(土) 19:08:51
ハードゲイフォー
328323:2005/11/19(土) 19:23:48
>>325
なるほど。例のファイルはRFC2223の規格に定められているものであり、
nroffを使って出力するものなのですね。このようなファイルを時々見かけ
ていたのですが知りませんでした。ありがとうございました。
329デフォルトの名無しさん:2005/11/19(土) 19:29:01
>>326
Perl では foreach と for はシノニム。

foreach (my $i = 0; $i < 5; ++$i) { print "$i\n" } # "for" ループ
for (0..4) { print "$_\n" } # "foreach" ループ

但し "foreach" 修飾子は存在するが "for" 修飾子は存在しない。

print "$_\n" for 0..4; # "foreach" 修飾子。OK。
print "$i\n" foreach ($i = 0; $i < 5; ++$i); # "for" 修飾子は存在しない。エラー。

Perl で for ループが必要な場面というのは少ないのと、
for なのか foreach なのかは見た目ですぐ分かるのとで、
略して書いても大して問題にならない。律儀に foreach
と書くかどうかは好みの問題。
330デフォルトの名無しさん:2005/11/19(土) 19:49:01
for, foreach どちらも同じと言われても
for は、for (my $i=0; $i<10; $i++) {} の使い方しかしないし、
foreach は、foreach (@array) {} の使い方しかしないなぁ。

331デフォルトの名無しさん:2005/11/19(土) 20:13:54
漏れはforもforeachと書くよ。foreach一神教派だし。
foreach (my $i = 0; $i < 10; $i++) {
  print "$i\n";
}
332デフォルトの名無しさん:2005/11/19(土) 20:28:38
>>317
関係無い者だけど勉強になりました。dクス
333デフォルトの名無しさん:2005/11/19(土) 20:38:33
じゃあ,俺はfor一神教派だ.
対立しようぜ.
334326:2005/11/19(土) 20:44:21
レスありがとうございます。
それなら自分はforでいこうと思います。
そもそもPerl使いはタイピングをいやがるという話だし
言語もそのような思想でつくられてるそうなので。
335デフォルトの名無しさん:2005/11/19(土) 20:46:03
forかforeachかって話よくみかけるけど
bshかcshか?みたいな話でけっこう笑える
そもそもfor,foreachってどこから借りてきたんだろね
fortranはDOが基本だしCとcshあたりなのかな?
336デフォルトの名無しさん:2005/11/19(土) 21:09:14
>335
「けっこう笑える」と言っているが、どこで笑えるのかよくわからないので、笑いどころを教えてくれ。
だいたい、bshとcshは違うものだが、for と foreach は同じだ。
337デフォルトの名無しさん:2005/11/19(土) 21:10:32
>>334
タイピングを嫌がる*のも*有り、かな。Perl は自然言語的な
表現の幅を持てるようデザインされているので、厳格な文体
で記してもいいし、くだけた言い回しも受け付けてくれる。

>>335
赤リャマを読んだ限りでは、多分それで正解。>借用元
338デフォルトの名無しさん:2005/11/19(土) 21:11:27
教えてください。
あるテキストファイルにときおり存在する1行以上の連続する空行を
<p>
の1行に圧縮するプログラムを書いているのですが、

open MYFILE, "???.txt";
undef $/;
$text = <MYFILE>;
$text =~ s/^\s*$/<p>/mg;
print $text;

これを実行すると、1行のみの空行は<p>に圧縮されますが
2行以上の連続する空行は<p><p>と圧縮されます。
正規表現の行を
$text =~ s/^\s*$/<p>/m for 1..10;
とかにすると意図した通りになります。
(もちろんこれだと10個までですが)

なぜこのような結果になるのでしょうか?
339デフォルトの名無しさん:2005/11/19(土) 21:18:20
>>336
Bシェルの for..in 構文も、Cシェルのforeachも
だいたい似たり寄ったりじゃない。
そんなところがさ、君もそう思わないかい?
シェルの話じゃないけど。
340デフォルトの名無しさん:2005/11/19(土) 21:19:50
>>338
pタグは閉じタグが必要なので、HTMLとして使い方が間違ってます。
341デフォルトの名無しさん:2005/11/19(土) 21:27:42
>>329ってどういうこと?
342デフォルトの名無しさん:2005/11/19(土) 21:36:15
>>341
for, foreachは基本的に一緒。
ただし、後置できるのは foreach タイプのみ (for と書いた場合も)。
for (; ;) のタイプは後置できないよってこと。

>>329 は、わざと互い違いに書いてるみたいだけどちょっと分かりにくいね。
343デフォルトの名無しさん:2005/11/19(土) 21:40:05
>>338
$text = "0\n1\n\n2\n\n\n3\n\n\n\n*";
while($text =~ m/^\s*$/mg) {
print join(':',length($'),length($&)),"\n";
}

こういう事らしい。
空行が1個の場合は0文字幅の一致が1回。
複数の場合は、n文字幅の一致と0文字幅の一致で2回マッチ。
344デフォルトの名無しさん:2005/11/19(土) 21:42:49
後置きfor(foreachでも)ってループ変数指定できないのが
なんかかゆいところだよね。
1ラインであんまり複雑なことすんな、って事なのかもしれんが。
Perl6では変わるのだろうか?
345デフォルトの名無しさん:2005/11/19(土) 21:56:13
>>343
その出力分かり辛いよ(笑)。

my $text = "0\n1\n\n2\n\n\n3\n\n\n\n*";
while ($text =~ /^\s*$/gm) {
  tr/\n/./ for my($pre, $match, $post) = ($`, $&, $');
  print "$pre($match)$post\n";
}

$ は*行末の直前*にマッチするというのが原因だね。
346デフォルトの名無しさん:2005/11/19(土) 22:03:34
$text =~ s/(\s)*/<br>/mg;
>>340の言うとおりpではなく、せめてbrだな。
347338:2005/11/19(土) 22:19:16
回答ありがとうございます。
ちなみに今はHTMLの文法はおいておいてください。

グローバル置換は順番に1つ1つ置換していくのとは
違うということでしょうかね。
$text =~ s/^\s*$/<p>/m for 1..10;
これだと違ってくるのはなぜなんでしょうね。
348デフォルトの名無しさん:2005/11/19(土) 22:24:15
>ちなみに今はHTMLの文法はおいておいてください。
これだからプログラマ(スクリプタ)の吐くHTMLは汚いっていわれるんだぞ・・・
349341:2005/11/19(土) 22:29:07
>>342
ありがとう
「for」を「3パート」って意味で使ったんだね
350デフォルトの名無しさん:2005/11/19(土) 22:29:36
いまどきは、HTMLをスクリプトに埋め込んだりしないで
テンプレートにしないか。デザイナに文句いわれないように。
351338:2005/11/19(土) 22:32:22
>>348
いやだから、目的は正規表現の学習であって
プログラムはそのために作ってるだけです。
もっといえばオライリーの「正規表現」から
サンプルコードをもってきているんです。
別に<p>だろうと<z>だろうと何でもいいのです。
352デフォルトの名無しさん:2005/11/19(土) 22:43:51
>>351
こいつ何開きなおってんの?
そもそもタグいじるならWebprogだろ。
目的もなく置換したいなら正規表現道場いけよ。
353338:2005/11/19(土) 22:48:11
>>352
は?
正規表現の本読んでいて、そこにあるサンプルプログラムを
そのまま実行してみたり、少し変えたらどういう結果になるかとか
そういう学習をしてるのがそんなにおかしいですか?
実際にサンプルプログラムをそのまま持ってきてるんで自分が
作ったプログラムでもないし。
しかも本に書かれている結果とは違った結果になったわけで、
十分研究の意味があるということになるじゃないですか。
開き直るもなにも、開き直る必要もないですが?
354デフォルトの名無しさん:2005/11/19(土) 22:51:35
>>352
(゚Д゚)ポカーン

<>を見るとHTMLだと思い込む香具師多いのか?
>>338はHTMLとは一言も言ってないなと思いつつ読んでた訳だが
独自構文か何かかと
355デフォルトの名無しさん:2005/11/19(土) 22:53:33
SGMLベースのHTML4.01までは、連続するp要素の終了タグは省略可だった希ガス。
356デフォルトの名無しさん:2005/11/19(土) 22:58:04
357デフォルトの名無しさん:2005/11/19(土) 22:58:32
>>355
だな。ついでに2.0だったか1.0だったかまではbr同様単独で段落の区切りに書く物だったと聞く
まあそれこそ板違いだから程々に
358デフォルトの名無しさん:2005/11/19(土) 23:00:48
>>356
HTMLの文法は置いておいてくれって言ってんじゃねぇか
それでもまだHTMLの話をする馬鹿の神経がしれねぇ
359デフォルトの名無しさん:2005/11/19(土) 23:01:33
なんにせよ質問者の態度が悪すぎるなw
360デフォルトの名無しさん:2005/11/19(土) 23:06:51
お前の目はかざりか?w
361デフォルトの名無しさん:2005/11/19(土) 23:08:57
最近ム板殺伐としすぎだよね
362デフォルトの名無しさん:2005/11/19(土) 23:09:20
356は'独自構文'に対するレスだと思うのだが…
どちらにしろ、この手の質問は、
後出しで違う文字に置換する質問を出してくる希ガス。
363デフォルトの名無しさん:2005/11/19(土) 23:24:14
# ここからまったり
364デフォルトの名無しさん:2005/11/19(土) 23:26:17
もっと殺伐を!!
365デフォルトの名無しさん:2005/11/19(土) 23:29:27
どうでもいいけど
「は?」
と書かれると癇に障るよね
366デフォルトの名無しさん:2005/11/19(土) 23:31:36
このスレでHTMLの文法は置いておいてくれという
質問者のコメントは至極まっとうじゃないのか?
なんなんだこのスレ違いの回答は。。。やれやれ
回答者マズすぎ
367デフォルトの名無しさん:2005/11/19(土) 23:33:17
それ以前にその相手の言いがかりのほうが癇に障ると思ふ。
こいつ呼ばわりとか。それも結局自分のはやとちりが原因。
「は?」は、よく我慢した方だろ。
俺ならアホかてめぇくらいは言いたくなるな。
368デフォルトの名無しさん:2005/11/19(土) 23:34:46
普通、質問者ってのは、もっと腰を低くあるべきものだと思うがw
369デフォルトの名無しさん:2005/11/19(土) 23:37:45
おまいらもちつけ
sleep(60);
370デフォルトの名無しさん:2005/11/19(土) 23:38:15
>>368
は?
371デフォルトの名無しさん:2005/11/19(土) 23:39:03
低かったと思うよ。
ただ>>352のようなバカには別に腰低くする必要ないじゃん。
質問者もそいつだけには答えて欲しくなかっただろうしww
372デフォルトの名無しさん:2005/11/19(土) 23:40:15
煽りに一々反応してるようじゃまだまだ青いね
373デフォルトの名無しさん:2005/11/19(土) 23:41:31
煽りってことにしたいらしいwww
374酩酊 ◆TWARamEjuA :2005/11/19(土) 23:42:31 BE:1742382-###
質問を挙げる前に今一度精査してみるのもよろしいかと。
いろいろやってみたら解決しちゃった♪って云うことも少なからずかと。
375デフォルトの名無しさん:2005/11/19(土) 23:42:35
へ?なんか人違いしてない?
376デフォルトの名無しさん:2005/11/19(土) 23:47:39
>>374
カスコテはどっか行ってろ
377デフォルトの名無しさん:2005/11/19(土) 23:56:45
ふんにゃかふんにゃか
378343:2005/11/20(日) 00:16:28
>>345
自分でもそう思う。分り易い奴、乙。

>>347
$text =~ s/^\s*$/print(join ':',pos $text,length $`,length $&,length $',length $text,"\n"),'___<P>___'/mge;
print length $text,"\n";
379デフォルトの名無しさん:2005/11/20(日) 00:20:50
お前らPerl初心者でも分かるようなコード書けよ
380デフォルトの名無しさん:2005/11/20(日) 00:49:11
Perl6ってどうなってるんですか?
381デフォルトの名無しさん:2005/11/20(日) 01:25:57
>>345
しまった。まじで分からん。俺にも教えてくれ。

>>347 が言ってるのは
while ($text =~ s/^¥s*$/<br>/m) {}

while ($text =~ s/^¥s*$/<br>/mg) {}
で結果が異なる事なんだよね。

gオプションの時は
/^¥s*$/ の他に、置換後の /^$/ にも反応してるってこと?

382デフォルトの名無しさん:2005/11/20(日) 01:39:59
Perl の蟲じゃないかな。
どう考えても、gオプションの動作がおかしい。

$text1 = $text2 = "abc\n\n\n\n\n\ndef";
$text1 =~ s/^\s*$/K/gm;
while( $text2 =~ s/^\s*$/K/m ){}
print "\$text1:$text1\n\$text2:$text2\n";

$text1:abc
KK
def
$text2:abc
K
def
383デフォルトの名無しさん:2005/11/20(日) 04:28:46
cronでperlスクリプトを定期的に起動して、あるサーバが正常に機能しているかチェックしたいのですが、 
HTTPサーバに接続して、ページを取得した際に、正常に取得されたかどうかはどのようにしたら分かるのでしょうか? 
384デフォルトの名無しさん:2005/11/20(日) 05:01:47
http://pc8.2ch.net/test/read.cgi/tech/1037383722/420-421

答えが出てると思うんだが
385デフォルトの名無しさん:2005/11/20(日) 05:23:29
foreach (@hoge){
 foreach my $x (@huga){
  〜

と、

foreach my $x (@hoge){
 foreach (@huga){
  〜

はどっちがいい?
386デフォルトの名無しさん:2005/11/20(日) 05:37:33
>>385
好みの質問?
漏れはどちらかと言われれば後者だが、両方名前をつける事が多い
387デフォルトの名無しさん:2005/11/20(日) 05:39:33
>>385
入れこにするなら$_使わず、両方とも変数使うかな。
ぱっと見て訳わかんなくなるし。
388ヽ(´ー`)ノ ◆.ogCuANUcE :2005/11/20(日) 06:10:32
>>385
基本的に両方名前を付ける。
ループで $_ を使うとしたら、最も入れ子になったループが
一文で終わる時だけだな。

foreach my $x (@hoge) {
$_->do_operation() foreach @fuga;
}
389デフォルトの名無しさん:2005/11/20(日) 11:49:07
>>382
gオプションの場合は、1つマッチしては置換というような
ことをしてないような希ガス
マッチが余分にある気がするねぇ…
バグ報告?
390デフォルトの名無しさん:2005/11/20(日) 13:12:29
俺もforeachは必ず変数名つける。入れこじゃなくても。
使わないとすれば、>>388と似たような感じのとき。

例えば、
foreach(@file){ -T or return }
とかみたいに書きたいときだけ。

漏れは $_ って文字はタイプしないような構成にする。
391デフォルトの名無しさん:2005/11/20(日) 14:10:16
>>382 のバグ報告しておきました。
(下の文章を[email protected]に送りました。)
title: Perl Bug in s///mg
Dear Sirs,

I expected in the following script that $text1 and $text2 should
have a coincide result. However, $text1 has an excess 'K' which
is considered to be a bug.
My environment is Windows XP, ActivePerl 5.8.7.815.

---------------script-------------------------
$text1 = $text2 = "abc\n\n\n\n\n\ndef";
$text1 =~ s/^\s*$/K/gm;
while( $text2 =~ s/^\s*$/K/m ){}
print "\$text1:$text1\n\$text2:$text2\n";

---------------output-------------------------
$text1:abc
KK
def
$text2:abc
K
def
392デフォルトの名無しさん:2005/11/20(日) 14:16:54
これがバグと認められたとして、直したバージョンてすぐに
出るものなの?パッチだけとか?
393デフォルトの名無しさん:2005/11/20(日) 14:31:17
端からみてたんだけど面白そうなので
>>345氏のコードを実行してみたよ。
^\s*$ を仮に @ に置き換えるとして、gオプションをつけたとき

0.1.().2...3....*.
[email protected].(.).3....*.
[email protected].@().3....*. <-- 2\n@\n3となっているはずの部分に^\s*$がなぜかマッチ
[email protected].@@.3.(..).*.
[email protected].@@.3.@().*. <-- 3\n@\n*となっているはずの部分に^\s*$がなぜかマッチ

となるのがおかしい、と理解していいのかな?
(質問の説明のために実行結果に若干手を加えています)
394デフォルトの名無しさん:2005/11/20(日) 14:40:48
>>391
え? それ、正しい動作...

まず、s///gでは置換途中は対象変数が元の値を保持している。
確認例 perl -e "$_='AAA ';s/A/print/ge;print"

/gは、元の文字列でマッチが成立する場所を全て置換するという事。
m//g と s///g でマッチ個所は同一になる。

$の件(>>345)を別の表現にすると、先読みの肯定(/(?=\n)/)
単純な例

$_='a aa aaa aaaa aaaaa';
s/a*(?=a)/print "$`($&)$'\n"/ge;
print;

これは、直後が'a'である0文字以上の'a'を置換という指定。
print出力は345準拠。
395デフォルトの名無しさん:2005/11/20(日) 14:44:34
ここははやとちりなインターネッツですね。
396デフォルトの名無しさん:2005/11/20(日) 14:46:18
use re 'debug' ぐらいしようよ…。
397デフォルトの名無しさん:2005/11/20(日) 14:49:25
>>394
それって意図したとおりの動作なのかな。
単純に何度も置換するのと、グローバルで一括置換するのと
結果が違うのは、まずい気がするんだが。
398デフォルトの名無しさん:2005/11/20(日) 15:26:22
>>397
そうすると、394氏が言ってる
m//g と s///g のマッチ箇所が異なる結果になるので
それはそれでよくないと思うのだけどな…
399デフォルトの名無しさん:2005/11/20(日) 15:51:30
400デフォルトの名無しさん:2005/11/20(日) 16:41:14
>>398
というよりかは、m//gの動き自体からおかしいのでは?ということに。
401デフォルトの名無しさん:2005/11/20(日) 16:50:17
>>390
俺もforeachのときは付けるけどmapだと使わないときあるな。
402399:2005/11/20(日) 17:34:25
頭からまとめときますか。

>>338
> なぜこのような結果になるのでしょうか?

>>338 の前者は $text に対し s///g を一回だけ実行し、その処理過程で
複数の置換を行っている。後者は $text に対し s/// 自体を複数回実行し、
それぞれ一回ずつの置換を行っている。前者では二つ目以降のマッチ開始
位置が前回マッチの終了位置となるのに対し、後者では毎回文字列の先頭
にリセットされる為、結果も変わってくる。

>>356
ム板にもある。

正規表現 part2
http://pc8.2ch.net/test/read.cgi/tech/1131028296/

>>381 >>389
上の説明と >>399 参照。

>>393
>>394 で書かれているように、/g の処理中で逐次的に置換されるわけ
ではない。よって 2\n@\n3 ではなく2\n\n\n3 のまま。>>399 も参照。

>>397
違う事をしているのだから結果も違って当然。

(my $str = 'ababab') =~ s/ab/abc/g; # abcabcabc
# my $str = 'ababab';
# 1 while $str =~ s/ab/abc/; # 無限ループ!
403デフォルトの名無しさん:2005/11/20(日) 17:39:15
違うことをしているから結果が違うのはいいとして、
実装した人がそういう違いをだしたかったかは
わからんのでは。
404デフォルトの名無しさん:2005/11/20(日) 17:43:13
つまり動作自体は正しいので、バグではなく、どうしようもないって事だね
置換してるんだから検索開始位置がズレて当然
405デフォルトの名無しさん:2005/11/20(日) 17:51:06
改行にマッチしたいときは不用意に$を使うとどつぼに嵌るということですな
$text =~ s/^\s*\n/<p>\n/mg;
とするのが正解?
406399:2005/11/20(日) 18:08:44
>>402
s{(?<=後者では毎回文字列の先頭にリセットされる為、)}
{また、置換対象となる文字列自体が変化している為、}
の方が正確か。

>>403
「実装した人」とは? この perl(1) の振る舞いが「正しくない」と
思うなら porters@ にでも提案してみてね。

>>405
正解と言うか、一番素直な表現だと思う。
$ は改行にマッチするパターンでなくて改行直前にマッチする
0 文字幅のパターンだという事を押さえておけば OK。
407405:2005/11/20(日) 18:30:40
>>406
確かに正解という限定的な言い方はTMTOWTDIの考え方に反してましたね。
訂正 s/正解/安全で分かりやすい表現/

改行直前にマッチということを今まで知らなかった漏れは
ちょっと正規表現勉強しなおしてこよう・・・
408デフォルトの名無しさん:2005/11/20(日) 20:03:02
正規表現であるかどうか分からない部分を$1、$2…で使いたいときに
perl -w でUse of uninitialized value…
と怒られないようにするにはどうしたらいいのでしょうか…
409デフォルトの名無しさん:2005/11/20(日) 20:13:22
>>408
ちょっとそれじゃ説明不足。もう少し具体的に
410デフォルトの名無しさん:2005/11/20(日) 21:08:20
>>408
'def' =~ /(?:<(.*?)>)?(.*)/;
こんな感じのときかな。definedを調べれ
411408:2005/11/20(日) 21:18:30
>>409
すいません…
例えば

$test = "AB";

if ($test =~ /^([AB])?([AB])?([AB])?$/) {
if ($1 eq "A") { print "\$1 match:A \n"; }
if ($2 eq "A") { print "\$2 match:A \n"; }
if ($3 eq "A") { print "\$3 match:A \n"; }
}

みたいなのだと最後のifの文で警告が出てしまいますよね。
このような場合の対処法をよろしければ…

>>410
defined調べてみます。
ありがとうございます。
定義済みかどうかを調べる制御構造を
増やさなければならないということなんでしょうか…。
412デフォルトの名無しさん:2005/11/20(日) 21:26:07
いちいち undefined 調べるのが面倒とか言い出すんなら
なんで -w で実行する必要があるのかっつーとこも問題になってくると思ゐ
413デフォルトの名無しさん:2005/11/20(日) 21:39:06
defined($n) &&
414デフォルトの名無しさん:2005/11/20(日) 21:40:48
>>411
> 定義済みかどうかを調べる制御構造を
> 増やさなければならないということなんでしょうか…。
確かに一つ判断は増えるが、チェックを増やすとネストが深くなるような長めの処理なら、
一旦レキシカル変数に落とすだろうから、そのときにチェックすれば良いのでは
my $hoge = defined $1 ? $1 : '';

また、もしマッチしていなければその処理を行わないというような内容なら、
そもそもそのチェック自体が要件なわけだし
415デフォルトの名無しさん:2005/11/20(日) 22:00:18
>>408
my @captured = ($1, $2, $3, $4); # まず配列(でもなんでも)に値を移して
foreach (@captured) { # ループにかけ、
  next unless defined; # 未定義ならはじいてしまうか、
  # あるいは、
  $_ |= ''; # 適当に初期化しておいてから、

  # 思う存分本来の処理をやりましょう。

}
416酩酊 ◆TWARamEjuA :2005/11/20(日) 22:38:51
my @Check_array = ($test =~ /^([AB])?([AB])?([AB])?$/)
print "\$1 match:A \n" $Check_array[0] eq 'A';
:
:

みたいな?
417デフォルトの名無しさん:2005/11/20(日) 22:58:41
なんか、こんがらがってきたけど、$(行末)ってのは改行文字を含む場合と
含まない場合とがあるんだよね?\n$とやった場合は$に改行は含まれないが
$だけなら改行文字も含むってことでいいの?
418デフォルトの名無しさん:2005/11/20(日) 23:33:41
>>417
いいや。改行文字は「常に」含まれない。
419デフォルトの名無しさん:2005/11/20(日) 23:44:42
>>408
>>415
> my @captured = ($1, $2, $3, $4); # まず配列(でもなんでも)に値を移して
試していないけど、この文を実行する時に$2, $3, $4などが無ければ、
また怒られるのでは?
リストコンテキストでは、($1, $2, $3, $4, ....)が返ってくるよ。

my @captured = $test =~ /^([AB])?([AB])?([AB])?$/;
420デフォルトの名無しさん:2005/11/21(月) 00:10:58
>>418
リャマによれば、ドル記号アンカーは文字列の末尾、または文字列の末尾に
ある改行文字にマッチします...とあるが。
/^fred$/は"fred"にも"fred\n"にもマッチするんで。
421デフォルトの名無しさん:2005/11/21(月) 00:27:33
ダブルクォート文字列内で使えるエスケープに
「\e」がありますよね。
これの使いどころがわからないのですが、
どういう使い方するのでしょうか?
ラクダ本には乗ってないようで、新しめの機能?
422415:2005/11/21(月) 00:28:34
>>419
連結したり展開するなどの形で値を「利用」しなければ警告は出ないみたいよ。

> my @captured = $test =~ /^([AB])?([AB])?([AB])?$/;

場合によりけりだけど通常はこちらのほうがいいよね。
予約されている範囲なら警告はないんで、順序を入れ換えたりする場合には ($1,...) も便利だけど。
423デフォルトの名無しさん:2005/11/21(月) 00:36:44
>>420
$_ = "fred\n";
print 'case $ >', /($)/, "<\n";
print 'case \\n >', /(\n)/, "<\n";
424デフォルトの名無しさん:2005/11/21(月) 00:40:20
超初心者ですみません。
配列関数について分からないのですが、

@list = (1, 2, 3);

の意味は@listが1、2、3という3つの値を持子とは分かるのですが

@primes = (0, 0, 2 .. $limit);

とはどういう意味なんでしょうか?
(limitにはある整数値が入っています)
425デフォルトの名無しさん:2005/11/21(月) 00:48:51
>>424
http://perldoc.jp/docs/perl/5.6.1/perlop.pod
の Range Operators 参照。

あと関数じゃなくて変数な。
426デフォルトの名無しさん:2005/11/21(月) 00:50:15
>>420
おちついて、$&や$'を確認しろ。
らくだ本(赤い奴だろうと青い奴だろうと)に説明あり。

>>421
第二版には載っていたけど、第三版には載ってないの?
赤い奴には載ってないな。
Perl4でも\eはESC文字だった気がするけど、うろ覚え。
427デフォルトの名無しさん:2005/11/21(月) 00:54:56
>>423
ということは行末$とは改行文字の直前てことでいいのかな?
428デフォルトの名無しさん:2005/11/21(月) 00:55:12
>>425
恥ずかしい間違いすみませんでした。
また答えを教えていただいてありがとうござていました。

予想していたとおり、0からlimitの値までの昇順の配列なようですが
(limitが5だったら1,2,3,4,5)
なぜ、0が2つあるのかが謎なのです。
素数を求めるプログラム(エラトステネスのふるい)
に使うので「2以上limit以下の配列」なら良いはずなのですが・・・。
429デフォルトの名無しさん:2005/11/21(月) 00:58:27
>>427
行末が改行文字で終わっていればその直前。
行末が改行文字で終わっていなければ文字列の末尾。

>>428
変数の中身をどう使うかなんてのはそのプログラムを書いた人に聞いてね。
430デフォルトの名無しさん:2005/11/21(月) 00:59:40
>>429
はい、すみませんでした。
0を無視して、@primes = (2 .. $limit);だと思って解釈します。

皆様、ありがとうございました。
431デフォルトの名無しさん:2005/11/21(月) 01:09:47
>>421
> ラクダ本には乗ってないようで、

5.3.2
432408:2005/11/21(月) 01:41:28
みなさまどうもありがとうございます。
なんらかの形でdefinedのチェックを通せばよいのですね。
>>413
>defined($n) &&
そうか…論理和は左から真でなければ右を見ないのでこれでいいんですね。
これはお手軽ですね。

他にもスマートな例をいただきありがとうございました。
433デフォルトの名無しさん:2005/11/21(月) 03:09:26
僕の性器を表現したいんですがどう書けばよいでしょうか
434デフォルトの名無しさん:2005/11/21(月) 03:11:02
ω
435ヽ(´ー`)ノ ◆.ogCuANUcE :2005/11/21(月) 08:54:37
>>411
そのケースだけで言えば、/^([AB]?)([AB]?)([AB]?)$/ にして、マッチしなければ
空文字にすればいいんでないの。
436デフォルトの名無しさん:2005/11/21(月) 08:56:39
warnings使ってるけど基本的にバグ発見ためで
意図してるなら未定義の変数も平気で使う人って実は少ないの?
437デフォルトの名無しさん:2005/11/21(月) 09:26:50
意図しなくてもタイピングミスとかのチェックに
438ヽ(´ー`)ノ ◆.ogCuANUcE :2005/11/21(月) 09:40:08
>>436
意図して未定義の変数を使うってのが、そもそも有り得ない。
439デフォルトの名無しさん:2005/11/21(月) 11:33:08
>>435
遅れて見てたが、はなから /^([AB]?)([AB]?)([AB]?)$/ で充分だと思う。
複雑なパターンでもグループ化と後方参照の為の()を区別すればいいだけで。
/ ...((?:[AB][XY])?)$/
440391:2005/11/21(月) 11:57:12
>>391 の質問に対して、perl.orgよりさっそく丁寧な回答を頂きましたので、ここに転載します。
回答内容は、>>399 の指摘と同様の内容になっています。

Thanks for the report, however this is correct behaviour.

The main thing to be aware of is that for s///g, we retain the source
string for the pattern matching so as not to be confused by any changes
that occur as a result of successful substitutions, building those up
instead into a separate results string.

In the first case then, the first match occurs at offset 4 in the string,
just after the first newline. The /\s*/ matches the next 4 newlines,
and the /$/m matches just before the 6th (final) one.

In the result string, those 4 newlines are replaced with 'K'. In the
source string, the position to continue matching is now still just
before the final newline, and at this point we repeat and match again -
the /^/m matches the position just after the 5th newline, /\s*/
matches zero characters, and /$/m matches (as before) just before the
6th (final) newline. This zero-width substring is thus replaced with
another 'K' in the result string.

Now the match is repeated again, still from the same position, and
the pattern matches a third time, matching in exactly the same way
as the second time. However this time the string has a flag attached
to say that we've already matched a zero-width substring at this
position, so the match is rejected, and no further matches are found.
441391(続き):2005/11/21(月) 11:57:51
You can see this happening with some runtime diagnostics:

perl -wle '$_="abc\n\n\n\n\n\ndef";s/^(?{print "pos ", pos($_)})\s*$(?{print "match"})/K/gm'

which prints:

pos 0
pos 4
match
pos 8
match
pos 8
match
pos 9

In the second case, we do a single replacement as in the case of the
first match described above. When we invoke the substitution a second
time, however, we are acting on the modified string, and so no further
matches are found. It is the fact that the second substitution acts on
the modified string that causes the visible difference between the two
cases.

This is all quite difficult to explain clearly, I hope my attempts have
helped,

Hugo van der Sanden
442デフォルトの名無しさん:2005/11/21(月) 13:15:32
実行しているのがwebか端末かを判別したいのですが
どのような方法が論理的かつ美しいのでしょうか。
現在はとりあえず$ENV{HTTP_HOST}があったらwebから実行されているとしています。
443デフォルトの名無しさん:2005/11/21(月) 13:44:28
>>442
-t STDOUT
444デフォルトの名無しさん:2005/11/21(月) 14:10:10
>>443
ありがとうございます。実は>>296の投稿を見てカンピュータで
-t <STDOUT>
としたのですがコンソールから実行してるのにundefが
返ってきてしまったので投稿してしまいました。
もっと精進します。
445デフォルトの名無しさん:2005/11/21(月) 14:55:05
英語さっぱり読めないけど、なんとなく>>391
446134:2005/11/21(月) 20:58:19
open(FH, ">>ログファイルへのパス");
でファイルをオープンした後に、
unshift @log, "あああああ<>いいいいい<>ううううう\n";
で@logに代入して、
print FH @log;
という形でファイルに書き込んだのですが、何故かログファイルが1行に連なってしまいます。
しかも、\nが・という感じに変わってしまうのですが・・・どうしたら良いですか?
447デフォルトの名無しさん:2005/11/21(月) 21:07:41
うちの環境ではならなかったけど
448デフォルトの名無しさん:2005/11/21(月) 21:12:39
\r\n
449デフォルトの名無しさん:2005/11/21(月) 21:16:19
バイナリファイルで開いて深呼吸して空の星を見るかのごとく数値を見つめるのだ。
450134:2005/11/21(月) 21:17:39
>>448
出来ました!ありがとうございます。
しかし、なぜ\nではなく\r\nとしなければならないのですか?
451デフォルトの名無しさん:2005/11/21(月) 21:26:53
452408:2005/11/21(月) 21:39:41
>>435
>>439
ありがとうございます。
?を括弧の中に入れれば良かったのですね。
よろしければもう一つ、
例えば

$test = "AB";
if ($test =~ /^([AB]?)([AB]?)(?:C([AB]?))?$/) {

のような形(つまり3回目はCが先行する場合のみマッチしたい)では
処理が$3まで到達しないのかやはり未定義になってしまうようです…
このような形に応用するやり方はあるでしょうか。
考えたのですが、どうしても…
453134:2005/11/21(月) 21:41:47
う〜・・・つまり、プラットフォームによって改行コード値が違うのですね。
しかし、それが何故\n→・の文字化けに繋がるのでしょうか。
あと、>>451さんの資料を読む限り、改行文字は\nなのですが、\r\nで記述しなければいけないのはどうしてでしょう・・・

駄目だ、定期テスト期間中なのに頭はperlでいっぱいですonz
454デフォルトの名無しさん:2005/11/21(月) 21:46:50
>>453
ヒント
OSの改行コード
Perl(発祥?のOS)の改行コード
メモ帳(エディター)が対応している改行コード
455134:2005/11/21(月) 21:57:28
>>454
な、なるほど!
テキストエディタで開かずドリームウィーバーで開いてみたら、ちゃんと改行されていました。
つまり、Perl(発祥?のOS)の改行コードに対応していないテキストエディタでログファイルを見ていた私がperlの奥の深さを知らなさ過ぎた訳ですね^−^;
どうもありがとうございました!

しかし何故か、unshiftでログファイルに書き込んでいるのに、配列の末尾に要素が追加されてしまいます・・・。
456デフォルトの名無しさん:2005/11/21(月) 22:12:24
Perl発祥のOSかぁ。壮大な話だ
CR, LF, CRLF
ファイルに追加書き込みしてるから
457デフォルトの名無しさん:2005/11/21(月) 22:23:36
>>452
#!/usr/local/bin/perl -w
use strict;
for (qw(A BA ABCA)) {
  if (/^([AB])?([AB])?(?:C([AB])?)?$/) {
    if (defined $1 && $1 eq 'A') { print "\$1 match:A \n" }
    if (defined $2 && $2 eq 'A') { print "\$2 match:A \n" }
    if (defined $3 && $3 eq 'A') { print "\$3 match:A \n" }
  }
  print "--\n";
}
__END__
458134:2005/11/21(月) 22:32:22
>>456
ファイルに追加書き込みとは">>ログファイルへのパス"のことですよね?
普通に書き込みが出来る入出力記号(>や+<)を記述すると、追加されずに上書きされてしまうです・・・。
459134:2005/11/21(月) 22:54:49
出来ました・・・お騒がせして申し訳ないです。
ただ、@logに要素を入れる場所を間違えていたみたいです。

そろそろ真剣にテスト勉強しないと留年するのでしばらくperlは我慢します...λ
460デフォルトの名無しさん:2005/11/22(火) 02:45:14
ActivePerl 5.8.7.815
これをダウンロードしたんですけどあってますか?
461デフォルトの名無しさん:2005/11/22(火) 02:59:00
>>460
質問の仕方が間違ってる
462デフォルトの名無しさん:2005/11/22(火) 07:48:30
>>460
ハイハイアッテスアッテス
463デフォルトの名無しさん:2005/11/22(火) 07:56:23
恐ろしい質問だ
464デフォルトの名無しさん:2005/11/22(火) 15:11:02
>>460
合ってるかどうかはMD5を見よう
あるいは、それを本当に自分がダウンロードしたのか思い出してみよう
465デフォルトの名無しさん:2005/11/22(火) 17:10:21
こういうのはWebProg板でやれよ
466デフォルトの名無しさん:2005/11/23(水) 14:15:45
print <<PAGE_END;
aaaaa
bbbbb
ccccc
PAGE_END

こんなprintの使い方ありますよね?
でもラクダ本にはこの手の使い方のってないし、
どのprintの構文に照らし合わせても、なぜこれが
できるのかわからんのですが、どういうことなんでしょうか?
467デフォルトの名無しさん:2005/11/23(水) 14:30:51
>>466
それはヒアドキュメントといってprintに限ったものではない
my $hoge = <<EOM;
hogehoge
EOM
ラクダ本は持ってないんだが、リファレンスの何所に載ってるんだろ・・・
468デフォルトの名無しさん:2005/11/23(水) 14:34:46
perldataのScalar value constructorsの中か
http://www.kt.rim.or.jp/~kbk/perl5.005/perldata.html#Scalar_value_constructors
> 行指向形式のクォートは、シェルの「ヒアドキュメント」構文をもとにしています。
以降参照
469466:2005/11/23(水) 15:15:07
レスどうもです。
そういうものがあったのですね・・・。
こんな使い方
print <<`EOC`; # コマンドを実行する
echo hi there
echo lo there
EOC
まであるのかと思い、やってみたら、Windows環境ですが、最初の
コマンドしか実行されませんでしたTT
470デフォルトの名無しさん:2005/11/23(水) 15:50:53
>>466
赤ラクダには載ってるよ。青にも載ってるんじゃないかな
471デフォルトの名無しさん:2005/11/23(水) 15:59:18
青ラクダ本にも、CGIとかで
print ・・・;
print ・・・;
print ・・・;
ってやるよりヒアドキュメント使えってあったよ。
472466:2005/11/23(水) 16:41:04
おおせのとおりです。
printではなくヒアドキュメントでラクダ本を調べると
詳しい解説が載っていました。
さすがラクダ本・・・。
473デフォルトの名無しさん:2005/11/23(水) 22:37:29
ヒアドキュメントの使い方上級編

print $header, <<"BODY_END", $footer if defined $hoge
適当に
複数行の
本文を書いて
BODY_END

my @text= ( <<"ARRAY1",<<"ARRAY2",<<"ARRAY3" );
複数行に
渡る
文字列の
代入を
ARRAY1
¥nとか
使って
書くと
美しくない
ARRAY2
とか
思う人に
おすすめ。
ARRAY3

my @text= ( <<"AND",<<"AND",<<"END" );
これって何かの本に載ってる?
適当に自分でいじってて、
AND
できたらいいのに、
AND
がホントにできた例なんだが。
END
474デフォルトの名無しさん:2005/11/23(水) 22:56:34
(;^ω^)
475デフォルトの名無しさん:2005/11/23(水) 23:01:59
476デフォルトの名無しさん:2005/11/23(水) 23:04:22
普通にperldocに載ってますが
477473:2005/11/23(水) 23:27:30
>>476
うん、今読んでた
478デフォルトの名無しさん:2005/11/23(水) 23:39:44
全くのPerl初心者が質問して良いですか?

例えば配列@list = ( 28, 10, 7, 15, 34, 9, 58, 2 ) を
ヒープソートするロジックを教えて頂きたいんですが・・・。

考えても考えても、どう表現したらいいかわからん。
479デフォルトの名無しさん:2005/11/23(水) 23:45:02
Perlから環境変数にアクセスするには%ENV使いますよね?
よく本では、
$ENV{PATH}
のようにやっているのですが、PATHってkeyの文字列ですよね?
なぜにクォーテーションで囲まないのでしょうか?
というかやってみると出来てしまうのですが。
なんででしょうか?
480デフォルトの名無しさん:2005/11/23(水) 23:46:06
>>479
『裸のワード』でぐぐれ
481デフォルトの名無しさん:2005/11/24(木) 00:31:21
482479:2005/11/24(木) 00:38:18
レスありがとうございます。
裸のワードというのを初めて知りました。
しかし、今回のケースでは、そういう解釈ではなく
文法で許されているようですね。
483デフォルトの名無しさん:2005/11/24(木) 03:10:27
ただし、たとえば"-"などは演算子とみなされてしまうので
$ENV{foo-bar}は書けない
$ENV{'foo-bar'}と書かないといけない
484デフォルトの名無しさん:2005/11/24(木) 14:02:06
ところが先頭ではOKだったり。
$hash{-foo} = 'bar';
とかね。
485デフォルトの名無しさん:2005/11/24(木) 14:49:22
リンクタグからURLを取り出したいんですが、うまくいきません。
$hoge=~m/(<.*?href.*?=("|')?)(https?:\/\/)?(.*?)($2| |\>)/

想定では
$1<href= $2" $3http:// $4url部分 $5">
と、なるはずなんですが、
$4,$5が空になってしまいます。だれか助けてください。
486485:2005/11/24(木) 15:44:06
$2がnullのとき、どうすればいいんだろう??
eオプションで条件式つけてだらだらやるしかないんでしょうか?
487デフォルトの名無しさん:2005/11/24(木) 16:20:36
>>486
同じ正規表現の中で使うときは$2じゃなくて\2
488デフォルトの名無しさん:2005/11/24(木) 17:51:01
eclipseでperlは使えるんでしょうか?
489デフォルトの名無しさん:2005/11/24(木) 17:55:02
>>488
何を持って使えるというのかにもよるが
つ EPIC
490デフォルトの名無しさん:2005/11/24(木) 18:21:57
>>489
ありがd
検索してepicのページ見つけました。
なんだかよくわからないけど使ってみます。
491デフォルトの名無しさん:2005/11/26(土) 12:07:39
IEでプロキシーを設定できますが、perlとのスクリプトからネットワークに接続した場合にもプロキシーは通ってるんでしょうか?
492デフォルトの名無しさん:2005/11/26(土) 12:58:25
通ってません
493デフォルトの名無しさん:2005/11/26(土) 13:25:45
Perlでプロキシー通す処理書けますか
それともWindows側で設定するんでしょうか
494デフォルトの名無しさん:2005/11/26(土) 13:36:38
例えばですが
LWP::UserAgentのproxyメソッドで設定できます
495デフォルトの名無しさん:2005/11/26(土) 14:19:06
自分の書いたサブルーチンを呼ぶときに、&をつけるかどうかについて
ですが、&を必ずつけるというやり方はいいやり方なのでしょうか?
496デフォルトの名無しさん:2005/11/26(土) 14:33:35
>>495
プロトタイプが無視されるので良くないやり方
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq7.html#What_s_the_difference_between_ca
497デフォルトの名無しさん:2005/11/26(土) 14:47:28
それって、例えば1ファイルのperl script書いた時、自作func()は呼び出される
「前に」必ず記述しないと駄目ってことになるの?
498デフォルトの名無しさん:2005/11/26(土) 14:50:36
>>497
プロトタイプを使うなら先行宣言
使わないなら無くても何も文句は言われん
499495:2005/11/26(土) 15:07:06
そうですか、どうも。
では関数ということを強調するのに引数が無い場合でも
my_func( );
こんな感じにするのはいいですよねぇ?
500デフォルトの名無しさん:2005/11/26(土) 15:10:00
むしろ俺はそう書いてるが
501デフォルトの名無しさん:2005/11/26(土) 15:43:53
普通そうする
502デフォルトの名無しさん:2005/11/26(土) 15:45:01
>>494
ありがとうございました
503デフォルトの名無しさん:2005/11/26(土) 16:55:53
>>498
なるほど、勉強になります。
504デフォルトの名無しさん:2005/11/26(土) 17:09:16
プロトタイプ必要か?
OOP派なのでそもそもプロトタイプは定義しない。
Perlで仕様ガチガチなsubを書くのもどうかしてると思われ

どっちにしても可読性の観点でmy_func();か$o->my_method();にするけどね。
505デフォルトの名無しさん:2005/11/26(土) 17:12:38
小規模なら何でもいいんだけどな
506デフォルトの名無しさん:2005/11/26(土) 17:29:21
sub my_func(\@);
こういうプロトタイプ書いておいて
my_func(@hoge);
とかなら使うけどな。
507デフォルトの名無しさん:2005/11/26(土) 17:41:20
>>504
自分で作ったものを自分で使っている限りはどうでもいいんじゃないの?
他人に使わせるモジュールを書くのなら、値渡しか参照渡しか、
ユーザが気にしなくても使えるほうがベターでしょう。
(Perl のプロトタイプってそのためにあるのだと思っていたが)
508デフォルトの名無しさん:2005/11/26(土) 19:43:38
初心者な質問でごめんなさい。
ブロック外に書いたmyがファイル全体のスコープを持っちゃうのって
どう対処してます?
ブラック外に書くのはサブルーチンの呼び出しだけだったりするんでしょうか。
509デフォルトの名無しさん:2005/11/26(土) 19:48:22
対処って・・・?
510デフォルトの名無しさん:2005/11/26(土) 19:50:52
>>507
504だけど、標準モジュールのソース読んだことある?
わざわざプロトタイプを指定しているのはperl4の時代から存在したものぐらいで
perl5以降の関数型標準モジュールを当たってもプロトタイプ指定は稀なように思える。
分野差があるかもしれんが。
511デフォルトの名無しさん:2005/11/26(土) 19:56:52
今時プロトタイプなんて使わないべ
512デフォルトの名無しさん:2005/11/26(土) 20:04:52
>>510
Perl4にプロトタイプは存在しない件(´・ω・`) 5.002から導入だそうだ

漏れ、小規模なコードはプロトタイプをがちがちに指定した物を書くのが
好きなんだけど時代遅れなのかな…
513デフォルトの名無しさん:2005/11/26(土) 20:07:54
プロトタイプしとけば、引数の型チェックしてくれるじゃん
514デフォルトの名無しさん:2005/11/26(土) 23:43:54
それをチェックしてくれるかどうかも、バージョン依存だったと思うから
俺は使ってない。
あと引数の型を sub foo(¥@) {...} として foo(@arr) で呼び出した時に
配列リファレンスを取り出してくれるかどうかも、バージョン依存だったはず。
なので俺はプロトタイプは使ってないし信用しないことにしてる。
515デフォルトの名無しさん:2005/11/27(日) 01:32:52
>>514
>あと引数の型を sub foo(\@) {...} として foo(@arr) で呼び出した時に
>配列リファレンスを取り出してくれるかどうかも、バージョン依存だったはず。

ああ、本当だ。ここのPerl5.005の解説では、
http://www.kt.rim.or.jp/~kbk/perl5.005/perlsub.html
「\」を付ければリファレンスになると書いてあるのに、
らくだ本の改訂版のp133〜(Perl5.002)には、そんなこと
な〜んにも書いていない。
まあ、しかし、5.6以前のことはもう考えなくていいんじゃないの?
516デフォルトの名無しさん:2005/11/27(日) 01:56:48
オブジェクト指向でプログラムを作る場合
CPANで集めてきたモジュールの関数を利用するために
複数継承させたら、多重継承になっちゃうんだよね?
多重継承(・A ・)イクナイ!って聞いたので、どうしたらいいのでしょうか?
例えば
package damepo;

use LWP::Simple;
use Encode;

こんな感じです。
517デフォルトの名無しさん:2005/11/27(日) 02:06:54
それは継承じゃない。
ちなみにPerlは多重継承をサポートしてるから気にすんな。
518デフォルトの名無しさん:2005/11/27(日) 02:20:31
>>517
thx
これは継承じゃないんですか!!!
(´Д⊂ モウダメポ
サブルーチンと継承の差がよくわからなくなってきた
オブジェクト指向がいっこうにわかんね_| ̄|○
519デフォルトの名無しさん:2005/11/27(日) 02:24:34
>>515
少なくとも 5.003_07 の perlsub にはその記述が既にある。
http://search.cpan.org/~andyd/perl5.003_07/pod/perlsub.pod#Prototypes

> 5.6以前のことはもう考えなくていいんじゃないの?
線引きをするなら 5.005_0[34] 以降と 5.8.1 以降かな、私の場合。

>>518
http://www.kt.rim.or.jp/~kbk/perl5.005/perlobj.html
http://www.kt.rim.or.jp/~kbk/perl5.005/perlbot.html
520519 追加:2005/11/27(日) 02:27:01
521デフォルトの名無しさん:2005/11/27(日) 06:01:13
>>515
p134で実際に\@や\%を使っているけどな。
522デフォルトの名無しさん:2005/11/27(日) 12:52:07
>>521
しかし、意味が違う。らくだ本の改訂版では\@とは、
「引数が@で始まらなければならない」という意味だから、
引数が「@foo」ならいいが、「(1,2,3,4)」みたいなのは
ダメということでしかない。
523デフォルトの名無しさん:2005/11/27(日) 13:19:28
ようするにそういうバージョン依存な糞仕様に振り回されずに
残りの時間を別の所で有効に使うためにプロトタイプするな
ってことでFA?
524デフォルトの名無しさん:2005/11/27(日) 13:44:42
>>523
「Perl6 を使えば全て解決」で FA。
525デフォルトの名無しさん:2005/11/27(日) 13:46:44
俺プロトタイプで & をよく使ってる。
高階関数を定義するのに便利だから。
526デフォルトの名無しさん:2005/11/27(日) 13:58:28
CPANにあるモジュールを勝手にPHP化して配布したらまずいですか?
527デフォルトの名無しさん:2005/11/27(日) 14:00:24
配布して何がしたいの?
528デフォルトの名無しさん:2005/11/27(日) 14:00:34
Perl6? あぁあの補助金尽きて開発者が路上生活者になりかけてるやつか
529デフォルトの名無しさん:2005/11/27(日) 14:49:30
perl6は俺たちが生きてる間にはお目にかかれないってやつでしょ?
530デフォルトの名無しさん:2005/11/27(日) 17:37:46
>>522
改訂版でも\@は、(リストではなく本物の)配列のリファレンスだよ。

宣言例のsub mypop (\@)やsub mysplice(\@$$@)が説明。
テキストは、@arrayは良いが\@arrayや$ref_arrayは駄目という事。
531デフォルトの名無しさん:2005/11/27(日) 18:22:01
perl6は俺たちの想い出の中にずっと生き続ける
532デフォルトの名無しさん:2005/11/27(日) 18:33:43
Tkを使っています。
(MainLoopが回った後?)fork出来ないと言う記述を
見かけたような気がするのですが,本当でしょうか。
533デフォルトの名無しさん:2005/11/27(日) 18:42:14
>>527
正確に言うと二次配布です。
友人に配るPHPのスクリプトにPerlのモジュールをPHP化したものを配りたいのですが、可能ですか?
534デフォルトの名無しさん:2005/11/27(日) 19:16:10
変数名とか変えてこっそり移植して、シラを切りとおせばよかろう
535デフォルトの名無しさん:2005/11/27(日) 19:35:35
>>533
CPANいってドキュメントのライセンス嫁よ
536デフォルトの名無しさん:2005/11/27(日) 20:18:46
質問はまだかね?
537デフォルトの名無しさん:2005/11/27(日) 20:34:35
Perl6 ・・・

Autrijus たんはどうしてあんなものに貴重な才能と時間を費やしているのでしょうか?
538デフォルトの名無しさん:2005/11/27(日) 20:36:36
必然です
539デフォルトの名無しさん:2005/11/27(日) 21:00:15
>>537
あの人のことは、われわれには分からないさ・・・。
540デフォルトの名無しさん:2005/11/27(日) 23:03:35
CPANのライブラリをRubyに移植したやつを読んで、まずPHPに移植。
3つの言語で使用法を統一する為に、
移植後のPHPのライブラリを、RubyとPerlに再移植ならしたことある。
配布はしてないが…。あの頃は暇だった。
541デフォルトの名無しさん:2005/11/27(日) 23:57:50
次スレのテンプレに、これを入れる?


[寄付のお願い]
https://donate.perlfoundation.org/
542デフォルトの名無しさん:2005/11/28(月) 00:07:37
いらんだろ
543デフォルトの名無しさん:2005/11/28(月) 03:22:39
>>532
スレッドは駄目だったと思うがforkは知らん。
てかそれ位自分で試せよ。
544デフォルトの名無しさん:2005/11/28(月) 13:37:21
すいません。教えてください。

テスト,:10,田中<TANAKA>NONAMAEHA一郎<ITIROU>TO言<I>IMASU,N000,123,__,050210,99999,
が$_に入っているとして、これを

テスト,:10,田中NONAMAEHA一郎TO言IMASU,N000,123,__,050210,99999,
テスト,:10,田中NONAMAEHA一郎TOIIMASU,N000,123,__,050210,99999,
テスト,:10,田中NONAMAEHAITIROUTO言IMASU,N000,123,__,050210,99999,
テスト,:10,田中NONAMAEHAITIROUTOIIMASU,N000,123,__,050210,99999,
テスト,:10,TANAKANONAMAEHA一郎TO言IMASU,N000,123,__,050210,99999,
テスト,:10,TANAKANONAMAEHA一郎TOIIMASU,N000,123,__,050210,99999,
テスト,:10,TANAKANONAMAEHAITIROUTO言IMASU,N000,123,__,050210,99999,
テスト,:10,TANAKANONAMAEHAITIROUTOIIMASU,N000,123,__,050210,99999,

というように<>の部分を展開してout.txtというファイルに出力するプログラムを作りたいです。
どうか、よろしくお願い致します。
545デフォルトの名無しさん:2005/11/28(月) 14:08:00
匂う、宿題の香り・・・
546デフォルトの名無しさん:2005/11/28(月) 14:10:19
use strict;

$_ = 'テスト,:10,田中<TANAKA>NONAMAEHA一郎<ITIROU>TO言<I>IMASU,N000,123,__,050210,99999,';

print $_, "\n" foreach f($_);

sub f {
my($s) = @_;

if ( $s =~ /([^[:ascii:]]+)<([^>]+)>/ ) {
my $pre = $`;
my $post = $';
my(@s) = ($1, $2);
my @r;
push @r, f($pre.$_.$post) foreach @s;
return @r;
} else {
return $s;
}
}
547544:2005/11/28(月) 16:12:33
>545
ぐっ…ご名答です。
>546
回答ありがとうございます。
print $_, "\n" foreach f($_); #←ここはprint $_, "\n";foreach f($_);ですか?
上のようにして変えても次の6行目でエラーが出るのですが…
548デフォルトの名無しさん:2005/11/28(月) 16:14:29
>>547
宿題は宿題スレへ行ってください。
549デフォルトの名無しさん:2005/11/28(月) 16:48:57
回答があっても理解できないレベルじゃ聞いても無駄なんじゃ...
550デフォルトの名無しさん:2005/11/28(月) 17:10:12
>>547
なんというか、せめてちゃんと動いている回答を疑う前に構文くらい調べようよ…
http://www.kt.rim.or.jp/~kbk/perl5.005/perlsyn.html#Simple_statements
551デフォルトの名無しさん:2005/11/28(月) 17:32:18
こんな役に立ちそうもない宿題出すなんてどこのボケだよ
552デフォルトの名無しさん:2005/11/28(月) 17:41:42
>>544 ではないが、
俺には >>546 みたいのは一生書けないだろうな、と思い知ったよ・・・orz
553デフォルトの名無しさん:2005/11/28(月) 18:23:49
>>552
それはかなりヤバい。
554デフォルトの名無しさん:2005/11/28(月) 18:31:00
この宿題漏れなら3行で終わらせる。

$_ = 'テスト,:10,田中<TANAKA>NONAMAEHA一郎<ITIROU>TO言<I>IMASU,N000,123,__,050210,99999,';
1 while s/^([^<>\n]*?)([^[:ascii:]<>]+)<(.+?)>([^\n]*?)$/\1\2\4\n\1\3\4/m;
print $_, "\n";
555デフォルトの名無しさん:2005/11/28(月) 18:43:01
(^∀^)問題良く見ろw
556544:2005/11/28(月) 19:26:24
答えてアリガト!(´▽`)です。
>550
すいません。ちゃんと動いてますね。ただ、恐縮ですが
546さんのプログラムを実行してみたのですが
テスト,:10,田中NONAMAEHA一郎<ITIROU>TO言IMASU,N000,123,__,050210,99999,
テスト,:10,田中NONAMAEHA一郎<ITIROU>TOIIMASU,N000,123,__,050210,99999,
テスト,:10,田TANAKANONAMAEHA一郎<ITIROU>TO言IMASU,N000,123,__,050210,99999,
テスト,:10,田TANAKANONAMAEHA一郎<ITIROU>TOIIMASU,N000,123,__,050210,99999,
というような結果で@rと$sの中身も展開したい形にはなってませんでした。
展開したい形というのは
テスト,:10,田中NONAMAEHA一郎TO言IMASU,N000,123,__,050210,99999,
テスト,:10,田中NONAMAEHA一郎TOIIMASU,N000,123,__,050210,99999,
テスト,:10,田中NONAMAEHAITIROUTO言IMASU,N000,123,__,050210,99999,
テスト,:10,田中NONAMAEHAITIROUTOIIMASU,N000,123,__,050210,99999,
テスト,:10,TANAKANONAMAEHA一郎TO言IMASU,N000,123,__,050210,99999,
テスト,:10,TANAKANONAMAEHA一郎TOIIMASU,N000,123,__,050210,99999,
テスト,:10,TANAKANONAMAEHAITIROUTO言IMASU,N000,123,__,050210,99999,
テスト,:10,TANAKANONAMAEHAITIROUTOIIMASU,N000,123,__,050210,99999,
というような形です。(_ _(--;(_ _(--;
557デフォルトの名無しさん:2005/11/28(月) 19:39:55
>>556
だから宿題は自分でやれって。

#!/usr/local/bin/perl -w
use encoding "shiftjis";$c=2;sub branch{my($s,$t,$n,$r)=@_;if($n==$#$t){push@$r
,$s.$_ for@{$t->[$n]}}else{branch($s.$_,$t,$n+1,$r)for@{$t->[$n]}}}while(<DATA>
){@f=split/,/;@t=map/^([^A-Z]+)<([A-Z]+)>\z/?[$1,$2]:[$_],split
/([^A-Z]+<[A-Z]+>)/,$f[$c];branch"",\@t,0,\@r;$f[$c]=$_,print join",",@f for@r}
__DATA__
テスト,:10,田中<TANAKA>NONAMAEHA一郎<ITIROU>TO言<I>IMASU,N000,123,__,050210,99999,
558デフォルトの名無しさん:2005/11/28(月) 19:50:51
きっと >>544>>546 のコード提出したら
多分先生に説明求められるだろうな。

学校で再帰や foreachの単純文使う段階に
入ってると思えねーw
559デフォルトの名無しさん:2005/11/28(月) 19:54:21
中卒の俺に教えて欲しいんだけどperlって学校で習えるもんなの?
560544:2005/11/28(月) 20:01:28
以後気をつけます。m( __ __ )m
っていうかあんた意外にいい人だね〜○感謝
自分でももっと勉強の必要ありだと実感しました。
561デフォルトの名無しさん:2005/11/28(月) 20:02:01
s/中卒/中学生/
562デフォルトの名無しさん:2005/11/28(月) 21:09:55
>>549
> 回答があっても理解できないレベルじゃ聞いても無駄なんじゃ...

なんで? 写して出せば終わりじゃん。
563デフォルトの名無しさん:2005/11/28(月) 21:11:34
さげろ中学生
564デフォルトの名無しさん:2005/11/28(月) 21:44:39
問題の意味がわからないのは俺だけか。
あれは一体何をしたいんだ。何の意味があるんだ。
565デフォルトの名無しさん:2005/11/28(月) 21:47:24
>>564
>何の意味があるんだ。

同意w
566544:2005/11/28(月) 22:54:36
テスト,:10,田中<TANAKA>NONAMAEHA一郎<ITIROU>TO言<I>IMASU,N000,123,__,050210,99999,
端的に言うとこれは辞書の一部です。プログラムの目的自体は読み仮名と漢字の展開です。
田中という漢字の読み仮名が<>にあってそれぞれ別で辞書に登録したいということです。
567554:2005/11/28(月) 23:11:35
>>566
よく解らんが、キミが>>556 に書いたとおりの結果を得たいのなら、
>>554の結果も全くその通りになっているのだが。これでまだ不足があるのかな?
568デフォルトの名無しさん:2005/11/28(月) 23:17:20
問題に意味がなくても正解があればいいんでね?
569デフォルトの名無しさん:2005/11/28(月) 23:21:07
>読み仮名と漢字の展開です。

なんつーか、それなら文字コードとかもっと学ばないといけないような・・
一応出力するプログラムができても、それに意味はないというか・・
570デフォルトの名無しさん:2005/11/28(月) 23:38:06
ここまで色々な例を示されて、動かないからちゃんと動くコードを
出せと逝ってくるようじゃ終わってるな 

時間がありあまってる学生時代からこれじゃな…
571デフォルトの名無しさん:2005/11/28(月) 23:58:15
>>567
残念ながら君のコードが意図通り動くかどうかは環境依存の上、
s/// の REPLACEMENT で $1 の代わりに \1 を使うお過ちを
している。
572デフォルトの名無しさん:2005/11/29(火) 00:03:44
はいはい残りは宿題スレに逝ってね
573デフォルトの名無しさん:2005/11/29(火) 00:51:32
perlの宿題スレなんてあるのかと探したけど、案の定無いな。
今後はこの辺へ振るか。

Perlでリクに答えるスクリプトを作るスレ
http://pc8.2ch.net/test/read.cgi/tech/1086143976/
574デフォルトの名無しさん:2005/11/29(火) 01:02:31
net::pop3使ったら、たまに添付ファイル部分の最初1バイトが欠けるんだけど?
これ経験した人いる?なんで?
575デフォルトの名無しさん:2005/11/29(火) 09:30:39
>>574
そういう経験はないな。しかしNet::POP3って添付ファイルの解析は
やってくれないのでいきなりそういう結果は出ないと思うが。どうして
Net::POP3のせいでかけたと考えたのかね?






576デフォルトの名無しさん:2005/11/29(火) 09:32:47
$str="あああコーヒーあああ";
という文字列のコーヒーという部分を太文字にするために
$str="あああ<B>コーヒー</B>あああ";のようにコーヒーの部分だけ
置換するにはどうすればいいですか?
577デフォルトの名無しさん:2005/11/29(火) 09:53:45
$str=~ s/(コーヒー)/<b>$1</b>/go;
578デフォルトの名無しさん:2005/11/29(火) 09:53:48
>>576
$str =~ s!コーヒー!<B>コーヒー</B>!;
579577:2005/11/29(火) 09:54:43
あ、/あるの忘れたw
>>578ケコーン
580デフォルトの名無しさん:2005/11/29(火) 10:01:03
どっちにしろなんのひねりもない置換ですむ話なので
このくらいわからないでperl使ってるというのは信じられん
のだが釣り?
581デフォルトの名無しさん:2005/11/29(火) 10:05:14
>>574
chompじゃなくてchop使ってたり、、という事じゃないよね。まさか
582デフォルトの名無しさん:2005/11/29(火) 10:05:53
>>580
他人が書いた掲示板を弄ってみたいとか、そんなんだろ
583329:2005/11/29(火) 10:19:18
http://pc8.2ch.net/test/read.cgi/tech/1086143976/l50

>>321から書込みを続けている者なんですが、もしPERLで詳しい方で
アドバイスいただける方いたら、あっちのスレのほうで教えてください。
584デフォルトの名無しさん:2005/11/29(火) 10:30:31
$honbunという文字列のテキストボックスから入力した
文字列$text_dataが含まれている部分だけ太字にしたかったんですけど
$honbun=~s/$text_data/<B>$text_data<\/B>/g;
でやってうまくいくんですが
入力された文字列がコーヒーという文字列だとエラーが出ちゃうんです。
うまく処理できる方法を教えてください
585デフォルトの名無しさん:2005/11/29(火) 10:41:55
>>584
スクリプトファイルの文字コードを euc に変えなされ。
586デフォルトの名無しさん:2005/11/29(火) 11:25:16
>>584
内部コードをEUCにして http://www.din.or.jp/~ohzaki/perl.htm に紹介されているような
技を使うか、use utf8して全部ユニコードで扱うかどっちかだな。
587デフォルトの名無しさん:2005/11/29(火) 14:07:11
制御構文で

if (A=1) {ここでCという値には3足して、Dという値には4足したい}
elsif (A=2) {Cに100足して、Dには40足したい}

こういった構文を作るにはどうすればいいですか?
普通if文の後って1つしか処理は出来ないの?
588デフォルトの名無しさん:2005/11/29(火) 14:09:12
はぁ
589デフォルトの名無しさん:2005/11/29(火) 14:14:09
大ボスがきたぞ
590デフォルトの名無しさん:2005/11/29(火) 14:18:10
>>584
つ quotemeta
591デフォルトの名無しさん:2005/11/29(火) 14:21:42
難易度自体も大ボスなら、倒しても経験値まったく上がらなそうなあたりも大ボス
592デフォルトの名無しさん:2005/11/29(火) 14:23:53
倒しますか?勇者様
593デフォルトの名無しさん:2005/11/29(火) 14:25:46
学校でperl習う所なんてあったんですね・・・
c、c++やパスカルくらいだと思ってましたよ。
594デフォルトの名無しさん:2005/11/29(火) 14:45:03
perlってif構文のあとから、その下のelsif文までの間に
2つの変数に足し算を2回処理するとか出来ないの!?
595デフォルトの名無しさん:2005/11/29(火) 15:04:48
お前ら釣られすぎ
596デフォルトの名無しさん:2005/11/29(火) 16:06:06
>>594 
出来るよ。
                             以上
597デフォルトの名無しさん:2005/11/29(火) 21:07:23
>>575
通常のメーラーとNet::POP3で落とした同メールでソースを比較したら、
Net::POP3の方は、base64でエンコードされた添付の部分の最初1バイトが欠けてるんです。
もちろんデコードしても壊れてるし。
Socketを使ってPOPサーバへ接続したら欠けてないんですけどね。
598デフォルトの名無しさん:2005/11/29(火) 21:11:17
>>597
サーバソフトウェアはどんなの使ってるの?
599デフォルトの名無しさん:2005/11/29(火) 21:32:16
>>598
メールサーバーソフトウェア?
それ分からないけど。
って事は、Net::POP3に問題無いって事なのかな。
600デフォルトの名無しさん:2005/11/29(火) 21:47:32
>>599
いや、わからんけど、
Net::POP3 みたいなメジャーなモジュールに問題があるとは考えにくいので、
普通は自分の実行環境の方に問題がないかというところから攻めて行くっしょ。
601デフォルトの名無しさん:2005/11/29(火) 21:49:46
添付の最初の1バイトなのか、添付の前の部分の最後の1バイトなのか。
602デフォルトの名無しさん:2005/11/29(火) 21:50:44
Win32::OLEモジュールを使ってファイル選択ダイアログを表示させ、
選択したファイルの名前を変数に設定するにはどうすればいいの?
603デフォルトの名無しさん:2005/11/29(火) 22:11:28
>>600
学内だし、SMTPもPOPも同じはず。。。?
でも、壊れたり壊れなかったりなんですわ。
添付内容が変わるだけの定型文のメールだし。

>>601
添付の最初の1バイト。
添付ファイルに該当する部分の最初の1バイトです。
604デフォルトの名無しさん:2005/11/29(火) 22:33:40
ヤバイ部分をふせてソースをアップしてくれないか
605デフォルトの名無しさん:2005/11/29(火) 22:58:55
perlのsystem関数とかで
passwdなどのパスワード入力を後から聞いてくるタイプのコマンドは
どうやって送ればいいのでしょうか?
よろしくです
606デフォルトの名無しさん:2005/11/29(火) 23:05:44
>>604
こんな感じ。
って、ほとんどなにもいじってないけど。
------------------------------------
use Net::POP3;
$pop = 'popサーバ';
$u = 'アカウント';
$p = 'パスワード';
my $oPop = Net::POP3->new($pop);
$oPop->login($u,$p);
my $rhMsg = $oPop->list();
foreach my $sMsgId (keys %$rhMsg) {
print @{$oPop->get($sMsgId)};
}
607デフォルトの名無しさん:2005/11/29(火) 23:24:20
>>605
漏れなら Expect を使う。
608デフォルトの名無しさん:2005/11/30(水) 00:17:30
>>606
それで再現すんの?俺の手元じゃ再現しないぜ。
609デフォルトの名無しさん:2005/11/30(水) 01:28:26
>>587
ちょwwww 大ボスたおしとくwwwww

if ( $A == 1 ) { $C += 3; $D += 4; }
elsif ( $A == 2 ) { $C += 100; $D += 40; }
610デフォルトの名無しさん:2005/11/30(水) 08:39:19
>>609
大ボスは倒しても形態を変えて再登場するのが普通
611デフォルトの名無しさん:2005/11/30(水) 08:47:49
これでいいよ

if ( $A == 1 ) $C += 3, $D += 4;
elsif ( $A == 2 ) $C += 100, $D += 40;
612デフォルトの名無しさん:2005/11/30(水) 08:53:00
>>611
(゚Д゚)ハァ?
613デフォルトの名無しさん:2005/11/30(水) 09:18:20
>>606
それだけのプログラムで欠けるというのはかなり不思議だね。
バグかもしれないのでがんばって追求すると楽しめそう。
オレのところでは再現しないので残念だ。
614デフォルトの名無しさん:2005/11/30(水) 09:27:44
Perlでディレクトリの容量を調べる方法を教えてください
UNIX鯖の場合とWIN鯖の場合を教えてください
615デフォルトの名無しさん:2005/11/30(水) 10:36:23
>>614
(WEBプログラミング板 http://pc8.2ch.net/php/ )
616デフォルトの名無しさん:2005/11/30(水) 11:13:03
>>615
なんでWebProg板なの?
別にここでもいいと思うんだけど
617デフォルトの名無しさん:2005/11/30(水) 11:31:28
>>616=>>614
うるせーよカスムシが
それぐらい自分でしらべろや。
大体なんで鯖なんだよ、鯖ならwebprog板いけよ低脳、Perlスレがあること自体
板違いなんだよ。自覚しろや

opendir(DIR,shift @ARGV);
@dir=readdir(DIR);
foreach(@dir){print "$_\n";}
618616@ 203.162.27.195:2005/11/30(水) 11:32:33
俺は616じゃないんだが。
勝手に決め付けないでね中学生さん
619デフォルトの名無しさん:2005/11/30(水) 11:33:23
s/616/614/
620617:2005/11/30(水) 11:40:01
>>618
ならコード書けばいいだろうが
うるせーよ無職ニートがなんでこんな時間に2chいるんだww
俺は授業だけどな

opendir(DIR,shift @ARGV);
@dir=readdir(DIR);
$dirsize=0;
foreach(@dir){
print "$_ ";
$size=-s $_;
print "$size\n";
$dirsize+=$size;
}
print "--- dirsize $dirsize\n";
621デフォルトの名無しさん:2005/11/30(水) 11:43:18
何コイツ・・・?
622デフォルトの名無しさん:2005/11/30(水) 12:09:38
>>606
http://digit.que.ne.jp/work/index.cgi?Perl%A5%E1%A5%E2%2FPerl%A4%C7%A5%E1%A1%BC%A5%EB%A4%F2%BC%F5%A4%B1%A4%EB
「Perlメモ/Perlでメールを受ける」
http://homepage3.nifty.com/hippo2000/perltips/rcvmail.htm
「Perlでメールを受ける」

Net::POP3のことはよく解らないが、上のページとかを見ると、
日本語を扱うために結構苦心しているようだ。単純にはいかないのだろう。
623デフォルトの名無しさん:2005/11/30(水) 12:23:09
>>614
試してないから自信ないが…。

print dirSize(".");
sub dirSize {
my ($dir) = @_;
my $sum = 0;
$sum += (-d)? dirSize($_): -s for glob("$dir/*");
return $sum;
}
624デフォルトの名無しさん:2005/11/30(水) 12:24:07
関数ごと渡してサブルーチンを他のcgiから読み込むって可能?

読み込み方教えてください。

それと超がつくほど初心者な質問ですが、

文字関数で日本語の文字列を全角500くらいを扱えるのを
定義するにはどうすればいいですか?
625デフォルトの名無しさん:2005/11/30(水) 12:35:48
もう少し分かりやすく質問お願いします
626デフォルトの名無しさん:2005/11/30(水) 12:40:57
>>624
日本語でおk
627デフォルトの名無しさん:2005/11/30(水) 12:40:59
例えば a.cgiをメインに使っていて、そこから$SUMとかの関数を 同じディレクトリの
中にあるb.cgiに渡して、b.cgiの&keisanというサブルーチンを実行して、
そのサブルーチンから、また a.cgiにkeisanから弾きだされた結果を送るということなんです。

なにせ、そのkeisanがあまりにも長いためメインのa本体と別にしたいなと思いまして
628デフォルトの名無しさん:2005/11/30(水) 12:42:32
a.cgiで
use b.cgi

とかけばいいだけだろ
629デフォルトの名無しさん:2005/11/30(水) 12:42:54
>>626さん
あ、私が意図したものは

$kekka="あなたは非常に素晴らしいです・・・・・(ここに入る日本語の文字列が500文字を超えるという意味です)"

↑のように""の内容が非常に膨大な文字列のときに適した文字列関数ってなんですか?
630デフォルトの名無しさん:2005/11/30(水) 12:43:36
>>628
そんなことできるんですか?ちなみにa.cgiの変数はそのまま継続して使えるのですか?
631デフォルトの名無しさん:2005/11/30(水) 12:47:13
定義すれば?
632デフォルトの名無しさん:2005/11/30(水) 12:48:04
文字列関数ってなによ

釣りなら帰れ
633デフォルトの名無しさん:2005/11/30(水) 12:48:05
例えばb.cgiにたくさんサブルーチンあったら、どれを実行とか出来ませんか?
634デフォルトの名無しさん:2005/11/30(水) 12:50:47
釣りじゃありません。ほんとうに教えてほしいんです
635デフォルトの名無しさん:2005/11/30(水) 12:54:44
>>634
すまんが、日本語を先に勉強してきてくれ。
636デフォルトの名無しさん:2005/11/30(水) 12:55:06
もしかして a.cgiで
use b.cgiして
&&keisan();をすればいいだけですか!?

そうすると普通に a.cgiに記述されていた場合と同じ結果になるのかな?
637デフォルトの名無しさん:2005/11/30(水) 12:55:53
もう1つ聞きたいのが、500文字以上の全角文字を変数に入れたいんですが、
どうすればいいですか?
638デフォルトの名無しさん:2005/11/30(水) 12:57:45
代入
639デフォルトの名無しさん:2005/11/30(水) 13:01:17
>>618-619
脳内置換したら名前欄が614になっちゃって、しばらくおかしいなと考え込んだ件

>>614
Filesys::DiskUsage

>>624
>>1
> CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
いや、煽りとかじゃなくマジで。
二つ目は、普通に文字列を変数に入れれば良いんじゃないかな。長さは関係ないわけだが…
CGIから受け取った云々というのならそれもWebProg板行き
640デフォルトの名無しさん:2005/11/30(水) 13:02:48
>>639
ありがとう!!!
文字数の長さは関係ないんだね!!ありがとー
641デフォルトの名無しさん:2005/11/30(水) 19:00:49

性別

回答者合計者○($SEXSUM)名中

男○($SEXMALE)名
女○($SEXFEMALE)名




というのをHTMLで出力したいんだけど、ディレクトリに SEX.txtというのを置いて
そのtxtファイルの中に「 0,0 」
というふうに男女の初期値の人数をいれておいて。

毎回フォームから'GENDER'の値が0(男性).もしくは1(女性)で送ってきた時のみ。
SEX.txtを読み込んで、1足して表示→そして読み込んだSEX.txtの人数の一人プラスという
ようなPERLスクリプト分かる人いますか?
642デフォルトの名無しさん:2005/11/30(水) 19:03:24
はい。僕分かります。
643デフォルトの名無しさん:2005/11/30(水) 19:03:49
おしえてください
644デフォルトの名無しさん:2005/11/30(水) 19:10:11
自分で作らないなら丸投げスレへ。
645デフォルトの名無しさん:2005/11/30(水) 19:10:51
646デフォルトの名無しさん:2005/11/30(水) 19:16:48
こんな感じ?試してないからちゃんと動くか分からん。

open(my $fh, "+<セックス.txt") or die $!;
my ($males, $females) = split(/,\s*/, <$fh>);
seek($fh, 0, 0);
($GENDER)? $males++: $females++;
print $fh ("$males, $females");
647デフォルトの名無しさん:2005/11/30(水) 19:17:52
うわあああスミマセン!携帯でのらくらやっててリロードし忘れたorz
648デフォルトの名無しさん:2005/11/30(水) 19:19:11
完全な答えになってないから許す
ってか携帯でコード書くなんて珍しいな・・
649デフォルトの名無しさん:2005/11/30(水) 19:34:00
マルチして、すいませんでした。
どうしても今すぐ知りたかったので・・・
650デフォルトの名無しさん:2005/11/30(水) 19:43:04
完全回答になってんじゃん
651デフォルトの名無しさん:2005/11/30(水) 19:50:01
スミマセン…。
652デフォルトの名無しさん:2005/11/30(水) 20:07:25
>>649
それがマナー違反なんだよ。死ね。
653デフォルトの名無しさん:2005/11/30(水) 20:14:17
>>613
>>622
自力で再現できないんで、原因不明ですわ。
メールのヘッダとか見てても、他のメールとさして違いないんだけど・・・
今日、SocketとMIME::Parser使って作りなおしました。
こいつを育てます。
いろいろありがとう。
654デフォルトの名無しさん:2005/11/30(水) 20:17:57
>>652
お前が市ね、外道が!
655デフォルトの名無しさん:2005/11/30(水) 20:35:57
はいはい次の質問どうぞ
656デフォルトの名無しさん:2005/11/30(水) 21:15:16
>>641
WebProg板の方に答え書いといたよ
657デフォルトの名無しさん:2005/11/30(水) 22:35:43
質問マダァ-? (・∀・ )っ/凵⌒☆チンチン
658デフォルトの名無しさん:2005/11/30(水) 23:16:57
Perl6はいつでるのですか?
659デフォルトの名無しさん:2005/11/30(水) 23:22:05
あなたに孫が出来る頃
660デフォルトの名無しさん:2005/12/01(木) 01:23:38
>>658
Pugsじゃ駄目なん?
661デフォルトの名無しさん:2005/12/01(木) 09:28:33
txtファイルに6つの変数(0, 1, 2, 3 , 4, 5)記録しておいて
それを $Gに読み込んで そこまでは分かるんだが

my ($A, $B, $C, $D, $E, $F) = split(/,\s*/, <$G>);
というように。

このあと読み込んだ6つの数字を全て0, 0, 0, 0, 0, 0 にしたいので
seek($G, 0, 0, 0, 0, 0, 0);

としたら最初の2つ目の変数までは0に処理されるんだけど、3つ目以降の0からは
エラー対象になります。

分かる人いますか?
662デフォルトの名無しさん:2005/12/01(木) 09:38:49
>>661
そもそも何をを考えてるのかさっぱりわからん
663デフォルトの名無しさん:2005/12/01(木) 09:41:32
>>661
seekの使い方が間違っています。
seekはファイルの読み書き位置を変更するものです。
664デフォルトの名無しさん:2005/12/01(木) 09:51:20
本当ですね。自己解決しました。すれ汚しスマソ
665デフォルトの名無しさん:2005/12/01(木) 09:51:22
>>661
エスパー翻訳:

6つの値をコンマ区切りで一行に書いたファイルがあって、それらの
値を一つずつ変数に読み込ませたい。ファイル名が $G 、ファイルの
内容が
 0, 1, 2, 3 , 4, 5
だとして、
 my($A, $B, $C, $D, $E, $F) = split(/,\s*/, <$G>);
でそれができると思う。
変数に読み込んだのち、ファイルの値は全て 0 に書き換えたいので、
seek($G, 0, 0, 0, 0, 0, 0);
としたら "Too many arguments for seek at ..." と怒られた。
どう書けば意図通り動くか分かる人いますか?

エスパー回答:
>>2 に載っている入門サイトや入門書を熟読せよ。
666デフォルトの名無しさん:2005/12/01(木) 09:52:34
SEEK(○, (成功したときに返す値), (失敗したときに返す値))
だったんだね
667デフォルトの名無しさん:2005/12/01(木) 09:53:39
クリア後の隠しボス登場
668デフォルトの名無しさん:2005/12/01(木) 11:23:47
>>666
お、おめぇ >>587 だろw
669デフォルトの名無しさん:2005/12/01(木) 11:34:54
>>646のコードに影響されてる悪寒。
670デフォルトの名無しさん:2005/12/01(木) 13:38:10
レベル低下の匂いがするぜ
671デフォルトの名無しさん:2005/12/01(木) 14:10:21
みてみ、大ボスが形態変えて復活しとる。
ドラクエだとあと1,2回あるんだよな。MP温存しとかんとやられるぞ
672デフォルトの名無しさん:2005/12/01(木) 20:27:01
回復魔法や薬草でもダメージ与えられるから問題なし。
673デフォルトの名無しさん:2005/12/01(木) 20:39:41
ゾンビプロセスのことか
674デフォルトの名無しさん:2005/12/01(木) 21:58:01
if ($AAA =~ /$BBB/) {・・・

$AAAが$BBBという文字列を含んでいるなら・・・
としたいのですがこのままだとエラーがでてしまいます。
どのように修正すればいいのでしょうか?
675デフォルトの名無しさん:2005/12/01(木) 21:59:54
お前のエラーの内容など知らん。
676674:2005/12/01(木) 22:04:03
失礼しました、解決できました。。
677デフォルトの名無しさん:2005/12/01(木) 22:12:43
>>674
マルチいくない。
678デフォルトの名無しさん:2005/12/01(木) 22:16:48
平気でマルチしたり、解決法も言わずに自己解決しましたでハイサヨナラしたり、
なんかそういうのってどうなんだろうねえ?
679677:2005/12/01(木) 22:43:07
とりあえず、ポインタだけでも貼っておくか。
http://pc8.2ch.net/test/read.cgi/php/1129477637/843-
680デフォルトの名無しさん:2005/12/01(木) 22:54:07
すみません。
LWP::UserAgentで、Basic認証をしたいのですが、どのようにコードを書けば良いのでしょうか。
681デフォルトの名無しさん:2005/12/01(木) 22:58:17
>>689
「LWP Basic」で Google に Go!!
682デフォルトの名無しさん:2005/12/02(金) 00:34:17
683酩酊 ◆TWARamEjuA :2005/12/02(金) 07:13:38 BE:6098887-###
10 use LWP::UserAgent;
20 my $response = $request->authorization_basic($id, $pw);
30 goto google.com;
684デフォルトの名無しさん:2005/12/02(金) 09:48:31
$STRの中に入っている文字列(配列なしの1つのみ)を出力する際に
20文字ごとに自動改行いれる方法わかる椰子いる?
685デフォルトの名無しさん:2005/12/02(金) 09:50:13
ちなみに全角だから、厄介なんですよ、ハイ。。。
686デフォルトの名無しさん:2005/12/02(金) 09:59:21
全角って分かってるなら40バイト置きに改行挿入すればいいだけじゃん
687デフォルトの名無しさん:2005/12/02(金) 10:01:03
>>684-685
usu Jcode;
print jcode($str)->jfold(20)-euc();
<br>で改行したけりゃ
print jcode($str)->jfold( 20, '<br>' )-euc();
perl5.8.1以降なら第三引数に行頭禁則文字の配列リファレンスを渡せますが何か?
688デフォルトの名無しさん:2005/12/02(金) 10:05:54
ちなみに既に改行がある場合は改行でsplitした配列に対して同様の操作が必要
↓一行でできるわ。
print join /\n/, map{ jcode($_)->jfold(20)-euc() } split /\n/, $str;
689デフォルトの名無しさん:2005/12/02(金) 10:09:02
ありがとんくす

メール出力だから<BR>の代わりに\n にすればいいだけかな
690デフォルトの名無しさん:2005/12/02(金) 10:10:19
jfoldはデフォルトで\n
てかドキュメント嫁
http://openlab.ring.gr.jp/Jcode/index-j.html
691689:2005/12/02(金) 10:16:30
読んでみたけど分からない漏れは負け犬。。。
692689:2005/12/02(金) 10:46:12
本当、わからない

# $str を $bytesバイトで折り返す

require 'fold.pl';

while (length($str)) {
(my $folded, $str) = fold($str, $bytes);
print $folded, "\n";
}

というソースを見つけたはいいものの、

$BODYというのに$STRに入ってる日本語の文字を40バイトごとで折り返して追加して
いきたいんだけど、 print $folded, "\n"; のところを
$body .= "$folded";
でいいかな?
693689:2005/12/02(金) 10:51:53
require 'fold.pl';

while (length($string)) {
(my $folded, $string) = fold($string, 40);
$body .= $folded, "\n";
}


一応出力されてメールは送ってくるけど、全角20時ごとに改行されていない
なんでだろ
694デフォルトの名無しさん:2005/12/02(金) 11:03:50
>>693
× $body .= $folded, "\n";
○ $body .= $folded. "\n";
695デフォルトの名無しさん:2005/12/02(金) 11:21:18
>>688
なんで join の第一引数を /.../ にするんだろう.
意味ないと思うんだけど.
696デフォルトの名無しさん:2005/12/02(金) 11:49:26
test.datというファイルにデータを書き込んでいるときに
rename関数でtest.datを他のディレクトリに移動するとtest.datのデータは壊れますか?
こういう場合もファイルロックをかけるんでしょうあ?
697デフォルトの名無しさん:2005/12/02(金) 12:26:26
>>695
$_ =~ m/.../ の結果(空文字列 or "1")でjoinしたい気分だったとか?

>>696
環境依存。
renameが失敗するとか、renameが成功してファイルも無事だとか。
698689:2005/12/02(金) 13:19:58
>>694
ありがとう。でけた!ただ、やっぱり、この命令つかって
メール生成しても、多少ずれるのね orz
699689:2005/12/02(金) 13:25:22
これって句読点とかのせい?
700689:2005/12/02(金) 13:42:35
TERAPADのようなテキストエディタで表示すると20字ごとに改行はいってるのに
メール(OE)だと、かなり毎行ずれてる orz
701デフォルトの名無しさん:2005/12/02(金) 13:48:10
>>689
フォントのせいじゃないのか?
固定幅フォント使ってる?
702689:2005/12/02(金) 13:51:49
>>701
OEの設定の問題ってことかな?
OEの設定は

プロポーショナルフォント:MS Pゴシック
固定ピッチフォント:MS ゴシック
フォントサイズ:中
エンコード:日本語(自動選択)になってるよ
703689:2005/12/02(金) 13:53:15
>>701
それってさ、送信する段階で、相手のメーラーソフトがどんなものであれ、
ずれないようにして幅を統一させるようなことってできない?
704デフォルトの名無しさん:2005/12/02(金) 14:01:04
ポカーン(゚Д゚)
705デフォルトの名無しさん:2005/12/02(金) 14:03:16
HTMLメールで<pre>本文</pre>とでもすれば。
706689:2005/12/02(金) 14:03:57
perlの命令で文字フォントまで指定してメールを生成することって無理か。。。
HTML出力ならまだしも。。。。
707689:2005/12/02(金) 14:04:53
HTMLメールには出来ないんだなぁ。。。
リッチテキストスタイルにするとか、何かいい案はありませんか?
708デフォルトの名無しさん:2005/12/02(金) 14:08:11
OSのAPIを使って文字幅を取得して、計算しつつ出力する
709デフォルトの名無しさん:2005/12/02(金) 14:10:05
面倒だから画像ファイルにして添付しろ。
710689:2005/12/02(金) 14:13:36
>>708
すげぇ難しそう。画像ファイルを生成して添付しろとなもし?

普通、数とか文字列的なデータはCSVに生成して添付する方法なら簡単だけど、

画像の生成の仕方わからんw
711デフォルトの名無しさん:2005/12/02(金) 14:14:20
つーか独り言書かれたりageて書き込むのが激しくウザいんだが
消えてくれないかな
712デフォルトの名無しさん:2005/12/02(金) 14:15:01
なんでも人に聞く前に自分で調べろ、カスが
713デフォルトの名無しさん:2005/12/02(金) 14:19:08
最近のメルマガや企業の広告のダイレクトメールなんかだと、
固定幅フォントで読むのを推奨する旨の注意書きを入れるケースが多いように思う。

つーか、ここから先は Perl 関係ないので余所でやって欲しい。
714デフォルトの名無しさん:2005/12/02(金) 15:01:04
ActivePerlでUTF-16LE形式のファイルを読み書きすると文字化けする。

回避方法はありますか?
715デフォルトの名無しさん:2005/12/02(金) 17:03:37
>>714
文字化けってのが理解できない。

BOM付きのutf16leが欲しいのに、
encode('utf16',decode('utf16',$input)) だとutf16beになって、
encode('utf16le',decode('utf16',$input)) だとBOM無しになるって事?

それなら、自分でencode前か後にBOMを追加すればいいはず。
716デフォルトの名無しさん:2005/12/02(金) 17:58:49
お前ら、YahooJAPANの検索APIが公開されましたよ

http://developer.yahoo.co.jp/

サンプルコードは低脳が書いたとしか思えないけど
717デフォルトの名無しさん:2005/12/02(金) 18:32:03
>>716
サンプルコードが酷いwwww
718デフォルトの名無しさん:2005/12/02(金) 18:48:32
Yahoo!デベロッパーネットワーク - 用語集
http://developer.yahoo.co.jp/glossary/

> REST
> REpresentational State Transferの略語。HTTPリクエストに対してXMLをレスポンスとして返す。
> Yahoo!検索WebサービスはRESTを採用しています。

REST ってそういう意味だっけ……?
719デフォルトの名無しさん:2005/12/02(金) 18:52:45
sort関数を使っても昇順に並び替えができません

@aaa=(10,25,35,69,190);

@aaa2=sort(@aaa);
foreach $_(@aaa2){
print "aaa=$_<BR>";

}
実行すると
aaa=10
aaa=190
aaa=25
aaa=35
aaa=69
となってしまいます。
sort関数ではちゃんとできないんでしょうか?
720デフォルトの名無しさん:2005/12/02(金) 18:57:38
@aaa2=sort({$a <=> $b} @aaa);
721デフォルトの名無しさん:2005/12/02(金) 19:18:25
>>715
具体的に説明できる能力がない orz

ttp://rakunet.org/TSNET/TSperl/10/311.html
を見ると、0A00 が泣き別れになるのを防げばいいらしいのだけど…

UTF-16LEで読み込み>置換処理>UTF-16LEで保存って考えると、
手も足も出ない。

cygwin上では出ない症状だから、不便じゃないのだけど。
722デフォルトの名無しさん:2005/12/02(金) 19:36:04
>>719
お前はPerlよりGoogleたんの使い方からはじめるべきだ。
低脳な質問はWebProg板でしろ!!

# 数字昇順
@BB=sort{$a <=> $b}@AA;

# 数字降順
@BB=sort{$b <=> $a}@AA;

http://66.102.7.104/search?q=cache:mak05M6bOSAJ:tech-web.net/perl_memo.html+%E6%95%B0%E5%AD%97+sort+perl&hl=ja&lr=lang_ja
723715:2005/12/02(金) 20:14:58
>>721
もしかしてbinmode?

open($fh,"<:raw:encoding(utf16le)",$filename);
又は
binmode($fh,":raw:encoding(utf16le)");
あたりかと。
724デフォルトの名無しさん:2005/12/02(金) 20:28:41
他のプロセスがファイルに書き込み中でもrenameって成功するんでしょうか?
725デフォルトの名無しさん:2005/12/02(金) 20:48:14
>>722
>低脳な質問はWebProg板でしろ!!

ワラタ
726デフォルトの名無しさん:2005/12/02(金) 20:59:36
>>724
実際にやってみろよ
それぐらいすぐできるだろ
727デフォルトの名無しさん:2005/12/02(金) 21:10:44
>>724
それはOSによって違うかも。
UNIX系OSの場合はファイルオープン後は i-node (ファイルの内容を指す
位置情報のようなもの)しか見てないので幾らファイル名を変えようが
ハードリンク増やそうが関係ない。
728デフォルトの名無しさん:2005/12/02(金) 21:43:57
perlをようやく5.6から5.8にアップしたんですが
なんかバグがあるようです。
@a = ("aaa", "bbb","ccc")
ような配列をprintすると、なんか
aaa
 bbb
 ccc
と、変な風にズレます。(ほんとはもっと高度なスクリプト)
5.6では問題なかったです。
一応報告まで。
729デフォルトの名無しさん:2005/12/02(金) 21:48:29
それだけだと出力は
aaabbbccc
になるはずだが

>(ほんとはもっと高度なスクリプト)
ここを公開しないで何の意味があるのかね
730デフォルトの名無しさん:2005/12/02(金) 21:51:07
>>728
あー、また文字列中に変数展開しているオチっぽいのがきたね。
731デフォルトの名無しさん:2005/12/02(金) 22:13:39
> yjwebsearch.pl
> (my $sec,my $min,my $hour,my $mday,my $mon,my $year) = localtime($y_modificationdate);

これは あらての つりだ
732デフォルトの名無しさん:2005/12/02(金) 22:25:15
高度なスクリプトて… 巡回セールスの完成コード入ってるとか?w
733デフォルトの名無しさん:2005/12/02(金) 22:30:12
「高度なスクリプト」は高度である=バグが無い
→Perl本体のバグだ という思考回路か
734デフォルトの名無しさん:2005/12/02(金) 22:36:23
>>728
釣りか?釣りか?
$" = '';
735デフォルトの名無しさん:2005/12/02(金) 23:47:52
>>733
ウチにもいるぞー。
何かっつーとすぐOSやらGCCやら環境がバグってるって言い出すヤツ。
736デフォルトの名無しさん:2005/12/02(金) 23:52:55
>>728
> と、変な風にズレます。(ほんとはもっと高度なスクリプト)

仕様です。

きっとその高度なスクリプトには、
「chomp していない値を放り込んだ配列をダブルクォート展開する」
というのっぴきならないニーズがあるんですね。

これは恐らくあなたの Perl 歴よりも長い歴史を持つ伝統的な FAQ なので、これを機会にしっかり覚えましょう。
737デフォルトの名無しさん:2005/12/02(金) 23:55:21
>>716
久々にワラタ
738デフォルトの名無しさん:2005/12/02(金) 23:55:49
SSL通信と●ログインに関する質問です。
http://kage.monazilla.org/system_DOLIB100.html
を参考にして●ログインスクリプトをperlで書きましたが
ログインしようとするとエラーになります。
以下のものが作ったスクリプトです。
何かアドバイスをください。
#ログインIDとパスワードは伏字にしております。

use LWP::UserAgent;
use HTTP::Request::Common qw(POST);
use HTTP::Headers;
my $ua = LWP::UserAgent->new;
$ua->default_header( 'User-Agent' => 'DOLIB/1.00'.$ua->agent );
$ua->default_header( 'X-2ch-UA' => 'kage/1.00'.$ua->agent );
$ua->default_header( 'Content-Length' => '36'.$ua->agent );
$ua->default_header( 'Content-Type' => 'application/x-www-form-urlencoded'.$ua->agent );
$ua->default_header( 'Connection' => 'Close'.$ua->agent );


# リクエストの生成
my $url = 'https://2chv.tora3.net/futen.cgi';
my %formdata = ('ID' => 'XXXX%40xxxx%2ene%2ejp', 'PW' => 'XXXXXXXX');
my $request = POST($url, [%formdata]);
739デフォルトの名無しさん:2005/12/03(土) 00:15:43
お前さんはエラーを書こうとは思わないのか。
740デフォルトの名無しさん:2005/12/03(土) 00:20:03
>>739
すみません。

HTTP/1.1 200 OK
Connection: close
Date: Fri, 02 Dec 2005 14:47:54 GMT
User-Agent: Monazilla/1.00
Server: Apache/2.0.49 (Unix) PHP/4.3.6 mod_ssl/2.0.49 OpenSSL/0.9.7c-p1
Content-Length: 204
Content-Type: text/plain
Client-Date: Fri, 02 Dec 2005 14:47:52 GMT
Client-Peer: 206.223.147.50:443
Client-Response-Num: 1
Client-SSL-Cert-Issuer: /C=US/O=Equifax Secure Inc./CN=Equifax Secure Global eBu
siness CA-1
Client-SSL-Cert-Subject: /C=US/O=2chv.tora3.net/OU=https://services.choicepoint.
net/get.jsp?4135261678/OU=See www.geotrust.com/resources/cps (c)04/OU=Domain Con
trol Validated - QuickSSL(R)/CN=2chv.tora3.net
Client-SSL-Cipher: DHE-RSA-AES256-SHA
Client-SSL-Warning: Peer certificate not verified

SESSION-ID=ERROR:ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp
pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp
ppppppppppppppppppppppppppppppppppppppppppp
741デフォルトの名無しさん:2005/12/03(土) 00:25:52
昔Perlで●ログインする関数を作った事あるが
お前さん、LWP::UserAgentの使い方を間違えてないか
742741:2005/12/03(土) 00:30:31
使い方は間違えてないな、スマン
これは経験からだが

●ログイン時の注意点
・ID/PWをエンコードして渡すとエラーになる
・返ってきたsidの最後の\nをchop()で刈り取る

コードはお前さん向けに編集するからまっとれ
743741:2005/12/03(土) 00:36:56
sub ch2_maru_login {
my($ua, $r, $sid) = ();
my($id, $pw) = @_;

$ua = LWP::UserAgent->new;
$ua->max_redirect(0);
$ua->agent('DOLIB/1.00');
$ua->default_header('X-2ch-UA' => 'Hoge/1.00');
$r = $ua->get('https://2chv.tora3.net/futen.cgi?ID=' . $id . '&PW=' . $pw);

if($r->is_success){
(undef, $sid) = split(/=/, $r->content, 2);
if($sid =~ /^ERROR/s){ return undef; }
chop $sid;
return $sid;
}else{ return undef; }
}

こんな感じかな
編集ミスとかあったらすまん
744デフォルトの名無しさん:2005/12/03(土) 00:49:41
POSTではできないんでしょうかね・・・
745デフォルトの名無しさん:2005/12/03(土) 00:54:50

>>743を試してみたんですが
$r->contentに
SESSION-ID=ERROR:ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp
pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp
ppppppppppppppppppppppppppppppppppppppppppp
がはいってますね。うーん、どこが間違っているんでしょうか・・・
746741:2005/12/03(土) 01:01:19
>>745
俺の環境では正常だったが・・

print &ch2_maru_login('[email protected]', 'password');

ってやった
747デフォルトの名無しさん:2005/12/03(土) 01:07:24
>>746
あ、、、できました。

print &ch2_maru_login("[email protected]", "password");
と書いてました。。。

ありがとうございました。
748デフォルトの名無しさん:2005/12/03(土) 01:12:37
うん。@は展開されるから気をつけような。
展開する必要がない場合は極力シングルクォートにしような。
749721:2005/12/03(土) 01:21:02
>>723
ありがとう。うまくいきました。
こんなに簡単にいくとは…
750デフォルトの名無しさん:2005/12/03(土) 01:23:57
すみません、Perl始めて間もない者です。


while(<>) {
if(/#BOOKTITLE#\((.+)\)/) {
print $1, "\n";
}
}


というプログラムを以下のようにテキストファイルと併せて実行すると


$ ./book.pl title.txt
Book title 03
Book title 01
Book title 14
Book title 08
:
:
    :

と表示するプログラムなのですが、これを01から順にソートするにはどうすればよいのでしょうか?
マッチ後にリスト配列へ入れてソートしていけばいいらしいのですが。
751デフォルトの名無しさん:2005/12/03(土) 01:29:38
push(@buf, $1);

...

print join("\n", sort(@buf));
752デフォルトの名無しさん:2005/12/03(土) 01:30:25
途中で
Book title 123
とか出てこないだろうな?
753デフォルトの名無しさん:2005/12/03(土) 01:51:09
>>751
実行すると
$ ./book.pl title.txt
$


となるだけで、何も変化がありません。
754デフォルトの名無しさん:2005/12/03(土) 02:00:35
>>753は間違いです。
実行はできるのですがソートできていない結果が表示されてしまいます。
755デフォルトの名無しさん:2005/12/03(土) 02:24:08
sub test ( ¥% ) {
my ($ref) = ¥%_;
$ref->{'fuga'} = 'World';
}

%hash = (
'hoge' => 'Hello',
'fuga' => 'Hello'
);

&test ( %hash );

print $hash{'hoge'}, $hash{'fuga'}, "¥n¥n";

# sub test に対して連想配列をリファレンスで渡し、
# 渡した元データ自体を sub test 内で直接書き換え、
# 結果として HelloWorld と表示させたい場合、
# sub test 内では、どのようにデリファレンス/代入
# すれば良いでしょうか?
# 現状のこの記述では上手くいきません。
# 力を貸してください。宜しくお願いします。
756デフォルトの名無しさん:2005/12/03(土) 02:27:01
sub test ( ¥% ) {
my ($ref) = ¥%_;
$ref->{'fuga'} = 'World';
return %$ref;
}

%hash = (
'hoge' => 'Hello',
'fuga' => 'Hello'
);

%hash2 = &test ( %hash );

print $hash2{'hoge'}, $hash2{'fuga'}, "¥n¥n";
757デフォルトの名無しさん:2005/12/03(土) 02:38:05
sub test {
my $ref = shift;
$ref->{'fuga'} = 'World';
}

%hash = (
'hoge' => 'Hello',
'fuga' => 'Hello'
);

&test(\%hash);

print $hash{'hoge'}, $hash{'fuga'}, "\n\n";
758755:2005/12/03(土) 02:40:59
>>756

素早い解答ありがとうございます。
実は、メモリ節約を模索しておりまして、
引数を丸ごと渡さずに済ませる方法を考えているのです。

説明足らずですいません。

配列で書くと、以下のような感じです。
これを連想配列で行いたいと思っているのです。

sub test ( ¥@ ) {
$_[1] = 'World';
}

@array = ('Hello', 'hello');

&test ( @array );

print $array[0], $array[1], "¥n¥n";
759755:2005/12/03(土) 02:48:46
>>757

まさにソレです。
ありがとうございました!

shift は、複数の引数を順に取り出す時ばかり使用していて、
頭が行きませんでした。

それから、引数を与える側の ¥ は、プロトタイプ宣言によって
解釈されるものだと、おもいっきり勘違いしておりました。

感謝です。
760デフォルトの名無しさん:2005/12/03(土) 03:20:30
@array = ();
while (<>) {
push @array, $1 if /#BOOKTITLE#¥((.+)¥)/;
}
print join ("¥n", sort @array), "¥n";
761デフォルトの名無しさん:2005/12/03(土) 03:43:59
>>760
>>751
解決できました。
こんな夜遅くに本当にありがとうございました。
762デフォルトの名無しさん:2005/12/03(土) 15:14:41
まあええことよ
763デフォルトの名無しさん:2005/12/03(土) 18:54:00
質問マダァ-? (・∀・ )っ/凵⌒☆チンチン
764デフォルトの名無しさん:2005/12/03(土) 18:56:58
最近、夫の帰りがひどく遅いんですが…
765デフォルトの名無しさん:2005/12/03(土) 19:01:23
ちんこにパールを埋め込むか迷ってます
766デフォルトの名無しさん:2005/12/03(土) 19:38:35
CPANモジュールをインストールすれば問題有りません
767デフォルトの名無しさん:2005/12/03(土) 19:51:42
perlがrubyより劣っているところを教えてください
768デフォルトの名無しさん:2005/12/03(土) 19:54:13
>>767
普通、パールはルビーより値段が安いな。
劣ってるところはそれだけw
769デフォルトの名無しさん:2005/12/03(土) 20:01:50
BEGINブロック内でCORE::GLOBALの操作によりbuilt-in関数の置き換えを行っているのですが、
既にロードされたモジュールに対しては効果が無いようです。
現在はスクリプトの一番初めにロードすることで対処していますが、
後からロードしても大丈夫なような回避方法は無いでしょうか。
770デフォルトの名無しさん:2005/12/03(土) 20:12:32
Pugsどうよ?
771デフォルトの名無しさん:2005/12/03(土) 20:16:26
下のように書いているのだけど、ファイルの読み込みができません。
環境はActivePerlです。
#! /usr/bin/perl
use utf8;
use Encode;
use File::Find;

@ARGV = ('.') unless @ARGV;

sub process_file{
$file = $File::Find::name;
open IN, "<encoding(cp932)", "$file" or die;
... 以下略
}

find(\&process_file, @ARGV);
772デフォルトの名無しさん:2005/12/03(土) 20:20:02
>>770
Pugs 入れようとしたら GHC のインスコで疲れた…
773769:2005/12/03(土) 20:47:03
すみません、訂正させてください。読み直したら説明文が意味不明でした。

現在、>>769のようなbuilt-in関数の置き換えを行う必要のあるモジュールを作っています。
現在はそのモジュールを、スクリプトの一番初めにロードすることで対処していますが、
それを後からロードしても大丈夫なような回避方法は無いでしょうか。

宜しくお願いします
774デフォルトの名無しさん:2005/12/03(土) 20:48:31
>>771
: が抜けているようだが。("<:encoding(cp932)")
use utf8;ってことはスクリプトの文字コードはUTF-8にしてるのか。
775771:2005/12/03(土) 21:04:55
>>774
その部分を修正しましたがが、: の有無は関係ないみたいです。
多言語処理を考えているので、意図的にスクリプトの文字コードをUTF-8にしています。
776デフォルトの名無しさん:2005/12/03(土) 21:27:16
>>772
Windowsなら ttp://pxperl.com/ が楽でいいですよ。
777デフォルトの名無しさん:2005/12/03(土) 21:39:14
>>775
日本語ファイル名使ってたりする?
778771:2005/12/03(土) 21:54:02
>>777
それも除外しています。色々と試しているんですが、subで
print $File::Find::name,"\n";

と追加して、

c:\home>test.pl test

とやると、
test

とのみ出力して、open INのところで落ちてしまいます。
testは同じ階層にあるフォルダで、中に処理対象のファイルを2つ入れています。
findの書き方が悪いのか?とも思っているんですが…
779デフォルトの名無しさん:2005/12/03(土) 22:19:32
>>778
> findの書き方が悪いのか?とも思っているんですが…

思ってないで調べろよ。
780デフォルトの名無しさん:2005/12/03(土) 22:27:36
ディレクトリをopenか。
781デフォルトの名無しさん:2005/12/03(土) 22:31:02
print $File::Find::name,"\n";

じゃなくて

print $file, "\n";
782771:2005/12/03(土) 23:28:21
原因判明。
findがファイルもフォルダも区別してなかった。

そのため、最初に$File::Find::nameにフォルダ名が入ってopenで落ちたみたい。
ファイルかフォルダかを判別するif文追加して回避した。
783デフォルトの名無しさん:2005/12/04(日) 00:10:35
>>782
気付くの遅いよ。>>780で答え出てるのに。

しかし、use utf8;やuse encoding "cp932";すると日本語ファイル名がまともに
扱えないのはなんとかならんのかな。
784デフォルトの名無しさん:2005/12/04(日) 01:59:08
s///にはなぜ/cオプションがないんですかね・・・。
785酩酊 ◆TWARamEjuA :2005/12/04(日) 09:24:39 BE:2723055-###
>>784
(?!exp)っていう拡張構文があるから?
786デフォルトの名無しさん:2005/12/04(日) 16:10:35
ActivePerl 5.8.7 bulid + Tkで
fork文を宣言するだけでコマンドプロンプトから落ちるのだけど
プログラムの問題だよね・・・?そんな仕様ないよね。
787デフォルトの名無しさん:2005/12/04(日) 17:01:18
ActivePerlでforkってできるの?
788デフォルトの名無しさん:2005/12/04(日) 17:19:22
え?使えないの?UNIXだけ?
789デフォルトの名無しさん:2005/12/04(日) 17:25:52
ラクダ本にはwindowsでも頑張ってforkを実装した、って書いてあった
790デフォルトの名無しさん:2005/12/04(日) 17:43:04
>>786
コマンドプロンプト「から」落ちるって、どういう事?
後、forkという記述があるだけで駄目なの?

>>532,543 あたりだと、メインループが走った後の実行は駄目っぽいが...
(Windowsでのforkはスレッドによるエミュレーション)
791デフォルトの名無しさん:2005/12/04(日) 19:26:42
リスト内の要素をランダムに並べ替える方法はありますか?

@aaa2=rand(@aaa);

だとうまくいきません。
教えて下さいよろしくお願いします。
792デフォルトの名無しさん:2005/12/04(日) 19:30:20
793デフォルトの名無しさん:2005/12/04(日) 19:46:46
>>791=>>719か?
学習能力が無いようだし、回答者への礼儀も無いようだな
794デフォルトの名無しさん:2005/12/04(日) 20:10:34
※低脳な質問はWebProg板でお願いします
795786:2005/12/04(日) 22:02:09
>>790
ちょっと今から試してみます。
あとで結果報告。
ありがとうございました。
796デフォルトの名無しさん:2005/12/04(日) 22:03:59
Perlで出来て Cで出来ない例を挙げてみてください
797786:2005/12/04(日) 22:22:05
御指摘の通りMainLoopがあると簡単なプログラムでも

問題が発生したため、Perl Command Line Interpreter を終了します。 ご不便を
おかけして申し訳ありません。

とでて落ちるみたいです。原因が分かりました。
どうもです。
798デフォルトの名無しさん:2005/12/04(日) 22:29:51
>>796
PerlはCで書かれているのでそのようなものは存在しません
799デフォルトの名無しさん:2005/12/04(日) 23:30:00
目的で言えばそうだけど、手段で言えばいっぱいあるな。
配列やハッシュのPerlのイデオムは、Cの文法じゃかけない。
800デフォルトの名無しさん:2005/12/04(日) 23:37:14
>>796
メモリの確保、解放、踏み越えを気にしない事
801デフォルトの名無しさん:2005/12/05(月) 00:00:05
極端な話、perlインタプリタを全部ライブラリとして組み込んで

main()
{
perl("任意のperlプログラム");
}

とかすりゃなんでもアリだからなぁ。これをCプログラムと呼んでいいか
どうかは知らんが。

結局楽に書けるかどうかが違うだけでできることは本質的に同じなんだし。

802デフォルトの名無しさん:2005/12/05(月) 01:05:34
>>801
適当なsample.plをつくって、
main () {
   perl("sample.pl");
}
として、sample.cで保存したら実行できるんですか?
803デフォルトの名無しさん:2005/12/05(月) 02:57:12
>802
よく読め。
「perlインタプリタを全部ライブラリとして組み込ん」だ場合の話だ。

>801 とは少し違うかもしれないが
「perlcc -c sample.pl
とやると sample.c ができる」
と説明したら理解できるか?
804デフォルトの名無しさん:2005/12/05(月) 07:38:24
CPANを利用してモジュールをインストールする際に
エラーが出てインストールできませんでした。
どうすれば正しくインストールされるのでしょうか?
805804:2005/12/05(月) 07:46:47
インストールしようとしたモジュールは"Schedule::At"で、
エラーメッセージの一部は以下の通りです。

t/t1....ok 1/6Can't exec "atq":
そのようなファイルやディレクトリはありません
at /root/.cpan/build/Schedule-At-1.06/blib/lib/Schedule/At.pm line 96.
Schedule::At: Can't exec getJobs command:
そのようなファイルやディレクトリはありません
806デフォルトの名無しさん:2005/12/05(月) 07:46:55
エラーが出ないようにすること、かなぁ。
807デフォルトの名無しさん:2005/12/05(月) 11:13:55
$db=DBI->connect("DBI:mysql:DB名:ホスト名","ユーザー名","パスワード",
{RaiseError => 0,PrintError => 1});
if(!$db){
print"接続失敗\n";
exit;
}

これで、接続失敗と出てしまうんですが。文法的な間違いはありますか?
文法的な間違いがないとしたら何が原因にあげられるでしょうか?
どなたかご教授お願いします。
(サーバーにmysqlはインストールされています。ユーザ名、パス等もあってると思われます。
808デフォルトの名無しさん:2005/12/05(月) 11:16:43
perlでアクセスする前にmysqlに直接アクセス出来てるかどうか確認
809ヽ(´ー`)ノ ◆.ogCuANUcE :2005/12/05(月) 12:05:39
>>807
$DBI::errstr
810ヽ(´ー`)ノ ◆.ogCuANUcE :2005/12/05(月) 12:06:31
age てもた。スマソ
811デフォルトの名無しさん:2005/12/05(月) 15:41:28
許しません
812デフォルトの名無しさん:2005/12/05(月) 16:48:25
俺に免じて許してあげてください
813デフォルトの名無しさん:2005/12/05(月) 17:21:59
許すよ
814デフォルトの名無しさん:2005/12/05(月) 17:38:40
質問です。

10文字のアルファベットa,b,・・i,jを0,1,2のいずれかに変換し、すべての組み合わせ
(3の10乗通り)を配列に格納したいのですがどのように書けばいいかわかりません。
なにぶん初心者で苦戦しております。わかる方がいらっしゃいましたら教えていただきたいです。
815デフォルトの名無しさん:2005/12/05(月) 17:47:45
>>814
「a,b,・・i,jを0,1,2のいずれかに変換し」
の意味がわからんな。
つか、アルファベッと数字、独立してね?
変換する意味あんの?
816デフォルトの名無しさん:2005/12/05(月) 18:08:39
3 ** 10 のパターンを列挙するだけじゃね?
なんか宿題くさいが。
817ヽ(´ー`)ノ ◆.ogCuANUcE :2005/12/05(月) 18:57:50
こんなんかな。

use strict;
use warnings;

use Data::Dumper;


my @nPRk = ([]);

foreach (1 .. 10) {
@nPRk = map {
my $__ = $_;
map { [ @$__, $_ ] } (0 .. 2);
} @nPRk;
}

my @result = map { my %hash = (); @hash{'a' .. 'j'} = @$_; \%hash; } @nPRk;

print Dumper(@result);

適当なので真面目にやるなら Math::Combinatorics でも使った方がいいと思うがね。
818814です:2005/12/05(月) 19:17:46
>815さん
変換というか、置換ですね申し訳ないです。
とくに0,1,2にこだわるわけではなく3つのグループに振り分ける組み合わせ
が知りたかったんです。
819デフォルトの名無しさん:2005/12/05(月) 19:24:13
>>818
a,b,・・i,j から3つ選んで (a, b, c) というリストを作る。
このリストのすべての組み合わせを作れ。
ってことか。
(a,a,a)とか同じ文字が入るのはだめなのか?
820デフォルトの名無しさん:2005/12/05(月) 19:52:23
>>818
何をどうしたいのか分かんねぇよ。
もうちょっと分かる様に説明しろや。
821デフォルトの名無しさん:2005/12/05(月) 19:59:14
エスパー募集中
822デフォルトの名無しさん:2005/12/05(月) 20:10:30
残念、今日は仁丹が切れていたようだ
823デフォルトの名無しさん:2005/12/05(月) 21:13:44
>>797
一応、systemやopenは大丈夫だし、
予めforkしておけば、Tkを使ってない側ではforkし放題だけどね。
なぜか、スレッドは予め生成してても駄目。

>>814
ほらよ、
@table = (
 {a=>0,b=>0,c=>0,d=>0,e=>0,f=>0,g=>0,h=>0,i=>0,j=>0},
 {a=>0,b=>0,c=>0,d=>0,e=>0,f=>0,g=>0,h=>0,i=>0,j=>1},
 {a=>0,b=>0,c=>0,d=>0,e=>0,f=>0,g=>0,h=>0,i=>0,j=>2},
 {a=>0,b=>0,c=>0,d=>0,e=>0,f=>0,g=>0,h=>0,i=>1,j=>0},
  :(中略)
 {a=>2,b=>2,c=>2,d=>2,e=>2,f=>2,g=>2,h=>2,i=>2,j=>2} );

課題は変換表を作るコード臭いが、質問の答えならこれで充分だろ。
コピー&ペースト&置換の繰返しだと、全要素完成まで10分程度かな。
824デフォルトの名無しさん:2005/12/05(月) 23:57:44
ちょっと難しい質問かもしれませんが、
パチスロのシミュレータを作っていまして、65536までの整数の乱数を発生させています。
(そのうちの50までが当たりなどというシステムです。)
しかし、
$rand=int(rand 65536);
では何故か片寄ってしまいます。
srand(time()^($$+($$<<15)));
を記述しても片寄ります。

どんな方法で乱数を発生させているのかは把握していないのですが、
本当にランダムな整数を発生させるような方法がわかるかたがいたら教えて下さい。
(もちろん「本当にランダム」ということはあり得ないことはわかっていますが)
825デフォルトの名無しさん:2005/12/05(月) 23:59:53
「片寄ってる」ってどういう状態なのかくわしく
826デフォルトの名無しさん:2005/12/06(火) 00:17:50
片寄ってませんでした。勘違いですいません。
827デフォルトの名無しさん:2005/12/06(火) 00:25:23
ときどきいるんだよ。1から100までの乱数を発生させているのに、
100回出力する前に同じ数字が2度出てきました。このプログラム
壊れています!!! と叫びながら下半身裸で飛び出してくる奴が。
828814です:2005/12/06(火) 00:26:38
みなさんどうもすみません&ありがとうございます。

>819さん
わかりづらくてすいませんでした。
たとえば(a,b,c,d,e,f,g,h,i,j,)→(0,1,0,0,2,2,1,2,0,2)
のようにしたかったのです。
829デフォルトの名無しさん:2005/12/06(火) 00:27:03
>下半身裸

詳しく
830デフォルトの名無しさん:2005/12/06(火) 01:31:55
>>829
オレオレ
831デフォルトの名無しさん:2005/12/06(火) 01:35:14
>>827
高校の数学の問題なんかにあるね。

「1から10までの乱数を10個発生させたときに、同じ値がひとつも
存在しない確率はどれくらいか?」

10の階乗 ÷ 10の10乗 = 0.00036288
832デフォルトの名無しさん:2005/12/06(火) 02:30:17
>>824
randはOS依存だし、そういう偏り方を気にする場合はMT法お勧め
http://search.cpan.org/~ams/Math-Random-MT-1.04/MT.pm
833デフォルトの名無しさん:2005/12/06(火) 02:38:52
どこまで実装するかによるけど、パチスロのシュミレータなら乱数じゃな
くて Time-HiRes でタイミング依存にした方が実機に近いかもしれないね。
834デフォルトの名無しさん:2005/12/06(火) 02:52:07
>>830
               ∧ ∧
             〃⌒ ヽl|l)  …ぅぉぇっぷ
            /   rノ ;
           Ο Ο_)***
835デフォルトの名無しさん:2005/12/06(火) 03:29:37
質問です。

今、perlでgoogleを使用して検索しようとするプログラムを
作ろうとしているですが、(IEやmozillaなどのブラウザを立ち上げずに)
Googleの入力フォームに検索したい文字列を代入して、
検索させるうまい方法が思い付きません。

Yahooニュースなどから、キーワード(国内、海外、経済etc)以下の
それぞれのトッピックを抜き出したりするなど、すでに記述されて
いる文章を読み込み、出力させることなどはできるのですが、
ポータルサイトなどで、検索して、検索結果を出力させるには
どうすればいいかわからず困っているので、知識をかしてください。
836デフォルトの名無しさん:2005/12/06(火) 03:36:43
>>835
クエリを自動生成してやりゃ出来る、といいたいところだが。
Googleの利用規約読んだことあるか?
ttp://www.google.com/intl/ja/terms.html
> 自動クエリの禁止
> Google による明示的な事前の許可なくして Google のシステムに対して
> いかなる自動クエリを送信することも禁止します。 「自動クエリ」には、
> Web サイトがさまざまなクエリに対して Google のどの位置に「ランク付け」
> されるかを判定するために Google にクエリを送るソフトウェアの使用が含まれます。

GoogleAPIなんてのもあるから調べて見れ
http://pc8.2ch.net/test/read.cgi/php/1018614427/
日本語がまともに動かなかった気がするけどな
837いつもお世話になっております:2005/12/06(火) 04:21:53
>>814
頭の体操のつもりが、やっつけ仕事気味なんだけれど、
モジュールを使わず組んでみました。
このスクリプトでは、55980通りの結果が出ました。

#! /usr/bin/perl -w

$cols = 10; $total = 0; $result = '';

sub three (¥$¥@) {
my ($digits, @totals) = @_;

if (length $digits == $cols) {
if ($totals[0] > 0 && $totals[1] > 0 && $totals[2] > 0) {
$result .= $digits."¥n"; $total++;
}
return;
}
else {
for (my $i=0; $i<3; $i++) {
$totals[$i]++; &three($digits.$i, @totals); $totals[$i]--;
}
}
}
&three('',(0,0,0));
$total = "total count: $total¥n";
print $total;
open(OUT, '>'.$ENV{'HOME'}.'/result.txt');
print OUT $result, $total;
close(OUT);
838デフォルトの名無しさん:2005/12/06(火) 04:24:52
839いつもお世話になっております:2005/12/06(火) 04:30:27
補足
ちなみに、3つのグループに分かれていない組み合わせは排除しています。
「if ($totals[0] > 0 && $totals[1] > 0 && $totals[2] > 0) {」の行と、
その2行下の「}」をコメントアウトすれば、1または2つのグループに
しか分かれなかった結果も出力します。(その場合、54049通り)
840いつもお世話になっております:2005/12/06(火) 04:39:09
あら。pm のときのクセが。
841いつもお世話になっております:2005/12/06(火) 04:45:40
タイポ…。

>>839
> ×(その場合、54049通り)
> ○(その場合、59049通り)
842デフォルトの名無しさん:2005/12/06(火) 05:34:32
乱数について尋ねた者ですが、そんな単純な事ではありませんでしたよ。まあ自己弁護。
843デフォルトの名無しさん:2005/12/06(火) 05:45:53
>>842
同じ「乱数」だからということで
パチスロの乱数ロジックを再現できると勘違いして
自己弁護している香具師発見。
844デフォルトの名無しさん:2005/12/06(火) 06:09:39
重度のスロッター発見
845酩酊 ◆TWARamEjuA :2005/12/06(火) 07:38:30 BE:4900695-###
パチスロにしろフィーバーにしろ乱数に依存していない罠。
純粋に乱数使うとでんでん面白くない罠。
846デフォルトの名無しさん:2005/12/06(火) 08:01:30
ふうむ。そのロジックとやらを教えてちょんまげ。
847デフォルトの名無しさん:2005/12/06(火) 08:09:40
ぷぷ
848デフォルトの名無しさん:2005/12/06(火) 08:32:13
もう逃げるのか・・・
849デフォルトの名無しさん:2005/12/06(火) 10:51:58
はいはい、低脳なやり取りはWebProg板でどうぞ
850デフォルトの名無しさん:2005/12/06(火) 11:38:48
もう一度いう おれは天才だ!  うわらば
851デフォルトの名無しさん:2005/12/06(火) 11:41:02
>>849
ロジックを示せないからって
唐突に両成敗を狙うのは不自然すぎますよ(^^)
852835:2005/12/06(火) 11:49:43
>>836
なるほど…こんな規約があったのか
853デフォルトの名無しさん:2005/12/06(火) 13:13:07
>>851
お前ランダムの意味わかってないだろ
854デフォルトの名無しさん:2005/12/06(火) 13:15:55
アムロが乗るやつだぞ
855デフォルトの名無しさん:2005/12/06(火) 15:56:55
化粧品メーカーでしょ?
856デフォルトの名無しさん:2005/12/06(火) 15:58:02
アムロが乗ったのはSAMだよね?
857デフォルトの名無しさん:2005/12/06(火) 16:09:20
はいはい、低脳なやり取りはWebProg板でどうぞ
858デフォルトの名無しさん:2005/12/06(火) 17:24:43
フリーダム
859デフォルトの名無しさん:2005/12/06(火) 20:05:37
頭悪い質問ですみません。

ActivePerlなんですけど、ppmでモジュールをインストールして、

-----
BEGIN {
unshift (@INC, "..");
}

use 〜(インストールしたモジュール名) ;
-----
とかやっても
Can't Locate 〜(モジュール名)in @INC〜
と怒られてしまいます。

うまく行くときといかないときがあってよく分かりません。
何が原因かお分かりの方がいらっしゃいましたら、ご教授ください。
860デフォルトの名無しさん:2005/12/06(火) 20:14:50
>>859の補足です。

うまく行くときと行かないときと言うのは、前にもやったんですけど
できなくてぐちゃぐちゃやってるうちに、
いつの間にかできるようになってたということです。

ファイル自体はきちんとsite/lib/に出来ています。
実行cgiと同じディレクトリわざと置いても認識しません。
861デフォルトの名無しさん:2005/12/06(火) 20:19:01
>>859-860
再現性の無い不具合の解決方法は君にしか分からない。

site/lib/ は始めから @INC に登録されているので、わざわざ
親ディレクトリを追加したりモジュールのファイルを移動させる
必要はない。
862デフォルトの名無しさん:2005/12/06(火) 20:24:15
>>861
レスありがとうございます

ということはBEGIN以下は不要ということですね。
(といっても変えても状況は変わりませんが・・・)

もう少しいろいろやってみます。
どうもありがとうございました。
863デフォルトの名無しさん:2005/12/06(火) 22:40:05
エラーメッセージの省略した部分にどのファイルをさがしたかと
そのときの@INCの内容がかかれているはずだから、そこにファイルが
あるかどうか確認するのが基本。わけもわからず適当にいじっても
時間の無駄というものだ。
864デフォルトの名無しさん:2005/12/06(火) 23:03:03
んで、乱数のロジックがわかるなら教えてくれよ。
865デフォルトの名無しさん:2005/12/07(水) 00:02:19
>>864

1)種を与える

2)種をアドレスとして適当なところを読んで乱数値とする

3)読んだデータを次の種にする

866デフォルトの名無しさん:2005/12/07(水) 06:36:29
もっとわかりやすく具体的に滑舌よく。
867デフォルトの名無しさん:2005/12/07(水) 07:06:44
もっと力強く明日への希望を込めて。
868デフォルトの名無しさん:2005/12/07(水) 07:34:18
確かにActivePerlのPPMって動作変。
動く人ってどう設定してるんだろう。
インストールしてそのままでも動いたためしない。
869デフォルトの名無しさん:2005/12/07(水) 08:08:20
>>868
旧版に上書きインストールしてるなら、古い設定が邪魔してないか
レジストリや %INSTALL_PATH%\site\lib\ppm-conf を確認してみ。
対話型インターフェイスで設定するより、*.cfg を直接編集した方が
楽な場合もある。

それとヴァージョンによって結構仕様が変わってるから、解説サイト
の類はアテにせず、正規のドキュメントを読むこった。
http://aspn.activestate.com/ASPN/docs/ActivePerl/5.8/faq/ActivePerl-faq2.html
870デフォルトの名無しさん:2005/12/07(水) 08:31:43
>>869
上書きインストールじゃないのは当然ですよ。
それにドキュメントとか全く関係ないレベルで動作しないんだよね。
仕方ないから普段はモヂュールは使わない、仕方なく使うときは
手動でインストールしてるよ。
871デフォルトの名無しさん:2005/12/07(水) 08:46:50
上書きインストールしても普通に動いてる俺って・・(´・ω・)
872デフォルトの名無しさん:2005/12/07(水) 08:55:16
Cygwin perlでいいじゃん???
873デフォルトの名無しさん:2005/12/07(水) 09:07:57
ActivePerl普通にインストールして普通に動いてるんだが
874デフォルトの名無しさん:2005/12/07(水) 09:14:15
>>871 >>873
普通は上書きインストールでも問題無く動くよ。複数ヴァージョンを
同時に使う方がレジストリ設定の奪い合いでおかしくなったりする。

>>872
Perl だけの為に Cygwin 入れるなら ActivePerl の方がスマートだし、
Tk や Win32 関係のモジュールが最初から付いてくるし、コンパイラを
用意していない環境でも PPM でバイナリがインストールできる。あと
Cygwin だと改行コードの自動変換に絡む要素が一つ増えるから、
その分トラブルシューティングが面倒になる。

これらを考慮の上で Cygwin Perl を使うメリットの方が大きい人は
Cygwin Perl を使えばいいんじゃないかな。
875デフォルトの名無しさん:2005/12/07(水) 10:51:41
あれ?
use strictしたらヒアドキュメントが使えなかったはずなのに
いつの間にか使えるようになってる
俺の勘違いだったのかなぁ
876デフォルトの名無しさん:2005/12/07(水) 12:13:19
> use strictしたらヒアドキュメントが使えなかったはずなのに
( Д )゚ ゚
877デフォルトの名無しさん:2005/12/07(水) 13:11:44
(「・ω・)「アンチョビー
878デフォルトの名無しさん:2005/12/07(水) 13:56:44
>>870
んな不具合あるわけねーべ。 どう考えたっておたくの環境問題だべ。
879デフォルトの名無しさん:2005/12/07(水) 22:35:36
プログラムを実行すると、
Wide character in subroutine entry at C:/Perl/lib/Encode.pm line 166.
とエラーが返ってくるのですが、どうも原因が分かりません。
プログラムを載せるので、原因を指摘していただけないでしょうか?
880デフォルトの名無しさん:2005/12/07(水) 22:36:39
usestrict;
useLWP::UserAgent;
useHTML::TokeParser;
useURI;
useencoding 'shiftjis';
binmode(STDERR, ':raw :encoding(shiftjis)');
useEncode;

my $baseURL = 'http://search.auctions.yahoo.co.jp/jp/search/auc';

my $keyword = shift @ARGV || die;

my $threshold = shift @ARGV || die;

my $ua = LWP::UserAgent->new;
my $url = URI->new($baseURL);
$url->query_form(
p=> encode('euc-jp', $keyword),
auccat=> '0',
alocale=> '0jp',
acc=> 'jp'
);
881デフォルトの名無しさん:2005/12/07(水) 22:37:36
my $response = $ua->get($url, 'Accept-Language' => 'ja,en');

while ($response ->is_success){

my $content = decode('euc-jp', $response->content);

my $stream = HTML::TokeParser->new (\$content) or die "\n";

while (my $tag = $stream->get_tag('td')){
last if $tag->[1]{colspan} && $tag->[1]{colspan} eq '5';
}

while (my $tag = $stream->get_tag('td')){
next unless $tag->[1]{align} && $tag->[1]{align} eq 'left';
$tag = $stream->get_tag('a');
my $descURL = $tag->[1]{href};
my $productName = decode('shiftjis', $stream->get_trimmed_text('/a'));
while ($tag = $stream->get_tag('td')){
last if $tag->[1]{align} && $tag->[1]{align} eq 'right';
}
my $currentPrice = decode('shiftjis', $stream->get_trimmed_text('/td'));
my $currentP = $currentPrice;
$currentP =~ s/[, 円]//g;
882デフォルトの名無しさん:2005/12/07(水) 22:38:13
if ($currentP < $threshold){

my $description = $ua->get($descURL, 'Accept-Language' => 'ja,en');
$description = decode('euc-jp', $description->content);
my ($reservedPrice) =
$description =~ m!希望落札価格:</b></td><td bgcolor=ffffcc><b>(.*?円)!mis;
$reservedPrice = '-' unless($reservedPrice);
my ($deadline) =
$description =~ m!<tr><td>終了日時:</td><td>(.*?分)!mis;
print "$productName\n ($descURL)\n";
print " $currentPrice ($reservedPrice) : $deadline\n\n";
}
}
$content =~ m!<a href="([^"]+)">\n次の\d+件!mis;
my $nextURL = URI->new_abs( $1, $baseURL);
$response = $ua->get($nextURL, 'Accept-Language' => 'ja,en');
}
883デフォルトの名無しさん:2005/12/07(水) 22:39:32
sub URI::query_form {
my $self = shift;
my $old = $self->query;
if (@_) {
my @query;
while (my($key,$vals) = splice(@_, 0, 2)) {
$key = '' unless defined $key;
$key =~ s/([;\/?:@&=+,\$\[\]%])/$URI::Escape::escapes{$1}/g;
$key =~ s/ /+/g;
$vals = [ref($vals) ? @$vals : $vals];
for my $val (@$vals) {
$val = '' unless defined $val;
884デフォルトの名無しさん:2005/12/07(水) 22:39:58

my @work = unpack('C*', $val);
$val = '';
foreach my $c (@work) {
if((($c >= 0x30) && ($c <= 0x39)) ||
(($c >= 0x41) && ($c <= 0x5A)) ||
(($c >= 0x61) && ($c <= 0x7A))) {
$val .= chr($c);
} elsif ($c == 0x20) {
$val .= '+';
} else {
$val .= sprintf("%%%02X", $c);
}
}
push(@query, "$key=$val");
}
}
$self->query(join('&', @query));
}
return if !defined($old) || !length($old) || !defined(wantarray);
return unless $old =~ /=/;
map { s/\+/ /g; uri_unescape($_) }
map { /=/ ? split(/=/, $_, 2) : ($_ => '')} split(/&/, $old);
}
#終わりです。お願いします。
885デフォルトの名無しさん:2005/12/07(水) 22:52:38
色々と突っ込みどころはあるが、まず

>C:/Perl/lib/Encode.pm line 166.

って書いてあるんだから、Encodeの関数の使い方に問題があるってのは分かるだろ
関係ないゴミソースを延々と載せるな
886デフォルトの名無しさん:2005/12/07(水) 22:56:14
すみません。Encode関数の使い方もどこがまちがっているのかがいまいち分かりません。
887デフォルトの名無しさん:2005/12/07(水) 23:03:44
decode関数の使い方を間違えとる
from_toでGuess使え
888デフォルトの名無しさん:2005/12/07(水) 23:15:13
ご指摘ありがとうございます。
すみませんが、具体的にどの場所でどう使えばよいのでしょうか?
889デフォルトの名無しさん:2005/12/07(水) 23:16:21
decode関数使ってるところを、from_toに置き換えろってこと

use Encode qw{from_to};
use Encode::Guess qw{euc-jp shiftjis 7bit-jis utf8};
890デフォルトの名無しさん:2005/12/07(水) 23:29:38
useを>>889のようにし、decodeをfrom_toに置き換えたのですがうまくいきませんでした。
置き換えたことによって他に書き換える部分はあるのでしょうか?
891デフォルトの名無しさん:2005/12/07(水) 23:32:58
まさか
s/decode/from_to/g
しただけじゃないだろうな・・
892デフォルトの名無しさん:2005/12/07(水) 23:46:26
申し訳ありませんがfrom_toの使い方自体がよくわかりません。
いちおう参考書の通りのプログラムなのですが・・・
893デフォルトの名無しさん:2005/12/07(水) 23:54:23
まず参考書を窓から投げ捨てるところから
894デフォルトの名無しさん:2005/12/07(水) 23:55:27
このまま実行してもうまくいくはずないですか?w
895デフォルトの名無しさん:2005/12/07(水) 23:56:23
初心者にencodingプラグマの使用を勧めてる時点でまともじゃなさそうだな…
896デフォルトの名無しさん:2005/12/08(木) 00:06:54
学校で正規表現を一応理解して、次に与えられた選択課題がこれなんですが…
897デフォルトの名無しさん:2005/12/08(木) 00:54:06
モジュールの使い方が分からなかったらここで検索しようね

http://search.cpan.org/
898デフォルトの名無しさん:2005/12/08(木) 01:00:03
おい、CGIスレっぽくなってきたぞ。
899デフォルトの名無しさん:2005/12/08(木) 01:12:34
上等だ
900 :2005/12/08(木) 02:12:08
perlでの辞書の作り方をおしえてください。
文字を入力するとファイルの中からそれの説明文がでてきて、対象がない場合は
ファイルに説明文を登録できるようなかたちのやつを。
901デフォルトの名無しさん:2005/12/08(木) 02:14:46
>>900
■こんなCGI作ってください■ Part.2
http://pc8.2ch.net/test/read.cgi/php/1133361560/
902 :2005/12/08(木) 02:33:00
>>901
どうもー
903デフォルトの名無しさん:2005/12/08(木) 03:41:05
>>896
宿題は自分でやろうな、坊や
904デフォルトの名無しさん:2005/12/08(木) 12:09:24
>>896
その手の学校のテキストはまず使い物にならんよ
905デフォルトの名無しさん:2005/12/08(木) 13:36:56
学校で習う オシベとメシベぐらい概念だけで役にたたん
906デフォルトの名無しさん:2005/12/08(木) 15:10:33
学校wwww何を想像して物言ってんだコイツwwwww
恥知らず NEET ウザスwwwwwww
907デフォルトの名無しさん:2005/12/08(木) 15:16:35
文字列で2文字以上同じ文字が連続した部分だけ1文字に置換する方法を教えてください
908デフォルトの名無しさん:2005/12/08(木) 15:23:03
909デフォルトの名無しさん:2005/12/08(木) 15:41:58
>>907

こういう質問ってなんだ?
わざとなのか?ネタなのか?
910デフォルトの名無しさん:2005/12/08(木) 17:07:15
>>909
釣りか宿題かどっちか。

911デフォルトの名無しさん:2005/12/09(金) 00:00:30
perlでソースビューワーを作りたいんですがどうもうまくいきません
お力お貸しください。
912デフォルトの名無しさん:2005/12/09(金) 00:02:36
つ perl -pe'' source.c
913デフォルトの名無しさん:2005/12/09(金) 10:27:46
つ 行番号付き
perl -ne 'printf "%4d|%s",$.,$_' source.c
914デフォルトの名無しさん:2005/12/09(金) 18:37:07
なんかスレの質が低下しているなぁ。
http://pc8.2ch.net/test/read.cgi/php/1024795138/833-
今は、こっち↑の方が質が高いぞ。
915デフォルトの名無しさん:2005/12/09(金) 19:42:01
そっちも大して変わらない件について
916デフォルトの名無しさん:2005/12/09(金) 19:57:54
>>915が質の違いを理解できない件について
917デフォルトの名無しさん:2005/12/09(金) 20:09:31
>>916
そうやって説明を放棄するのはよくない傾向
918デフォルトの名無しさん:2005/12/09(金) 20:09:59
いいから、perlの話をしろ。
919915:2005/12/09(金) 20:56:31
はは、WebProg板を見てる俺にとっては何ともないぜ
920デフォルトの名無しさん:2005/12/10(土) 00:00:13
むかしむかしあるところに
921デフォルトの名無しさん:2005/12/10(土) 02:26:23
単品の話題を扱ってるスレと質問スレを比べる意味が分からん。
922デフォルトの名無しさん:2005/12/10(土) 07:12:39
>>912
できないんですが…
923デフォルトの名無しさん:2005/12/10(土) 07:54:16
ハイハイ -e のあとにスペーススペース
924デフォルトの名無しさん:2005/12/10(土) 08:39:32
>>923
スペース要らんよ。シングルクォート→ダブルクォートに300ガバス。
http://search.cpan.org/~nwclark/perl-5.8.7/pod/perlrun.pod#%23!_and_quoting_on_non-Unix_systems
925デフォルトの名無しさん:2005/12/10(土) 13:46:15
>>921
そうカリカリすんなよ学生さん
926デフォルトの名無しさん:2005/12/10(土) 15:46:17
質問はまだかね
暇で暇でしょうがない
927デフォルトの名無しさん:2005/12/10(土) 16:14:33
>>925
>>921の発言がそんなに腹たったの?
928デフォルトの名無しさん:2005/12/10(土) 16:18:49
>>927
うん
929デフォルトの名無しさん:2005/12/10(土) 16:24:17
質問はまだかね!!
930デフォルトの名無しさん:2005/12/10(土) 16:25:27
あげてみる
931デフォルトの名無しさん:2005/12/10(土) 16:59:03
すみません、質問させて下さい
>perl -MCPAN -e shell
で最初に設定する事柄を、後で変更するにはどうすれば良いのでしょうか?
932931:2005/12/10(土) 17:44:31
自己解決したわ
933デフォルトの名無しさん:2005/12/10(土) 17:54:47
>931 ではありませんが、
ftp 不可、proxy経由でhttpのみ可能な環境で
perl -MCPAN -e shell
するにはどうすればよいでしょうか?
934デフォルトの名無しさん:2005/12/10(土) 18:28:43
初歩的な質問ですが検索しても見つからなかったので質問させてください。
ハッシュのキーとして.(ピリオド)と@を含む文字列、
つまるところメールアドレスを取ることはできるのでしょうか。
935デフォルトの名無しさん:2005/12/10(土) 18:29:18
出来ます
936デフォルトの名無しさん:2005/12/10(土) 18:31:55
>935
ありがとうございます
937デフォルトの名無しさん:2005/12/10(土) 18:35:02
それだけかよ!
それぐらいすぐテストできるだろ!
938デフォルトの名無しさん:2005/12/10(土) 19:14:58
Windows版 ActivePerl を使用しています。
*.pl ファイルをダブルクリックして実行するとエラー時にDOS窓が閉じてしまって、
エラーメッセージが読めません。
dos窓を一度開いてからコマンドを入れて実行するとエラーメッセージが読めるのですが、
操作が煩雑になります。
ダブルクリックしたときにエラーメッセージを残すための良いアイディアはないでしょうか?
939デフォルトの名無しさん:2005/12/10(土) 20:07:21
一番最後の行に
`pause`;
940デフォルトの名無しさん:2005/12/10(土) 20:16:32
>>939
それでもエラー時は終了されるよ
941デフォルトの名無しさん:2005/12/10(土) 20:46:50
ネコミミがついてないやしには難しいな。

eval {
 &your_main_routine();
}
if ($@) {
 print $@;
 `pause`;
}

これでどうだ。
942デフォルトの名無しさん:2005/12/10(土) 20:55:15
今Perlの勉強してるのですが
正確な1秒を刻んでいく関数は何があるのでしょうか

どうもsleepは正確ではないようなので
943デフォルトの名無しさん:2005/12/10(土) 21:03:43
>>942
正確って、どれくらいの正確さを求めてるんだ?
所詮、PCの時計の精度以上は出ないぞ。
944デフォルトの名無しさん:2005/12/10(土) 21:06:24
>>941
それでもだめだよ
しっかりしろ回答者!
945デフォルトの名無しさん:2005/12/10(土) 21:07:14
>>942
つ Time::HiRes
946デフォルトの名無しさん:2005/12/10(土) 21:24:52
>>911
ソースビューワー
my @work = unpack('C*', $val);
$val = '';
foreach my $c (@work) {
if((($c >= 0x30) && ($c <= 0x39)) ||
(($c >= 0x41) && ($c <= 0x5A)) ||
(($c >= 0x61) && ($c <= 0x7A))) {
$val .= chr($c);
} elsif ($c == 0x20) {
$val .= '+';
} else {
$val .= sprintf("%%%02X", $c);
}
}
push(@query, "$key=$val");
}
まるうつしでつw
947デフォルトの名無しさん:2005/12/10(土) 22:02:52
>>944
面倒くさいなあ。いいからネコミミをつけろ。話はそれからだ。

こういうバッチファイルならどうだ。
文法エラーでもdieでもきちんとpauseする。
「今度は窓が開きっぱなしになっちゃうよ!」と言う前に
エクスプローラでこのバッチファイルを右クリックして
プロパティを確認するんだ。下半身裸で。

@echo off
perl -x "%0"
if ERRORLEVEL 1 goto errorend
goto theend

#!perl

# ここらへんにperlのコードを書け

sub routine { # カッコが閉じてない文法エラー

__END__

:errorend
pause
:theend
948939:2005/12/10(土) 22:31:40
エラーだと実行されないから駄目だたね。

---ここから---
@echo off
"C:\Perl\bin\perl" %1
echo; & echo ---perl end---
pause>nul
---ここまで---
をperl.batとかで保存してpl,cgiを関連付けるか
ソースファイルをper.batにドラッグ&ドロップ。
エディタと連携させるとボタン一つで実行出来て便利。
949947:2005/12/10(土) 23:48:36
あと、あれだな。perl5.6.1以降なら CHECK が使えるか?
先頭あたりに

sub CHECK {`pause`}

と書いておく。
CHECK はコンパイル直後に実行される。
文法エラーでもきちんと動いてくれるぞ。
950デフォルトの名無しさん:2005/12/11(日) 00:40:33
エラー時と正常終了を振り分けないならcmd -kあたりですぐできそうだな
951デフォルトの名無しさん:2005/12/11(日) 11:38:43
質問マダァ-? (・∀・ )っ/凵⌒☆チンチン
952デフォルトの名無しさん:2005/12/11(日) 13:40:28
何でいつまでたっても標準ライブラリにHTTP関係が含まれないんですかね
不便この上ない
953デフォルトの名無しさん:2005/12/11(日) 13:52:17
5.8系ならLWPあるだろ
954デフォルトの名無しさん:2005/12/11(日) 13:54:30
955デフォルトの名無しさん:2005/12/11(日) 13:56:27
なんでうちの環境じゃ5.8入れて何も弄ってないのにLWP入ってるんだ・・・
956デフォルトの名無しさん:2005/12/11(日) 14:30:27
ActivePerlだからかと。
一応、ActivePerlでも非標準モジュールはsite/lib以下に配置されてる。
957デフォルトの名無しさん:2005/12/11(日) 14:32:17
>>956
ああ本当だ
ボケてたorz
958デフォルトの名無しさん:2005/12/11(日) 14:37:00
use Fcntl qw{:flock};

この :flock ってのはどういう意味なのでしょうか?
959デフォルトの名無しさん:2005/12/11(日) 14:42:43
960デフォルトの名無しさん:2005/12/11(日) 14:45:31
>>959
回答ありがとうございます
下の方のページで解説されてるようなんですが
英語が読めなくて分かりません・・・

:flock

↑これの、 : が何を意味するかが分からないんですが
質問下手ですみません
961958,960:2005/12/11(日) 14:52:42
すみません、なんとか自己解決しました
962デフォルトの名無しさん:2005/12/11(日) 15:30:28
use Hoge ('foo', 'bar');

この時、('foo', 'bar')にはモジュール内からどのようにアクセスすればよいのでしょうか?
963デフォルトの名無しさん:2005/12/11(日) 15:47:13
964デフォルトの名無しさん:2005/12/11(日) 20:37:07
答えるなよ。うぜえ。
965デフォルトの名無しさん:2005/12/11(日) 21:31:21
まぁまぁそんなに怒らずに。
回答するのが嫌ならこのスレから出て行くがよろし
966デフォルトの名無しさん:2005/12/11(日) 22:09:05
URL貼るだけだったら答えないほうがまし。
967デフォルトの名無しさん:2005/12/11(日) 22:13:27
うんこ
968デフォルトの名無しさん:2005/12/11(日) 22:41:40
>>966
なんで?その理屈がわからん。
969デフォルトの名無しさん:2005/12/11(日) 23:25:12
質問者が外部の文章を読んで理解するを強要するのは
良くないからだよ。そのくらいわかれ。
970デフォルトの名無しさん:2005/12/11(日) 23:30:52
(゚Д゚ )ハァ?
971デフォルトの名無しさん:2005/12/11(日) 23:31:01
なんで良くないの?
972デフォルトの名無しさん:2005/12/11(日) 23:39:50
外部・内部の意味が分からん。
973デフォルトの名無しさん:2005/12/11(日) 23:41:35
同じことを言うのに、よりよく説明している文献が
既にあるのであればそれを示すのは極めて合理的。
阿呆は無視しとけ。
974デフォルトの名無しさん:2005/12/11(日) 23:51:01
>>962-963
が答えになってないから言ってんじゃないの
リンク先には関係ない事しか書いてない
975デフォルトの名無しさん:2005/12/11(日) 23:58:04
どう見てもそれは理由になっていない。
976デフォルトの名無しさん:2005/12/12(月) 00:01:29
わかる方、力を貸して欲しいです。ほんと困ってます。
google web apiをperlで使って、検索語を含むWebページのヒット数、URL
を表示するようなプログラムを作りたくて、あるサイトのプログラムを参
考にして作ったのですが、実行したら英語のサイトのURLが表示されて、
明らかに検索語を含んでいません。
もしこうした方がいいという案がありましたら、教えていただきたいです。

自分はPerlをあまり使ったことがなく記述の仕方もいまいちわかっていない
状況です。自分なり本を読んで少しプログラムも書いてみたのですが
まだまだのようです。どうかよろしくお願いします。


use SOAP::Lite;
use Jcode;

my $googleSearch = SOAP::Lite -> service("file:GoogleSearch.wsdl");
my $key='LkML035QFHLEaaFEoFDfPd2VZFDzWGCE';
my $query="とんかつ";

my $result = $googleSearch -> doGoogleSearch($key,jcode($query)->utf8, 0, 10, "false", "", "false", "", "UTF-8", "UTF-8");
#print "About ".$result->{"estimatedTotalResultsCount"}."results.\n";

printf("query=%s %d results\n",$query,$result->{estimatedTotalResultsCount});
for $i(@{$result->{resultElements}}){
printf("%s,%s\n",jcode($i->{title})->euc,jcode($i->{URL})->euc);
}

977デフォルトの名無しさん:2005/12/12(月) 00:08:44
まぁ焦ってるのは分かるけどマルチはやめような
常識として

http://pc8.2ch.net/test/read.cgi/tech/1037383722/422
978デフォルトの名無しさん:2005/12/12(月) 00:48:34
つーか、このスレの 21箱目が立ったら、下の2つはスレスト依頼したほうがいいよね。
異論がなければ、そうしとくよ。

Perl言語に詳しい人に質問!
http://pc8.2ch.net/test/read.cgi/tech/1037383722/l50

超初級Perlが動きません助けてください。
http://pc8.2ch.net/test/read.cgi/tech/1106741950/l50
979デフォルトの名無しさん:2005/12/12(月) 01:05:11
>>974

http://www.kt.rim.or.jp/~kbk/perl5.005/perlmod.html#Perl_Modules
> Perlのモジュールは
>  use Module;
> とするか
>  use Module LIST;
> とすることによって、プログラムに取り込まれます。これは、
>  BEGIN { require Module; import Module; }
> や
>  BEGIN { require Module; import Module LIST; }
> とまったく等価なものです。

http://search.cpan.org/~nwclark/perl-5.8.7/lib/Exporter.pm
> DESCRIPTION
>
> The Exporter module implements an import method which allows a module
> to export functions and variables to its users' namespaces. Many modules
> use Exporter rather than implementing their own import method because
> Exporter provides a highly flexible interface, with an implementation
> optimised for the common case.
980デフォルトの名無しさん:2005/12/12(月) 01:08:21
>>979
上は答えになってないでしょ
下は英語で読めないし
もう少し考えろよ
981980:2005/12/12(月) 01:11:58
ごめん、無かった事にして
982デフォルトの名無しさん:2005/12/12(月) 01:13:54
つまるところ
URL出されただけじゃ答えを導くのはそう簡単じゃないので
説明付きで回答しろや、と
983デフォルトの名無しさん:2005/12/12(月) 01:23:35
それには同意
984デフォルトの名無しさん:2005/12/12(月) 02:07:52
>>965 の言う通り、回答するのが嫌ならこのスレから出ていけばいい。
URL 張るだけじゃなくてキチンと説明しろっていうなら、説明したい奴が
勝手にすればいいんでないの?
985デフォルトの名無しさん:2005/12/12(月) 02:11:34
よくわからんけど次スレよろ
立てるだけで誰かがテンプレ貼ってくれるなら俺が立てるけど
986デフォルトの名無しさん:2005/12/12(月) 02:29:49
WebProg の方でも書いたけど、>>2 の URL の変更。

クックブック: http://www.oreilly.co.jp/books/4873112028/
日本語ドキュメント検索: http://www.cpan.jp/search.cgi
987デフォルトの名無しさん:2005/12/12(月) 03:03:58
指導者が光臨してるし
988デフォルトの名無しさん:2005/12/12(月) 03:20:55
次スレ立ててくれるひとは、>>5-7の間違いの訂正よろしこ
989デフォルトの名無しさん:2005/12/12(月) 03:50:43
スレ立て行ってくる
990デフォルトの名無しさん:2005/12/12(月) 04:10:56
my $$self{next} = new BBS2ch::Thread 'Perlについての質問箱 21箱目';

次スレ
http://pc8.2ch.net/test/read.cgi/tech/1134327348/
991デフォルトの名無しさん:2005/12/12(月) 06:56:36
992デフォルトの名無しさん:2005/12/12(月) 08:05:29
>>982
質問者猛々しい
993デフォルトの名無しさん:2005/12/12(月) 08:07:21
次スレ移動ですか
994デフォルトの名無しさん:2005/12/12(月) 08:08:04
松竹梅
995デフォルトの名無しさん:2005/12/12(月) 08:09:40
松竹梅ってなんだよ
996デフォルトの名無しさん:2005/12/12(月) 08:11:31
松→竹→梅
997デフォルトの名無しさん:2005/12/12(月) 08:12:36
998デフォルトの名無しさん:2005/12/12(月) 08:13:18
999デフォルトの名無しさん:2005/12/12(月) 08:13:22
1000デフォルトの名無しさん:2005/12/12(月) 08:13:39
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。