[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2chのread.cgiへ]
Update time : 05/09 22:28 / Filesize : 164 KB / Number-of Response : 561
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 21:17:36 ]
"The duct tape of the Internet" こと、Perl についての質問箱です。
"There's more than one way to do it" ということで、
Perl の奥深さについて皆で語り合い、追求してまいりましょう。

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

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

www.perl.org/get.html
● 2009/02/09 現在の最新版: 5.10.0

▼ 前スレ
Perlについての質問箱 38箱目
pc11.2ch.net/test/read.cgi/tech/1221967332/

リンク集は >>2-3
Perl 日本語処理の基礎の基礎 >>4
過去スレは >>5-6 あたり

2 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 21:18:35 ]
[プログラミング自体の経験が無い奴はまずココを読め]
Perl プログラミング講座: ttp://www.site-cooler.com/kwl/perl/

[本]
リャマ: ttp://www.oreilly.co.jp/books/4873111269/
駱駝: ttp://www.oreilly.co.jp/books/4873110963/
Effective Perl: ttp://www.ascii.co.jp/books/books/detail/4-7561-3057-7.shtml (修正)
クックブック: ttp://www.oreilly.co.jp/books/4873112028/
Perl ベストプラクティス: ttp://www.oreilly.co.jp/books/4873113008/
Perl Hacks: ttp://www.oreilly.co.jp/books/9784873113142/

[オンラインマニュアル]
最新のドキュメント: ttp://search.cpan.org/dist/perl/
perl5.8.x のドキュメント(一部): ttp://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: ttp://www.kt.rim.or.jp/~kbk/perl5.005/
日本語ドキュメント検索: ttp://www.cpan.jp/search.cgi (停止中)
perldoc.jp: ttp://www.perldoc.jp/
perldoc.com: ttp://www.perldoc.com/

3 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 21:19:37 ]
[モジュール]
CPAN.com: ttp://search.cpan.org/
河馬屋二千年堂: ttp://homepage3.nifty.com/hippo2000/

[テクニック]
Perl メモ: ttp://www.din.or.jp/~ohzaki/perl.htm
Perl のページ: ttp://homepage1.nifty.com/nomenclator/perl/
Perl の小技: ttp://homepage3.nifty.com/hippo2000/perltips/index.htm

[Perl 5.8 Unicodeメモ]
ttp://www.rwds.net/kuroita/program/Perl_unicode.html (修正)
ttp://www.namazu.org/~tsuchiya/perl/perl-5.8.html
ttp://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html

4 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 21:20:36 ]
# [Perl 日本語処理の基礎の基礎]
# このレスは、Windows の ActivePerl で日本語処理を行う場合のテンプレートです。
# このレスの内容をそのまま、UTF8 形式のソースファイルに保存して下さい。
# 入出力ともシフト JIS 形式のファイルまたは DOS 窓を想定しています。
# まず、以下の行を先頭に入れて下さい。
use utf8;
use open IO => ":encoding(cp932)";
binmode STDIN => ":encoding(cp932)";
binmode STDOUT => ":encoding(cp932)";
binmode STDERR => ":encoding(cp932)"; # ※1
use Encode;
# 次に、あなたが実行したい処理の内容を入れて下さい。
$file = 'C:/なんたら/かんたら.txt';
open my $fh, '<', encode("cp932", $file) or die $! ; # ※2
print <$fh>;
# 以上の内容は、日本語処理が解らない人でも、とりあえず日本語処理ができてしまう
# おまじないです。条件が異なる場合の対処方法は、ご自分で勉強して下さい。
# 【注】※1. の行を入れると、DOS 窓への日本語出力は簡便になりますが、
# ソースファイル名に非 ANSI 文字が含まれる場合に die 文の出力が失敗します。
# ※2. OS に渡す文字列(ファイル名,dos コマンドのオプションなど)は、
# この例のように cp932 でエンコードする必要があります。

5 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 21:21:35 ]
[過去スレ1]
1 pc.2ch.net/tech/kako/1017/10177/1017736187.html
2 pc3.2ch.net/tech/kako/1033/10336/1033688230.html
3 pc2.2ch.net/tech/kako/1041/10412/1041205885.html
4 pc2.2ch.net/tech/kako/1048/10485/1048519394.html
5 pc5.2ch.net/tech/kako/1053/10530/1053053082.html
6 pc5.2ch.net/tech/kako/1060/10606/1060689008.html
7 pc2.2ch.net/test/read.cgi/tech/1068051036/ (事故により消滅)
8 pc2.2ch.net/test/read.cgi/tech/1074151549/ (事故により消滅)
9 pc5.2ch.net/test/read.cgi/tech/1079114157/
10 pc5.2ch.net/test/read.cgi/tech/1085564875/
11 pc5.2ch.net/test/read.cgi/tech/1090889189/
12 pc5.2ch.net/test/read.cgi/tech/1094579428/
13 pc5.2ch.net/test/read.cgi/tech/1097851764/
14 pc5.2ch.net/test/read.cgi/tech/1101649274/
15 pc5.2ch.net/test/read.cgi/tech/1105953092/
16 pc8.2ch.net/test/read.cgi/tech/1111034732/
17 pc8.2ch.net/test/read.cgi/tech/1117870308/
18 pc8.2ch.net/test/read.cgi/tech/1121804136/
19 pc8.2ch.net/test/read.cgi/tech/1126977805/
20 pc8.2ch.net/test/read.cgi/tech/1131286411/

6 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 21:23:01 ]
[過去スレ2]
21 pc8.2ch.net/test/read.cgi/tech/1134327348/
22 pc8.2ch.net/test/read.cgi/tech/1138519327/
23 pc8.2ch.net/test/read.cgi/tech/1141742901/
24 pc8.2ch.net/test/read.cgi/tech/1146022352/
25 pc8.2ch.net/test/read.cgi/tech/1149259409/
26 pc8.2ch.net/test/read.cgi/tech/1153412251/
27 pc8.2ch.net/test/read.cgi/tech/1157874614/
28 pc8.2ch.net/test/read.cgi/tech/1162273941/
29 pc11.2ch.net/test/read.cgi/tech/1166708139/
30 pc11.2ch.net/test/read.cgi/tech/1173880452/
31 pc11.2ch.net/test/read.cgi/tech/1181500187/
32 pc11.2ch.net/test/read.cgi/tech/1186995713/
33 pc11.2ch.net/test/read.cgi/tech/1192463997/
34 pc11.2ch.net/test/read.cgi/tech/1199977642/
35 pc11.2ch.net/test/read.cgi/tech/1208674881/
36 pc11.2ch.net/test/read.cgi/tech/1215569470/
37 pc11.2ch.net/test/read.cgi/tech/1218449440/
38 pc11.2ch.net/test/read.cgi/tech/1221967332/

7 名前:1 [2009/02/09(月) 21:24:29 ]
遅らせながら無いと寂しいので立てました。


8 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 21:29:52 ]
1おつ

9 名前:デフォルトの名無しさん [2009/02/10(火) 16:19:34 ]
下記のような配列を値として持つハッシュがある時

%hoge = {
"A" => [ 100, 300, 800 ],
"B" => [ 150, 50, 320 ],
"C" => [ 160, 220, 500 ]
};

配列n番目の値をソートしてハッシュからKey値を取り出したい。

たとえば、配列2番目(配列[1])の昇順に、ハッシュKeyを
"B", "C", "A" の順番に取り出す、ってなことをやりたい場合
どういうコーディングをすればいいのでしょうか?

よろしくお願いいたします。


10 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 20:33:01 ]
>>9
sort命令使えば一行でできるよ。

my @sortedkeys = sort { /* ここに配列の二番目を比較する方法を書く */ } keys(%hoge);



11 名前:デフォルトの名無しさん [2009/02/10(火) 21:40:03 ]
>>10
その配列の二番目を比較する方法の書き方を知りたいっていうのが質問の主旨なんじゃ・・・


12 名前:デフォルトの名無しさん [2009/02/10(火) 21:51:32 ]
$hoge{$a}[1] <=> $hoge{$b}[1]

13 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 01:45:35 ]
糞スレ立てんな、ほげ

14 名前:デフォルトの名無しさん [2009/02/11(水) 12:57:48 ]
調べてもよくわからなかったので質問です。
perlを用いてexcelデータから行、列ごとにデータを取りこみ、計算処理した後データをファイルに出力することは可能ですか?


15 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 12:59:50 ]
Yes, we can

CPANで探したらそれっぽいモジュールがあると思うよ

16 名前:デフォルトの名無しさん [2009/02/11(水) 13:13:05 ]
>>15
即レスありがとうございます。

ちょっと自分で調べてみますね

17 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 09:54:53 ]
ブックマークや直接入力したときでも、直前のURLを取得するには
どうしたらよいでしょうか?

18 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 10:18:54 ]
>>17
△▲ WebProg 初心者の質問 Part18 ▼▽
pc11.2ch.net/test/read.cgi/php/1219842559/

19 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 10:21:31 ]
>>18 誘導ありがとうございます 行ってきます

20 名前:デフォルトの名無しさん [2009/02/12(木) 15:40:13 ]
Catalyst-Plugin-FormValidator-0.02
で困っています。

全てのエラーチェックをエラーを表示するように設定しているのですが、
エラー項目が出力されず、かといって先に進めません。

エラーチェックは

if(not $result->has_error){
$c->stash->{template} = "form/cfm";
$c->detach("cfm", $item_id);

のようにして、エラーがなければ次へ行っているのですが$result->has_errorはなぜか真です。

どこがエラーしたか分かる方法とかありませんか?

すみませんがよろしくお願いします。



21 名前:デフォルトの名無しさん [2009/02/12(木) 15:45:14 ]
name属性のヴァリデート

> name => [qw/NOT_BLANK/, [qw/LENGTH 0 20/] ],

を外したら正常動作しました。不思議なのは、ブランクにすると
エラーが出ますし値を埋めても正常動作しない点です。
どなたか助けてください。

22 名前:デフォルトの名無しさん [2009/02/12(木) 15:58:39 ]
$result->invalidで調べると、間違ってもないのに
nameがinvalidになってます。何故なんでしょう・・・。

23 名前:デフォルトの名無しさん [2009/02/12(木) 16:00:28 ]
> name => [qw/NOT_BLANK/, [qw/LENGTH 0 20/] ],

の20を40にすると動きました。お騒がせしました。急いでいたので荒らし気味になってスマソ。

24 名前:デフォルトの名無しさん [2009/02/12(木) 18:20:56 ]
7文字で3x7=21でオーバーしてたのね・・・・。
しかも半角文字もUTF-8扱いで困った。

25 名前:デフォルトの名無しさん mailto:sage, [2009/02/13(金) 02:00:09 ]
以前、perlに詳しい人にソースを見てもらったときに
「もっと短くできる。とにかくperlは文字量、行数を節約して書くものだ」と言われました。
有名なperlの参考書にもそう書いてあります。
とにかくあらゆるテクニックを駆使して短く書くのがperlの美学のように書いてあります。
私は、他の言語では行数にこだわらず可読性を重視してソースを記述していました。
今、perlでやや大きめのプログラム(個人で使うツール)を作ろうとしています。
テクニックや行数圧縮にこだわらず自分が保守しやすい読みやすいコードを書きたいと
思っていますが、それはperlでは許されないのでしょうか。


26 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 02:18:43 ]
あまりにトリッキーなのはあれだけど
基本的にはシンプルに書けるなら
短い方がわかりやすいものだと個人的には思っている

27 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 02:25:18 ]
誰が許さないんですか?
言語仕様が許さないんならともかく、
書けるんなら自分が書きたいように書けばいいじゃないですか。
There's more than one way to do it っていう言葉もありますよ。

28 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 02:28:18 ]
>>25
お好きにどうぞ

29 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 10:11:00 ]

 「 可 読 性 」 は 禁 句

このスレの掟。

30 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 16:53:34 ]
>>25
許しまへんでー



31 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 16:58:26 ]
ひとつの事をするのにいくつものやり方があるのがPerlの哲学
自分の好きなように書けばおk

32 名前:デフォルトの名無しさん [2009/02/13(金) 17:31:37 ]
長く書いても短く書いてもどっちでもいいけど、

abc => "cde"
1 while
or die
$flag and

$_=$flag
/abc/ and 処理
/cdf/ and 処理
/ghi/ and 処理

$name->firstname->camel->output

辺りは知っといて欲しい。

33 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 19:49:49 ]
perlは簡潔に書いたときに可読性が増すように設計された言語だと思う。
ほかの言語だと、したい処理を表現するのに余計なことを書き込まなくてはいけない。
その余計なことはプログラムの流れにとって不自然なので注釈が必要になる。
25はほかの言語の仕様に毒されていてプログラムに無駄が多いんだろうね。
perlが可読性に乏しいと主張する人は単にperlについての知識が乏しいだけだ。

34 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 21:22:44 ]
Perlをよく知ってる人はより完結に書けるけど、あまり知らなくても
知ってる知識だけでプログラムが出来ちゃうところがPerlのいいところだと思う


35 名前:デフォルトの名無しさん [2009/02/13(金) 21:28:43 ]
でもuse strictしてないのとか、goto使ってるのとか、
ファイル1枚で絵巻物みたいに長いのは勘弁してください。

36 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 12:14:44 ]
Active perl にてwperlを使用してコマンドプロンプトを開かないようにしたいのですが
ソース内でシステムコマンド(たとえば`tasklist`とか)を使うとプロンプトが一瞬開きます。
これを開かないようにする方法ってありますか?

37 名前:9 mailto:sage [2009/02/15(日) 00:40:34 ]
>>10
>>12
ずいぶん亀になってしまいましたが・・・
ありがとうございます。
おかげさまでうまくいったデス。

38 名前:デフォルトの名無しさん [2009/02/15(日) 05:33:13 ]
Perl で、バイナリーデータを検索するにはどうしてますか?
1Mぐらいのデータを読んで、特定のデータを検索するのですが、
最初、index を使っていたら、これは、\r\nを1文字と解釈するようで、
位置がずれてしまいます。
代わりになる関数を探したけど、見つからないです。

39 名前:デフォルトの名無しさん [2009/02/15(日) 08:14:08 ]
>>38
Windowsで使ってるでしょ?

特殊変数の$/に「\n」を代入してから検索してみ?

40 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 12:01:37 ]
>>38
バイナリを扱うなら \r や \n といった論理的な表現を使わず \x0D や \x0A を使え。
print index join('', map chr, 0..31), "\x0A"; # 10

www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify



41 名前:デフォルトの名無しさん [2009/02/15(日) 12:08:27 ]
>>40
1行目は重箱の隅で本件とは関係なし。
2行目はなんなの?

$/ = "\n";
print index($a,$b);

で済む問題。

42 名前:デフォルトの名無しさん [2009/02/15(日) 13:07:18 ]
Perl始めて数日の初心者です
ActivePerlでWindowsでやっているのですが、Webで見つけたサンプルが
use strict;
use warnings;
use HTML::ExtractContent;
use LWP::UserAgent;

となっているのですが、モジュールのインストールの方法がまったくわかりません。
HTML::ExtractContentというのはsearch.cpan.org/dist/HTML-ExtractContent/
ここからダウンロードできたのですが、その先をどうしたらよいのでしょうか
LWPというのはとりあえずppmからインストールできました

43 名前:デフォルトの名無しさん [2009/02/15(日) 13:08:54 ]
>>42
>su
>password: ********
> cpan
:
:
[1]cpan>install HTML::ExtractContent

おしまい。

44 名前:42 [2009/02/15(日) 14:45:18 ]
コマンドプロンプトを開いて
install HTML::ExtractContent
と入力しエンターを押すとたくさんズラーっとでてきて最終的に

NMAKE : fatal error U1077: 'C:\WINDOWS\system32\cmd.exe' : return code '0xff'
Stop.
TARAO/HTML-ExtractContent-0.05.tar.gz
nmake test -- NOT OK
//hint// to see the cpan-testers results for installing this module, try:
reports TARAO/HTML-ExtractContent-0.05.tar.gz
Running make install
make test had returned bad status, won't install without force
Failed during this command:
ROBIN/Want-0.18.tar.gz : make NO
RCLAMP/Class-Accessor-Lvalue-0.11.tar.gz : make_test NO
TARAO/HTML-ExtractContent-0.05.tar.gz : make_test NO

cpan >

と表示されました。
インストールが完了したと思ったのでサンプルプログラムa.plを実行すると

C:\Documents and Settings\SX3WX06MA\デスクトップ>perl a.pl
Can't locate HTML/ExtractContent.pm in @INC (@INC contains: C:/Perl/site/lib C:/
Perl/lib .) at a.pl line 3.
BEGIN failed--compilation aborted at a.pl line 3.

となってしまいました
これはインストールが失敗したということでしょうか
もしかして、ダウンロードしたモジュールを特別な場所に移動してから
cpan>install HTML::ExtractContent
をしなければいけないのでしょうか

45 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 14:50:18 ]
>>44
> これはインストールが失敗したということでしょうか

そう書いてありますが。

46 名前:デフォルトの名無しさん [2009/02/15(日) 15:33:12 ]
>>44
cpanのログを読んでどこでcpan installがつまづいたか自力で探すしかないね。

47 名前:デフォルトの名無しさん [2009/02/15(日) 15:36:46 ]
追記。
d.hatena.ne.jp/KNOPP/
の一番最後の方を読むと幸せになるかもしれん。
ただWindowsだからどうなのかは知らん。

> Class-Accessor-Lvalue
> File-Slurp
> をPPMであらかじめいれておき、

そのあと cpan >installしてみたらどーなる?

48 名前:デフォルトの名無しさん [2009/02/15(日) 15:39:14 ]
もしかしてコンパイル環境がないからコケてるのか?
ぽつぽつとスマソ。

49 名前:38 [2009/02/15(日) 21:14:22 ]
>>39
ありがとうございました。
$/なる変数は、初めて知りました。

しかし、どうやら原因は、ほかでしたw。
FTP転送の際に、改行を勝手に変換してたため、\r\nが、\nだけになってたことでした。
これで、2文字が1文字扱いされてるなってw

50 名前:デフォルトの名無しさん mailto:binmode(sage) [2009/02/15(日) 21:16:42 ]
>>38
indexや正規表現を使ってる。
文字列がutf8に汚染されないように気をつけている程度かな。



51 名前:デフォルトの名無しさん [2009/02/15(日) 21:22:34 ]
>>50
それだとバイナリにindexや正規表現を使っちゃいけないように読める。

52 名前:50 mailto:sage [2009/02/15(日) 21:56:57 ]
しまった元ファイルが壊れていたってオチか。

>>51
言われてみればそう読める。
指摘tnx.

ついでに >>36
方法はあるけど、それなりに難しそう。
GUIアプリからコンソールアプリを実行 でググると吉。
もしかしたら既存モジュールがあるかも。

53 名前:42 [2009/02/15(日) 23:00:58 ]
>>47
ついさっきまでCentOS5をインストールしてCPANで試してもうまくいかず絶望していましたが、
書き込みを見てリンク先の指示通りにやったら無事プログラムが動きました。
本当にありがとうございました。いくら感謝しても感謝し切れません。

54 名前:デフォルトの名無しさん [2009/02/16(月) 11:55:30 ]
>>53
おお動いたか、よかったな。少し心配してたw

55 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 22:19:33 ]
>>36
>>50

僕もよく知らないのだが、下のはどうかな?

use Win32::OLE;
my $WshShell = Win32::OLE->CreateObject("WScript.Shell");
$WshShell->Run('tasklist', 0);

56 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 07:10:12 ]
パッケージの外から変数を覗き見たいです
ググったところ、グローバル変数ならシンボルテーブルとかいうものを検索すれば見られそうな感じですが、
レキシカル変数は無理なのでしょうか

57 名前:デフォルトの名無しさん [2009/02/17(火) 09:16:53 ]
>>56
なぜそんなことが必要な状況になったかが問題だと思う。

58 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 09:32:52 ]
>>56
つPadWalker

59 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 13:26:55 ]
>>57
デバッグのときにあまり本体を汚さずに中の変数を覗きたいんですよ
最終的には一行書くだけで自動的に変数をトレースしたいです

>>58
それ素晴らしく完璧ですね
ありがとうございます


60 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 14:03:35 ]
>>57
知らないならレスしないでください



61 名前:デフォルトの名無しさん [2009/02/17(火) 14:25:23 ]
知ってるがお前の態度が気に入らない。

62 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 14:36:07 ]
>>61
後出しみっともない


63 名前:デフォルトの名無しさん [2009/02/17(火) 15:42:16 ]
>>62
コピペにマジレスみともない。

64 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 15:49:58 ]
>>63
そう思うならやるなよ


65 名前:デフォルトの名無しさん [2009/02/17(火) 16:31:29 ]
>>64
いつまでもみっともない。

66 名前:デフォルトの名無しさん [2009/02/17(火) 17:50:44 ]
>>65
必死だな!

67 名前:デフォルトの名無しさん [2009/02/17(火) 18:40:21 ]
>>66
>>66

68 名前:デフォルトの名無しさん [2009/02/17(火) 18:41:46 ]
キモイ、粘着、IDストーカー、
もう返信しないで下さい。キモいです。

69 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 19:08:44 ]
なにこのスレ

70 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 23:44:42 ]
文字列取得の質問です

"a,b,c:ABC,d,e,DEF"ghi

のような文字列があった場合に、

ABC(コロンとカンマの間)
DEF(カンマとダブルクオテーションの間)

の文字を取得するにはどのようにすればよいでしょうか?

indexとsubstrを駆使してみましたが、
カンマやダブルクオテーションが複数あるため
indexの位置が正しく取得できずに断念しました。



71 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 23:51:51 ]
>>70
っ[パターンマッチ]

72 名前:デフォルトの名無しさん [2009/02/18(水) 00:29:51 ]
>>71
ありがとうございます。

$tmp =~ /:(.+)\,/;

のようにやってみましたが、下記の結果になってしまいました。

$1⇒「ABC,d,e」

後ろのカンマのマッチを無視するにはどのようにすればよいでしょうか?

73 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 00:39:30 ]
>>72
(.+?)で最小マッチングできるよ

74 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 00:50:47 ]
>>73
ABC ⇒ /:(.+?)\,/
DEF ⇒ /.+\,(.+?)"/

↑で、うまくいきましたー。
ありがとうございました

75 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 06:44:36 ]
呼び出したモジュールから、本体の出力命令 ( print とか die とか )を察知して
内容を置換して出力し直すことは可能でしょうか

76 名前:デフォルトの名無しさん [2009/02/18(水) 07:48:50 ]
可能です。

77 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 14:57:23 ]
>>76
どうもです

78 名前:75 mailto:sage [2009/02/18(水) 23:09:04 ]
どうやら print をオーバーライドするのが一番手っ取り早そうですね
ですが、perl はサポートしてないんですよね
実現してるモジュールなんかはありますでしょうか

79 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 01:33:04 ]
>>78
親切な僕が変態 ReplacePrint.pm をそれっぽく書いたげたお。
die のほうはせっかく例外投げてんだから catch してあげて。

使い方:
use ReplacePrint;
print "string\n";

# ここから ReplacePrint.pm
package ReplacePrint;
use strict;

sub TIEHANDLE { bless [], $_[0] };

sub PRINT {
my $self = shift;
my @str = @_;
for (@str) {
s/$/ is replaced/;
print STDOUT;
}
}

my $out;
open *OUT, ">", \$out;
my $stdout = select(OUT);
tie *OUT, "ReplacePrint";
1;


80 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 03:00:45 ]
ありがとうございます
まだファイルハンドルあたりやtaiについての知識が薄いので、
ここ2,3日で実験しながら学びたいと思います
また何か分からないことがあると思うので、
よろしくお願いします



81 名前:79 mailto:sage [2009/02/19(木) 22:56:32 ]
>>80
正直、想定外の好反応にあわててる僕がいるお。
外野からの「こんなひどいことするくらいなら設計見直したほうがいい」系のツッコミを期待してたので。
>>79 は猛烈にやっつけで、行儀の良くないことをいくつもやっている点が「変態」の所以。
なのでこのまま流用したりすると後でひどい目にあうことうけあい。
ヒント程度にしておくのが吉です。

82 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 00:25:08 ]
Mooseっていったん適当なクラスにrole付加したら、あとでそのrole使わないようにってできないの?

83 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 09:24:24 ]
:>>81
:viaレイヤ使うといいのかもしれない。使ったことないけど。

84 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 10:12:57 ]
StringRandomモジュールを使用せずに2chのIDのようにランダムな文字列を生成するにはどうすればよいでしょうか?

85 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 11:43:28 ]
その程度のプログラムも書けないのは全くプログラミングの勉強が
不足しているのでもうすこし勉強しましょう。

86 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 14:09:07 ]
>>84
っ[Digest]

87 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 14:28:40 ]
解決しました。ありがとうございました。勉強してきますorz

88 名前:デフォルトの名無しさん [2009/02/20(金) 18:27:25 BE:1369512858-2BP(150)]
UTF-8のテキストファイルから">"一文字を正規表現で検索して置き換えたいのですが、
s/>/test/g
とやってもうまく検索できません
EUC-JPへのエンコードなどしてみたのですが、そうすると他の文字が一部文字化けなどしてしまい更に
面倒なことになったので、できれば文字のエンコードなしで日本語の置き換えをしたいです
Dumpで表示した\xxxなどの形式で検索もしてみましたが、うまく置き換えできませんでした

日本語の置き換えに何かいい方法はないでしょうか?
置き換えしたい文字は">"だけです。

89 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 18:31:12 ]
なんといういやがらせ


90 名前:88 [2009/02/20(金) 18:56:00 ]
自己解決しました
index関数とsubstr関数で置換できました



91 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 18:58:52 ]
とあるプログラムの一部に書かれてたんですが
これはどういう意味なんでしょう?

# untaint
$0 =~ /^(.+)$/;
my $self = $1;

$0でスクリプト自身のファイル名を取ってきて
正規表現に掛け、マッチしたものを別の変数に入れてますけど、
これだと$0と$selfは一緒なものが入る気がするんですが・・・。

92 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 19:21:24 ]
>>91
志村〜、コメント、コメント

汚染されたデータからパターンマッチで部分文字列を取り出すことで
汚染を取り除いている(=untaint)のだが、汚染とは何かとか言い出すと
長くなるので「perl 汚染」でぐぐっていろいろと調べてみるといいよ。

93 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 20:02:26 ]
$0が汚染されてたらスクリプト自体が実行出来ないもんじゃねえの?
(汚染チェックの重要性は十二分に解ってはいるんだけど)

94 名前:91 mailto:sage [2009/02/20(金) 21:38:11 ]
>>92
レスありがとうございます。
なるほど、不正なコマンド含んでたりするものを取り除いてるわけですね。

でもこの正規表現だと任意の文字列にマッチしてしまって取り除いたりは
できないような気もしますが・・・。一回正規表現を通して見かけだけ汚染を
取り除いたとみなしてるんでしょうか。

まぁ調べる方針はわかったのでもう少し調べてみます。どうもでした。

95 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 23:19:11 ]
.*は何にでもマッチしちゃうので、全くその通り。無理矢理に汚染フラグを
取り除いただけです。よい子は真似しないこと!


96 名前:デフォルトの名無しさん [2009/02/21(土) 18:23:38 ]
perl -e 'use strict;my%H;sub A{@H{qw/A B C/}=(1,2,3);return \%H};*H=A();print "$H{C}\n"'
perl -e 'use strict;my%H;sub A{my %H@H{qw/A B C/}=(1,2,3);return \%H};*H=A();print "$H{C}\n"'

この二つ
上は何故かコンパイルも通り、意図したようにデータも返すことが出来る
下は一見すると正しい文法だし問題もないように見えるけどなぜかデータを取得できない
原因がわかる人いますか?

97 名前:デフォルトの名無しさん [2009/02/21(土) 18:24:12 ]
下は
perl -e 'use strict;my%H;sub A{my %H;@H{qw/A B C/}=(1,2,3);return \%H};*H=A();print "$H{C}\n"'
の間違いです。スマソ

98 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 20:00:22 ]
>>96-97
スコープが違うから。
上はサブルーチンの外側で宣言した %H に代入している。
下はサブルーチンの内側で宣言した %H に代入している。

型グロブはパッケージ変数。

99 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 20:18:27 ]
>>98
なるほど
パッケージレベルのmy変数はどの関数からも見えるんですね
あと型グロブはmy変数とは異なるパッケージ変数と。勉強になりました

100 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 11:53:36 ]
ここ(kage.monazilla.org/system_DOLIB100.html)を参考に
●ログインするプログラムを書いてみました。
しかし、認証に失敗して、以下のセッションIDが返ってきます。
SESSION-ID=ERROR:ppppppppppp
何かアドバイスお願いします。

※IDとパスワードはここではダミーのものとしていますが
実際には自分自身のIDとパスワードを使用しています。

use strict;
use Socket;
use FileHandle;
use LWP::UserAgent;
use HTTP::Request::Common qw(POST);

my $id='id';
my $pw='password';
my $ua = LWP::UserAgent->new;
$ua->agent('DOLIB/1.00');
$ua->default_header('X-2ch-UA' => 'Hoge/1.00');
my $url='https://2chv.tora3.net/futen.cgi';
my %form = ('ID'=>$id,'PW'=>$pw);
my $req = POST($url,[%form]);



101 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 12:51:19 ]
>>100
手元で検証してみたが、サーバ側のバグかもしれない
IDパラメータの「@」が「%40」にエンコードされていると認証に失敗した

102 名前:101 mailto:sage [2009/02/22(日) 12:58:44 ]
さっきのレスがわかりにくいかもしれないので…
futen.cgiに渡すパラメータは通常
ID=mail@domain.jp&PASS=password
って風になるんだけど、これが
ID=mail%40domain.jp&PASS=password
という風に渡すと、なぜか認証に失敗する。
本来は後者でも%40が@にデコードされた結果、認証が成功していないといけないのだが…

あ、>>100のコードでおかしいところ発見。
my $req = POST($url,[%form]);

my $req = POST($url,\%form);

103 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 13:12:46 ]
>>102
・エンコードしない。
・[%form]→\%formに修正。

再度実行してみましたけど、認証に失敗・・・orz

104 名前:101 mailto:sage [2009/02/22(日) 13:20:31 BE:1092302674-2BP(1)]
>>103
いや、プログラムが間違ってるわけじゃなくて、サーバ側の実装がおかしいんです。
で、一応の回避策ですが、
\%form

Content => "ID=$id&PW=$pw"
に修正すればうまくいくかと思います。

P.S.
サーバ側のバグについて
qb5.2ch.net/test/read.cgi/operate/1225876082/591
にて問い合わせています

105 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 14:11:11 ]
お〜っ、勃ってる。
辛抱強く DAT 落ちしたログ持って待ってた甲斐があった。


…単なるログコレクターみたいなもんなんだけど…。

106 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 19:02:42 BE:318384566-PLT(54324)]
大昔から知られてる問題

107 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 19:48:03 ]
  ↑
すぐそういうことを言う・・・
たまたま知ってたから自慢したいだけやろ。

108 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 20:13:00 ]
>>107
そういう風に嫉妬むきだしの解釈するのは感心しませんね。

>>106さんは、自分がたまたま読んでいなかったばかりに、素早く問題点を
指摘してあなたがたに無駄働きさせないことが出来なくてすいませんと
言いたかったんですよ。

109 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 20:18:33 ]
後出しジャンケンみっともない

110 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 22:12:06 ]
>>104
解決しました。
ありがとうございました。




111 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 22:36:02 ]
仮想配列の中に'abc'が存在するかどうか確認する方法はありますか?

112 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 22:40:11 ]
exists

113 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 22:40:20 ]
仮想配列って何ですか

114 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 22:40:39 ]
「仮想配列」

115 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 23:51:08 ]
先っぽの皮が半分だけ剥けてるヤツだろ。
手で引っぱって全部剥けるなら心配いらん。

116 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 03:18:46 ]
>>106
>switch.layer3.asia が稼動してる際に SNMPv2c の一般的な読み取りコミュニティ名で
>リクエストを送ると、どこかのツリーの下に私の携帯電話番号が現れますよ

layer3.asia/

痛いw


117 名前:デフォルトの名無しさん [2009/02/24(火) 03:02:56 ]
perlに限った事じゃないかも知れない(前置き)
klassというのをたまに見掛けるけど、これはどういった意図で使ってるの?
ある程度の頻度で見掛けるので、一定の合意があるのかと思って聞いてみました。


118 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 03:29:04 ]
classが予約語の言語でclassの類似物を作った場合とか
funktionなんてのもよく見るね

119 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 13:22:48 ]
フォームから読み出したデータを処理したいのです。
読み出したデータの名前はa1からa10までで、それを$a1から$a10に入れたいのですが、

$form = new CGI;
$a1 = $form -> param('a1');
$a2 = $form -> param('a2');

…と、a10まで順番に書いていかなければならないんでしょうか。
すっきりした書き方があれば、教えて下さい。

120 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 13:25:44 ]
>>119
そもそも変数名に通し番号をつけるセンスをなんとかすべきだな。
配列使えよ。



121 名前:デフォルトの名無しさん [2009/02/24(火) 13:32:09 ]
$form = new CGI;

foreach(0..10){push(@a, $form->param('a' . $_))}

でいいんじゃね?ゼロからだけど@aの添え字にあわせるため。

122 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 14:00:14 ]
>>119
${"a$_"} = $form->param("a$_") for 1..10;

123 名前:デフォルトの名無しさん [2009/02/24(火) 14:13:51 ]
変態が好きなら0-9にしようぜ

push(@a,$form->param($_))for a0..a9;


124 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 14:23:55 ]
というか、パラメタにつく数字は2桁超えるならa00-a10と言う風に桁をそろえようぜ。
ソートする時とか上のような技法が使えないから。

125 名前:119 mailto:sage [2009/02/24(火) 14:41:12 ]
>>120-124
配列なんて考えもしませんでした…思いついたところで、
今度は「配列に入れたいんですが」と泣きついていたように思いますが。
桁数にも気をつけます。

ありがとうございました。

126 名前:デフォルトの名無しさん [2009/02/24(火) 14:45:13 ]
>>124
ラマ本は買った?
www.amazon.co.jp/dp/4900900818
昔のラマ本の方が分かりやすかったな・・・。

127 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 14:45:31 ]
>>125

128 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 14:47:47 ]
さらにごめん。さっきの中古本だった。3版になってるのね。
www.amazon.co.jp/dp/4873111269

129 名前:デフォルトの名無しさん [2009/02/24(火) 17:06:30 ]
BigFloatで以下などが正確に計算出来ないのですが、何故なのでしょうか?

print Math::BigFloat->new('436611485')->fdiv('2074', 3)->bstr, "\n";
# 211000 と表示されてしまう

130 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 17:24:37 ]
つprint Math::BigFloat->new('436611485')->bdiv('2074')->bstr, "\n";

fdivじゃなくてbdivだよな。bdivの二番目の引数は精度だから精度3桁で計算合ってるよ。



131 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 18:44:14 ]
jcode(ver 2.7) で誰か知ってたらおしえてください。

utf8の文字列(フラグ付き)で、 'あ' という文字を 650字程度より
多い状態で、sjis に変換すると 途中から、????? と文字化けします。

Jcode.pm ってバイト数の制限があるのでしょうか。

どなたか知っていたら教えてください。



132 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 18:54:10 ]
>>131
とりあえずざっと目通した?
search.cpan.org/~dankogai/Jcode-2.07/Jcode.pm
search.cpan.org/~dankogai/Encode-2.31/Encode.pm

133 名前:デフォルトの名無しさん [2009/02/24(火) 23:21:18 ]
Perlの実行エラー時に、エラーの発生したファイル名と行番号が表示されますが、
それに加えて、呼び出し元(さらに呼び出し元の呼び出し元なども)の関数を表示できるような機能ってありますか?

&aaa();
sub aaa{ &bbb(); }
sub bbb{ &ccc(); }
sub ccc{ &ddd(); } #ここでエラー

たとえば、上のようなプログラムで、関数 ddd が定義されていないとき、
「Undefined subroutine &main::ddd called at test.pl line XX.」というエラーが出ますが、
このエラーの呼び出し元が bbb でさらにその呼び出し元が aaa であることが
エラーメッセージで表示されると助かります。


134 名前:デフォルトの名無しさん [2009/02/24(火) 23:52:07 ]
anond.hatelabo.jp/20080822142610
ここにプログラムがありますが、これを実行するために
1.必要なもの
2.(1.)が揃ったらやること
をざっと教えてください。

135 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 23:57:57 ]
>133
自前でエラー出すなら perldoc carp 参照。
そうじゃなきゃ、perl -d hoge.pl でデバッガ上で実行すれば?

136 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 00:06:54 ]
>>134
増田に聞けば?
はてなでもいいけど
とりあえず自分がどこまで理解しているのかくらいは書けよ
環境とか

137 名前:デフォルトの名無しさん [2009/02/25(水) 00:13:10 ]
>>136
すんません
プログラミング経験はありません
環境はwindows vistaです

138 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 00:26:05 ]
>>134
> anond.hatelabo.jp/20080822142610
> ここにプログラムがありますが、これを実行するために
> 1.必要なもの

それを実行するために何が必要で、何をやればいいのかがわかるだけの知識。

139 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 00:26:18 ]
>>136
それ書けば質問に答えられるのか?

140 名前:デフォルトの名無しさん [2009/02/25(水) 00:31:02 ]
>>138
その知識を分けてください

>>139
もしかしたら>>134の1,2,の回答だけじゃ俺には無理かもしれないけど
最低限それだけあれば頑張れそうな気がする
要するにエロい思いしたいからです。



141 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 00:32:54 ]
えっちなのはいけないと思います。

142 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 00:33:20 ]
正直者め

143 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 03:22:27 ]
>>140
ここ見て、知らない単語はぐぐれ。
ttp://www.moongift.jp/2008/06/strawberry_perl/

英語読めるなら
ttp://win32.perl.org/wiki/

144 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 13:44:59 ]
>>140
プログラミング自体が初めてなら、こうゆう本から始めたほうがいいかもな。
books.livedoor.com/item/379362

Perlとは何か、プログラムとは何か、というところから始まってるから。
ただ、オレ自身はこの本を読んだことはないが。

145 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 19:34:10 ]
ワラタw何という見当外れな回答
その上、読んでない本すすめてるし
ちょっと興味もって調べたら著者はこぼら

146 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 23:35:21 ]
4Uは、Gigazineの記事を読んだだけでスルーしてたけど、二次元版も出来てたんだな
さっそく登録した

147 名前:デフォルトの名無しさん [2009/02/26(木) 06:13:13 ]
Sort::Fields - 区切られたフィールドを持つ行のソート
fleur.hio.jp/perldoc/mix/Fields.ja.html

フィールドソートをしたいのですが、
use Sort::Fields;
これを書くとエラーになります。インストール先ディレクトリをみると
sort.pmやfields.pmがperl本体と同じディレクトリに置かれています。
本来は perl本体のディレクトリ直下から /sort/の下に存在するべき物でしょうか?

インストール場所が悪いと手直しをお客に依頼する必要があるのですが、
作業は大変でしょうか?

環境はlinux Red Hatなのでsortで頑張った方が良いですか?
sort に詳しくありません。

148 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 06:21:09 ]
「エラーになります」

大爆笑

149 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 06:59:30 ]
ぞっとした

150 名前:デフォルトの名無しさん [2009/02/26(木) 09:21:40 ]
みんなで仲良くねF



151 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 10:15:42 ]
>>147
確かにuse Sort::Fieldsがアクセスするのは"[モジュールの検索パス]/Sort/Fields.pm"(大文字小文字の区別有り)だと思うけど、
なんかファイル名が小文字でperl本体と同居してるとかなってるなら
もはやカオスとしか言いようが無い。

CPAN行ってインストールをやり直した方がマシじゃね。
もちろん、使うコマンドは"perl -MCPAN -e shell"で。


152 名前:デフォルトの名無しさん [2009/02/26(木) 10:27:07 ]
sortで出来るかどうかもわからないなら、もはやらくだ本からやり直してもらうしかない。
第三フィールドでソートしたいとかなら配列の配列使えば出来るよ。

153 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 10:46:46 ]
>>151
バカに引っ張られて自分もバカになるなよ。

154 名前:デフォルトの名無しさん [2009/02/26(木) 13:04:39 ]
正規表現スレとどっちかと思ったんですが、perlで組んでいるので
ひとまずこっちに質問させてください。

XMLっぽいタグを解析してるんですが、

<AAA BBB=CCC>
にマッチさせるのに
/<.*?>/

と書いています。一応これでマッチするのですが、CCCに例えば

<AAA BBB="XXX>=YYY">
のような大小比較式がダブルクオートで囲まれて入っている場合があって、
このときは上の書き方だと

<AAA BBB="XXX>

にマッチしてしまいます。ダブルクオート内を無視して<〜>にマッチさせる
にはどう書けば良いのでしょうか?

よろしくお願いします。

155 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 13:17:12 ]
誰かがゴリゴリ書いてるだろうと想像して傍観。"....\"...."とかは許されるんだっけ?

156 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 13:21:26 ]
XML タグ 正規表現
でググったら変態正規表現がけっこうヒットするな。

157 名前:154 mailto:sage [2009/02/26(木) 13:34:51 ]
ども

158 名前:デフォルトの名無しさん [2009/02/26(木) 17:04:37 ]
誰もゴリゴリ書かなかったな。
/(<[^>"]*?(?:(?:".*?){2}|)>)/


159 名前:147 mailto:sage [2009/02/26(木) 22:26:27 ]
>>151

>use Sort::Fields
>"[モジュールの検索パス]/Sort/Fields.pm"(大文字小文字の区別有り)

やっぱりそうでしたか。
エラーにはperlのインストール環境と思われるパスが出力されました。

>なんかファイル名が小文字でperl本体と同居してる

今日も確認しましたが、小文字でperl本体と同居になっていました。
お客の環境を使っているので、指摘や説明をするのが大変なので諦めます。
有り難うございました。

160 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 07:35:19 ]
全力でスルーしてたが…

sort.pm, fields.pm => pragma
Sort::Fields => 外部モジュール
「人間はタマゴから生まれる」レベルの気違い理論を展開してる事に気付け。




161 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 07:40:21 ]
よくそれで仕事にしてるよな・・・。

162 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 07:58:04 ]
がまんしてスルーして

163 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 11:24:32 ]
Windows 2000 / XPでは$SIG{'QUIT'}を設定することで、Windowsのシャットダウン時に
終了処理ができたんですが、Vistaでは終了処理が実行されずに、問答無用で停止し
ているようです。Vistaで終了処理を実行するヒント等、ありますでしょうか?

ActivePerl 1004で、以下のようなスクリプトでテストしています。

$SIG{INT} = $SIG{HUP} = $SIG{TERM} = $SIG{KILL} = $SIG{QUIT} =
sub {
# 終了処理
}

while (1){
print "a";
sleep 1;
}

164 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 17:07:51 ]
ループでひとつの配列を使いまわしているのですが、次のループ時も前のループのときの配列のデータが残っていて都合が悪いです
配列を空っぽにする方法はありますか?

165 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 17:13:02 ]
>>164
@a = ();

166 名前:164 mailto:sage [2009/02/27(金) 17:31:23 ]
ありがとうございました
うまく空っぽにすることができました

167 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 17:35:31 ]
>>166
できれば仕組みも理解してね。応用利くから。

168 名前:デフォルトの名無しさん [2009/02/28(土) 23:31:59 ]
複数のテキストファイルから1行目だけを抜き出すスクリプトって
かけないでしょうか。

169 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 23:37:29 ]
>>168
#!/usr/bin/perl
foreach my $fn (@ARGV){
open my $fp, "<", $fn;
print scalar(<$fp>);
}


170 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 23:39:31 ]
>>168
書けるよ



171 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 23:43:38 ]
>>169が回答出してるのに「書けるよ」と自慢げに一行レスする>>170

172 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 00:10:02 ]
>>168
書けるよ

173 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 00:10:14 ]
>>171
いやん

174 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 00:11:00 ]
ところで、headコマンドつかっちゃダメなの?pure perlでやらなくちゃダメなの?

175 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 00:21:22 ]
>>169
まだ冗長だね。
#!/usr/bin/perl
while(<>){
print $_;
close(ARGV);
}


176 名前: ◆TWARamEjuA mailto:sage [2009/03/01(日) 00:30:41 BE:2723055-BRZ(10000)]
え?

177 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 00:40:57 ]
PERLっていくら学んでも知らない書き方が出てくるな・・w
>>175
close(ARGV)ってclose($ARGV)やclose(@ARGV)とはどう違うん?
とりあえず、printの後の$_は省略出来るぜ

178 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 00:45:08 ]
>>175
おお、d>printの後の$_
close(ARGV)はコマンドラインで指定されたファイルのうち今開いてるファイルを閉じる。
次の<>では次のファイルを開く。

179 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 00:52:04 ]
#!/usr/bin/perl -n
print ;
close ARGV;

180 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 01:17:03 ]
% perl -ne 'print;close ARGV'



181 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 01:23:46 ]
perl -pe 'close ARGV' *

182 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 01:32:22 ]
perl -pe'close ARGV' *

183 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 01:57:48 ]
head -n 1 -q *

184 名前:デフォルトの名無しさん [2009/03/01(日) 08:33:59 ]
#!/usr/local/bin/radin;
print $musabetsutero;


185 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 10:38:53 ]
>>184
いつのネタだよ。ったく。

186 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 10:42:21 ]
>>181
先にcloseしちゃうからダメじゃん。

187 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 11:04:56 ]
>>186
closeする前に1行分が読み込まれてるから大丈夫。

188 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 11:13:47 ]
>>187
あ、そか。さんくす。

189 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 12:05:50 ]
日本語でおk

190 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 12:12:36 ]
openで開くファイル名に使えない文字コードってありますか?
Shift-jisでスクリプトを書いていてShift-jisのファイル名でファイルを作成しようとするとエラーは出ないのですがファイルが作成できません
英数字のファイル名だとファイルが作成できます



191 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 12:16:16 ]
>>190
システムがShift-JISのファイル名に対応してなかったら当然作れない。
あと""で囲むとメタ文字が発動するかもな。

192 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 12:28:07 ]
使用環境はWindows+ActivePer5.10.0lです

$file = "テスト";
open FH, ">$file"; →失敗
open FH, '>$file'; →書き込めるが当然変数展開がされない
open FH, ">テスト"; →成功
open FH, '>テスト'; →成功

ファイル名を変数を使わずに直接記述するとうまくいきました
変数に格納されている文字列の形式がおかしいのかな…

193 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 12:35:19 ]
>>192
調べてないけど、2回""で囲ってるからメタ文字が二度発動してるんだと思われ。

194 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 12:37:40 ]
まあ、Shift_JIS文字列はいかなる場合でもメタ文字に気をつけるのが吉。
ダメ文字という言葉は知っておいた方がいい。

195 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 13:24:19 ]
時々ファイル名にもIOレイヤみたいな仕組みが欲しくなるね。

196 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 13:45:53 ]
ダメ文字の対処法としてメジャーなのが

$a = '十\';

だと思うが、探すのもメンテも面倒だしなんかイラッとくるから、

$a = <<'EOF';

EOF
chop($a);

とするようにしてる。

197 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 13:47:50 ]
つーかそんな面倒なことしなくてもqwで何とかなるような気がしてきた。
昔はqwなかったからその時の流儀をそのまま使ってる。

198 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 13:53:03 ]
あー久しぶりにこのコード書くなと思ったら、最近はUTF-8でコード書いて出力時変換だな。
連投スマソ

199 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 17:07:13 ]
>>190-198 のような話題を解決するために
>>4のテンプレがあるのにな。

200 名前:190 mailto:sage [2009/03/01(日) 19:41:26 ]
open ">$file";
ならファイルが作成できるんですが、
open ">$file.txt"にするとだめでした
事前に$file .= ".txt";
で文字結合してもだめでした



201 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 19:48:27 ]
file="テスト"なんだよね?
ソースファイルのエンコーディングは何?
もしSJISでなければSJISにしてみては?



202 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 19:49:52 ]
ってSJISって書いてあった。すまん

203 名前:190 mailto:sage [2009/03/01(日) 19:53:45 ]
ソースファイルのエンコーディングはSJISです
open ">テスト.txt";はできます

末尾に.txtを文字結合すると書き込めなくなるようです

204 名前:190 mailto:sage [2009/03/01(日) 20:00:43 ]
Dumpしてみたら原因がわかりました
改行コードを含んでいたようです
スレ汚し失礼しました

205 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 22:41:48 BE:1417729695-2BP(192)]
Perrrrrrrrrrrrrrrrrrrrrrrrrrrrnrrrrrrl

206 名前:デフォルトの名無しさん [2009/03/03(火) 13:58:07 ]
オブジェクト指向の勉強中なんだが…

my(%ch, $i);
$i = 0;
sub new{
my($pkg, $data) = @_;

$ch{$i} = $data;
my $self = {obj_num => $i ++};
return bless $self, $pkg;
}

sub DESTROY{
delete $ch{$_->{obj_num}};
}

カプセル化ってこんな感じでいいの?
自分で動かした感じは問題なさそうだけど普通のオブジェクトとアクセサしか使えないだけで同じ動作する?

207 名前:1/2 mailto:sage [2009/03/03(火) 17:18:15 ]
$iがゴニョゴニョとか$_って何よ?とかあるが…それを差し引いて
どのレベルでのカプセル化を言っとるんだ?
その例だと、呼出元にて、$obj->{obj_num} = 10 ; とかしてobj_numに
直接代入可能だから、その点ではカプセル化されたとは言えん。
只、編集とか継承とかしない限りにおいて、$ch{$obj->{obj_num}} には
アクセス出来ん事だけは確かだ。ゲッタねえし。

インサイドアウトオブジェクトレベルの意味ならば以下に簡単な例。
Hoge2は(恐らく)貴方の目指してた物をインサイドアウトで実現してる。
new時に投入した'hoge'がアクセサを介さず変えられるか?がポイント。

package Hoge; #=== カプセル前 ===
sub new { bless { data => pop }, shift ; }
sub setter { shift->{data} = pop ; return ; }
sub getter { shift->{data} }
1;
package Hoge2; #=== カプセル後 ===
use Scalar::Util qw(refaddr) ;
my %hash ;
sub new { my $obj = bless \do{''}, shift ; $hash{ refaddr $obj } = shift ; $obj ;}
sub getter { $hash{ refaddr shift} ; }
sub setter { $hash{ refaddr shift} = pop ; return ; }
sub DESTROY { delete $hash{ refaddr shift } ; }
1;


208 名前:2/2 mailto:sage [2009/03/03(火) 17:18:54 ]
package main ; #=== 実行 ===
use Data::Dumper ;
use Hoge;
use Hoge2;
my $obj = Hoge->new('hoge') ;
print Dumper $obj ; # ほら丸見えだし、
$obj->setter('fuga') ; # 折角セッタでセットしても
$obj->{data} = 'bar' ; # カプセル化出来てねえよ。
print $obj->getter . qq{\n} ; # ほらね、変えられちゃった
my $obj2 = Hoge2->new('hoge') ;
print Dumper $obj2 ; # bless先がdo{ }で弄り様もねえしなあ。
printf "%s\n", $obj2->getter;
$obj2->setter('fuga') ; # 専用のセッタを用いて漸く変更可能。
printf "%s\n", $obj2->getter;

#Hoge2を以下の様に書いてるサイト(有名所)もあるが、大ポカだから注意!
#package Hoge2;
#my %hash ;
#sub new { my $obj = bless \do{''}, shift ; $hash{ $obj } = shift ; $obj ;}
#sub getter { $hash{ shift } ; }
#sub setter { $hash{ shift } = pop ; return ; }
#sub DESTROY { delete $hash{ shift } ; }
#1;

長文失礼

209 名前:デフォルトの名無しさん [2009/03/03(火) 19:46:08 ]
>>207
それそれ、それ完璧
Scalar:Util の refaddr がよく分からんけど、Dumper に見てもらった限りだとオブジェクトごとに固有の数字を割り振ってくれる感じなのかな?

とりあえずゲッターとセッター書いたのに、
使わなくても自由に書き換えできるなら書く意味ないじゃんってのが気持ち悪かったから、
それが解消できればよかった

$iゴニョゴニョはrefaddrの代わりにオブジェクトごとに固有の数字を割り当てるために使ってたつもり
$_はミスです

後でScalar::Utilについては色々詳しく調べてみます、丁寧にありがとう
助かりました



210 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 19:05:23 ]
>>208
どこらへんが大ポカなの?



211 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 09:30:59 ]
ゥーperlーパー

212 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 11:27:45 ]
Perlかわいいよ

213 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 01:50:07 ]
*Hoge::huga = /&hogehoge('hugahuga');
としたときに引数が設定されたメソッドが生えると思います
ですが
Hoge::huga('hogehoge');
としてもhogehogeは無視されるようです
設定した引数に加えて更に引数を追加する方法は無いでしょうか

214 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 04:47:47 ]
>213
> *Hoge::huga = /&hogehoge('hugahuga');
> としたときに引数が設定されたメソッドが生えると思います
本当?

> 設定した引数に加えて更に引数を追加する方法は無いでしょうか
*Hoge::huga = sub { hogehoge('hugahuga', @_); };

215 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 12:31:20 ]
>>213

つ Sub::Curry

216 名前:デフォルトの名無しさん [2009/03/07(土) 13:32:36 ]
SUPERAntiSpywareでスキャンしていたら、

Adware.Vundo/Variant [ 4 items ]
Files
C:\PERL\LIB\AUTO\FCNTL\FCNTL.DLL
C:\PERL\LIB\AUTO\LIST\UTIL\UTIL.DLL
C:\PERL\LIB\AUTO\MIME\BASE64\BASE64.DLL
C:\PERL\LIB\AUTO\SOCKET\SOCKET.DLL

と検出されていました。
昔、perlをインストールした憶えはあるのですが、入れた経緯は忘れてしまいました。
これって誤検出ですよね?

誰かSUPERAntiSpyware入れてる方で、検出された方いますか?

217 名前:デフォルトの名無しさん [2009/03/08(日) 12:29:04 ]
perlとawkの使い分けってどうするんでしょうか?

perlが使えればawkでできることは全てできる、それはわかってるんです。
でも、awk使う人ってawk単独で使うわけじゃなくてbash,sed,grepなんかも使えるから
結局出来ることに違いはないですよね。
むしろやる内容によってはawkのほうがスッキリ書けますし。

どういった場合にどちらを使えば良いのか教えて下さい。

※awkは古いからダメとか、ダサいとか、そういうのは抜きにして下さい。
 純粋に有用性の観点のみでお願いします。

218 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 12:35:53 ]
自分が楽だと思う方でいいと思うよ

219 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 12:43:15 ]
>>218
やっぱり楽なほうを選ぶのが賢明ですか。

Windowsだとperl単独のほうが環境を整えやすいでしょうね。
UNIXやLinuxだったら最初から色々入ってるのが普通ですけど。
Cygwinとか入れてよければどちらでも手間は変わらない気がしますけど、
学校や会社のPCなんかだと、何かインストールするのに許可が必要だったりしますし。

220 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 12:47:41 ]
>>217
元awk使いだけど。言語的なメリットはないと思うよ。
Perlはawkの後方互換を目指した言語だからね。awk2perlっつって
awkスクリプトをPerlスクリプトに置換するものがあるのは最近の人は知らなさそう。
ちなみにPerlにはawk互換のためだけに作られた機構がいくつかある。

awkのメリットは必ずプリインストールされているから
root権限持ってない場合でも必ず動くってとこだけど、
今日びデフォルトでPerlが入らないケースは稀だろうから、
このメリットも失われつつある。

長いことCGIプログラマをやってきたけどPerl覚えてからawkを使う機会は
上記のようなケースを除いてゼロになったな。特にここ10年は全く書いてない。



221 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 12:51:19 ]
>>220
a2pで変換すると長〜いスクリプトに変換してくれますよね。
あれってどうにかならないでしょうか。

あれ見るとawkのほうが簡単じゃん、って思ってしまうんですよ。

222 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 12:57:02 ]
>>221
いやいやa2pは人工知能じゃないし、最適化とかはしないから
長くなるのは仕方ない。

awkはバイナリ扱えないとか(今は知らんけど)文字コード変換が大変とか
色々制約あるし、書くのもPerlの方が楽だよ。

223 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 13:06:22 ]
>>222
>いやいやa2pは人工知能じゃないし、最適化とかはしないから
>長くなるのは仕方ない

私もそれはあるだろうなぁ〜、と思ってましたけど、やっぱりそうですか。


>awkはバイナリ扱えないとか(今は知らんけど)文字コード変換が大変とか
>色々制約あるし、書くのもPerlの方が楽だよ。

シェルスクリプトでバイナリは扱えますよね。
nkfとかconvmvとか使うと文字コード変換できますね。
でも、やっぱりperlのほうが楽なのですか?
もし楽ならperlを学んでみたいなぁ、と思います。

224 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 13:13:58 ]
>>223
でもやっぱりPerlが楽ですね。awkより短く速く書けるよ。

225 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 13:23:11 ]
何しろLarry Wallがawkの弱点に音を上げて、awkの欠点弱点を
補うべく作られた言語だからね。そもそもは。

226 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 14:02:19 ]
awkはできることが少ない。
でも当たり前だよな。

sedはできることが少ない。
grepはできることが少ない。
wcは、mvは・・・
って、言えばその通りだが、
単独で使うわけじゃないから気にするようなことでもない。

一つで何でもやれるようになんていうLarry Wallがバカなだけ。

227 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 14:37:32 ]
perlとsedの使い分けってどうするんでしょうか?

perlが使えればsedでできることは全てできる、それはわかってるんです。
でも、sed使う人ってsed単独で使うわけじゃなくてbash,awk,grepなんかも使えるから
結局出来ることに違いはないですよね。
むしろやる内容によってはsedのほうがスッキリ書けますし。

どういった場合にどちらを使えば良いのか教えて下さい。

※sedは古いからダメとか、ダサいとか、そういうのは抜きにして下さい。
 純粋に有用性の観点のみでお願いします。

228 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 14:56:45 ]
>>227
perlとperl以外で同じことをやってみれば違いがわかるだろう。
大雑把な傾向として、シェルスクリプトのほうが覚えることが少なく、
簡単なことは簡単にかける。
日本刀があれば包丁は要らないわけではないのと同様、
Perlがあってもsedは必要。


sed 's/nae/moe/g' akiba.txt

perl -pe 's/nae/moe/g' < akiba.txt

----------------------------------------------

awk 'BEGIN{FS=","}$2 == $3{print $1}' hoge.csv

perl -F',' -alne 'print $F[1] if $F[2] ne $F[3]' hoge.csv



でも、ある程度以上の規模のスクリプトを組んだり、
C言語に近いようなことをしたいならPerlを選びましょう。

229 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 15:26:42 ]
>>226
Perl不要論ですか。これは新しい。

230 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 15:37:05 ]
>>228
絶対必要ってわけじゃないだろ。Perlが入ってないマシンいじる
機会があるならともかく。覚えといて損はない程度だと思うが。
日本刀でも料理は出来る。

>>226
インストーラがPerlを要求するご時勢にこんな事言う人がいるとは。
昔はそうやって批判する人もいたけどね。



231 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 15:47:58 ]
>>230
日本刀で料理w
そこまでムキになって否定しなくてもいいんでない?
世の中シェルスクリプトはできるけどPerlはできない人なんてゴロゴロいるし、
Perlが出来ても使い捨てスクリプトはシェルスクリプトでやる流儀の人もいる。
どうあがいても完全にシェルスクリプトを駆逐するのは無理だよ。
自動車の優位性をいくら説いても原チャリや自転車はなくならないのと同じでさ。

232 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 15:52:30 ]
>>231
不要とは言ってない。Perlでブートするわけにはいかんだろw
ただマの知識として必要かというとPerlで事足りる人もいるだろう。

233 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 16:07:30 ]
>>231
お前こそムキになってPerlは必要ないって言ってるじゃん

234 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 16:07:39 ]
>>232
エンドユーザの立場から一言。

プログラマの方のお考えはごもっともです。
しかし、「高層建築にカンナやカナヅチなんて要らない」的発想が
今日のエンドユーザー・コンピューティングの惨状を招いたのではありませんか?

たかだかちょっとした自動化、文書検索、集計程度も自分で書けない人だらけにしてしまったのは
「素人は言語なんて使わなくていい」という発想のせいだと思えるのですが。

235 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 16:21:46 ]
自分の目的を達成できれば言語なんて何使ったっていいんだよ。

特にスクリプト系言語を使うってことは、大体が小物でしょう?
自分がサッと書けること。これが重要。

236 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 16:26:44 ]
>>234
時代のせいだと思います。
例えば自分はWebプログラミング畑だけど、全てのWebアプリケーションを
全部Cで書くことは納期的にほとんど不可能です。awkでは完成すらしない
ものも出てきます。

自分も昔はquick sortくらいは空で書けたけど、Webに足を
突っ込んだ今ではそれすら忘れてしまいました。

237 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 16:47:37 ]
>>236
quicksortなんてlibcに任せときゃいいんですよ。気に病むことでもない。

238 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 16:59:13 ]
>>236
quick sortもできないの?
ププ

239 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 17:03:17 ]
>>237
だね。
>>238みたいになんでも自分で作るとたまに間違うことがあるし、
馬鹿馬鹿しいプライドで心がねじ曲がってしまう。

240 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 17:17:39 ]
エンドユーザの立場から一言。

プログラマの方のお考えはごもっともです。
しかし、sortコマンド打つのが簡易で合理的な発想だと思えるのですが。

たかだかちょっとしたソートも自分で書けない人だらけにしてしまったのは
「素人はソートなんてやらなくていい」という発想のせいだと思えるのですが。



241 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 17:22:21 ]
単純なテキストファイルで単純なソートなら sort(1) でもいいんだろうけど

242 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 17:24:54 ]
FYI

■libcでqsort()を再帰を使って実装してる香具師は怠慢だろ…常識的に考えて
d.hatena.ne.jp/n2s/20070421/p1

243 名前: ◆TWARamEjuA mailto:sage [2009/03/08(日) 18:49:15 BE:1742944-BRZ(10000)]
そーっとしといてやれよ。

244 名前:デフォルトの名無しさん [2009/03/08(日) 20:19:13 ]
>>230
シェル言語ってのは地味に需要がある。
MSがUNIX/Linuxへの対抗心むき出しでWindows PowerShellなんぞ作ってるくらいだから。

UNIX/Linuxを普段使ってる人ってのはシェルを対話的に利用するのに慣れている。
だから、さて何か組もうかって時もシェル言語が第一選択になる。
それでダメな時に別の言語を選ぶ。
UNIXの世界ではシェルでできることはシェルで、というのが昔から暗黙の了解なので
いきなりPerlやPythonでやろうとするのは、コンピュータの世界にWindowsから入った人くらいだろう。
それは例えて言うなら、自家用車を持ってるのにリムジンをレンタルしてドライブするようなもんだ。

245 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 22:44:41 ]
ワンライナーはsed,awk,sortの方が楽なことが
多いな。例えばいくらオプションでsplitを暗黙
にさせても[]書かされる時点で、$1,$2でいい
awkにはかなわない。

もちろんガッツり書くならスクリプト言語。

246 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 17:17:27 ]
>>244
1行目は同意だが、あとはいつの時代の話だよと思うな。
そりゃ配布物配ろうとか思ったらまずshを選択するだろうが、
例えばWebアプリケーション作る時にshを第一選択肢に上げるか?
hello world以外は特にsh使う場面って思いつかないんだが。

247 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 17:48:50 ]
>>246
普通にファイル処理やテキスト処理には使うし、
処理を自動化するのにも使うし、
定期的にどっかのサイトにアクセスして、特定の情報だけを記録するとか、
その程度の用途には当たり前に使うと思うが。

本格的なプログラミングか、ワープロとか表計算みたいに出来合いのアプリで済ませるか、
二者択一だったらパソコンライフなんて送れねーよ。

それとも、プログラミングってのはアプリとwebの開発のためだけにあんのか?

248 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 17:54:32 ]
小規模ならまずシェルで出来ないか考えるよな

249 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 17:54:45 ]
>>247
例外は認めないのかよw
普遍的な事のように書くから変な誤解受けるんだろ。

んで、それらの用途にシェル使わない人もいると思うが何かデメリットでもあるのか?
「UNIXの世界ではふつー」とかじゃ理由にならんだろ。
例えば毎秒起動とかだったらさすがに少々面倒でもshを第一選択とするのが吉だと思うが。

250 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 17:58:02 ]
>>249
>んで、それらの用途にシェル使わない人もいると思うが何かデメリットでもあるのか?

同じことができるならそれでいい。
ただし、より面倒臭くなることはあるだろう。
何も難しくないワンライナーでできることに他の物使うとか、そういうのは単なるアホだろ。



251 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 18:06:37 ]
トリッキーなことしなくても普通にシェルでできるなら、それが一番簡単なんじゃね?
コマンド並べれば動くから
難しいナンチャラ理論やらウンタラ指向やらも考えなくて済む

プログラマでないエンドユーザや管理者にも使えるのは大きなメリットだと思うな

252 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 18:07:23 ]
>>250
要するに余計面倒な時だけsh使うでもいいわけね。
>>244はとてもそういう論調には見えないけど。

そういう俺はよくshスクリプト書くがな。

253 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 18:10:49 ]
>>252
w3m -dump www.media-k.co.jp/jiten/wiki.cgi?%A1%E3%B4%E9%CA%B8%BB%FA%A1%A6%A3%C1%A3%C1%A1%E4 | grep '´_'

254 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 18:11:49 ]
>>250
> 何も難しくないワンライナーでできることに他の物使うとか、そういうのは単なるアホだろ。

Perlプログラミングに没頭してる合間とかだったら、AWKの方が少々短くても
Perlのワンライナーを選択することはあるな。

短く書けるっつったってせいぜい数バイトだろ>>228。頭切り替える方が面倒だわ。

255 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 18:13:28 ]
>>254
Perlに没頭してるあなたにとってはPerlでやるほうが簡単なんでしょうね
別にそれはそれでいいのでは?
だからといって、それはあなた個人の特殊事情で簡単に感じるだけなのだから、
シェルでやるほうが手間が少ない人にまで強要すべきことではないでしょう

256 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 18:15:10 ]
>>255
いつ強要したんだよww俺はこうだって言っただけじゃん。
逆に>>244なんかshで出来ることにPerl使う奴は外道みたいな書き方じゃん。

257 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 18:17:24 ]
この人論点が分かってないからトンチンカンな事を言うのかね。

「何事もshが第一選択にするのが普通、じゃなきゃ外道」

みたいな主張がおかしいと言ってるだけなんだが。

258 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 18:22:07 ]
>>257
話がかみ合わない理由って案外簡単なんじゃない?
普通にUNIX系OS使ってる人にとってshって標準的な道具だから、
シェルで作業するってのは鉛筆で文字を書くのと同じくらい簡単で当たり前なんだよ。
だから、どうしても他の物を試す前にshで、っていう発想になるだけでしょ。

259 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 19:01:03 ]
いったい、シェルの話をしているのかシェルスクリプトの話をしているのか
はっきりさせてくれ。

260 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 19:09:12 ]
つーかPerlの話しようぜ




261 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 19:20:03 ]
>>259-260の流れわろた


262 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 19:41:35 ]
この現代に、WEBアプリ以外に何があるの?
世界じゅうどこを見て回っても、WEBアプリしか無いんだから
awk も sh もいらん。perl しか選択の道は無いだろ。

263 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 19:43:50 ]
最近の家庭電化製品はマイコン内臓でずいぶん賢くなった。
しゃべる電子レンジのファームウエアを awk や sh で書けると思ってんの?

264 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 19:56:31 ]
宗教の勧誘みたいw

265 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 20:00:33 ]
shのほうが慣れてるからsh使うという人が、昔は多かった。
イマドキのPerlerには、Perlのワンライナーのほうが慣れてる人が多いんだろうね。

266 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 20:06:24 ]
>>265
perlの人は

ls

と打たずに

opendir(DIR,'.');
@file = sort readdir(DIR);
foreach(@file){
$time = localtime ((stat($_))[9]);
print "$time"."\t"."$_\n";
}
closedir(DIR);

とやるわけですね?
簡単なことをいちいち
perl ふがほげ
perl うんたらかんたら
ってやるのは不自然なんですけど


267 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 20:10:37 ]
lsで済むことならlsじゃねえの普通
Windowsユーザならlsなんぞ打たずにファイラとかエクスプローラだろうしな

でも、スクリプトの話じゃなかったのか

268 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 20:13:40 ]
ファイルの行数調べるのも「Perlでどうやろうか」とか考えちゃうのね
cat hoge | wc -l
とせずに

269 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 20:14:54 ]
そこは
wc -l <hoge
catとか使わないな

270 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 20:15:05 ]
>>267
シェルとシェルスクリプトに何の違いがあんの?
コマンドが単発か複数かの違いだけじゃん?



271 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 20:15:32 ]
ファイルに記述するか
その場でうちこんで終わりかの違いじゃね

272 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 20:17:15 ]
シェル言語の有用性認めないなら
シェル言語使わなけりゃいいじゃん
そこまで言うならPerlだけで暮らせ

273 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 20:18:57 ]
bashのコマンド使わないでperlだけで暮らしたらさぞ便利だろうねw

274 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 20:23:47 ]
Windowsユーザの9割はbashなんて使ってないけどね

275 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 20:26:16 ]
>>274
この話ではWinユーザは無関係と思われ

UNIXの操作ではシェルが母国語みたいなもんなのに
簡単な用事でも外国語使いたがる変人だけが対象

276 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 20:30:51 ]
それって、いもしないキャラを作り上げてない?

277 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 20:40:09 ]
awk '/UNIX/ || /Linux/' hoge

perl -ne 'print if /UNIX/ || /Linux/' hoge

シェルを普通に使いこなしてる人なら最初の方が明らかに簡単だろ?
打鍵数だけじゃなく、構文的にも。

「何でもPerl」ってやりかたが変だってのは、そういうこと。
shは古い、awkやgrepは低機能だと文句言いながら、より難しくやってる人たちを変だと言ってるだけさ。

で、シェルとシェルスクリプトをやたらに区別したがってる奴がいるが、本質は同じだろ。
シェル使って作業して、コマンドを複数使って仕事しようとすると、シェルスクリプトと言われるだけで。

278 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 21:04:33 ]
>>277
その例なら
grep '(UNIX|LINUX)' hoge
かなあ
awkなんて使わないよ

279 名前: ◆TWARamEjuA mailto:sage [2009/03/09(月) 21:09:44 BE:1960463-BRZ(10000)]
my @textfiles = grep /txt$/, qx|ls -l|;
でもえぇやん。。。

280 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 21:13:16 ]
>>278
環境によって動かないとおもいまつ
GNU grep 2.5.3
では少なくとも×

grep -e UNIX -e Linux hoge

これなら動きます
ただし、awk使うのと難しさに大差ありません



281 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 21:15:29 ]
例を挙げれば挙げるほど
Perlより簡単な方法が出てくる件

282 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 21:21:06 ]
>>280
ありゃ
egrepならいいのかな?

283 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 21:21:44 ]
>>282
そうでつね

284 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 21:29:38 ]
ここまでの流れを見た率直な感想


Bシェルとかgrepとかawkとかsedなんて前時代の遺物だと思ってたけど・・・
今でも十分に使えんじゃん

285 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 21:45:28 ]
結局どうやるのがもっとも効率的かを的確に判断できるように
あらゆるスキルを磨いとけってこった。

286 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 22:15:16 ]
専用のコマンドの方が使い勝手がいいのは当然だよね
それでも sed や awk を使うのでは1行で済まない場合は
(シェルスクリプト組むような場合は)、Perl の方がシンプルになってくる

287 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 22:19:03 ]
ワンライナーの話をしてるのに
なんでshのコマンドラインとワンライナーを比べるんだか・・・。
ネジ緩んでるの?後者は一応スクリプトだぞ。

コマンドはスクリプトで書くのが大変or不可能なことをするために
存在するんだからwcとか例に持ってくるのは愚の骨頂。


288 名前:デフォルトの名無しさん [2009/03/09(月) 23:24:23 ]
>>286
簡単なことだけならシェルスクリプトの方がシンプルだと思うが

>>287
それって自分の首絞めてないか?
コマンド単体で強力ならそれを利用したスクリプトも強力なわけで

289 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 23:42:01 ]
>>287
ワンライナーってコマンドラインの延長じゃねーの?
質的な違いなんてねーよ

290 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 23:48:37 ]
質問です!
Perlとsedとawkとbashはどれがいちばんつおいのですか?




291 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 23:57:59 ]
perlで話題が無いからって、そこまで引っ張ることないだろ(w

292 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 00:00:57 ]
じゃあ無理やり話題作りを。
問:以下のシェルスクリプトをPerlに直しなさい。

#!/bin/sh
o=$(echo "$@" | sed 's/ /+/g' | sed 's/ /+/g')
w3m "www.google.co.jp/search?hl=ja&q="$o"&meta=lr%3D&aq=f&oq="

293 名前:292 mailto:sage [2009/03/10(火) 00:08:22 ]
ちなみに、
sed 's/ /+/g' | sed 's/ /+/g'
の部分は
sed 's/[  ]/+g'
でも同じですが、
全角スペースと半角スペースを列記すると見た目にわかりにくくなるので、
問題文ではあえて別々に処理しとります。

294 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 00:15:36 ]
sedやw3mがシェルスクリプトの一部だというなら
perlも仲間に入れてあげなよ

295 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 00:18:46 ]
perlだけは絶対入れない。絶対ニダ

296 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 00:21:18 ]
sedとかawkでやると楽な事とperlでやるのが楽な事の境界線を
判断するのは難しいよな

297 名前:デフォルトの名無しさん [2009/03/10(火) 01:53:00 ]
まーあれだ、シェルがどーこーとかほざいてる奴らが言ってるのはどうせbashだろ。
糞linuxごときの標準シェルなんぞどーでもえーわ

298 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 06:31:06 ]
どーでもえーことに熱くなれるっていいネ!!

299 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 11:47:12 ]
Linux板のシェルスクリプトスレはここほど釣れなかった
からといってここに八つ当たりしなくてもねえ。

300 名前:デフォルトの名無しさん [2009/03/10(火) 22:07:54 ]
RSSから指定期間の祝日を取得するスクリプトを書いてる。
ある程度の日付の範囲をもって複数の祝日を取得するときは問題なく動作するんだけど、ある特定の祝日を一つに絞って実行すると上手く動作しない。
printをあちこちかませて調べてるんだけどどうも$keyが上手く取れてない様子。通常はURLが入るんだけどNGの場合はXMLのタグ名がなぜか入ってきてNGになってしまう。

上手く動かすには何が足らないんだろ?
use LWP::UserAgent;
use XML::Simple;
&Holiday ("2009-02-01", "2009-04-01"); # OK
&Holiday ("2009-03-20", "2009-03-21"); # NG
sub Holiday {
my $feed_base = 'www.google.com/calendar/feeds/japanese@holiday.calendar.google.com/public/full';
my $sdate = $_[0]; # この日を含む開始日
my $edate = $_[1]; # この日を含まない終了日
my $query = "start-min=${sdate}&start-max=${edate}";
my $feed_url = $feed_base . '?' . $query;
my $ua = LWP::UserAgent->new;
my $res = $ua->get( $feed_url );
if( $res->is_success ){
my $xml_parser = XML::Simple->new();
$XML::Simple::PREFERRED_PARSER = 'XML::Parser';
my $holidays_data = $xml_parser->XMLin( $res->content );
foreach my $key ( keys %{ $holidays_data->{ entry } } ){
#print "$key\n";
my $holiday_day = $holidays_data->{ 'entry' }{ "$key" }{ 'gd:when' }{ startTime };
print $holiday_day , "\n";
}
}else{
die $res->status_line;
}
}



301 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 23:08:10 ]
質問です。
以下のコードを実行するとhoge_fooという出力を期待していたのですがfooとしか表示されません。
おそらく_が何か演算子としての働きをしているんだと思いますが、
一体これはどういう意味を持つ演算子なんでしょうか?教えてください。
Perlのバージョン:This is perl, v5.8.8 built for MSWin32-x86-multi-thread

$hoge="hoge";
$foo="foo";
print "$hoge_$foo\n"; # 出力:foo
print "$hoge\_$foo\n"; # 出力:hoge_foo

302 名前:301 mailto:sage [2009/03/10(火) 23:10:45 ]
$hoge="hoge";
$foo="foo";
$hoge_="まさか・・";

print "$hoge_$foo\n";
print "$hoge\_$foo\n";

どうみても誤解釈です。ほんとうにありがとうございました。

303 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 23:11:02 ]
>>301
3行目で$home_ を展開してる。
サンプルコードの最初に
$hoge_ = "HOGE";
て入れてみると、3行目の出力が「HOGEfoo」になる。

304 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 23:11:34 ]
あ、>>302で解決してますね

305 名前:301 mailto:sage [2009/03/10(火) 23:17:29 ]
>>303,304
レスどうもありがとうございました。

306 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 10:31:12 ]
くだすれスンマセン
($self->{year},$self->{month},$self->{day}) = ( gmtime time + $time_difference * 3600 )[5,4,3]

この [5,4,3]っていうのはどういうことなのですか?
こういう書き方の呼称がわからないのでググれなくて

307 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 10:50:28 ]
slice

308 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 13:46:55 ]
list

309 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 18:19:50 ]
>>306
ググる前にマニュアルを読めばいいと思うよ。
perldoc.jp/docs/perl/5.10.0/perldata.pod

310 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 18:31:28 ]
>>309
perldata読めばいいってはじめからわかってたら困らんだろ。



311 名前:デフォルトの名無しさん [2009/03/14(土) 10:04:59 ]
少しお聞きしたいのです。

以下のようなソースがありまして、

$| = 1;
print "Start\n";
$i = 0;
while($a = <>){
 print "Loop: $a $i\n";
 $i++;
}
print "End\n";

コマンドラインから perl test.pl などとして起動すると、
Ctrl+Z(ENTER)でEOFを渡して(よくわかってない?)中断して終了できますよね。

しかし、EOF(0x1a)を、
ファイルで渡したり(perl test.pl < test.txt)、Delphi等のプログラムから渡したりすると
上記プログラムでは終了してくれなす。
これを終了してくれるようにするにはどうしたらよいでしょうか?

312 名前:デフォルトの名無しさん [2009/03/14(土) 10:06:38 ]
>>311
捕捉
> EOF(0x1a)を、ファイルで渡したり
これは、バイナリエディタで 74 65 73 0D 0A 74 65 73 74 0D 0A 1A 0D 0A のように記述しました。


313 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 11:13:25 ]
シグナル打ち込め

314 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 11:24:01 ]
>>311
1A は関係ないと思う。
1A は有っても無くても終了するはずだよ。
でないと UNIX などは大変なことになる。
1A は Windows だけの習慣。UNIX のテキストファイルには普通 1A は無いからね。
原因は何か他にあるんじゃないの?

315 名前:311 mailto:sage [2009/03/14(土) 12:15:10 ]
ごめん、環境かいてなかった。

OS: Windows Vista SP1 32bit
perlは体分前に入れたものなので古い

This is perl, v5.8.3 built for MSWin32-x86-multi-thread
(with 8 registered patches, see perl -V for more detail)

>>314
ファイルをつっこむと、1Aで終了せずに、ファイル全部読み込んだら終了します
プログラムで(というか以下のライブラリ)で読むと、1A送っても無限ループが続く幹事
maxxdelphisite.free.fr/doscmd.htm

1AってそもそもEOFじゃないんのかな?

316 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 12:27:16 ]
>>315
先ず先に<>はSTDINとARGV両方を示す事を理解しろ。
プログラム引数に何か渡されたら、< であろうが、ARGVとして扱われ、
ARGVがあれば、暗黙のうちに<>は<ARGV>として挙動する。
従って
====
while(<>){ print "ARGV: $_" }
while( ($_=<>) !~/^$/ ){ print "STDIN: $_"}
====
をhoge.plとして保存して以下の様に実行した場合、
perl hoge.pl < hoge.pl
は、ARGVの中身を全てプリントした後にSTDINの処理をする
(STDIN処理は、何も入力せずにreturnで終了)。

外部ファイルにシグナルを入れて流し込むのが仮に可能だと
しても、それをどのタイミングで使うかは書き手に任される訳だから、
素直に終了フラグを立てるのが普通では無いの?


317 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 13:49:03 ]
なんか変なのが沸いた

>>プログラム引数に何か渡されたら、< であろうが、ARGVとして扱われ、

へー


318 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 13:55:55 ]
ファイルハンドルがって意味じゃねえの?
それでも言葉不足だけどw
perl hoge.pl < hoge.pl
は、
while(<ARGV>){ print ; }
でも
while(<STDIN>){ print ; }
動くよ。


319 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 13:57:02 ]
最終行「でも動くよ。」


320 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 14:08:58 ]
知ったかぶり者を論うのやめろ。荒れるから。



321 名前:へんなの mailto:sage [2009/03/14(土) 14:09:01 ]
あーすまん。
言葉も変だし、5.8までと5.10で挙動が違うわ、>>316
>>316の例とかは全面撤回(5.10では動く)


322 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 14:28:14 ]
CPANやperldoc.jpでのPODトランスレータは何を使っていますか?

Pod::HTML, Pod::HtmlEasy, Pod::Xhtml, Pod::Tree::HTML,
Pod::Simple::HTML, Pod::Simple::XHTML...と、色々試していますが、
L<Foo>やら=item * <Bar::Baz>やらマルチバイト文字やら、
一部に対応しているものがありますが、全部に対応したものはないように
感じました。

323 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 17:02:33 ]
>>315
>ファイルをつっこむと、1Aで終了せずに、ファイル全部読み込んだら終了します
>プログラムで(というか以下のライブラリ)で読むと、1A送っても無限ループが続く幹事

結局どうなの?終了するの?無限ループするの?どっちなの?
結局、何がしたいの?どういう動作を期待してるの?

324 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 19:47:30 ]
>>311 が使ってるOSでは、0x1a を送っても 0x1a にすぎず EOF にはならない。
どうしてもそれを望むなら OS を CP/M に換えるといい

325 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 21:48:07 ]
I love you

326 名前:デフォルトの名無しさん [2009/03/16(月) 20:40:31 ]
二重のforeach修飾子は使えないのでしょうか?

perl -E '
@tmp=([1,2,3],[4,5,6],[7,8,9]);
for (@tmp){
for (@{$_}){say}
}'

出力
1
2
3
(以下略)

という構文をforeach修飾子を使って、以下のように書いたのですが、

perl -E '
@tmp=([1,2,3],[4,5,6],[7,8,9]);
say for @{$_} for @tmp;'
コンパイルエラーになってしまいます。

このような二重のforeach修飾子は使えないのですか?
それともコードが間違っているのでしょうか?

perlのバージョンは
v5.10.0 built for x86_64-linux-thread-multi
です。


327 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 20:59:27 ]
修飾子はひとつしかつけられません。(perlsyn参照)

Any simple statement may optionally be followed by a SINGLE modifier,
just before the terminating semicolon (or block ending).


328 名前:デフォルトの名無しさん [2009/03/16(月) 21:15:11 ]
rand()で、0が出る確率というのはあるのでしょうか?

もしくはrand()で出る一番小さな数字というのがあれば教えて頂けないでしょうか。

329 名前:326 [2009/03/16(月) 21:19:15 ]
>>327

ありがとうございます。
参考になりました。

330 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 21:51:39 ]
>328
perldoc -f rand



331 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 23:58:47 ]
$data = "19:09:34 hoge 294";

if($data =~ /\d\d:\d\d:\d\d \d*/){
    print "マッチ\n";
}else{
    print "マッチせず\n";
}

「数字数字:数字数字:数字数字 いくつかの数字」という文にだけヒットさせたいんですが、
何故か余計な文字の入っている上の文でもヒットしてしまいます。
どうしてヒットしてしまうんでしょうか?

環境:This is perl, v5.8.8 built for MSWin32-x86-multi-thread

332 名前:331 mailto:sage [2009/03/17(火) 00:01:27 ]
*だと\dが0の場合も含まれるんでした。
*を+にしたらうまくいきました。

333 名前:デフォルトの名無しさん [2009/03/17(火) 00:42:36 ]
関数のreturn値って成功の場合1で、失敗の場合0が普通なのでしょうか?
標準関数はこのパターンが多いような気がします。
シェルスクリプトの場合だとたいてい逆ですよね?


334 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 07:18:18 ]
成功の場合に真を、失敗の場合に偽を返す
って考えれば Perlの関数の多くも コマンドの終了コードも同じ

335 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 08:34:52 ]

アフォ?

336 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 16:16:53 ]
>>333
そだよ
だからsystem関数の使い方には注意

Perl6では、system関数の戻り値もPerlの流儀になる

337 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 20:36:43 ]
引数がAから始まって、後が全部数字かどうかチェックするのって

if($ARGV[0] =~ /^A+[0-9]$/)
でいいのかな


338 名前: ◆TWARamEjuA mailto:sage [2009/03/17(火) 20:38:57 BE:3920966-BRZ(10001)]
>>337
おしいかも。
/^A[0-9]+$/

でもその前にchomp入れた方がよいかも♪

339 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 20:47:23 ]
おおお、なんと優しい
ありがとーw

340 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 23:20:12 BE:309540375-PLT(54324)]
/\AA[0-9]+\z/



341 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 04:15:45 ]
xms

342 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 09:46:26 ]
\d+はダメなの?

343 名前:311 mailto:sage [2009/03/18(水) 10:41:45 ]
>>316
時間が空いてすいません。

^Z(1A)はシグナルなのでそもそもファイルからは渡せないもんなんでしょうか?(単にデータとして受け取られる)

問題は、通常のプログラムから標準入力を渡した場合なのですが、これもファイルから渡したのと同様になる
ものなのでしょうか?
つまり、何かのデータをフラグと見立てて、それを検出したら終了、というような作業が必要なものか、と。

344 名前:311 mailto:sage [2009/03/18(水) 10:44:13 ]
>>323
期待する動作は、プログラムで1Aを送ると終了して欲しい、ということです。
ターミナルやコマンドプロンプトなどで、^Zを送ったときと同じような動作を期待しています。

345 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 10:44:39 ]
>>342
\d や \w はロケールや UTF-8 フラグによってマッチする文字が変わる。例えば全角数字。
$ は改行の直前にもマッチするので、"A10\n" =~ /^A[0-9]+$/ が真となってハマる初心者多し。
^ は /m が指定されていない限り文字列先端にしかマッチしないので、\A だとやや偏執的
とも感じる。用心深いに越した事はないけれど、/\AA よりは /^A の方が見た目がスッキリ
して読みやすい。

perldoc.jp/docs/perl/5.10.0/perlreref.pod
perldoc.jp/docs/perl/5.10.0/perlretut.pod

346 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 11:35:38 ]
>>344
1Aが入ってきたら終わるように書けばいいだけ。

347 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 16:01:22 ]
Perl業界におけるPerl 6の立ち位置がよく分からないんですが、
雰囲気的にはどんな感じなんでしょうか?

348 名前:デフォルトの名無しさん [2009/03/18(水) 16:24:04 ]
>>347
Web業界に限って言えば様子見ムード。

349 名前:デフォルトの名無しさん [2009/03/18(水) 16:28:27 ]
Parrot1.0が出ましたが、これ使うと何が出来るようになるんですか?
他言語との連携が楽になるだけ?

350 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 16:40:10 ]
>>344
CP/Mからの呪縛。

DOS(Windows)とUNIXそれぞれの、改行コード、終端コード、
テキストモード、バイナリモードについて、ググるなりして理解するのが先。



351 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 18:44:37 ]
>>345
d

352 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 20:17:40 ]
>>344
だから 0x1a が EOF と思ってる時点で間違ってる
まずここを理解しろよ

CTRL-Z 押下は EOF を送るための特殊な操作であって、
それが歴史的な理由で CTRL-Z (0x1a)になってるだけであって
0x1a を送れば EOF になるわけじゃない。


353 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 01:24:01 ]
>>344
if (ナントカ eq "\x1a") { exit }

こういう発想は思いつかんの?

354 名前:311 mailto:sage [2009/03/19(木) 07:08:15 ]
>>346 >>352-353
理解しました。ありがとう。

355 名前:デフォルトの名無しさん [2009/03/20(金) 02:20:00 ]
@a = ('1','2','3','4','5','6')
@b = ('2','3')

という配列があった時に、@aから@bを削除して

@c = ('1','4','5','6')

を作りたいのです。ループ回すしか無いのでしょうか?
大崎氏(www.din.or.jp/~ohzaki/perl.htm#ArrayUnique)の、

# 配列 @array から重複した要素を取り除く

{
my %count;
@array = grep(!$count{$_}++, @array);
}

みたいな華麗な手法があるなら知りたいです。

356 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 03:24:57 ]
@count{@b} = @b;
@array = grep(!defined($count{$_}), @a);

357 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 05:09:05 ]
@c = grep{!((join ',', @b) =~ /(?:^|[^0-9])$_(?:[^0-9]|$)/)} @a;

すごく…力わざです…

358 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 06:47:02 ]
>>355
みたいなじゃなくてそれ使えよ

359 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 16:49:14 ]
>>355
use Array::Utils;

@a = ('1','2','3','4','5','6');
@b = ('2','3');
@c = Array::Utils::array_diff(@a, @b); # (1,4,5,6)

360 名前:デフォルトの名無しさん [2009/03/20(金) 16:52:41 ]
>>359
最近ではそういうのを華麗というのか?



361 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 17:25:05 ]
モダン(笑)

362 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 21:33:12 ]
教えてください。恥ずかしいんですが...

sample.html
--------------------
<html>
2009-03-20
</html>
--------------------

yyyy-mm-dd.pl
--------------------
#!/usr/bin/perl

use Time::Local;

($s, $mi, $h, $d, $mo, $y, $w) = localtime(time);

$lastupdate = sprintf("%04d-%02d-%02d", $y + 1900, $mo +1, $d);
$yesterday = sprintf("%04d-%02d-%02d", $y + 1900, $mo +1, $d-1);

s/$yesterday/$lastupdate/g sample.html;
--------------------

363 名前:362 mailto:sage [2009/03/21(土) 21:34:06 ]
(続き)
sample.html内の2009-03-20を2009-03-21に置換したいのですが、
これじゃだめなんですよね? どうしたらいいでしょうか。

ちなみに、ワンライナーっていうんですよね、それで
$ perl -i -p -e 's/2009-03-20/2009-03-21/g;' sample.html
みたいにすると置換できましたが、s/foo/bar/のfoo, barの部分に
変数を使いたいんです。

目的は、社内LANで公開しているweb(html)内の最終更新日時の表示を、
ちょっとした理由から、毎朝午前5時とかに、その日の日付に変えること、です。

よろしくお願いします。

364 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 21:45:51 ]
>>363
javascriptじゃだめなの?

365 名前: ◆TWARamEjuA mailto:sage [2009/03/21(土) 21:51:44 BE:3484984-BRZ(10001)]
04月01日だと、$yesterdayに04月00日が生成される伊予柑♪

366 名前:362 mailto:sage [2009/03/21(土) 22:00:24 ]
しくしく。。。いじわるですね。。。というか遊ばれていますね。。。

javascriptでもいけるんでしょうか。
それから、おっしゃるとおり04月00日になりそうですね。
perlで行くとしたら、そこは勉強して、何とか回避策を考えようと思います。

WSH, perl, あと何だろう、いくつか候補を考えたのですが、perlは
まったくといっていい初心者です。sedも。正規表現は理解はしている
つもりですが使ったことがあまりないです。

どんな手段でもよいのですが、何となくperlがよさそうだと思って、
この板に来てしまいました。。。

あらためて、どんな手段(言語、手段、ツール)がいいかを含めて
教えてください。<(_ _)>

367 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 22:11:34 ]
>>362
1) SSIで最終更新日時を書くのが楽
2) Perlでやるなら、File::Slurpで読んでDateTimeで計算するのが楽

かね。
そもそも、

A) sample.htmlにベタ書きしてある最終更新日時の翌日を書けばいいのか、
B) sample.htmlの最終更新日時をただ表示すればよいのか(上記1.でよい)、

そのあたりの要件がはっきりしません。
更新日時についても、営業日でなくて暦日で良いのか、とか。

ちょっとまってね、これから書くから。

368 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 22:15:53 ]
明らかにSSIが楽。

369 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 22:19:42 ]
# YYYY-MM-DDをその翌日に置き換える場合
# ただし13月32日とかも引っ掛かって甘いので注意
# しかも、最終更新日以外でも、くだんの正規表現に引っ掛かった値が変換されるので注意

use strict;
use warnings;
use File::Slurp;
use DateTime;

my $file_name = q{sample.html}; # $ARGV[0]とかの引数で渡すとか好きにして
my $file = read_file($file_name, array_ref => 1);

LINE:
foreach my $line (@$file) {
$line =~ s{
(\d{4}) - (\d{2}) - (\d{2})
}{
DateTime->new(year => $1, month => $2, day => $3)
->add(days => 1)
->ymd();
}xmse;
}

write_file($file_name, $file);

370 名前:362 mailto:sage [2009/03/21(土) 22:19:54 ]
すみません...

そもそも、から行きますと、

A) sample.htmlにベタ書きしてある最終更新日時の翌日を書けばいい

です。

営業日ではなく暦日でOKです。
土日祝日もインフラが停止しなければ365日毎朝更新したいです。

というのは、会社のデータベースからあるまとまった形のデータを
Excel形式で落としてきて、それにパスワードをかけて、所定のフォルダに
アップロードし、それを地方拠点にイントラウェブで提供します。

最終更新日を更新したいというのは、そのアップロードの案内ページなんです。

データを落としてきて、パスワードをかけて、所定のフォルダにアップロード
するところまでは、マクロとMS-DOSのバッチファイルとタスクスケジューラと、
恥ずかしいうにょうにょなやり方でどうにか実現しました。

が、そうしたところ、案内のhtmlファイルも自動で日付を変えられるだろうと、
偉い人から言われまして...



371 名前:369 mailto:sage [2009/03/21(土) 22:22:40 ]
Template-Toolkit(Template)とかHTML::Templateを使う手もあるね。

ただ、>>370の書き方を見ると、
土日でもアップロードされたデータが更新されているなら、
touch sample.html
してアップロード案内ページだけ最終更新日時を変えれば、
A)はB)と同じになるよね。

そうすればSSIでもやれるんじゃないかな?

372 名前:362 mailto:sage [2009/03/21(土) 22:22:46 ]
>>369さんありがとうございます。

さっそく明日試してみます。

SSIについては鯖管さんに相談してみます。
そういうとこ、小回りのきかない、相談窓口も親身になってくれない
会社です。。。

373 名前:369 mailto:sage [2009/03/21(土) 22:26:43 ]
うい、367=369=371れす。

鯖管は別なのか……。
まあ、SSIを検討してみてよ。日曜なのに大変だね。

もしPerlでどうしてもやりたいなら、>>369を使う場合、
DateTimeとかFile::Slurpは標準では入っていないから、
CPANから導入出来るかも聞いておいて。

374 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 22:29:14 ]
あー、LINE:も要らないし(逐行処理の名残)、そもそもよく考えたら
my $file = read_file($file_name, scalar_ref => 1);
して
$file =~ s{略}{略}xmseg;
すりゃよかったか。

しつこくてごめん。

375 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 22:33:23 ]
さらにしつこいが、scalar_refするなら$$fileを置換に突っ込むんだった罠。
チラ裏。

>>322が気になった今日この頃。比較表とかないかな?

376 名前:362 mailto:sage [2009/03/21(土) 22:40:12 ]
重ね重ね、ありがとうございます。

日付を表記するのに、yyyy-mm-ddは、そのhtmlファイルでその更新日の
部分だけにしてあります。よくわからないなりに、ここだけは見つかるように、
ここだけの形にしておかなければいけないだろうと思いました。

CPANからの導入についても明日確認してみます。
正規表現の本もperlの本も、いつか勉強しなければと積ん読になっています。
(恥ずかしながら)

ところで私、普段はぜんぜん違う板の住人です。切羽詰まってここに来ました。
こんなに速くレスをいただけるとは思っていませんでした。
本当にありがとうございます。

perl、勉強しますね。今はお金とか在庫とかの勘定ばかりやっていますが、
小学生の頃はベーマガとかで勉強したクチです。

おやすみなさい。

377 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 22:41:04 ]
PBPとtokuhiromの受け売りだが、
13月32日に引っかけないためにはRegexp::Commonを使おう

378 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 00:28:52 ]
>>369
これはちょっとマズいんじゃないの?
コメントでは YYYY-MM-DD と書いてるけど、実際の処理が
\d{4}-\d{2}-\d{2] では、全然年月日じゃない文字列にもマッチしかねない。

もちろん年月日かどうか完璧な判定はできないけど、
>>362 にあるようにマッチさせる文字列が昨日の日時でいいなら
そういう風に限定すべき

379 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 01:19:26 ]
某所で再びFizzBuzz問題がはやっているようなのでPerlで書いてみました!添削してください!

perl -e 'for ($n=1;$n<16;$n++) {my$res;!(($n%3||($res="Fizz"))&&($n%5||($res=$res."Buzz")))||($res&&print "$res\n")||(print "$n\n");}'

380 名前:戦犯369 mailto:sage [2009/03/22(日) 02:48:29 ]
>>378
thxです。
ついでに、sample.htmlのエンコードを考慮してみた。

# UTF-8(BOMなし)で保存してね
use strict;
use warnings;
use utf8;

use DateTime;
use Encode::Guess;
use File::Slurp;

# ファイルの中身を変数に突っ込む
my $file_name = q{sample.html}; # $ARGV[0]とかの引数で渡すとか好きにして
my $file      = read_file($file_name, scalar_ref => 1);

# ファイルのエンコードを類推して、UTF-8に変換する
# 決め打ちならこんなことをせず、use Encodeしてdecode, encodeする
my $encoding  = guess_encoding($$file, qw(cp932 euc-jp utf8));
die "Can't guess"
    unless ref $encoding;
if ($encoding->name() ne 'ascii' || $encoding->name() ne 'utf8') {
    $$file = $encoding->decode($$file);
}

# 昨日のYYYY-MM-DDを得る
my $yesterday = DateTime->now(time_zone => 'local')
                        ->add(days => -1)
                        ->ymd();
# つづく



381 名前:戦犯369 mailto:sage [2009/03/22(日) 02:49:50 ]
# つづき
# >>362式なら
# my (undef, undef, undef, $day, $month, $year) = localtime();
# my $yesterday = sprintf("%04d-%02d-%02d", $year + 1900, $month + 1, $day - 1);


# ファイルの中身で昨日のYYYY-MM-DDに合致すれば変換する
$$file =~ s{
    ($yesterday)
}{
    # ファイルに書いてある最終更新年月日(昨日)を、
    my ($year, $month, $day) = split q{-}, $1;
    # 翌日(つまり今日)に変換する
    DateTime->new(year => $year, month => $month, day => $day)
            ->add(days => 1)
            ->ymd();
    # >>362式なら
    # sprintf("%04d-%02d-%02d", $year, $month, $day + 1);
}xmseg;

# ファイルのエンコードを元に戻す
if ($encoding->name() ne 'ascii' || $encoding->name() ne 'utf8') {
    $$file = $encoding->encode($$file);
}

write_file($file_name, $file);

__END__

まあ、
SSI > テンプレート使用 > ベタ置換
の順が楽なんだろうけど。

382 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 02:57:58 ]
なにを持って善しと成すのかわからんけど、俺も作ってみた

perl -e 'for(1..15){my$r;$_%3or$r="Fizz";$_%5or$r.="Buzz";$r or$r=$_;print"$r\n"}'

添削してくだちぃ

383 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 03:12:33 ]
個人的には、勉強するためならいきなりCPANに頼るのはどうかと思った。

いきなりDateTimeを使わずにsprintfでやった方がいいし、
いきなりFile::Slurpを使わずにopen関数を使った方がいいと思うけど、
面倒くさすぎて放り投げられるとPerlスキーとしては寂しいので、
CPANに依存してみた。今は反省している。

FizzBuzzについては、
1. 要件を実現出来ているんなら、
2. ワンライナーなら、
3. FizzBuzzでゴルフしたり難読化選手権を開くんじゃなければ、
多少腕白でもいいと思うけどね、俺は。

敢えてPBP的に見ても、
a. C的なforでなくforeachを使おうとか、
b. $_でなくてちゃんとforeach my $num (1 .. 15)にしようとか、
c. ""で括らなくていいときは''で括ろうとか、
そんなつまらない指摘しか出来ないけど。

あとはあれか、>>379なら、C的なforをどうしても使うときは、
$n <= 15の方が直感的とかか。

384 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 03:20:37 ]
あ、うそ、ごめん。
>>381の二つめの>>362式は、3月32日になるw
ゆえに素直にDateTime使おう。

385 名前:379 mailto:sage [2009/03/22(日) 03:36:54 ]
>>382-383
ありがとうございます!>>382さんのコードの方がPerlっぽくていいですね。
ぼくのはJavaとかでも使えるテクしか使ってないや。
最近Perlはワンライナーしか書かなくなってさっぱり鈍ってしまった。

386 名前: ◆TWARamEjuA mailto:sage [2009/03/22(日) 10:10:15 BE:6861097-BRZ(10001)]
1日前ってそんなに難しいのかしら?
time - 86400
でよさそうな。。。

387 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 10:34:11 ]
うるう秒をちゃんと扱わないシステムならな

388 名前:デフォルトの名無しさん [2009/03/22(日) 11:15:10 ]
>>387
UNIX時はどれも閏秒は算定してないと思うが。
システムによって現在のUNIX時が食い違ったら困るだろ。

389 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 13:00:39 ]
超頭悪い会話が繰り広げられている

390 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 13:15:46 ]
>>389
>>389



391 名前:362 mailto:sage [2009/03/23(月) 05:38:24 ]
おはようございます。
ご報告が遅くなりました。

>>381さんに教えていただいたスクリプトを昨日、会社で使って
(ファイル名など一部変えました)、まだ1日(1回)だけですがテストとしては
うまく動いたようです。

今朝出社してうまく書き換わっているかどうか。これから出勤です。
うまくいったら引き続き使います。

ではみなさま、また縁がありましたらどうぞよろしくお願いします。

392 名前:デフォルトの名無しさん [2009/03/23(月) 07:49:00 ]
>>389
仕様上はどちらでもいいことになっているが、先発製品との互換上、
どのシステムもうるう秒は算定していない。

うるう秒はいつ発生するか算定できないからどっかから情報取得する必要があるし、
tarファイルを移転する時とか、NTP使う時とか困るだろ。

よほど金融系のシステムとかでなければ、NTPクライアントを随時走らせておけば大きな支障はない。

393 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 09:22:29 ]
いちおうtzfile(5)とか見ればわかるけどうるう秒扱えるようにはなって
いるんだよね。

実用上はうるう秒のたびに時計を進めたり戻したりして1日の秒数は
一定としてしまうのが楽な場合がほとんどだから設定した例は自分の
周りでは見たことない。

天文とかは過去のある時刻との間の時間みたいのをきっちり出せない
と困りそうだけど。

394 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 09:23:10 ]
うるう秒を勘案するシステムは存在しないってこと?

395 名前:デフォルトの名無しさん [2009/03/23(月) 13:06:04 ]
>>394
一般的なUNIXtimeの扱いの話であって、
そういったシステムが存在しないとは誰も言ってない。
極端な話、協定世界時を管理してるシステムなんかは当然勘案しなきゃ困るでしょ。

396 名前:526 [2009/03/24(火) 19:51:11 ]
ここで聞くのが適切かどうか心配ですが、違ったら誘導願います。

debian etch の上で、perl-tk をいれて触っています。
どうにも日本語が表示されませんので、どなたか詳しい人、アドバイスをお願いします。
perlは、 v5.8.8
perl-tkは、804.027-7
です。
よろしくお願いします。


397 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 04:25:03 ]
エスパーじゃないんだからさ、それじゃ答えようがないよ。

とりあえず>>4
あとやったこと書け

398 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 14:49:23 ]
ここで聞くのが適切かどうか心配ですが、違ったら誘導願います。

昨日から体の具合が悪いんですが、何かの病気でしょうか?
どなたか詳しい人、アドバイスをお願いします。

どんな薬を飲めばいいですか?医者に診せたほうがいいですすかね・・・
何科の医者に行けばいいですか?
よろしくお願いします。

399 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 14:53:25 ]
エスパーじゃないんだからさ、それじゃ答えようがないよ。

400 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 17:06:54 ]
@test
赤、A、あ、   #$test{0}
黄、A、い、   #1
青、A、あ、   #2
赤、B、あ、   #3
赤、C、い、   #4
青、A、あ、   #5
例えばこういう配列があったとして
各項目ごとに一番多い文字列(赤 A あ)をそれぞれ取り出したいんですがどのようにすればいいんでしょうか?



401 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 17:28:24 ]
「こういう配列」

402 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 17:36:06 ]
>>400
my @dat = ( 'red,A,a', 'yellow,A,b', 'blue,A,a', 'blue,B,a' ) ;
my @cache ;
for ( @dat ){ my $cnt = 0 ; $cache[$cnt++]->{$_} ++ for split /,/ ; }
printf "%s\n", sort { $_->{$b} <=> $_->{$a} } keys %{$_} for @cache ;

日本語? => 自分で考えて
同じ個数の物があったら? => 知らん。


403 名前:デフォルトの名無しさん [2009/03/25(水) 23:32:24 ]
○○.cgiのプログラムで、
「exec △△.pl $param1」とexecを使用して呼び出しても、
呼び出し先の△△.plが実行されないです。

環境が原因と思うのですが、
初心者で何が原因かわからないです。


404 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 12:16:36 ]
>>400
二次元配列のようでもあるし、コメント見るとハッシュにしてるし…
せめてPerlの書式で書いてくれ

405 名前:400 mailto:sage [2009/03/26(木) 18:21:17 ]
>>402
レスありがとうございます。

ただちょっと仕様を変更したので、普通の配列の中から一番多い要素を取り出すものに変えようと思ったのですが、
初心者なため>>402のコードでわからない部分があり、改良することができません。

どなたか配列の中で一番多い要素を取り出すサブルーチンを書いていただけないでしょうか。


406 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 18:50:35 ]
>>405
いくら出すかも書いておくと話が早いよ

407 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 18:52:32 ]
www.seshop.com/detail.asp?pid=6160
『10日でおぼえる Perl /CGI入門教室 第2版 』2005/9/5発売。
を購入しようと思っています。

この書籍が出た時点のバージョンのPerlをWindowz Vistaで
動かすことは可能でしょうか?バクがでたりエラーなどは大丈夫でしょうか?
これからPerlを勉強するので詳しいことはわかりません。

なお、PHP関連の書籍に付録で付いていたXAMPP1.6.5はインストール済みで
少なくともVistaで動作確認済みとPHPの書籍にありました。


どなたか回答よろしくお願いいたします。

408 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 19:32:34 ]
perl タダなんだから、自分でダウンロードして確かめてみればいいじゃん。

409 名前:405 mailto:sage [2009/03/26(木) 20:37:12 ]
しくしく。。。

どう書けばいいのかわからないんです、アドバイスください
@array = ('マグロ','鯛','イワシ','鯛','マグロ','鯛');

&extract(@array);

#一番多い要素を書き出す
sub extract {
foreach (@_) {
$hash{$_} ++;
}

while (($key, $value) = each(%hash)) {
push(@test, $value);
}
@sort = sort{$b <=> $a} @test;
$shift = shift(@sort);
$aa = $hash{$shift};
print "$aa";
}

410 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 20:44:10 ]
っ「List::Utilのmax」



411 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 22:47:29 ]
>>409
初心者をあまりいじめるのも可哀想なのでとりあえず書くけど、正直なところもっとちゃんと自分で調べてほしい。
>>402 のヒントがあれば本を読むなりウェブでリファレンスを引くなりして調べようがあるとおもう。
人のコードを盲目的にコピペするのではなくて、ちゃんと一行一行やってることを理解するようにしないと上達しないよ。
シンタックスシュガーはあえて封じた。

use strict;
use List::Util qw(max first);
my @data=('foo','bar','poo','foo');
my %cache;
foreach my $entity(@data) {
 $cache{$entity}=$cache{$entity}+1;
}
my $maxval=max(values(%cache));
my $res=first(sub{$cache{$_}==$maxval},keys(%cache));
print $res."\n";


412 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 17:23:43 ]
>>409

#一番多い要素を書き出す
sub extract {
foreach (@_) {
$hash{$_} ++;
if($max < $hash{$_}){ $max = $hash{$_}; } #追加
}

while (($key, $value) = each(%hash)) {
if($value == $max){ print $key,"\n"; } #追加
}
}

413 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 20:50:08 ]
sub extract{
 my %hash;
 my $res = $_[0] ;
 for ( @_ ){ next if ++ $hash{$_} < $hash{$res} ; $res = $_ ; }
 return $res ;
}

414 名前:デフォルトの名無しさん [2009/03/30(月) 04:58:54 ]
リストの略記法って (1..10) しかないんでしょうか
(1がずっと続くよ) みたいな書き方が知りたいです

415 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 07:28:29 ]
(1) x 10

416 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 09:31:19 ]
DB_Fileってundefは保存できないんですか
""とundefどうやって区別したらいいんでしょうか

417 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 10:15:31 ]
>>415
どもです

418 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 13:31:20 ]
分類と項目が並んでいるリストがあったとして
各項目はいくつかの分類のどれかに属していて、
分類ごとにまとめて処理をしたいので、
項目のリストを分類別に作りたい

for (keys %class) {
 for (@items{$_}) {

みたいに配列の連想配列が使えるといいのだけれど
何かスマートな解決法はありますか

419 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 13:37:48 ]
PerlでWebからのレスポンスを標準出力すると文字化けが発生してしまいます
色々とエンコードも試したのですが解決しませんでした
文字コード判別もなぜか失敗しました

↓がDumpした結果ですが、文字コードは何なのか教えてくれませんか

SV = PV(0x1cffd24) at 0x1bbe7e4
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x1832f24 "G\"\22w\221U\207L\241\300\361l\16\326ao\352d\351\30\265m\303Ox
\203\24\213\2262\273\271\274\5\273S\307\323\367b\372\277\340\17\254#\257\206D\24
3\243\243\265\342{4_\254j@\213\266gV\3417\236\237\265\331U\370\266\300\2477\227\
357\324D!\362&\32\204\233h\325\36l\301S\370\210n\0366\242\373\205lX\203\317\225\
375\fm\324\322\213\347\324\223\270\360\203'e\253UB\221\"\360l\340\305\211\357Q|u
\377\1\24yz\316\302\3\0\0"\0
CUR = 143
LEN = 676

420 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 15:16:24 ]
>>416
defined
>>418
ハッシュのキーに分類の名前
ハッシュの要素に項目の配列リファレンスとか入れたらどうだろう
$item{分類} = [qw/項目 項目 項目/];
みたいに



421 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 15:44:36 ]
      $str =~ s/<hoge>//;
      という正規表現を使って複数回文字を削除しようとしています
      while($str =~ /<hoge>/){ $str =~ s/<hoge>//; }
      とすると無駄な処理が入るので、ループの判別のところだけで処理したいんですが、
      そういう書き方は可能でしょうか
      while($str =~ s/<hoge>//);
      と書くとエラーを吐かれました
      do{''} while($str =~ s/<hoge>//);
      や
      while($str =~ s/<hoge>//){}
      だとうまくいきますが、なんか気持ち悪いです

422 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 15:51:12 ]
1 while $str =~ s/<hoge>//g; かなぁ

423 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 15:51:37 ]
>>421
1 while $str =~ s/<hoge>//; とか
$str =~ s/<hoge>//g; とか

424 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 16:16:08 ]
>>420
$class と $itemのセットを記憶するのに、
push(@{$items{$class}}, $item);
でいけました

@$items{$class} ではないという部分で引っかかりました
念のため[]で初期化したけど、外しても問題なく動くあたりが流石

425 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 16:39:15 ]
>>423
上では無駄な1が気持ち悪いです
下では $str = '<h<hoge>oge>' のときに削除できません…

426 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 16:48:20 ]
>>425
リャマ本に似たようなコード載ってるから、じゃ気持ち悪くならない理由にならない?
上の方は定数式(1)は最適化で取り除かれるんだとさ

427 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 16:57:42 ]
>>426
見た目が気持ち悪いのと処理的に気持ち悪いのは違うんですよ
「全部取り除く」って処理に全く関係ない1なんかがあるのは生理的に気持ち悪いです
{}で終わるのも一文なのに;がないから処理が終わってない感じがいやらしいです
リャマ本に上が載ってるなら、他にやり方はないんですかね…
もしかしたら正規表現で再帰的に検索してくれるオプションがあるかもと思ってたんですが…

428 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 17:21:08 ]
>>427
再帰的にやるなら

my $hoge;
$hoge = qr/<(??{$hoge})?h(??{$hoge})?o(??{$hoge})?g(??{$hoge})?e(??{$hoge})?>/;
$str =~ s/$hoge//g;

とか? もっと綺麗に書けそうだが。
5.10以降ならキャプチャバッファ(see perl5100delta)使って一行でしかも効率良く書けるはず。

429 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 19:56:14 ]
>>428
トン
キャプチャバッファについてググってみます

430 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 19:59:32 ]
>>427
my $str = '<h<hoge>oge>' ;
L:{ $str =~ s/<hoge>//g and redo L; }

1 while COND の方が断然気持ち良いけどさ。



431 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 13:55:08 ]

 「 気 持 ち 悪 い 」

・・・か。それじゃC言語の

if (a == 1) {
 hoge();
}

なんか、気持ち悪さ1000%だな。
なぜ「等しい」の判定に () が必要なのか。
なぜ hoge を呼び出すのに { } が必要なのか。
なぜ hoge のうしろにも () がくっついてるのか。

アメリカ人は苗字と名前を逆に言う。
住所も番地から逆に言う。
日付も逆に言う。
実に「気持ち悪い」。

だが、そういうもんだ。いちいち疑問にしてたらキリが無い。
順応しろよ、順応。

432 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 13:56:13 ]
自分で拡張すればいい

433 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 14:01:47 ]
アッー

434 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 15:41:46 ]
>>431が気持ち悪い

435 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 17:37:19 ]
activeperl 5.8.8を使っています
-d でフォルダかどうか判断する時に、
5Cで終わっているフォルダ名を正しく扱えません

どうやったら回避できますか

436 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 18:30:23 ]
5Cでエスケープしてみては?

437 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 18:58:01 ]
ちょっと意味が判らないのですが、

-d "$file\\"

という書き方でも結果は同様です

438 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 19:04:39 ]

必ず失敗するかというとそうでもないようで、
opendir(dir, '.');
for $file (readdir(dir)) {
if (-d "$file") {print "$file is directory.\n"}
else {print "$file is file.\n"}
}
これを
aaa
aaa2―
aaa―
こんな状況で実行すると
. is directory.
.. is directory.
aaa is directory.
aaa― is directory.
aaa2― is file.
test.pl is file.
_ is file.
こうなります

439 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 19:22:59 ]
で、何が問題なの?

440 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 19:51:36 ]
aaa2―はフォルダなのに
aaa2― is file.
となってしまうことが問題



441 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 20:05:27 ]
-dの返り血をちゃんと調べたのか?


442 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 20:23:03 ]
-dの戻り値なんて1か0しか無いのでは

443 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 20:47:53 ]
>>431
至極真っ当
理に叶ってる
()の中はbooleanが必要とされてる
{}の中は場合によって処理されるか否かなんだからブロックで囲まれてて当然

だけどwhile(〜){}は関数的に使われてるのにセミコロンがない
これが問題
気持ち悪い原因

つまりwhile(〜);と書ければ万事解決なんだよ!!!!

444 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 21:49:19 ]
順応と思考停止と信者脳って紙一重だなぁ、って>>431見ると思うね。

445 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 21:57:59 ]
>>443
while(~){}は
while(~){
 ();
}
の省略記法だよ?B::Deparseで確認してみ?
勝手に省略して、省略してしまった部分について気持悪がられても…
「();が気持悪い!」って言われたら、
「そりゃごもっとも、俺もそう思う。」と言わざるを得ないけどさ。

446 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 22:04:09 ]
-f -d -eについても調べたところ、-eにすら通っていない
aaa: -f, -d1, -e1
aaa―: -f, -d1, -e1
aaa2―: -f, -d, -e

ディレクトリを再帰的に辿って全部のファイルに対して云々、みたいな
処理をさせると、フォルダの末尾が5Cかもしれない問題は必ず発生すると思うんだけど、
どうやって回避してるの?

447 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 22:04:57 ]
省略記法てーのは正しくないな。
perlではこう解釈されるってのが正しいのか。

448 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 22:13:47 ]
>>446
あなたの環境が何か解らないからスルーしてたけど、
スクリプトのエンコーディングとディレクトリのは合ってるの?
winなら>>4とかそこらへんの問題じゃないの?

私の環境だと問題が出ないから力にはなれません。

449 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 22:43:19 ]
>>4を入れても改善しないようです
aaa: -f, -d1, -e1
aaa?\: -f, -d, -e
aaa?Q?\: -f, -d, -e

むしろ悪化しています
環境はwindowsXPです

450 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 23:34:09 ]
なんで""つけるんだよ



451 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 00:20:37 ]
>>4 に答えが書いてあるじゃん。なぜそうしない?

452 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 00:35:54 ]
>>4は、表示で化けるとか、検索とか正規表現がうまく行かないとかの、
日本語の文字列としての取り扱いを完璧にする方法だけど、
ファイルシステム絡みは何も改善しないように見える

唯一、ファイル名をcp932でencodeするように注意はあるけど、
それは必要な処理であって、今回のケースを解決しない

453 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 00:54:42 ]
cygwinと同じ問題じゃないの?
ActivePerlがMultiByte系のW32API使ってないんじゃ

454 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 00:59:15 ]
activeperlではどうやっても無理、というはっきりした結論があれば、
他の言語も含めた別の解決法を探すんだけど、
ぐぐってもそのへんを断言した文章は見つからない

逆に、このスレでは口を揃えて出来る出来ると言っている
サンプルは1バイトも出てこないけど

455 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 01:53:05 ]
Perlでは出来ないし、ここにいるやつらは知ったかぶりの初心者ばかりだから、
PerlはあきらめてPythonでやるといいよ!!

456 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 04:29:43 ]
うちの環境で"activeperl エンコーディング readdir"でググって一番上に出てくる
homepage2.nifty.com/ttoyoshima/Perl/lesson5.htm
には
> 「Active Perl V5.8.8」では日本語の「ファイル名」のファイルは開けない。
って書いてあるけど。

457 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 08:13:35 ]
>日本語の「ファイル名」のファイルは開けない
というのはそのサイトの人がUTF-8のままで処理しようとしているからでは?
別のサイト
ttp://www.aritia.org/hizumi/perl/perlwin.html
では内部コードはUTF-8でもファイル操作時はShift_JISに
戻せみたいなことが書いてあるが
open(IN,encode('cp932',"<表.txt")) or die "open(表.txt):$!\n";

少なくともまったくできないってことはないだろ

458 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 08:45:49 ]
単に説明が面倒だから、全部できないことにしとけ、という手抜きだろ

459 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 10:27:31 ]
PHPにはPEAR::Text_Passwordっていう便利なモジュールがあって、

<?php
require_once "Text/Password.php";
$a=new Text_Password;
$b=$a->create(8, 'unpronounceable', 'alphanumeric');
echo $b ;
?>

このコードを書くだけで、ランダムなパスワードを
自動で生成してくれる。

同じことをperlでやったら65行は書かないといけない。

460 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 10:53:36 ]
その65行をライブラリとして使えば変わらん



461 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 11:20:31 ]
そのText/Password.phpの中身は何行だよ

462 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 11:46:17 ]
PerlにはString::Randomっていう便利なモジュールがあって、

use String::Random;
print $a=String::Random->new->randregex('[A-Za-z0-9]{8}');

このコードを書くだけで、ランダムなパスワードを
自動で生成してくれる。

同じことをphpでやったら6行は書かないといけない。

463 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 12:29:06 ]
>>449
> >>4を入れても改善しないようです

>>4には
> # ※2. OS に渡す文字列(ファイル名,dos コマンドのオプションなど)は、
> # この例のように cp932 でエンコードする必要があります。
と書いてあるが、なぜそんなことが必要なのか、よく考えてごらんよ。
すると、OS からもらった文字列は逆にcp932 からutf8 にデコード
しなきゃならない、という事にも気づけるだろう。


464 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 14:07:20 ]
>>463
問題を勘違いしてる
0x5Cがエスケープ文字だからトラブってるのではなくて
Windowsのディレクトリセパレータなのが問題

465 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 15:49:06 ]
>>464
> Windowsのディレクトリセパレータなのが問題

へ〜、そうなんだ。

466 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 15:54:30 ]
>>462
ワロタwww

467 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 17:30:30 ]
>>4 に書いてあるとおり、教科書的な書き方をすれば、こうなる。

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

opendir dir, encode('cp932','.');
@files = readdir dir;
for (@files) { $_ = decode('cp932', $_) }

for $file (@files) {
  if (-d encode('cp932',$file)) {print "$file is directory.\n"}
  else {print "$file is file.\n"}
}

ポイント
・OS に渡す文字列(ファイル名,dos コマンドのオプションなど)は、utf8 → cp932 に変換すること。
・逆に OS からもらう文字列(readdirなど)は cp932 → utf8 に変換すること。

468 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 18:38:39 ]
下記のように1〜5万の数をランダムに表示していき、かつ一度表示した数は表示しないというコードをゴリゴリ書きました。
しかしこれは何故か3万回を超えた辺りから重複による何十回ものスキップ処理が入ってしまいます。
3万回数字を表示した時点でスキップが起こる確率は3/5=60%なので何十回ものスキップが頻発するというのはおかしいです。
(例えば10回のスキップ処理が連続で起こる確率は0.6^10でたった0.6%であるにも関わらず、こういう規模の事象が頻発する。3桁レベルのスキップも起こったりする。)
Perlのランダム関数がおかしいとは考えにくいのですが、何故こういう事が起こってしまうんでしょうか?教えてください。

$starttime = (times())[0];
$sessionstarttime = (times())[0];
$count=1;
$skipcount=0;
@triedNumbers=();
print " count skip num total this\n";
while(1){
    $number = int(rand(50000))+1;
    $new = 1;
    foreach(@triedNumbers) {
        if($number == $_) {
            $skipcount++;
            $new = 0;
            last;
        }
    }
    if($new==0){next;}
    push(@triedNumbers,$number);
    $endtime = (times())[0];
    $totaltime = $endtime-$starttime;
    $sessiontime=$endtime-$sessionstarttime;
    printf "%6d %4d %6d %3ds %3ds\n", $count, $skipcount,$number,$totaltime,$sessiontime;
    $sessionstarttime = (times())[0];
    $skipcount=0;
    $count++;
}

469 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 18:40:13 ]
環境は以下です。
This is perl, v5.8.8 built for MSWin32-x86-multi-thread
WindowsXP SP3

470 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 18:54:55 ]
Win32::APIガリガリ叩いてやればできたはずなんだけど、英語の記事だったから読んでないしどこでみたかも覚えてない



471 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 19:03:36 ]
>>468
This is perl, v5.8.9 built for i386-freebsd-64int
だと以下のようになるが。

32264 3 48037 119s 0s
32265 4 43101 119s 0s
32266 2 38633 119s 0s
32267 2 31075 119s 0s
32268 0 8513 119s 0s
32269 1 49402 119s 0s
32270 1 27972 119s 0s
32271 0 32400 119s 0s
32272 3 28045 119s 0s
32273 0 35972 119s 0s
32274 0 22672 119s 0s
32275 1 44140 119s 0s
32276 2 32443 119s 0s
32277 2 41433 119s 0s
32278 2 33357 119s 0s
32279 0 6772 119s 0s
32280 2 26341 119s 0s


472 名前:468 mailto:sage [2009/04/02(木) 19:03:40 ]
当初の目的は下のコードでさくっとできるようになりました。
>>468のスキップ多発については原因が分かりません。

@numbers=();

for my $i (1..50000){
    push(@numbers,$i);
}

for my $i (0..$#numbers){
    $rand = int(rand(@numbers));
    $tmp = $numbers[$i];
    $numbers[$i] = $numbers[$rand];
    $numbers[$rand]=$tmp;
}

for my $i (0..$#numbers){
    print "$i:$numbers[$i]\n";
}

473 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 19:10:27 ]
>>468
所詮線型合同法だろ? 偏りあるしそんなもんよ。
List::Utils::shuffle(1..50000) じゃダメなのか。

474 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 19:11:18 ]
>>472
それは偏りが出るまずいアルゴリズム。

っ「Fisher-Yates shuffle」

475 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 19:21:05 ]
>>468-469
その環境での乱数の有効ビット数が15だから。
rand(1)が返す数の種類が32768通りしか存在しないので、3万時点のskip確率は90%以上。
乱数のビット数は use Config して $Config{randbits} で確認できる。

476 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 19:55:54 ]
>>467でも結果は同じ
aaa is directory.
aaa― is directory.
aaa―2 is directory.
aaa2― is file.

テスト結果で書くと
aaa: -f, -d1, -e1
aaa―: -f, -d1, -e1
aaa―2: -f, -d1, -e1
aaa2―: -f, -d, -e
こんなん

aaa―2みたいに途中に5cを含む場合はエスケープとか無しに普通に扱える
aaa―が何で通るのかが謎だけど、
aaa2―みたいなのは、aaa2―/hoge みたいにフォルダ内のファイルを
直接指定してもエラーになる

結論としては、そんなフォルダ名を使うな、ということになる
ファイル名もNGなんだけど、大抵は拡張子があるので、問題になることがない

477 名前:468 mailto:sage [2009/04/02(木) 20:08:30 ]
>>471,473,474
乱数の有効ビット数というのが原因のようですね。
手持ちのWindowsだと15でしたがLinuxでは48でした。

Fisher-Yates法では偏りが出る様なので>>473の方法でやってみようとおもいます。
レスありがとうございました。

478 名前:468 mailto:sage [2009/04/02(木) 20:10:03 ]
>>475さんもありがとうございました。

479 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 20:13:48 ]
>>476
aaa― が通るのは aaa があるから。
aaa2―/hogeの失敗は、何らかの単純ミスの可能性が高い。

>>446
>どうやって回避してるの?
@dirs=split /[\r\n]+/,`dir /s/b/aD`; とか?
再帰? 再帰って何だ?


ファイルテスト演算子内から呼ばれるwin32_stat()内で終端の\を加工してるのが直接の原因。
なんでも FindFirstFile() and stat() are buggy with a trailing backslash, なので、
so change it to a forward slash (〜5.8.7.815)とか、
remove additional trailing slashes (5.8.8.816〜)という対策をしてるとの事。

-dを使う限りstatを避けることは出来ないが、There's More Than One Way To Do Itという
決まり文句を持ち出すまでもなく回避するには数多くの方法がある。

1.くどいけど @dirs=split /[\r\n]+/,`dir /b/aD`;
2.Win32::FileにGetAttributesがあるのでソレを使う
3.Win32API::FileやWin32::APIで好き勝手にやりたい放題?
4.面倒だから -e "${fn}/." で代用 (chdir/opendirにも使える/-fはopenで代用)

X. グロブ(<*>)を使うと、statに通らないファイル名は入ってこない

正しい対応.バグレポートを出し、余裕があればパッチも投稿する。
例えば、WideChar化してから終端加工して再度MultiByteに戻すとか。

楽な対応.そんなフォルダ名は使わない、見つけたら即リネーム

480 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 20:47:30 ]
>>467
> if (-d encode('cp932',$file)) {print "$file is directory.\n"}
がおかしいんじゃないの?
エンコードするから、sjis の2バイト目の0x5Cが復活する。

if (-d $file) {print "$file is directory.\n"}
でうまくいくと思うが。



481 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 21:18:47 ]
>>479
詳しくd

-d 以外にテストの方法があったとしても、
次にそこに対してopendirすると失敗するので、結局目的は果たせない
例えば、ディレクトリ構造のツリーを表示するとかそんなプログラム

5.10.0 とか 5.8.9.825 では直っているかしら

482 名前:PHPの神 mailto:sage [2009/04/02(木) 22:15:14 ]
>>462
お前は何か勘違いしているようだな、、、

PHPでは
「発音できないパスワードを生成する」
とか、そういうことができるんだぞ

483 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 01:52:56 ]
ここって教えてくれる人がたくさんいていいな・・・
VBAスレなんて、、、

484 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 12:19:33 ]


485 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 12:45:06 ]
VBAを使う人というのは、VBAを使っても
嘔吐感、嫌悪感が生じない人なんだろ?
なら、数が限られてくるわな。

486 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 15:09:01 ]
>>481
最初に479に間違いがあったので訂正。
誤 4.面倒だから -e "${fn}/." で代用 (chdir/opendirにも使える/-fはopenで代用)
正 4.面倒だから -e "${fn}/./" で代用 (chdir/opendirにも使える. -fはopenで代用)

末尾への/.追加だけだと5.8.8以降ではchdirには使えなかった。
chdirの確認を常用してる5.8.7.813でしかやってなかったという単純ミス


>次にそこに対してopendirすると失敗するので、結局目的は果たせない
>例えば、ディレクトリ構造のツリーを表示するとかそんなプログラム
そんなに難しいことをやっているの? ツリー表示程度なら
sub tree {
# my(@dir,$ent) = map { chomp;$_ } `dir "$_[0]" /b/aD`; # ,`dir "$_[0]" /b/aDH`;
#↓は↑の手抜き変形でほぼ同内容
my(@dir,$ent) = eval { opendir my $h,"$_[0]/.";grep {-d "$_[0]/$_/." and !/^\.+$/} readdir $h };
while(defined($ent = shift @dir)) {
print "$_[1]+${ent}\n";
&tree("$_[0]/${ent}",@dir ? $_[1].'| ' : $_[1].' ');
}
}
&tree('.');
みたいにopendir無しでも書ける気がするし、opendirも成功しそうな気がするんだが。
opendirに関しては最悪DLL違いでの挙動差もありえなくは無いけどね。

487 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 15:59:30 ]
opendirはできなくても、中にあるファイルをopenは出来る
だからうまいことすれば大抵のソフトは回避できると思うけど、
そんな僅かなリスクの為に常時opendir禁止というのは辛すぎる

488 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 16:59:22 ]
>>486
>例えば、ディレクトリ構造のツリーを表示するとかそんなプログラム

長いよ。長すぎるよ。そんなん書いたら保守性が悪いだろ。
いいかい?

system("tree");

ほら、たった一行でできただろ。

489 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 20:53:37 ]
treeコマンドのあるOSだけじゃないし

490 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 22:48:39 ]
5C が問題になるOSには、たいてい tree コマンドはあるよ。



491 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 00:27:34 ]
Perlを使う人というのは、Perlを使っても
嘔吐感、嫌悪感が生じない人なんだろ?
なら、数が限られてくるわな。

492 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 01:25:46 ]
優越感と陶酔感が生じますよ

493 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 01:30:46 ]
>>492
ぷw

494 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 02:26:05 ]
>>432
田植えならしかるべきとこでやっていただきたい

あーゲシュタルト崩壊してきた

495 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 11:24:11 ]
Perl使ってるひとはいつもこんな主張
"他の言語は使えないから、Perlが一番いい"
Perlの良いことを一言も言えない

496 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 11:51:14 ]
ポテンシャルを語るのに飽きたひと
いわゆるYAGNI
みたいな?

497 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 18:57:42 ]
良い点なんて他との比較でしか論じれないからな
とりあえずperlが使えれば、好奇心以外に他の言語に乗り換える動機が発生しにくいので、
perlしか使わない人がおおい

498 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 22:22:18 ]
Perlの世界って閉じて荘

499 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 00:35:28 ]
そもそもどんな人なら「Perl使ってるひと」を名乗ってもいいのだろうか。
もしかすると>495に答えを授けた自称「Perl使ってるひと」も
>497の「perlしか使わない人」も「Perl使ってるひと」ではないかもしれない。

500 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 19:11:10 ]
if(($str =~ /hoge\((.*?)\)/) && ($str =~ /foo\((.*?)\)/)){
    $str =~ /hoge\((.*?)\)/;
    $hoge=$1;
    $str =~ /foo\((.*?)\)/;
    $foo=$1;
}

これをもっと綺麗に書くことってできませんか?できたら教えてください。
hogeとfooの位置が前後する事があるのでこういう書き方にしました。

・やりたいこと
文中のhoge(あいうえお)とfoo(かきくけこ)から
$hoge="あいうえお"; $foo="かきくけこ";という変数を生成したい。



501 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 20:56:00 ]
中のブロックだけでいいのでは(1行目要らないのでは)

502 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 21:18:19 ]
>>500
例えばこんな感じ?

@pair = $str =~ /((?:hoge\([^)]*)|(?:huga\([^)]*))/g;
foreach my $pair(@pairs){
 my($name, $value) = $split '\(', $pair;
 $name = 'hoge' ? $hoge = $value
 : $name = 'huga' ? $huga = $value
 : 1
 ;
}

503 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 21:22:23 ]
×$name =
○$name eq

確かに>>501の通り

504 名前:un001.ecc.u-tokyo.ac.jp mailto:sage [2009/04/06(月) 21:48:05 ]
ハッシュを使うのが手っ取り早いと思う。$foo, $hoge を残したいなら
my $foo, $hoge;
my %refhash = ( foo => \$foo, hoge => \$hoge );

...行ごとのループとか

if (/(hoge|foo)\((.*?)\).*(hoge|foo)\((.*?)\)/) {
$r1 = $refhash{$1};
$$r1 = $2;
$r2 = $refhash{$3};
$$r2 = $4;

... $foo, $hogeを使った処理

}


505 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 22:39:27 ]
ハッシュの例
my %hash = $str =~ /(hoge|foo)\((.*?)\)/g ;
my $hoge = $hash{hoge} ;
my $foo = $hash{foo} ;
>1行目要らないのでは
の例
my ($hoge) = $str =~ /hoge\((.*?)\)/ ;
my ($foo )= $str =~ /foo\((.*?)\)/ ;

506 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 22:54:29 ]
変態の例
my $hoge ;
my $foo ;
1 while $str =~ /(hoge|foo)\((.*?)\)(?{ ($1 eq 'hoge' ? $hoge : $foo )= $2 })/g ;


507 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 23:40:54 ]
Singletonパターンってこれでいい?

package Foo;

my $singleton;

sub new {
my $class = shift;
return $singleton if $singleton;
return $singleton = bless {}, ref $class || $class;
}

1;


508 名前:500 mailto:sage [2009/04/06(月) 23:52:45 ]
# 最初はこうだったんですが
if(($str =~ /hoge\((.*?)\).*foo\((.*?)\)/)){
    $hoge=$1;
    $foo=$2;
}

# 位置関係が前後した場合に対応できない事が分かったので書き直して以下に
if(($str =~ /hoge\((.*?)\)/) && ($str =~ /foo\((.*?)\)/)){
    $str =~ /hoge\((.*?)\)/;
    $hoge=$1;
    $str =~ /foo\((.*?)\)/;
    $foo=$1;
}

これを前者と比べるとゴテゴテしてしまったなというところでした。

>1行目のif文
万が一hogeが含まれfooが含まれていないという場合
if文が無いとhogeの値がfooの値にも入ってしまい、それはマズいので入れてます。

ワンライナーな方のコードも読んでみました。$hoge = ($1 eq 'hoge' ? true : false)みたいな用法は知っていましたが、
この方法を右辺にも使えるんですね。自分には新しいです。(?{})というのは知りませんでした。
見た感じ正規表現の中で処理を実行する際に使うんでしょうが調べてみてもうまくヒットさせられませんでした。
もうちょっと知りたいのでキーワードとかあれば教えてください。

$hoge = ($str =~ 正規表現)での代入方法。これ知りませんでした。
あと右辺がリストで左辺もリストだと配列、右辺がリストで左辺がハッシュだと
キー、値、キー、値というハッシュになるというのも便利ですね。
この用法自体は知っていましたが、実際こういう使い方ができるんだなあと。

>>505さんのコードがわかりやすかったのでこれ使っていこうと思います。
>>501,502,503,504,505,506さんレスどうもありがとうございました。色々勉強になりました。

509 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:08:26 ]
ttp://perldoc.jp/docs/perl/5.10.0/perlretut.pod
A bit of magic: executing Perl code in a regular expression
の項だけど、、、
>この機能は実験的であると考えられており、予告なしに 変更されるかもしれないことを
>警告しておきます。
なので勉強する必要は無いと思うよ…

510 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:24:03 ]
実験的とはいいつつ5.6.0のころからずっとある機能だから勉強しといてもいいだろ
とはいえそう使うことのあるものとも思えんが



511 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:33:22 ]
>>507
>ref $class
これ真になる事無いだろ。

インスタンスメソッドとしても機能させたいんだったら
もう一工夫必要じゃね?

512 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:38:31 ]
あー、そっか。インスタンスからnew呼んだら return $singleton if $singleton; で抜けるんだな
クラスからでもインスタンスからでも同じもの返して欲しいからそこだけ削除して
sub new {
my $class = shift;
return $singleton if $singleton;
return $singleton = bless {}, $class;
}
こうするだけでいいのか?

513 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:55:28 ]
ああ、一工夫もへったくれもなかったねw
スマン。

514 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 20:49:43 ]
>>506
ど変態の例
sub hoge { $hoge = shift }
sub foo { $foo = shift }
$str =~ s/((?:hoge|foo)\(.*?\))/$1/eeg;

515 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 21:03:43 ]
Perlのコードを配布する際ってCPANからインストールして
使用したモジュールってどのように付属すれば良いのでしょうか?
それともReadmeなどにCPANからこのモジュールをインストールしてくださいと
書いておくのでしょうか

516 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 22:15:26 ]
それとも

517 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 22:18:40 ]
>>515
CPAN モジュールやその他のよく知られたライブラリ類は、特に事情がなければユーザに揃えてもらった方がよいでしょう。

ユーザ環境のモジュール配布元へのアクセスが制限されていたり、配布スクリプトがモジュールの特定のバージョンに依存するなどの事情がある場合は、その旨明記した上で各モジュールのライセンスが許せば同梱することもできます。

インストールスクリプト中で依存モジュールを CPAN からインストールさせることもできますが、大抵の単体配布では単に依存関係(必要なモジュールのリスト)を(できれば POD に)明記しておくだけで充分です。


518 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 23:12:09 ]
なるほど、やはりユーザーにもある程度の技術力は求められるのですね。
ありがとう御座いました

519 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 17:38:42 ]
$hogeの中の「\/:*?"<>|」を全て半角スペースに置き換えるのはどうすればいい?

520 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 18:53:38 ]
>>519
$hoge =~ s,\Q\/:*?"<>|\E, ,sg;



521 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 19:45:04 ]
>>519-520
perldoc.jp/docs/perl/5.10.0/perlop.pod#item_tr_SEARCHLIST_REPLACEMENTLIST_cds_tr_y_transliterate__c__d__s
$hoge =~ tr{\\/:*?"<>|}{ };

522 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 01:08:47 ]
質問です。
Class::Accessor::Fastを使用して
ハッシュのアクセサって作れるのでしょうか?
いろいろ試してみたのですがうまく行きませんでした…

↓イメージ的にはこんな感じ

package My::Class;
use base qw(Class::Accessor::Fast);
__PACKAGE__->mk_accessors( qw(hoge) );


package main;
my %hash = (
"a" => 'aaaaa',
"b" => 'bbbbb',
);
my $obj = My::Class->new();
#$obj->hoge(\$hash);



523 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 01:52:22 ]

d.hatena.ne.jp/goryugo/20090222/1235237948
↑の問題ってまだ残っているのでしょうか?
久しぶりにMechanizeを使ったプログラムを動かしたら
同じエラーが出るようになったのですがCommon.pmの中身が変わってしまっているようで
何処を修正すれば良いのかわからないのですが.....

524 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 02:05:45 ]
s/ で / が使えない時の第一選択って何にしてる?

525 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 02:40:29 ]
{}

526 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 02:47:34 ]
>>524
PATTERN か REPLACEMENT がある程度長ければ、/ の有無に関わらず {} 。
短ければ PATTERN にも REPLACEMENT にも現れない棒状の文字… | か ! か # 。

527 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 03:23:38 ]
>>522
$obj->hoge(\%hash);

528 名前:PHPの神 mailto:sage [2009/04/09(木) 06:53:49 ]
itpro.nikkeibp.co.jp/article/NEWS/20090408/328083/

Pelってなんだよ

529 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 07:50:22 ]
> 「Pelは大規模Webサービスを支え,今も進化している。しかしそのことが広く知られていない」

確かに「Pel」は知られていないなw 

冗談はともかく、日曜プログラマの自分からするとめちゃめちゃ知られてるような気がするんだ
けど。「Perl技術者の雇用を増やしたい」とは言ってるけど、それでも何がしたいのかよくわから
ない。まだ安定した地位を得ていないRubyとかならまだわかる。

まったくの妄想だけど、Ruby on Railsに仕事を奪われがちになってるとか? でもそれなら
そっちも覚えればいいだけだしなあ。

530 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 13:47:31 ]
{}なんて使えるんだ

うちだと、
$str =~ s{}a{}A{};
みたいにしてもエラーになる



531 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 14:12:06 ]
>>530
本気なのかネタなのか判断に苦しむなそれw

532 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 14:27:26 ]
$str =~ s{a{b{;
普通に考えたらこんな感じ?
変な感じ…
家帰ったら試してみよう

533 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 17:05:11 ]
>>532
それはNG

$str =~ s}a}b};

こっちはok

534 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 17:07:18 ]
>>530 >>532
search.cpan.org/dist/perl-5.10.0/pod/perlop.pod#Quote_and_Quote-like_Operators____________________
perldoc.jp/docs/perl/5.10.0/perlop.pod

関係無いけど perldoc.jp の和訳は目次もname属性も削ってる上に
見出しが腐ってて不便極まりないな。

535 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 17:30:33 ]
一般的な正解

$str =~ s{a}{A};

536 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 18:05:55 ]
1と9を4つとを四則演算で計算結果が10になるものを出力したいのですが、

@a1 = (1,9);
@a2 = (1,9);
@a3 = (1,9);
@a4 = (1,9);

foreach $a1 (@a1){
foreach $a2 (@a2){
foreach $a3 (@a3){
foreach $a4 (@a4){
if ($a1 + $a2 + $a3 + $a4 == 10){
print $a1.'+'.$a2.'+'.$a3.'+'.$a4."\n";
}
if ($a1 + $a2 + $a3 - $a4 == 10){
print $a1.'+'.$a2.'+'.$a3.'-'.$a4."\n";

(中略)

if ($a1 / $a2 / $a3 * $a4 == 10){
print $a1.'/'.$a2.'/'.$a3.'*'.$a4."\n";
}
if ($a1 / $a2 / $a3 / $a4 == 10){
print $a1.'/'.$a2.'/'.$a3.'/'.$a4."\n";
}}}}}

こんな感じで記述する手間がとても大変です
こういう場合に少ない記述で全組み合わせを試すいい方法はありますか?

537 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 18:41:26 ]
@a1 = (1,9);
@a2 = (1,9);
@a3 = (1,9);
@a4 = (1,9);
@op = ('+', '-', '*', '/');

foreach $a1 (@a1){
foreach $op1 (@op){
foreach $a2 (@a2){
foreach $op2 (@op){
# 中略

$fomulae = $a1.$op1.$a2.$op2.$a3.$op3.$a4;
print "$fomulae \n" if (eval $fomulae == 10);

}}}}

こんな感じかな。


538 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 18:51:32 ]
>>537
演算子を変数に入れておkだと初めて知りました!
ありがとうございました

539 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 19:06:21 ]
なぜ複数形

540 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 21:10:04 ]
誰か助けて下しア
環境がPERL5.8.* Jcode 2.6.5
PERL5.6.1 Jcode2.0から移したら
今までCGIで文字化けしなかったものが化けました。

$str = '莞ゲマン';
$hoge = Jcode->new($str, euc)->h2z->euc;
print "$hoge";

今までは 潟zゲマン
と表示されていたのに、 ?ホゲマン
となります。

原因を調べていたら、5.8移行は機種依存文字は無視しないで?に変換してしまうとのことで。。。
これを 潟zゲマン となるように
解決したいのですが、どなたかご教授ください。




541 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 21:16:20 ]
すみません
他で聴くためこちらの回答は不要です
失礼しました


542 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 21:28:24 ]
541は540とは違います。
引き続き回答お願いします。

543 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 21:50:52 ]
コードをeucで書いて、sjisで読んでeucに変換して処理して、
ということをよくやるけど、ローマ数字が元に戻せなくなるんだよな

544 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 22:06:00 ]
euc-jp-msでも?

545 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 22:37:02 ]
そんなencodeは知らんと言われる

546 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 22:48:06 ]
ppm install Encode::EUCJPMS
みたいなことをしても、見つからない

547 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 22:58:35 ]
5.8.xならactivestateのリポジトリにあるみたいだけど。
ppm install Encode-EUCJPMS


548 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:00:35 ]
それもやったんだけどな
無いってよ

549 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:21:10 ]
普通に入ったぞ。見りゃわかるだろうが手元はwindowsな

I:\> ppm i Encode-EUCJPMS
====================
Install 'Encode-EUCJPMS' version 0.07 in ActivePerl 5.8.8.817.
====================
Files found in blib\arch: installing files in blib\lib into architecture depende
nt library tree
Installing C:\Perl\site\lib\auto\Encode\EUCJPMS\EUCJPMS.dll
Installing C:\Perl\site\lib\auto\Encode\EUCJPMS\EUCJPMS.exp
Installing C:\Perl\site\lib\auto\Encode\EUCJPMS\EUCJPMS.lib
Installing C:\Perl\site\lib\Encode\EUCJPMS.pm
Successfully installed Encode-EUCJPMS version 0.07 in ActivePerl 5.8.8.817.


550 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:25:56 ]
D:\>ppm i Encode-EUCJPMS
ppm i failed: Can't find any package that provide Encode-EUCJPMS

なーにが違うんだろう

D:\>perl -v

This is perl, v5.8.8 built for MSWin32-x86-multi-thread
(with 18 registered patches, see perl -V for more detail)



551 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:30:44 ]
I:\> perl -v

This is perl, v5.8.8 built for MSWin32-x86-multi-thread
(with 25 registered patches, see perl -V for more detail)

Copyright 1987-2006, Larry Wall

Binary build 817 [257965] provided by ActiveState www.ActiveState.com
Built Mar 20 2006 17:54:25

ppm repは?もしかしてactivestateのリポジトリ無効にしてるとか無いよな?

552 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:40:11 ]
D:\>ppm rep
レトトトトツトトトトトトツトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトソ
ウ id ウ pkgs ウ name ウ
テトトトトナトトトトトトナトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトエ
ウ 1 ウ 9817 ウ ActiveState Package Repository ウ
タトトトトチトトトトトトチトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトル
(1 enabled repository)

大丈夫なのか、この画面は

553 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:43:13 ]
んー、ppmのバージョン違うのか?その表示は覚えが無いぞ…

> ppm version
PPM 3.4

> ppm rep
Repositories:
[1] tcool
[2] ActiveState Package Repository


554 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:46:25 ]
D:\>ppm version
ppm 4.01
Copyright (C) 2007 ActiveState Software Inc. All rights reserved.

ここがはっきり違う

Binary build 822 [280952] provided by ActiveState www.ActiveState.com
Built Jul 31 2007 19:34:48

ここ?

555 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:56:53 ]
あー、わかった。activeperl5.8.xは確かbuild818か819ぐらいで別リポジトリになってるんだわ
てことはそっちの新しいリポジトリに入ってないんだな
今ちょっと調べてきたらtrouchelle(ttp://trouchelle.com/perl/ppmrepview.pl)のリポジトリに入ってるみたいなんで、
リポジトリ追加したらいいと思う

build822だからこれでリポジトリ追加して
ppm rep add trouchelle trouchelle.com/ppm/
ppm i Encode-EUCJPMS
で入ると思う

ま、ローマ数字扱えるかどうかは確信がもてないがw

556 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 00:03:55 ]
D:\>ppm rep add trouchelle trouchelle.com/ppm/
Downloading trouchelle packlist...done
Updating trouchelle database...done
Repo 2 added.

D:\>ppm i Encode-EUCJPMS
Downloading Encode-EUCJPMS-0.07...done
Unpacking Encode-EUCJPMS-0.07...done
Generating HTML for Encode-EUCJPMS-0.07...done
Updating files in site area...done
7 files installed

流石は名探偵

557 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 00:08:39 ]
でもローマ数字は駄目だった

558 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 00:10:42 ]
と思ったら、shiftjisじゃなくてcp932にしたら上手く行った

559 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 00:14:55 ]
サンプル

#written in EUC
use Encode;
use Encode::EUCJPMS;

$str = "つI";
print e2s($str);

sub e2s() {
my $str = shift;
return encode('cp932', decode('euc-jp-ms', $str));
}

560 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 02:08:03 ]
>>539
どういうことですか?








[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<164KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef