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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
"The duct tape of the Internet" こと、Perl についての質問箱です。
"There's more than one way to do it" ということで、
Perl の奥深さについて皆で語り合い、追求してまいりましょう。

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

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

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

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

リンク集は >>2-3
Perl 日本語処理の基礎の基礎 >>4
過去スレは >>5-6 あたり
2デフォルトの名無しさん: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デフォルトの名無しさん:2009/02/09(月) 21:19:37
4デフォルトの名無しさん: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デフォルトの名無しさん:2009/02/09(月) 21:21:35
6デフォルトの名無しさん:2009/02/09(月) 21:23:01
71:2009/02/09(月) 21:24:29
遅らせながら無いと寂しいので立てました。
8デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/02/11(水) 01:45:35
糞スレ立てんな、ほげ
14デフォルトの名無しさん:2009/02/11(水) 12:57:48
調べてもよくわからなかったので質問です。
perlを用いてexcelデータから行、列ごとにデータを取りこみ、計算処理した後データをファイルに出力することは可能ですか?
15デフォルトの名無しさん:2009/02/11(水) 12:59:50
Yes, we can

CPANで探したらそれっぽいモジュールがあると思うよ
16デフォルトの名無しさん:2009/02/11(水) 13:13:05
>>15
即レスありがとうございます。

ちょっと自分で調べてみますね
17デフォルトの名無しさん:2009/02/12(木) 09:54:53
ブックマークや直接入力したときでも、直前のURLを取得するには
どうしたらよいでしょうか?
18デフォルトの名無しさん:2009/02/12(木) 10:18:54
>>17
△▲ WebProg 初心者の質問 Part18 ▼▽
http://pc11.2ch.net/test/read.cgi/php/1219842559/
19デフォルトの名無しさん: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デフォルトの名無しさん:2009/02/13(金) 02:00:09
以前、perlに詳しい人にソースを見てもらったときに
「もっと短くできる。とにかくperlは文字量、行数を節約して書くものだ」と言われました。
有名なperlの参考書にもそう書いてあります。
とにかくあらゆるテクニックを駆使して短く書くのがperlの美学のように書いてあります。
私は、他の言語では行数にこだわらず可読性を重視してソースを記述していました。
今、perlでやや大きめのプログラム(個人で使うツール)を作ろうとしています。
テクニックや行数圧縮にこだわらず自分が保守しやすい読みやすいコードを書きたいと
思っていますが、それはperlでは許されないのでしょうか。
26デフォルトの名無しさん:2009/02/13(金) 02:18:43
あまりにトリッキーなのはあれだけど
基本的にはシンプルに書けるなら
短い方がわかりやすいものだと個人的には思っている
27デフォルトの名無しさん:2009/02/13(金) 02:25:18
誰が許さないんですか?
言語仕様が許さないんならともかく、
書けるんなら自分が書きたいように書けばいいじゃないですか。
There's more than one way to do it っていう言葉もありますよ。
28デフォルトの名無しさん:2009/02/13(金) 02:28:18
>>25
お好きにどうぞ
29デフォルトの名無しさん:2009/02/13(金) 10:11:00

 「 可 読 性 」 は 禁 句

このスレの掟。
30デフォルトの名無しさん:2009/02/13(金) 16:53:34
>>25
許しまへんでー
31デフォルトの名無しさん: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デフォルトの名無しさん:2009/02/13(金) 19:49:49
perlは簡潔に書いたときに可読性が増すように設計された言語だと思う。
ほかの言語だと、したい処理を表現するのに余計なことを書き込まなくてはいけない。
その余計なことはプログラムの流れにとって不自然なので注釈が必要になる。
25はほかの言語の仕様に毒されていてプログラムに無駄が多いんだろうね。
perlが可読性に乏しいと主張する人は単にperlについての知識が乏しいだけだ。
34デフォルトの名無しさん:2009/02/13(金) 21:22:44
Perlをよく知ってる人はより完結に書けるけど、あまり知らなくても
知ってる知識だけでプログラムが出来ちゃうところがPerlのいいところだと思う
35デフォルトの名無しさん:2009/02/13(金) 21:28:43
でもuse strictしてないのとか、goto使ってるのとか、
ファイル1枚で絵巻物みたいに長いのは勘弁してください。
36デフォルトの名無しさん:2009/02/14(土) 12:14:44
Active perl にてwperlを使用してコマンドプロンプトを開かないようにしたいのですが
ソース内でシステムコマンド(たとえば`tasklist`とか)を使うとプロンプトが一瞬開きます。
これを開かないようにする方法ってありますか?
379: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デフォルトの名無しさん:2009/02/15(日) 12:01:37
>>38
バイナリを扱うなら \r や \n といった論理的な表現を使わず \x0D や \x0A を使え。
print index join('', map chr, 0..31), "\x0A"; # 10

http://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というのはhttp://search.cpan.org/dist/HTML-ExtractContent/
ここからダウンロードできたのですが、その先をどうしたらよいのでしょうか
LWPというのはとりあえずppmからインストールできました
43デフォルトの名無しさん:2009/02/15(日) 13:08:54
>>42
>su
>password: ********
> cpan
:
:
[1]cpan>install HTML::ExtractContent

おしまい。
4442: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デフォルトの名無しさん: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
追記。
http://d.hatena.ne.jp/KNOPP/
の一番最後の方を読むと幸せになるかもしれん。
ただWindowsだからどうなのかは知らん。

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

そのあと cpan >installしてみたらどーなる?
48デフォルトの名無しさん:2009/02/15(日) 15:39:14
もしかしてコンパイル環境がないからコケてるのか?
ぽつぽつとスマソ。
4938:2009/02/15(日) 21:14:22
>>39
ありがとうございました。
$/なる変数は、初めて知りました。

しかし、どうやら原因は、ほかでしたw。
FTP転送の際に、改行を勝手に変換してたため、\r\nが、\nだけになってたことでした。
これで、2文字が1文字扱いされてるなってw
50デフォルトの名無しさん:2009/02/15(日) 21:16:42
>>38
indexや正規表現を使ってる。
文字列がutf8に汚染されないように気をつけている程度かな。
51デフォルトの名無しさん:2009/02/15(日) 21:22:34
>>50
それだとバイナリにindexや正規表現を使っちゃいけないように読める。
5250:2009/02/15(日) 21:56:57
しまった元ファイルが壊れていたってオチか。

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

ついでに >>36
方法はあるけど、それなりに難しそう。
GUIアプリからコンソールアプリを実行 でググると吉。
もしかしたら既存モジュールがあるかも。
5342:2009/02/15(日) 23:00:58
>>47
ついさっきまでCentOS5をインストールしてCPANで試してもうまくいかず絶望していましたが、
書き込みを見てリンク先の指示通りにやったら無事プログラムが動きました。
本当にありがとうございました。いくら感謝しても感謝し切れません。
54デフォルトの名無しさん:2009/02/16(月) 11:55:30
>>53
おお動いたか、よかったな。少し心配してたw
55デフォルトの名無しさん:2009/02/16(月) 22:19:33
>>36
>>50

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

use Win32::OLE;
my $WshShell = Win32::OLE->CreateObject("WScript.Shell");
$WshShell->Run('tasklist', 0);
56デフォルトの名無しさん:2009/02/17(火) 07:10:12
パッケージの外から変数を覗き見たいです
ググったところ、グローバル変数ならシンボルテーブルとかいうものを検索すれば見られそうな感じですが、
レキシカル変数は無理なのでしょうか
57デフォルトの名無しさん:2009/02/17(火) 09:16:53
>>56
なぜそんなことが必要な状況になったかが問題だと思う。
58デフォルトの名無しさん:2009/02/17(火) 09:32:52
>>56
つPadWalker
59デフォルトの名無しさん:2009/02/17(火) 13:26:55
>>57
デバッグのときにあまり本体を汚さずに中の変数を覗きたいんですよ
最終的には一行書くだけで自動的に変数をトレースしたいです

>>58
それ素晴らしく完璧ですね
ありがとうございます
60デフォルトの名無しさん:2009/02/17(火) 14:03:35
>>57
知らないならレスしないでください
61デフォルトの名無しさん:2009/02/17(火) 14:25:23
知ってるがお前の態度が気に入らない。
62デフォルトの名無しさん:2009/02/17(火) 14:36:07
>>61
後出しみっともない
63デフォルトの名無しさん:2009/02/17(火) 15:42:16
>>62
コピペにマジレスみともない。
64デフォルトの名無しさん: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
68デフォルトの名無しさん:2009/02/17(火) 18:41:46
キモイ、粘着、IDストーカー、
もう返信しないで下さい。キモいです。
69デフォルトの名無しさん:2009/02/17(火) 19:08:44
なにこのスレ
70デフォルトの名無しさん:2009/02/17(火) 23:44:42
文字列取得の質問です

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

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

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

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

indexとsubstrを駆使してみましたが、
カンマやダブルクオテーションが複数あるため
indexの位置が正しく取得できずに断念しました。
71デフォルトの名無しさん:2009/02/17(火) 23:51:51
>>70
っ[パターンマッチ]
72デフォルトの名無しさん:2009/02/18(水) 00:29:51
>>71
ありがとうございます。

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

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

$1⇒「ABC,d,e」

後ろのカンマのマッチを無視するにはどのようにすればよいでしょうか?
73デフォルトの名無しさん:2009/02/18(水) 00:39:30
>>72
(.+?)で最小マッチングできるよ
74デフォルトの名無しさん:2009/02/18(水) 00:50:47
>>73
ABC ⇒ /:(.+?)\,/
DEF ⇒ /.+\,(.+?)"/

↑で、うまくいきましたー。
ありがとうございました
75デフォルトの名無しさん:2009/02/18(水) 06:44:36
呼び出したモジュールから、本体の出力命令 ( print とか die とか )を察知して
内容を置換して出力し直すことは可能でしょうか
76デフォルトの名無しさん:2009/02/18(水) 07:48:50
可能です。
77デフォルトの名無しさん:2009/02/18(水) 14:57:23
>>76
どうもです
7875:2009/02/18(水) 23:09:04
どうやら print をオーバーライドするのが一番手っ取り早そうですね
ですが、perl はサポートしてないんですよね
実現してるモジュールなんかはありますでしょうか
79デフォルトの名無しさん: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デフォルトの名無しさん:2009/02/19(木) 03:00:45
ありがとうございます
まだファイルハンドルあたりやtaiについての知識が薄いので、
ここ2,3日で実験しながら学びたいと思います
また何か分からないことがあると思うので、
よろしくお願いします
8179:2009/02/19(木) 22:56:32
>>80
正直、想定外の好反応にあわててる僕がいるお。
外野からの「こんなひどいことするくらいなら設計見直したほうがいい」系のツッコミを期待してたので。
>>79 は猛烈にやっつけで、行儀の良くないことをいくつもやっている点が「変態」の所以。
なのでこのまま流用したりすると後でひどい目にあうことうけあい。
ヒント程度にしておくのが吉です。
82デフォルトの名無しさん:2009/02/20(金) 00:25:08
Mooseっていったん適当なクラスにrole付加したら、あとでそのrole使わないようにってできないの?
83デフォルトの名無しさん:2009/02/20(金) 09:24:24
:>>81
:viaレイヤ使うといいのかもしれない。使ったことないけど。
84デフォルトの名無しさん:2009/02/20(金) 10:12:57
StringRandomモジュールを使用せずに2chのIDのようにランダムな文字列を生成するにはどうすればよいでしょうか?
85デフォルトの名無しさん:2009/02/20(金) 11:43:28
その程度のプログラムも書けないのは全くプログラミングの勉強が
不足しているのでもうすこし勉強しましょう。
86デフォルトの名無しさん:2009/02/20(金) 14:09:07
>>84
っ[Digest]
87デフォルトの名無しさん: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デフォルトの名無しさん:2009/02/20(金) 18:31:12
なんといういやがらせ
9088:2009/02/20(金) 18:56:00
自己解決しました
index関数とsubstr関数で置換できました
91デフォルトの名無しさん:2009/02/20(金) 18:58:52
とあるプログラムの一部に書かれてたんですが
これはどういう意味なんでしょう?

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

$0でスクリプト自身のファイル名を取ってきて
正規表現に掛け、マッチしたものを別の変数に入れてますけど、
これだと$0と$selfは一緒なものが入る気がするんですが・・・。
92デフォルトの名無しさん:2009/02/20(金) 19:21:24
>>91
志村〜、コメント、コメント

汚染されたデータからパターンマッチで部分文字列を取り出すことで
汚染を取り除いている(=untaint)のだが、汚染とは何かとか言い出すと
長くなるので「perl 汚染」でぐぐっていろいろと調べてみるといいよ。
93デフォルトの名無しさん:2009/02/20(金) 20:02:26
$0が汚染されてたらスクリプト自体が実行出来ないもんじゃねえの?
(汚染チェックの重要性は十二分に解ってはいるんだけど)
9491:2009/02/20(金) 21:38:11
>>92
レスありがとうございます。
なるほど、不正なコマンド含んでたりするものを取り除いてるわけですね。

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

まぁ調べる方針はわかったのでもう少し調べてみます。どうもでした。
95デフォルトの名無しさん: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デフォルトの名無しさん:2009/02/21(土) 20:00:22
>>96-97
スコープが違うから。
上はサブルーチンの外側で宣言した %H に代入している。
下はサブルーチンの内側で宣言した %H に代入している。

型グロブはパッケージ変数。
99デフォルトの名無しさん:2009/02/21(土) 20:18:27
>>98
なるほど
パッケージレベルのmy変数はどの関数からも見えるんですね
あと型グロブはmy変数とは異なるパッケージ変数と。勉強になりました
100デフォルトの名無しさん:2009/02/22(日) 11:53:36
ここ(http://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デフォルトの名無しさん:2009/02/22(日) 12:51:19
>>100
手元で検証してみたが、サーバ側のバグかもしれない
IDパラメータの「@」が「%40」にエンコードされていると認証に失敗した
102101:2009/02/22(日) 12:58:44
さっきのレスがわかりにくいかもしれないので…
futen.cgiに渡すパラメータは通常
[email protected]&PASS=password
って風になるんだけど、これが
ID=mail%40domain.jp&PASS=password
という風に渡すと、なぜか認証に失敗する。
本来は後者でも%40が@にデコードされた結果、認証が成功していないといけないのだが…

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

my $req = POST($url,\%form);
103デフォルトの名無しさん:2009/02/22(日) 13:12:46
>>102
・エンコードしない。
・[%form]→\%formに修正。

再度実行してみましたけど、認証に失敗・・・orz
104101:2009/02/22(日) 13:20:31 BE:1092302674-2BP(1)
>>103
いや、プログラムが間違ってるわけじゃなくて、サーバ側の実装がおかしいんです。
で、一応の回避策ですが、
\%form

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

P.S.
サーバ側のバグについて
http://qb5.2ch.net/test/read.cgi/operate/1225876082/591
にて問い合わせています
105デフォルトの名無しさん:2009/02/22(日) 14:11:11
お〜っ、勃ってる。
辛抱強く DAT 落ちしたログ持って待ってた甲斐があった。


…単なるログコレクターみたいなもんなんだけど…。
106デフォルトの名無しさん:2009/02/22(日) 19:02:42 BE:318384566-PLT(54324)
大昔から知られてる問題
107デフォルトの名無しさん:2009/02/22(日) 19:48:03
  ↑
すぐそういうことを言う・・・
たまたま知ってたから自慢したいだけやろ。
108デフォルトの名無しさん:2009/02/22(日) 20:13:00
>>107
そういう風に嫉妬むきだしの解釈するのは感心しませんね。

>>106さんは、自分がたまたま読んでいなかったばかりに、素早く問題点を
指摘してあなたがたに無駄働きさせないことが出来なくてすいませんと
言いたかったんですよ。
109デフォルトの名無しさん:2009/02/22(日) 20:18:33
後出しジャンケンみっともない
110デフォルトの名無しさん:2009/02/22(日) 22:12:06
>>104
解決しました。
ありがとうございました。
111デフォルトの名無しさん:2009/02/22(日) 22:36:02
仮想配列の中に'abc'が存在するかどうか確認する方法はありますか?
112デフォルトの名無しさん:2009/02/22(日) 22:40:11
exists
113デフォルトの名無しさん:2009/02/22(日) 22:40:20
仮想配列って何ですか
114デフォルトの名無しさん:2009/02/22(日) 22:40:39
「仮想配列」
115デフォルトの名無しさん:2009/02/22(日) 23:51:08
先っぽの皮が半分だけ剥けてるヤツだろ。
手で引っぱって全部剥けるなら心配いらん。
116デフォルトの名無しさん:2009/02/23(月) 03:18:46
>>106
>switch.layer3.asia が稼動してる際に SNMPv2c の一般的な読み取りコミュニティ名で
>リクエストを送ると、どこかのツリーの下に私の携帯電話番号が現れますよ

http://layer3.asia/

痛いw
117デフォルトの名無しさん:2009/02/24(火) 03:02:56
perlに限った事じゃないかも知れない(前置き)
klassというのをたまに見掛けるけど、これはどういった意図で使ってるの?
ある程度の頻度で見掛けるので、一定の合意があるのかと思って聞いてみました。
118デフォルトの名無しさん:2009/02/24(火) 03:29:04
classが予約語の言語でclassの類似物を作った場合とか
funktionなんてのもよく見るね
119デフォルトの名無しさん:2009/02/24(火) 13:22:48
フォームから読み出したデータを処理したいのです。
読み出したデータの名前はa1からa10までで、それを$a1から$a10に入れたいのですが、

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

…と、a10まで順番に書いていかなければならないんでしょうか。
すっきりした書き方があれば、教えて下さい。
120デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/02/24(火) 14:23:55
というか、パラメタにつく数字は2桁超えるならa00-a10と言う風に桁をそろえようぜ。
ソートする時とか上のような技法が使えないから。
125119:2009/02/24(火) 14:41:12
>>120-124
配列なんて考えもしませんでした…思いついたところで、
今度は「配列に入れたいんですが」と泣きついていたように思いますが。
桁数にも気をつけます。

ありがとうございました。
126デフォルトの名無しさん:2009/02/24(火) 14:45:13
>>124
ラマ本は買った?
http://www.amazon.co.jp/dp/4900900818
昔のラマ本の方が分かりやすかったな・・・。
127デフォルトの名無しさん:2009/02/24(火) 14:45:31
128デフォルトの名無しさん:2009/02/24(火) 14:47:47
さらにごめん。さっきの中古本だった。3版になってるのね。
http://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デフォルトの名無しさん:2009/02/24(火) 17:24:37
つprint Math::BigFloat->new('436611485')->bdiv('2074')->bstr, "\n";

fdivじゃなくてbdivだよな。bdivの二番目の引数は精度だから精度3桁で計算合ってるよ。
131デフォルトの名無しさん:2009/02/24(火) 18:44:14
jcode(ver 2.7) で誰か知ってたらおしえてください。

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

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

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

132デフォルトの名無しさん:2009/02/24(火) 18:54:10
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
http://anond.hatelabo.jp/20080822142610
ここにプログラムがありますが、これを実行するために
1.必要なもの
2.(1.)が揃ったらやること
をざっと教えてください。
135デフォルトの名無しさん:2009/02/24(火) 23:57:57
>133
自前でエラー出すなら perldoc carp 参照。
そうじゃなきゃ、perl -d hoge.pl でデバッガ上で実行すれば?
136デフォルトの名無しさん:2009/02/25(水) 00:06:54
>>134
増田に聞けば?
はてなでもいいけど
とりあえず自分がどこまで理解しているのかくらいは書けよ
環境とか
137デフォルトの名無しさん:2009/02/25(水) 00:13:10
>>136
すんません
プログラミング経験はありません
環境はwindows vistaです
138デフォルトの名無しさん:2009/02/25(水) 00:26:05
>>134
> http://anond.hatelabo.jp/20080822142610
> ここにプログラムがありますが、これを実行するために
> 1.必要なもの

それを実行するために何が必要で、何をやればいいのかがわかるだけの知識。
139デフォルトの名無しさん:2009/02/25(水) 00:26:18
>>136
それ書けば質問に答えられるのか?
140デフォルトの名無しさん:2009/02/25(水) 00:31:02
>>138
その知識を分けてください

>>139
もしかしたら>>134の1,2,の回答だけじゃ俺には無理かもしれないけど
最低限それだけあれば頑張れそうな気がする
要するにエロい思いしたいからです。
141デフォルトの名無しさん:2009/02/25(水) 00:32:54
えっちなのはいけないと思います。
142デフォルトの名無しさん:2009/02/25(水) 00:33:20
正直者め
143デフォルトの名無しさん:2009/02/25(水) 03:22:27
>>140
ここ見て、知らない単語はぐぐれ。
ttp://www.moongift.jp/2008/06/strawberry_perl/

英語読めるなら
ttp://win32.perl.org/wiki/
144デフォルトの名無しさん:2009/02/25(水) 13:44:59
>>140
プログラミング自体が初めてなら、こうゆう本から始めたほうがいいかもな。
http://books.livedoor.com/item/379362

Perlとは何か、プログラムとは何か、というところから始まってるから。
ただ、オレ自身はこの本を読んだことはないが。
145デフォルトの名無しさん:2009/02/25(水) 19:34:10
ワラタw何という見当外れな回答
その上、読んでない本すすめてるし
ちょっと興味もって調べたら著者はこぼら
146デフォルトの名無しさん:2009/02/25(水) 23:35:21
4Uは、Gigazineの記事を読んだだけでスルーしてたけど、二次元版も出来てたんだな
さっそく登録した
147デフォルトの名無しさん:2009/02/26(木) 06:13:13
Sort::Fields - 区切られたフィールドを持つ行のソート
http://fleur.hio.jp/perldoc/mix/Fields.ja.html

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

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

環境はlinux Red Hatなのでsortで頑張った方が良いですか?
sort に詳しくありません。
148デフォルトの名無しさん:2009/02/26(木) 06:21:09
「エラーになります」

大爆笑
149デフォルトの名無しさん:2009/02/26(木) 06:59:30
ぞっとした
150デフォルトの名無しさん:2009/02/26(木) 09:21:40
みんなで仲良くね
151デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/02/26(木) 13:17:12
誰かがゴリゴリ書いてるだろうと想像して傍観。"....\"...."とかは許されるんだっけ?
156デフォルトの名無しさん:2009/02/26(木) 13:21:26
XML タグ 正規表現
でググったら変態正規表現がけっこうヒットするな。
157154:2009/02/26(木) 13:34:51
ども
158デフォルトの名無しさん:2009/02/26(木) 17:04:37
誰もゴリゴリ書かなかったな。
/(<[^>"]*?(?:(?:".*?){2}|)>)/
159147:2009/02/26(木) 22:26:27
>>151

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

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

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

今日も確認しましたが、小文字でperl本体と同居になっていました。
お客の環境を使っているので、指摘や説明をするのが大変なので諦めます。
有り難うございました。
160デフォルトの名無しさん:2009/02/27(金) 07:35:19
全力でスルーしてたが…

sort.pm, fields.pm => pragma
Sort::Fields => 外部モジュール
「人間はタマゴから生まれる」レベルの気違い理論を展開してる事に気付け。
161デフォルトの名無しさん:2009/02/27(金) 07:40:21
よくそれで仕事にしてるよな・・・。
162デフォルトの名無しさん:2009/02/27(金) 07:58:04
がまんしてスルーして
163デフォルトの名無しさん: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デフォルトの名無しさん:2009/02/27(金) 17:07:51
ループでひとつの配列を使いまわしているのですが、次のループ時も前のループのときの配列のデータが残っていて都合が悪いです
配列を空っぽにする方法はありますか?
165デフォルトの名無しさん:2009/02/27(金) 17:13:02
>>164
@a = ();
166164:2009/02/27(金) 17:31:23
ありがとうございました
うまく空っぽにすることができました
167デフォルトの名無しさん:2009/02/27(金) 17:35:31
>>166
できれば仕組みも理解してね。応用利くから。
168デフォルトの名無しさん:2009/02/28(土) 23:31:59
複数のテキストファイルから1行目だけを抜き出すスクリプトって
かけないでしょうか。
169デフォルトの名無しさん:2009/02/28(土) 23:37:29
>>168
#!/usr/bin/perl
foreach my $fn (@ARGV){
open my $fp, "<", $fn;
print scalar(<$fp>);
}
170デフォルトの名無しさん:2009/02/28(土) 23:39:31
>>168
書けるよ
171デフォルトの名無しさん:2009/02/28(土) 23:43:38
>>169が回答出してるのに「書けるよ」と自慢げに一行レスする>>170
172デフォルトの名無しさん:2009/03/01(日) 00:10:02
>>168
書けるよ
173デフォルトの名無しさん:2009/03/01(日) 00:10:14
>>171
いやん
174デフォルトの名無しさん:2009/03/01(日) 00:11:00
ところで、headコマンドつかっちゃダメなの?pure perlでやらなくちゃダメなの?
175デフォルトの名無しさん:2009/03/01(日) 00:21:22
>>169
まだ冗長だね。
#!/usr/bin/perl
while(<>){
print $_;
close(ARGV);
}
176 ◆TWARamEjuA :2009/03/01(日) 00:30:41 BE:2723055-BRZ(10000)
え?
177デフォルトの名無しさん:2009/03/01(日) 00:40:57
PERLっていくら学んでも知らない書き方が出てくるな・・w
>>175
close(ARGV)ってclose($ARGV)やclose(@ARGV)とはどう違うん?
とりあえず、printの後の$_は省略出来るぜ
178デフォルトの名無しさん:2009/03/01(日) 00:45:08
>>175
おお、d>printの後の$_
close(ARGV)はコマンドラインで指定されたファイルのうち今開いてるファイルを閉じる。
次の<>では次のファイルを開く。
179デフォルトの名無しさん:2009/03/01(日) 00:52:04
#!/usr/bin/perl -n
print ;
close ARGV;
180デフォルトの名無しさん:2009/03/01(日) 01:17:03
% perl -ne 'print;close ARGV'
181デフォルトの名無しさん:2009/03/01(日) 01:23:46
perl -pe 'close ARGV' *
182デフォルトの名無しさん:2009/03/01(日) 01:32:22
perl -pe'close ARGV' *
183デフォルトの名無しさん:2009/03/01(日) 01:57:48
head -n 1 -q *
184デフォルトの名無しさん:2009/03/01(日) 08:33:59
#!/usr/local/bin/radin;
print $musabetsutero;
185デフォルトの名無しさん:2009/03/01(日) 10:38:53
>>184
いつのネタだよ。ったく。
186デフォルトの名無しさん:2009/03/01(日) 10:42:21
>>181
先にcloseしちゃうからダメじゃん。
187デフォルトの名無しさん:2009/03/01(日) 11:04:56
>>186
closeする前に1行分が読み込まれてるから大丈夫。
188デフォルトの名無しさん:2009/03/01(日) 11:13:47
>>187
あ、そか。さんくす。
189デフォルトの名無しさん:2009/03/01(日) 12:05:50
日本語でおk
190デフォルトの名無しさん:2009/03/01(日) 12:12:36
openで開くファイル名に使えない文字コードってありますか?
Shift-jisでスクリプトを書いていてShift-jisのファイル名でファイルを作成しようとするとエラーは出ないのですがファイルが作成できません
英数字のファイル名だとファイルが作成できます
191デフォルトの名無しさん:2009/03/01(日) 12:16:16
>>190
システムがShift-JISのファイル名に対応してなかったら当然作れない。
あと""で囲むとメタ文字が発動するかもな。
192デフォルトの名無しさん:2009/03/01(日) 12:28:07
使用環境はWindows+ActivePer5.10.0lです

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

ファイル名を変数を使わずに直接記述するとうまくいきました
変数に格納されている文字列の形式がおかしいのかな…
193デフォルトの名無しさん:2009/03/01(日) 12:35:19
>>192
調べてないけど、2回""で囲ってるからメタ文字が二度発動してるんだと思われ。
194デフォルトの名無しさん:2009/03/01(日) 12:37:40
まあ、Shift_JIS文字列はいかなる場合でもメタ文字に気をつけるのが吉。
ダメ文字という言葉は知っておいた方がいい。
195デフォルトの名無しさん:2009/03/01(日) 13:24:19
時々ファイル名にもIOレイヤみたいな仕組みが欲しくなるね。
196デフォルトの名無しさん:2009/03/01(日) 13:45:53
ダメ文字の対処法としてメジャーなのが

$a = '十\';

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

$a = <<'EOF';

EOF
chop($a);

とするようにしてる。
197デフォルトの名無しさん:2009/03/01(日) 13:47:50
つーかそんな面倒なことしなくてもqwで何とかなるような気がしてきた。
昔はqwなかったからその時の流儀をそのまま使ってる。
198デフォルトの名無しさん:2009/03/01(日) 13:53:03
あー久しぶりにこのコード書くなと思ったら、最近はUTF-8でコード書いて出力時変換だな。
連投スマソ
199デフォルトの名無しさん:2009/03/01(日) 17:07:13
>>190-198 のような話題を解決するために
>>4のテンプレがあるのにな。
200190:2009/03/01(日) 19:41:26
open ">$file";
ならファイルが作成できるんですが、
open ">$file.txt"にするとだめでした
事前に$file .= ".txt";
で文字結合してもだめでした
201デフォルトの名無しさん:2009/03/01(日) 19:48:27
file="テスト"なんだよね?
ソースファイルのエンコーディングは何?
もしSJISでなければSJISにしてみては?

202デフォルトの名無しさん:2009/03/01(日) 19:49:52
ってSJISって書いてあった。すまん
203190:2009/03/01(日) 19:53:45
ソースファイルのエンコーディングはSJISです
open ">テスト.txt";はできます

末尾に.txtを文字結合すると書き込めなくなるようです
204190:2009/03/01(日) 20:00:43
Dumpしてみたら原因がわかりました
改行コードを含んでいたようです
スレ汚し失礼しました
205デフォルトの名無しさん: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}};
}

カプセル化ってこんな感じでいいの?
自分で動かした感じは問題なさそうだけど普通のオブジェクトとアクセサしか使えないだけで同じ動作する?
2071/2: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;
2082/2: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デフォルトの名無しさん:2009/03/04(水) 19:05:23
>>208
どこらへんが大ポカなの?
211デフォルトの名無しさん:2009/03/05(木) 09:30:59
ゥーperlーパー
212デフォルトの名無しさん:2009/03/05(木) 11:27:45
Perlかわいいよ
213デフォルトの名無しさん:2009/03/07(土) 01:50:07
*Hoge::huga = /&hogehoge('hugahuga');
としたときに引数が設定されたメソッドが生えると思います
ですが
Hoge::huga('hogehoge');
としてもhogehogeは無視されるようです
設定した引数に加えて更に引数を追加する方法は無いでしょうか
214デフォルトの名無しさん:2009/03/07(土) 04:47:47
>213
> *Hoge::huga = /&hogehoge('hugahuga');
> としたときに引数が設定されたメソッドが生えると思います
本当?

> 設定した引数に加えて更に引数を追加する方法は無いでしょうか
*Hoge::huga = sub { hogehoge('hugahuga', @_); };
215デフォルトの名無しさん: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デフォルトの名無しさん:2009/03/08(日) 12:35:53
自分が楽だと思う方でいいと思うよ
219デフォルトの名無しさん:2009/03/08(日) 12:43:15
>>218
やっぱり楽なほうを選ぶのが賢明ですか。

Windowsだとperl単独のほうが環境を整えやすいでしょうね。
UNIXやLinuxだったら最初から色々入ってるのが普通ですけど。
Cygwinとか入れてよければどちらでも手間は変わらない気がしますけど、
学校や会社のPCなんかだと、何かインストールするのに許可が必要だったりしますし。
220デフォルトの名無しさん:2009/03/08(日) 12:47:41
>>217
元awk使いだけど。言語的なメリットはないと思うよ。
Perlはawkの後方互換を目指した言語だからね。awk2perlっつって
awkスクリプトをPerlスクリプトに置換するものがあるのは最近の人は知らなさそう。
ちなみにPerlにはawk互換のためだけに作られた機構がいくつかある。

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

長いことCGIプログラマをやってきたけどPerl覚えてからawkを使う機会は
上記のようなケースを除いてゼロになったな。特にここ10年は全く書いてない。
221デフォルトの名無しさん:2009/03/08(日) 12:51:19
>>220
a2pで変換すると長〜いスクリプトに変換してくれますよね。
あれってどうにかならないでしょうか。

あれ見るとawkのほうが簡単じゃん、って思ってしまうんですよ。
222デフォルトの名無しさん:2009/03/08(日) 12:57:02
>>221
いやいやa2pは人工知能じゃないし、最適化とかはしないから
長くなるのは仕方ない。

awkはバイナリ扱えないとか(今は知らんけど)文字コード変換が大変とか
色々制約あるし、書くのもPerlの方が楽だよ。
223デフォルトの名無しさん:2009/03/08(日) 13:06:22
>>222
>いやいやa2pは人工知能じゃないし、最適化とかはしないから
>長くなるのは仕方ない

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


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

シェルスクリプトでバイナリは扱えますよね。
nkfとかconvmvとか使うと文字コード変換できますね。
でも、やっぱりperlのほうが楽なのですか?
もし楽ならperlを学んでみたいなぁ、と思います。
224デフォルトの名無しさん:2009/03/08(日) 13:13:58
>>223
でもやっぱりPerlが楽ですね。awkより短く速く書けるよ。
225デフォルトの名無しさん:2009/03/08(日) 13:23:11
何しろLarry Wallがawkの弱点に音を上げて、awkの欠点弱点を
補うべく作られた言語だからね。そもそもは。
226デフォルトの名無しさん:2009/03/08(日) 14:02:19
awkはできることが少ない。
でも当たり前だよな。

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

一つで何でもやれるようになんていうLarry Wallがバカなだけ。
227デフォルトの名無しさん:2009/03/08(日) 14:37:32
perlとsedの使い分けってどうするんでしょうか?

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

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

※sedは古いからダメとか、ダサいとか、そういうのは抜きにして下さい。
 純粋に有用性の観点のみでお願いします。
228デフォルトの名無しさん: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デフォルトの名無しさん:2009/03/08(日) 15:26:42
>>226
Perl不要論ですか。これは新しい。
230デフォルトの名無しさん:2009/03/08(日) 15:37:05
>>228
絶対必要ってわけじゃないだろ。Perlが入ってないマシンいじる
機会があるならともかく。覚えといて損はない程度だと思うが。
日本刀でも料理は出来る。

>>226
インストーラがPerlを要求するご時勢にこんな事言う人がいるとは。
昔はそうやって批判する人もいたけどね。
231デフォルトの名無しさん:2009/03/08(日) 15:47:58
>>230
日本刀で料理w
そこまでムキになって否定しなくてもいいんでない?
世の中シェルスクリプトはできるけどPerlはできない人なんてゴロゴロいるし、
Perlが出来ても使い捨てスクリプトはシェルスクリプトでやる流儀の人もいる。
どうあがいても完全にシェルスクリプトを駆逐するのは無理だよ。
自動車の優位性をいくら説いても原チャリや自転車はなくならないのと同じでさ。
232デフォルトの名無しさん:2009/03/08(日) 15:52:30
>>231
不要とは言ってない。Perlでブートするわけにはいかんだろw
ただマの知識として必要かというとPerlで事足りる人もいるだろう。
233デフォルトの名無しさん:2009/03/08(日) 16:07:30
>>231
お前こそムキになってPerlは必要ないって言ってるじゃん
234デフォルトの名無しさん:2009/03/08(日) 16:07:39
>>232
エンドユーザの立場から一言。

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

たかだかちょっとした自動化、文書検索、集計程度も自分で書けない人だらけにしてしまったのは
「素人は言語なんて使わなくていい」という発想のせいだと思えるのですが。
235デフォルトの名無しさん:2009/03/08(日) 16:21:46
自分の目的を達成できれば言語なんて何使ったっていいんだよ。

特にスクリプト系言語を使うってことは、大体が小物でしょう?
自分がサッと書けること。これが重要。
236デフォルトの名無しさん:2009/03/08(日) 16:26:44
>>234
時代のせいだと思います。
例えば自分はWebプログラミング畑だけど、全てのWebアプリケーションを
全部Cで書くことは納期的にほとんど不可能です。awkでは完成すらしない
ものも出てきます。

自分も昔はquick sortくらいは空で書けたけど、Webに足を
突っ込んだ今ではそれすら忘れてしまいました。
237デフォルトの名無しさん:2009/03/08(日) 16:47:37
>>236
quicksortなんてlibcに任せときゃいいんですよ。気に病むことでもない。
238デフォルトの名無しさん:2009/03/08(日) 16:59:13
>>236
quick sortもできないの?
ププ
239デフォルトの名無しさん:2009/03/08(日) 17:03:17
>>237
だね。
>>238みたいになんでも自分で作るとたまに間違うことがあるし、
馬鹿馬鹿しいプライドで心がねじ曲がってしまう。
240デフォルトの名無しさん:2009/03/08(日) 17:17:39
エンドユーザの立場から一言。

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

たかだかちょっとしたソートも自分で書けない人だらけにしてしまったのは
「素人はソートなんてやらなくていい」という発想のせいだと思えるのですが。
241デフォルトの名無しさん:2009/03/08(日) 17:22:21
単純なテキストファイルで単純なソートなら sort(1) でもいいんだろうけど
242デフォルトの名無しさん:2009/03/08(日) 17:24:54
FYI

■libcでqsort()を再帰を使って実装してる香具師は怠慢だろ…常識的に考えて
http://d.hatena.ne.jp/n2s/20070421/p1
243 ◆TWARamEjuA :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デフォルトの名無しさん:2009/03/08(日) 22:44:41
ワンライナーはsed,awk,sortの方が楽なことが
多いな。例えばいくらオプションでsplitを暗黙
にさせても[]書かされる時点で、$1,$2でいい
awkにはかなわない。

もちろんガッツり書くならスクリプト言語。
246デフォルトの名無しさん:2009/03/09(月) 17:17:27
>>244
1行目は同意だが、あとはいつの時代の話だよと思うな。
そりゃ配布物配ろうとか思ったらまずshを選択するだろうが、
例えばWebアプリケーション作る時にshを第一選択肢に上げるか?
hello world以外は特にsh使う場面って思いつかないんだが。
247デフォルトの名無しさん:2009/03/09(月) 17:48:50
>>246
普通にファイル処理やテキスト処理には使うし、
処理を自動化するのにも使うし、
定期的にどっかのサイトにアクセスして、特定の情報だけを記録するとか、
その程度の用途には当たり前に使うと思うが。

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

それとも、プログラミングってのはアプリとwebの開発のためだけにあんのか?
248デフォルトの名無しさん:2009/03/09(月) 17:54:32
小規模ならまずシェルで出来ないか考えるよな
249デフォルトの名無しさん:2009/03/09(月) 17:54:45
>>247
例外は認めないのかよw
普遍的な事のように書くから変な誤解受けるんだろ。

んで、それらの用途にシェル使わない人もいると思うが何かデメリットでもあるのか?
「UNIXの世界ではふつー」とかじゃ理由にならんだろ。
例えば毎秒起動とかだったらさすがに少々面倒でもshを第一選択とするのが吉だと思うが。
250デフォルトの名無しさん:2009/03/09(月) 17:58:02
>>249
>んで、それらの用途にシェル使わない人もいると思うが何かデメリットでもあるのか?

同じことができるならそれでいい。
ただし、より面倒臭くなることはあるだろう。
何も難しくないワンライナーでできることに他の物使うとか、そういうのは単なるアホだろ。
251デフォルトの名無しさん:2009/03/09(月) 18:06:37
トリッキーなことしなくても普通にシェルでできるなら、それが一番簡単なんじゃね?
コマンド並べれば動くから
難しいナンチャラ理論やらウンタラ指向やらも考えなくて済む

プログラマでないエンドユーザや管理者にも使えるのは大きなメリットだと思うな
252デフォルトの名無しさん:2009/03/09(月) 18:07:23
>>250
要するに余計面倒な時だけsh使うでもいいわけね。
>>244はとてもそういう論調には見えないけど。

そういう俺はよくshスクリプト書くがな。
253デフォルトの名無しさん:2009/03/09(月) 18:10:49
254デフォルトの名無しさん:2009/03/09(月) 18:11:49
>>250
> 何も難しくないワンライナーでできることに他の物使うとか、そういうのは単なるアホだろ。

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

短く書けるっつったってせいぜい数バイトだろ>>228。頭切り替える方が面倒だわ。
255デフォルトの名無しさん:2009/03/09(月) 18:13:28
>>254
Perlに没頭してるあなたにとってはPerlでやるほうが簡単なんでしょうね
別にそれはそれでいいのでは?
だからといって、それはあなた個人の特殊事情で簡単に感じるだけなのだから、
シェルでやるほうが手間が少ない人にまで強要すべきことではないでしょう
256デフォルトの名無しさん:2009/03/09(月) 18:15:10
>>255
いつ強要したんだよww俺はこうだって言っただけじゃん。
逆に>>244なんかshで出来ることにPerl使う奴は外道みたいな書き方じゃん。
257デフォルトの名無しさん:2009/03/09(月) 18:17:24
この人論点が分かってないからトンチンカンな事を言うのかね。

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

みたいな主張がおかしいと言ってるだけなんだが。
258デフォルトの名無しさん:2009/03/09(月) 18:22:07
>>257
話がかみ合わない理由って案外簡単なんじゃない?
普通にUNIX系OS使ってる人にとってshって標準的な道具だから、
シェルで作業するってのは鉛筆で文字を書くのと同じくらい簡単で当たり前なんだよ。
だから、どうしても他の物を試す前にshで、っていう発想になるだけでしょ。
259デフォルトの名無しさん:2009/03/09(月) 19:01:03
いったい、シェルの話をしているのかシェルスクリプトの話をしているのか
はっきりさせてくれ。
260デフォルトの名無しさん:2009/03/09(月) 19:09:12
つーかPerlの話しようぜ
261デフォルトの名無しさん:2009/03/09(月) 19:20:03
>>259-260の流れわろた
262デフォルトの名無しさん:2009/03/09(月) 19:41:35
この現代に、WEBアプリ以外に何があるの?
世界じゅうどこを見て回っても、WEBアプリしか無いんだから
awk も sh もいらん。perl しか選択の道は無いだろ。
263デフォルトの名無しさん:2009/03/09(月) 19:43:50
最近の家庭電化製品はマイコン内臓でずいぶん賢くなった。
しゃべる電子レンジのファームウエアを awk や sh で書けると思ってんの?
264デフォルトの名無しさん:2009/03/09(月) 19:56:31
宗教の勧誘みたいw
265デフォルトの名無しさん:2009/03/09(月) 20:00:33
shのほうが慣れてるからsh使うという人が、昔は多かった。
イマドキのPerlerには、Perlのワンライナーのほうが慣れてる人が多いんだろうね。
266デフォルトの名無しさん: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デフォルトの名無しさん:2009/03/09(月) 20:10:37
lsで済むことならlsじゃねえの普通
Windowsユーザならlsなんぞ打たずにファイラとかエクスプローラだろうしな

でも、スクリプトの話じゃなかったのか
268デフォルトの名無しさん:2009/03/09(月) 20:13:40
ファイルの行数調べるのも「Perlでどうやろうか」とか考えちゃうのね
cat hoge | wc -l
とせずに
269デフォルトの名無しさん:2009/03/09(月) 20:14:54
そこは
wc -l <hoge
catとか使わないな
270デフォルトの名無しさん:2009/03/09(月) 20:15:05
>>267
シェルとシェルスクリプトに何の違いがあんの?
コマンドが単発か複数かの違いだけじゃん?
271デフォルトの名無しさん:2009/03/09(月) 20:15:32
ファイルに記述するか
その場でうちこんで終わりかの違いじゃね
272デフォルトの名無しさん:2009/03/09(月) 20:17:15
シェル言語の有用性認めないなら
シェル言語使わなけりゃいいじゃん
そこまで言うならPerlだけで暮らせ
273デフォルトの名無しさん:2009/03/09(月) 20:18:57
bashのコマンド使わないでperlだけで暮らしたらさぞ便利だろうねw
274デフォルトの名無しさん:2009/03/09(月) 20:23:47
Windowsユーザの9割はbashなんて使ってないけどね
275デフォルトの名無しさん:2009/03/09(月) 20:26:16
>>274
この話ではWinユーザは無関係と思われ

UNIXの操作ではシェルが母国語みたいなもんなのに
簡単な用事でも外国語使いたがる変人だけが対象
276デフォルトの名無しさん:2009/03/09(月) 20:30:51
それって、いもしないキャラを作り上げてない?
277デフォルトの名無しさん:2009/03/09(月) 20:40:09
awk '/UNIX/ || /Linux/' hoge

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

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

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

で、シェルとシェルスクリプトをやたらに区別したがってる奴がいるが、本質は同じだろ。
シェル使って作業して、コマンドを複数使って仕事しようとすると、シェルスクリプトと言われるだけで。
278デフォルトの名無しさん:2009/03/09(月) 21:04:33
>>277
その例なら
grep '(UNIX|LINUX)' hoge
かなあ
awkなんて使わないよ
279 ◆TWARamEjuA :2009/03/09(月) 21:09:44 BE:1960463-BRZ(10000)
my @textfiles = grep /txt$/, qx|ls -l|;
でもえぇやん。。。
280デフォルトの名無しさん:2009/03/09(月) 21:13:16
>>278
環境によって動かないとおもいまつ
GNU grep 2.5.3
では少なくとも×

grep -e UNIX -e Linux hoge

これなら動きます
ただし、awk使うのと難しさに大差ありません
281デフォルトの名無しさん:2009/03/09(月) 21:15:29
例を挙げれば挙げるほど
Perlより簡単な方法が出てくる件
282デフォルトの名無しさん:2009/03/09(月) 21:21:06
>>280
ありゃ
egrepならいいのかな?
283デフォルトの名無しさん:2009/03/09(月) 21:21:44
>>282
そうでつね
284デフォルトの名無しさん:2009/03/09(月) 21:29:38
ここまでの流れを見た率直な感想


Bシェルとかgrepとかawkとかsedなんて前時代の遺物だと思ってたけど・・・
今でも十分に使えんじゃん
285デフォルトの名無しさん:2009/03/09(月) 21:45:28
結局どうやるのがもっとも効率的かを的確に判断できるように
あらゆるスキルを磨いとけってこった。
286デフォルトの名無しさん:2009/03/09(月) 22:15:16
専用のコマンドの方が使い勝手がいいのは当然だよね
それでも sed や awk を使うのでは1行で済まない場合は
(シェルスクリプト組むような場合は)、Perl の方がシンプルになってくる
287デフォルトの名無しさん:2009/03/09(月) 22:19:03
ワンライナーの話をしてるのに
なんでshのコマンドラインとワンライナーを比べるんだか・・・。
ネジ緩んでるの?後者は一応スクリプトだぞ。

コマンドはスクリプトで書くのが大変or不可能なことをするために
存在するんだからwcとか例に持ってくるのは愚の骨頂。
288デフォルトの名無しさん:2009/03/09(月) 23:24:23
>>286
簡単なことだけならシェルスクリプトの方がシンプルだと思うが

>>287
それって自分の首絞めてないか?
コマンド単体で強力ならそれを利用したスクリプトも強力なわけで
289デフォルトの名無しさん:2009/03/09(月) 23:42:01
>>287
ワンライナーってコマンドラインの延長じゃねーの?
質的な違いなんてねーよ
290デフォルトの名無しさん:2009/03/09(月) 23:48:37
質問です!
Perlとsedとawkとbashはどれがいちばんつおいのですか?
291デフォルトの名無しさん:2009/03/09(月) 23:57:59
perlで話題が無いからって、そこまで引っ張ることないだろ(w
292デフォルトの名無しさん:2009/03/10(火) 00:00:57
じゃあ無理やり話題作りを。
問:以下のシェルスクリプトをPerlに直しなさい。

#!/bin/sh
o=$(echo "$@" | sed 's/ /+/g' | sed 's/ /+/g')
w3m "http://www.google.co.jp/search?hl=ja&q="$o"&meta=lr%3D&aq=f&oq="
293292:2009/03/10(火) 00:08:22
ちなみに、
sed 's/ /+/g' | sed 's/ /+/g'
の部分は
sed 's/[  ]/+g'
でも同じですが、
全角スペースと半角スペースを列記すると見た目にわかりにくくなるので、
問題文ではあえて別々に処理しとります。
294デフォルトの名無しさん:2009/03/10(火) 00:15:36
sedやw3mがシェルスクリプトの一部だというなら
perlも仲間に入れてあげなよ
295デフォルトの名無しさん:2009/03/10(火) 00:18:46
perlだけは絶対入れない。絶対ニダ
296デフォルトの名無しさん:2009/03/10(火) 00:21:18
sedとかawkでやると楽な事とperlでやるのが楽な事の境界線を
判断するのは難しいよな
297デフォルトの名無しさん:2009/03/10(火) 01:53:00
まーあれだ、シェルがどーこーとかほざいてる奴らが言ってるのはどうせbashだろ。
糞linuxごときの標準シェルなんぞどーでもえーわ
298デフォルトの名無しさん:2009/03/10(火) 06:31:06
どーでもえーことに熱くなれるっていいネ!!
299デフォルトの名無しさん: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 = 'http://www.google.com/calendar/feeds/[email protected]/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デフォルトの名無しさん: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
302301:2009/03/10(火) 23:10:45
$hoge="hoge";
$foo="foo";
$hoge_="まさか・・";

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

どうみても誤解釈です。ほんとうにありがとうございました。
303デフォルトの名無しさん:2009/03/10(火) 23:11:02
>>301
3行目で$home_ を展開してる。
サンプルコードの最初に
$hoge_ = "HOGE";
て入れてみると、3行目の出力が「HOGEfoo」になる。
304デフォルトの名無しさん:2009/03/10(火) 23:11:34
あ、>>302で解決してますね
305301:2009/03/10(火) 23:17:29
>>303,304
レスどうもありがとうございました。
306デフォルトの名無しさん:2009/03/11(水) 10:31:12
くだすれスンマセン
($self->{year},$self->{month},$self->{day}) = ( gmtime time + $time_difference * 3600 )[5,4,3]

この [5,4,3]っていうのはどういうことなのですか?
こういう書き方の呼称がわからないのでググれなくて
307デフォルトの名無しさん:2009/03/11(水) 10:50:28
slice
308デフォルトの名無しさん:2009/03/11(水) 13:46:55
list
309デフォルトの名無しさん:2009/03/11(水) 18:19:50
>>306
ググる前にマニュアルを読めばいいと思うよ。
http://perldoc.jp/docs/perl/5.10.0/perldata.pod
310デフォルトの名無しさん: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デフォルトの名無しさん:2009/03/14(土) 11:13:25
シグナル打ち込め
314デフォルトの名無しさん:2009/03/14(土) 11:24:01
>>311
1A は関係ないと思う。
1A は有っても無くても終了するはずだよ。
でないと UNIX などは大変なことになる。
1A は Windows だけの習慣。UNIX のテキストファイルには普通 1A は無いからね。
原因は何か他にあるんじゃないの?
315311: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送っても無限ループが続く幹事
http://maxxdelphisite.free.fr/doscmd.htm

1AってそもそもEOFじゃないんのかな?
316デフォルトの名無しさん: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デフォルトの名無しさん:2009/03/14(土) 13:49:03
なんか変なのが沸いた

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

へー
318デフォルトの名無しさん:2009/03/14(土) 13:55:55
ファイルハンドルがって意味じゃねえの?
それでも言葉不足だけどw
perl hoge.pl < hoge.pl
は、
while(<ARGV>){ print ; }
でも
while(<STDIN>){ print ; }
動くよ。
319デフォルトの名無しさん:2009/03/14(土) 13:57:02
最終行「でも動くよ。」
320デフォルトの名無しさん:2009/03/14(土) 14:08:58
知ったかぶり者を論うのやめろ。荒れるから。
321へんなの:2009/03/14(土) 14:09:01
あーすまん。
言葉も変だし、5.8までと5.10で挙動が違うわ、>>316
>>316の例とかは全面撤回(5.10では動く)
322デフォルトの名無しさん: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デフォルトの名無しさん:2009/03/14(土) 17:02:33
>>315
>ファイルをつっこむと、1Aで終了せずに、ファイル全部読み込んだら終了します
>プログラムで(というか以下のライブラリ)で読むと、1A送っても無限ループが続く幹事

結局どうなの?終了するの?無限ループするの?どっちなの?
結局、何がしたいの?どういう動作を期待してるの?
324デフォルトの名無しさん:2009/03/14(土) 19:47:30
>>311 が使ってるOSでは、0x1a を送っても 0x1a にすぎず EOF にはならない。
どうしてもそれを望むなら OS を CP/M に換えるといい
325デフォルトの名無しさん: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デフォルトの名無しさん: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()で出る一番小さな数字というのがあれば教えて頂けないでしょうか。
329326:2009/03/16(月) 21:19:15
>>327

ありがとうございます。
参考になりました。
330デフォルトの名無しさん:2009/03/16(月) 21:51:39
>328
perldoc -f rand
331デフォルトの名無しさん: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
332331:2009/03/17(火) 00:01:27
*だと\dが0の場合も含まれるんでした。
*を+にしたらうまくいきました。
333デフォルトの名無しさん:2009/03/17(火) 00:42:36
関数のreturn値って成功の場合1で、失敗の場合0が普通なのでしょうか?
標準関数はこのパターンが多いような気がします。
シェルスクリプトの場合だとたいてい逆ですよね?
334デフォルトの名無しさん:2009/03/17(火) 07:18:18
成功の場合に真を、失敗の場合に偽を返す
って考えれば Perlの関数の多くも コマンドの終了コードも同じ
335デフォルトの名無しさん:2009/03/17(火) 08:34:52

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

Perl6では、system関数の戻り値もPerlの流儀になる
337デフォルトの名無しさん:2009/03/17(火) 20:36:43
引数がAから始まって、後が全部数字かどうかチェックするのって

if($ARGV[0] =~ /^A+[0-9]$/)
でいいのかな
338 ◆TWARamEjuA :2009/03/17(火) 20:38:57 BE:3920966-BRZ(10001)
>>337
おしいかも。
/^A[0-9]+$/

でもその前にchomp入れた方がよいかも♪
339デフォルトの名無しさん:2009/03/17(火) 20:47:23
おおお、なんと優しい
ありがとーw
340デフォルトの名無しさん:2009/03/17(火) 23:20:12 BE:309540375-PLT(54324)
/\AA[0-9]+\z/
341デフォルトの名無しさん:2009/03/18(水) 04:15:45
xms
342デフォルトの名無しさん:2009/03/18(水) 09:46:26
\d+はダメなの?
343311:2009/03/18(水) 10:41:45
>>316
時間が空いてすいません。

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

問題は、通常のプログラムから標準入力を渡した場合なのですが、これもファイルから渡したのと同様になる
ものなのでしょうか?
つまり、何かのデータをフラグと見立てて、それを検出したら終了、というような作業が必要なものか、と。
344311:2009/03/18(水) 10:44:13
>>323
期待する動作は、プログラムで1Aを送ると終了して欲しい、ということです。
ターミナルやコマンドプロンプトなどで、^Zを送ったときと同じような動作を期待しています。
345デフォルトの名無しさん:2009/03/18(水) 10:44:39
>>342
\d や \w はロケールや UTF-8 フラグによってマッチする文字が変わる。例えば全角数字。
$ は改行の直前にもマッチするので、"A10\n" =~ /^A[0-9]+$/ が真となってハマる初心者多し。
^ は /m が指定されていない限り文字列先端にしかマッチしないので、\A だとやや偏執的
とも感じる。用心深いに越した事はないけれど、/\AA よりは /^A の方が見た目がスッキリ
して読みやすい。

http://perldoc.jp/docs/perl/5.10.0/perlreref.pod
http://perldoc.jp/docs/perl/5.10.0/perlretut.pod
346デフォルトの名無しさん:2009/03/18(水) 11:35:38
>>344
1Aが入ってきたら終わるように書けばいいだけ。
347デフォルトの名無しさん: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デフォルトの名無しさん:2009/03/18(水) 16:40:10
>>344
CP/Mからの呪縛。

DOS(Windows)とUNIXそれぞれの、改行コード、終端コード、
テキストモード、バイナリモードについて、ググるなりして理解するのが先。
351デフォルトの名無しさん:2009/03/18(水) 18:44:37
>>345
d
352デフォルトの名無しさん:2009/03/18(水) 20:17:40
>>344
だから 0x1a が EOF と思ってる時点で間違ってる
まずここを理解しろよ

CTRL-Z 押下は EOF を送るための特殊な操作であって、
それが歴史的な理由で CTRL-Z (0x1a)になってるだけであって
0x1a を送れば EOF になるわけじゃない。
353デフォルトの名無しさん:2009/03/19(木) 01:24:01
>>344
if (ナントカ eq "\x1a") { exit }

こういう発想は思いつかんの?
354311: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')

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

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

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

みたいな華麗な手法があるなら知りたいです。
356デフォルトの名無しさん:2009/03/20(金) 03:24:57
@count{@b} = @b;
@array = grep(!defined($count{$_}), @a);
357デフォルトの名無しさん:2009/03/20(金) 05:09:05
@c = grep{!((join ',', @b) =~ /(?:^|[^0-9])$_(?:[^0-9]|$)/)} @a;

すごく…力わざです…
358デフォルトの名無しさん:2009/03/20(金) 06:47:02
>>355
みたいなじゃなくてそれ使えよ
359デフォルトの名無しさん: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デフォルトの名無しさん:2009/03/20(金) 17:25:05
モダン(笑)
362デフォルトの名無しさん: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;
--------------------
363362: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デフォルトの名無しさん:2009/03/21(土) 21:45:51
>>363
javascriptじゃだめなの?
365 ◆TWARamEjuA :2009/03/21(土) 21:51:44 BE:3484984-BRZ(10001)
04月01日だと、$yesterdayに04月00日が生成される伊予柑♪
366362:2009/03/21(土) 22:00:24
しくしく。。。いじわるですね。。。というか遊ばれていますね。。。

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

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

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

あらためて、どんな手段(言語、手段、ツール)がいいかを含めて
教えてください。<(_ _)>
367デフォルトの名無しさん:2009/03/21(土) 22:11:34
>>362
1) SSIで最終更新日時を書くのが楽
2) Perlでやるなら、File::Slurpで読んでDateTimeで計算するのが楽

かね。
そもそも、

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

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

ちょっとまってね、これから書くから。
368デフォルトの名無しさん:2009/03/21(土) 22:15:53
明らかにSSIが楽。
369デフォルトの名無しさん: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);
370362:2009/03/21(土) 22:19:54
すみません...

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

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

です。

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

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

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

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

が、そうしたところ、案内のhtmlファイルも自動で日付を変えられるだろうと、
偉い人から言われまして...
371369:2009/03/21(土) 22:22:40
Template-Toolkit(Template)とかHTML::Templateを使う手もあるね。

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

そうすればSSIでもやれるんじゃないかな?
372362:2009/03/21(土) 22:22:46
>>369さんありがとうございます。

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

SSIについては鯖管さんに相談してみます。
そういうとこ、小回りのきかない、相談窓口も親身になってくれない
会社です。。。
373369:2009/03/21(土) 22:26:43
うい、367=369=371れす。

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

もしPerlでどうしてもやりたいなら、>>369を使う場合、
DateTimeとかFile::Slurpは標準では入っていないから、
CPANから導入出来るかも聞いておいて。
374デフォルトの名無しさん:2009/03/21(土) 22:29:14
あー、LINE:も要らないし(逐行処理の名残)、そもそもよく考えたら
my $file = read_file($file_name, scalar_ref => 1);
して
$file =~ s{略}{略}xmseg;
すりゃよかったか。

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

>>322が気になった今日この頃。比較表とかないかな?
376362:2009/03/21(土) 22:40:12
重ね重ね、ありがとうございます。

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

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

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

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

おやすみなさい。
377デフォルトの名無しさん:2009/03/21(土) 22:41:04
PBPとtokuhiromの受け売りだが、
13月32日に引っかけないためにはRegexp::Commonを使おう
378デフォルトの名無しさん:2009/03/22(日) 00:28:52
>>369
これはちょっとマズいんじゃないの?
コメントでは YYYY-MM-DD と書いてるけど、実際の処理が
\d{4}-\d{2}-\d{2] では、全然年月日じゃない文字列にもマッチしかねない。

もちろん年月日かどうか完璧な判定はできないけど、
>>362 にあるようにマッチさせる文字列が昨日の日時でいいなら
そういう風に限定すべき
379デフォルトの名無しさん: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: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: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/03/22(日) 03:20:37
あ、うそ、ごめん。
>>381の二つめの>>362式は、3月32日になるw
ゆえに素直にDateTime使おう。
385379:2009/03/22(日) 03:36:54
>>382-383
ありがとうございます!>>382さんのコードの方がPerlっぽくていいですね。
ぼくのはJavaとかでも使えるテクしか使ってないや。
最近Perlはワンライナーしか書かなくなってさっぱり鈍ってしまった。
386 ◆TWARamEjuA :2009/03/22(日) 10:10:15 BE:6861097-BRZ(10001)
1日前ってそんなに難しいのかしら?
time - 86400
でよさそうな。。。
387デフォルトの名無しさん:2009/03/22(日) 10:34:11
うるう秒をちゃんと扱わないシステムならな
388デフォルトの名無しさん:2009/03/22(日) 11:15:10
>>387
UNIX時はどれも閏秒は算定してないと思うが。
システムによって現在のUNIX時が食い違ったら困るだろ。
389デフォルトの名無しさん:2009/03/22(日) 13:00:39
超頭悪い会話が繰り広げられている
390デフォルトの名無しさん:2009/03/22(日) 13:15:46
391362:2009/03/23(月) 05:38:24
おはようございます。
ご報告が遅くなりました。

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

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

ではみなさま、また縁がありましたらどうぞよろしくお願いします。
392デフォルトの名無しさん:2009/03/23(月) 07:49:00
>>389
仕様上はどちらでもいいことになっているが、先発製品との互換上、
どのシステムもうるう秒は算定していない。

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

よほど金融系のシステムとかでなければ、NTPクライアントを随時走らせておけば大きな支障はない。
393デフォルトの名無しさん:2009/03/23(月) 09:22:29
いちおうtzfile(5)とか見ればわかるけどうるう秒扱えるようにはなって
いるんだよね。

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

天文とかは過去のある時刻との間の時間みたいのをきっちり出せない
と困りそうだけど。
394デフォルトの名無しさん:2009/03/23(月) 09:23:10
うるう秒を勘案するシステムは存在しないってこと?
395デフォルトの名無しさん:2009/03/23(月) 13:06:04
>>394
一般的なUNIXtimeの扱いの話であって、
そういったシステムが存在しないとは誰も言ってない。
極端な話、協定世界時を管理してるシステムなんかは当然勘案しなきゃ困るでしょ。
396526:2009/03/24(火) 19:51:11
ここで聞くのが適切かどうか心配ですが、違ったら誘導願います。

debian etch の上で、perl-tk をいれて触っています。
どうにも日本語が表示されませんので、どなたか詳しい人、アドバイスをお願いします。
perlは、 v5.8.8
perl-tkは、804.027-7
です。
よろしくお願いします。
397デフォルトの名無しさん:2009/03/25(水) 04:25:03
エスパーじゃないんだからさ、それじゃ答えようがないよ。

とりあえず>>4
あとやったこと書け
398デフォルトの名無しさん:2009/03/25(水) 14:49:23
ここで聞くのが適切かどうか心配ですが、違ったら誘導願います。

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

どんな薬を飲めばいいですか?医者に診せたほうがいいですすかね・・・
何科の医者に行けばいいですか?
よろしくお願いします。
399デフォルトの名無しさん:2009/03/25(水) 14:53:25
エスパーじゃないんだからさ、それじゃ答えようがないよ。
400デフォルトの名無しさん:2009/03/25(水) 17:06:54
@test
赤、A、あ、   #$test{0}
黄、A、い、   #1
青、A、あ、   #2
赤、B、あ、   #3
赤、C、い、   #4
青、A、あ、   #5
例えばこういう配列があったとして
各項目ごとに一番多い文字列(赤 A あ)をそれぞれ取り出したいんですがどのようにすればいいんでしょうか?
401デフォルトの名無しさん:2009/03/25(水) 17:28:24
「こういう配列」
402デフォルトの名無しさん: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デフォルトの名無しさん:2009/03/26(木) 12:16:36
>>400
二次元配列のようでもあるし、コメント見るとハッシュにしてるし…
せめてPerlの書式で書いてくれ
405400:2009/03/26(木) 18:21:17
>>402
レスありがとうございます。

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

どなたか配列の中で一番多い要素を取り出すサブルーチンを書いていただけないでしょうか。
406デフォルトの名無しさん:2009/03/26(木) 18:50:35
>>405
いくら出すかも書いておくと話が早いよ
407デフォルトの名無しさん:2009/03/26(木) 18:52:32
http://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デフォルトの名無しさん:2009/03/26(木) 19:32:34
perl タダなんだから、自分でダウンロードして確かめてみればいいじゃん。
409405: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デフォルトの名無しさん:2009/03/26(木) 20:44:10
っ「List::Utilのmax」
411デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/03/30(月) 07:28:29
(1) x 10
416デフォルトの名無しさん:2009/03/30(月) 09:31:19
DB_Fileってundefは保存できないんですか
""とundefどうやって区別したらいいんでしょうか
417デフォルトの名無しさん:2009/03/30(月) 10:15:31
>>415
どもです
418デフォルトの名無しさん:2009/03/31(火) 13:31:20
分類と項目が並んでいるリストがあったとして
各項目はいくつかの分類のどれかに属していて、
分類ごとにまとめて処理をしたいので、
項目のリストを分類別に作りたい

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

みたいに配列の連想配列が使えるといいのだけれど
何かスマートな解決法はありますか
419デフォルトの名無しさん: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デフォルトの名無しさん:2009/03/31(火) 15:16:24
>>416
defined
>>418
ハッシュのキーに分類の名前
ハッシュの要素に項目の配列リファレンスとか入れたらどうだろう
$item{分類} = [qw/項目 項目 項目/];
みたいに
421デフォルトの名無しさん: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デフォルトの名無しさん:2009/03/31(火) 15:51:12
1 while $str =~ s/<hoge>//g; かなぁ
423デフォルトの名無しさん:2009/03/31(火) 15:51:37
>>421
1 while $str =~ s/<hoge>//; とか
$str =~ s/<hoge>//g; とか
424デフォルトの名無しさん:2009/03/31(火) 16:16:08
>>420
$class と $itemのセットを記憶するのに、
push(@{$items{$class}}, $item);
でいけました

@$items{$class} ではないという部分で引っかかりました
念のため[]で初期化したけど、外しても問題なく動くあたりが流石
425デフォルトの名無しさん:2009/03/31(火) 16:39:15
>>423
上では無駄な1が気持ち悪いです
下では $str = '<h<hoge>oge>' のときに削除できません…
426デフォルトの名無しさん:2009/03/31(火) 16:48:20
>>425
リャマ本に似たようなコード載ってるから、じゃ気持ち悪くならない理由にならない?
上の方は定数式(1)は最適化で取り除かれるんだとさ
427デフォルトの名無しさん:2009/03/31(火) 16:57:42
>>426
見た目が気持ち悪いのと処理的に気持ち悪いのは違うんですよ
「全部取り除く」って処理に全く関係ない1なんかがあるのは生理的に気持ち悪いです
{}で終わるのも一文なのに;がないから処理が終わってない感じがいやらしいです
リャマ本に上が載ってるなら、他にやり方はないんですかね…
もしかしたら正規表現で再帰的に検索してくれるオプションがあるかもと思ってたんですが…
428デフォルトの名無しさん: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デフォルトの名無しさん:2009/03/31(火) 19:56:14
>>428
トン
キャプチャバッファについてググってみます
430デフォルトの名無しさん:2009/03/31(火) 19:59:32
>>427
my $str = '<h<hoge>oge>' ;
L:{ $str =~ s/<hoge>//g and redo L; }

1 while COND の方が断然気持ち良いけどさ。
431デフォルトの名無しさん:2009/04/01(水) 13:55:08

 「 気 持 ち 悪 い 」

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

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

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

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

だが、そういうもんだ。いちいち疑問にしてたらキリが無い。
順応しろよ、順応。
432デフォルトの名無しさん:2009/04/01(水) 13:56:13
自分で拡張すればいい
433デフォルトの名無しさん:2009/04/01(水) 14:01:47
アッー
434デフォルトの名無しさん:2009/04/01(水) 15:41:46
>>431が気持ち悪い
435デフォルトの名無しさん:2009/04/01(水) 17:37:19
activeperl 5.8.8を使っています
-d でフォルダかどうか判断する時に、
5Cで終わっているフォルダ名を正しく扱えません

どうやったら回避できますか
436デフォルトの名無しさん:2009/04/01(水) 18:30:23
5Cでエスケープしてみては?
437デフォルトの名無しさん:2009/04/01(水) 18:58:01
ちょっと意味が判らないのですが、

-d "$file\\"

という書き方でも結果は同様です
438デフォルトの名無しさん: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デフォルトの名無しさん:2009/04/01(水) 19:22:59
で、何が問題なの?
440デフォルトの名無しさん:2009/04/01(水) 19:51:36
aaa2―はフォルダなのに
aaa2― is file.
となってしまうことが問題
441デフォルトの名無しさん:2009/04/01(水) 20:05:27
-dの返り血をちゃんと調べたのか?
442デフォルトの名無しさん:2009/04/01(水) 20:23:03
-dの戻り値なんて1か0しか無いのでは
443デフォルトの名無しさん:2009/04/01(水) 20:47:53
>>431
至極真っ当
理に叶ってる
()の中はbooleanが必要とされてる
{}の中は場合によって処理されるか否かなんだからブロックで囲まれてて当然

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

つまりwhile(〜);と書ければ万事解決なんだよ!!!!
444デフォルトの名無しさん:2009/04/01(水) 21:49:19
順応と思考停止と信者脳って紙一重だなぁ、って>>431見ると思うね。
445デフォルトの名無しさん:2009/04/01(水) 21:57:59
>>443
while(~){}は
while(~){
 ();
}
の省略記法だよ?B::Deparseで確認してみ?
勝手に省略して、省略してしまった部分について気持悪がられても…
「();が気持悪い!」って言われたら、
「そりゃごもっとも、俺もそう思う。」と言わざるを得ないけどさ。
446デフォルトの名無しさん:2009/04/01(水) 22:04:09
-f -d -eについても調べたところ、-eにすら通っていない
aaa: -f, -d1, -e1
aaa―: -f, -d1, -e1
aaa2―: -f, -d, -e

ディレクトリを再帰的に辿って全部のファイルに対して云々、みたいな
処理をさせると、フォルダの末尾が5Cかもしれない問題は必ず発生すると思うんだけど、
どうやって回避してるの?
447デフォルトの名無しさん:2009/04/01(水) 22:04:57
省略記法てーのは正しくないな。
perlではこう解釈されるってのが正しいのか。
448デフォルトの名無しさん:2009/04/01(水) 22:13:47
>>446
あなたの環境が何か解らないからスルーしてたけど、
スクリプトのエンコーディングとディレクトリのは合ってるの?
winなら>>4とかそこらへんの問題じゃないの?

私の環境だと問題が出ないから力にはなれません。
449デフォルトの名無しさん:2009/04/01(水) 22:43:19
>>4を入れても改善しないようです
aaa: -f, -d1, -e1
aaa?\: -f, -d, -e
aaa?Q?\: -f, -d, -e

むしろ悪化しています
環境はwindowsXPです
450デフォルトの名無しさん:2009/04/01(水) 23:34:09
なんで""つけるんだよ
451デフォルトの名無しさん:2009/04/02(木) 00:20:37
>>4 に答えが書いてあるじゃん。なぜそうしない?
452デフォルトの名無しさん:2009/04/02(木) 00:35:54
>>4は、表示で化けるとか、検索とか正規表現がうまく行かないとかの、
日本語の文字列としての取り扱いを完璧にする方法だけど、
ファイルシステム絡みは何も改善しないように見える

唯一、ファイル名をcp932でencodeするように注意はあるけど、
それは必要な処理であって、今回のケースを解決しない
453デフォルトの名無しさん:2009/04/02(木) 00:54:42
cygwinと同じ問題じゃないの?
ActivePerlがMultiByte系のW32API使ってないんじゃ
454デフォルトの名無しさん:2009/04/02(木) 00:59:15
activeperlではどうやっても無理、というはっきりした結論があれば、
他の言語も含めた別の解決法を探すんだけど、
ぐぐってもそのへんを断言した文章は見つからない

逆に、このスレでは口を揃えて出来る出来ると言っている
サンプルは1バイトも出てこないけど
455デフォルトの名無しさん:2009/04/02(木) 01:53:05
Perlでは出来ないし、ここにいるやつらは知ったかぶりの初心者ばかりだから、
PerlはあきらめてPythonでやるといいよ!!
456デフォルトの名無しさん:2009/04/02(木) 04:29:43
うちの環境で"activeperl エンコーディング readdir"でググって一番上に出てくる
http://homepage2.nifty.com/ttoyoshima/Perl/lesson5.htm
には
> 「Active Perl V5.8.8」では日本語の「ファイル名」のファイルは開けない。
って書いてあるけど。
457デフォルトの名無しさん: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デフォルトの名無しさん:2009/04/02(木) 08:45:49
単に説明が面倒だから、全部できないことにしとけ、という手抜きだろ
459デフォルトの名無しさん: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デフォルトの名無しさん:2009/04/02(木) 10:53:36
その65行をライブラリとして使えば変わらん
461デフォルトの名無しさん:2009/04/02(木) 11:20:31
そのText/Password.phpの中身は何行だよ
462デフォルトの名無しさん: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デフォルトの名無しさん:2009/04/02(木) 12:29:06
>>449
> >>4を入れても改善しないようです

>>4には
> # ※2. OS に渡す文字列(ファイル名,dos コマンドのオプションなど)は、
> # この例のように cp932 でエンコードする必要があります。
と書いてあるが、なぜそんなことが必要なのか、よく考えてごらんよ。
すると、OS からもらった文字列は逆にcp932 からutf8 にデコード
しなきゃならない、という事にも気づけるだろう。
464デフォルトの名無しさん:2009/04/02(木) 14:07:20
>>463
問題を勘違いしてる
0x5Cがエスケープ文字だからトラブってるのではなくて
Windowsのディレクトリセパレータなのが問題
465デフォルトの名無しさん:2009/04/02(木) 15:49:06
>>464
> Windowsのディレクトリセパレータなのが問題

へ〜、そうなんだ。
466デフォルトの名無しさん:2009/04/02(木) 15:54:30
>>462
ワロタwww
467デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/04/02(木) 18:40:13
環境は以下です。
This is perl, v5.8.8 built for MSWin32-x86-multi-thread
WindowsXP SP3
470デフォルトの名無しさん:2009/04/02(木) 18:54:55
Win32::APIガリガリ叩いてやればできたはずなんだけど、英語の記事だったから読んでないしどこでみたかも覚えてない
471デフォルトの名無しさん: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
472468: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デフォルトの名無しさん:2009/04/02(木) 19:10:27
>>468
所詮線型合同法だろ? 偏りあるしそんなもんよ。
List::Utils::shuffle(1..50000) じゃダメなのか。
474デフォルトの名無しさん:2009/04/02(木) 19:11:18
>>472
それは偏りが出るまずいアルゴリズム。

っ「Fisher-Yates shuffle」
475デフォルトの名無しさん:2009/04/02(木) 19:21:05
>>468-469
その環境での乱数の有効ビット数が15だから。
rand(1)が返す数の種類が32768通りしか存在しないので、3万時点のskip確率は90%以上。
乱数のビット数は use Config して $Config{randbits} で確認できる。
476デフォルトの名無しさん: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なんだけど、大抵は拡張子があるので、問題になることがない
477468:2009/04/02(木) 20:08:30
>>471,473,474
乱数の有効ビット数というのが原因のようですね。
手持ちのWindowsだと15でしたがLinuxでは48でした。

Fisher-Yates法では偏りが出る様なので>>473の方法でやってみようとおもいます。
レスありがとうございました。
478468:2009/04/02(木) 20:10:03
>>475さんもありがとうございました。
479デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/04/02(木) 21:18:47
>>479
詳しくd

-d 以外にテストの方法があったとしても、
次にそこに対してopendirすると失敗するので、結局目的は果たせない
例えば、ディレクトリ構造のツリーを表示するとかそんなプログラム

5.10.0 とか 5.8.9.825 では直っているかしら
482PHPの神:2009/04/02(木) 22:15:14
>>462
お前は何か勘違いしているようだな、、、

PHPでは
「発音できないパスワードを生成する」
とか、そういうことができるんだぞ
483デフォルトの名無しさん:2009/04/03(金) 01:52:56
ここって教えてくれる人がたくさんいていいな・・・
VBAスレなんて、、、
484デフォルトの名無しさん:2009/04/03(金) 12:19:33
485デフォルトの名無しさん:2009/04/03(金) 12:45:06
VBAを使う人というのは、VBAを使っても
嘔吐感、嫌悪感が生じない人なんだろ?
なら、数が限られてくるわな。
486デフォルトの名無しさん: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デフォルトの名無しさん:2009/04/04(土) 15:59:30
opendirはできなくても、中にあるファイルをopenは出来る
だからうまいことすれば大抵のソフトは回避できると思うけど、
そんな僅かなリスクの為に常時opendir禁止というのは辛すぎる
488デフォルトの名無しさん:2009/04/04(土) 16:59:22
>>486
>例えば、ディレクトリ構造のツリーを表示するとかそんなプログラム

長いよ。長すぎるよ。そんなん書いたら保守性が悪いだろ。
いいかい?

system("tree");

ほら、たった一行でできただろ。
489デフォルトの名無しさん:2009/04/04(土) 20:53:37
treeコマンドのあるOSだけじゃないし
490デフォルトの名無しさん:2009/04/04(土) 22:48:39
5C が問題になるOSには、たいてい tree コマンドはあるよ。
491デフォルトの名無しさん:2009/04/05(日) 00:27:34
Perlを使う人というのは、Perlを使っても
嘔吐感、嫌悪感が生じない人なんだろ?
なら、数が限られてくるわな。
492デフォルトの名無しさん:2009/04/05(日) 01:25:46
優越感と陶酔感が生じますよ
493デフォルトの名無しさん:2009/04/05(日) 01:30:46
>>492
ぷw
494デフォルトの名無しさん:2009/04/05(日) 02:26:05
>>432
田植えならしかるべきとこでやっていただきたい

あーゲシュタルト崩壊してきた
495デフォルトの名無しさん:2009/04/05(日) 11:24:11
Perl使ってるひとはいつもこんな主張
"他の言語は使えないから、Perlが一番いい"
Perlの良いことを一言も言えない
496デフォルトの名無しさん:2009/04/05(日) 11:51:14
ポテンシャルを語るのに飽きたひと
いわゆるYAGNI
みたいな?
497デフォルトの名無しさん:2009/04/05(日) 18:57:42
良い点なんて他との比較でしか論じれないからな
とりあえずperlが使えれば、好奇心以外に他の言語に乗り換える動機が発生しにくいので、
perlしか使わない人がおおい
498デフォルトの名無しさん:2009/04/05(日) 22:22:18
Perlの世界って閉じて荘
499デフォルトの名無しさん:2009/04/06(月) 00:35:28
そもそもどんな人なら「Perl使ってるひと」を名乗ってもいいのだろうか。
もしかすると>495に答えを授けた自称「Perl使ってるひと」も
>497の「perlしか使わない人」も「Perl使ってるひと」ではないかもしれない。
500デフォルトの名無しさん: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デフォルトの名無しさん:2009/04/06(月) 20:56:00
中のブロックだけでいいのでは(1行目要らないのでは)
502デフォルトの名無しさん: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デフォルトの名無しさん:2009/04/06(月) 21:22:23
×$name =
○$name eq

確かに>>501の通り
504un001.ecc.u-tokyo.ac.jp :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デフォルトの名無しさん: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デフォルトの名無しさん:2009/04/06(月) 22:54:29
変態の例
my $hoge ;
my $foo ;
1 while $str =~ /(hoge|foo)\((.*?)\)(?{ ($1 eq 'hoge' ? $hoge : $foo )= $2 })/g ;
507デフォルトの名無しさん: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;
508500: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/04/07(火) 00:24:03
実験的とはいいつつ5.6.0のころからずっとある機能だから勉強しといてもいいだろ
とはいえそう使うことのあるものとも思えんが
511デフォルトの名無しさん:2009/04/07(火) 00:33:22
>>507
>ref $class
これ真になる事無いだろ。

インスタンスメソッドとしても機能させたいんだったら
もう一工夫必要じゃね?
512デフォルトの名無しさん: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デフォルトの名無しさん:2009/04/07(火) 00:55:28
ああ、一工夫もへったくれもなかったねw
スマン。
514デフォルトの名無しさん:2009/04/07(火) 20:49:43
>>506
ど変態の例
sub hoge { $hoge = shift }
sub foo { $foo = shift }
$str =~ s/((?:hoge|foo)\(.*?\))/$1/eeg;
515デフォルトの名無しさん:2009/04/07(火) 21:03:43
Perlのコードを配布する際ってCPANからインストールして
使用したモジュールってどのように付属すれば良いのでしょうか?
それともReadmeなどにCPANからこのモジュールをインストールしてくださいと
書いておくのでしょうか
516デフォルトの名無しさん:2009/04/07(火) 22:15:26
それとも
517デフォルトの名無しさん:2009/04/07(火) 22:18:40
>>515
CPAN モジュールやその他のよく知られたライブラリ類は、特に事情がなければユーザに揃えてもらった方がよいでしょう。

ユーザ環境のモジュール配布元へのアクセスが制限されていたり、配布スクリプトがモジュールの特定のバージョンに依存するなどの事情がある場合は、その旨明記した上で各モジュールのライセンスが許せば同梱することもできます。

インストールスクリプト中で依存モジュールを CPAN からインストールさせることもできますが、大抵の単体配布では単に依存関係(必要なモジュールのリスト)を(できれば POD に)明記しておくだけで充分です。
518デフォルトの名無しさん:2009/04/07(火) 23:12:09
なるほど、やはりユーザーにもある程度の技術力は求められるのですね。
ありがとう御座いました
519デフォルトの名無しさん:2009/04/08(水) 17:38:42
$hogeの中の「\/:*?"<>|」を全て半角スペースに置き換えるのはどうすればいい?
520デフォルトの名無しさん:2009/04/08(水) 18:53:38
>>519
$hoge =~ s,\Q\/:*?"<>|\E, ,sg;
521デフォルトの名無しさん:2009/04/08(水) 19:45:04
522デフォルトの名無しさん: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デフォルトの名無しさん:2009/04/09(木) 01:52:22

http://d.hatena.ne.jp/goryugo/20090222/1235237948
↑の問題ってまだ残っているのでしょうか?
久しぶりにMechanizeを使ったプログラムを動かしたら
同じエラーが出るようになったのですがCommon.pmの中身が変わってしまっているようで
何処を修正すれば良いのかわからないのですが.....
524デフォルトの名無しさん:2009/04/09(木) 02:05:45
s/ で / が使えない時の第一選択って何にしてる?
525デフォルトの名無しさん:2009/04/09(木) 02:40:29
{}
526デフォルトの名無しさん:2009/04/09(木) 02:47:34
>>524
PATTERN か REPLACEMENT がある程度長ければ、/ の有無に関わらず {} 。
短ければ PATTERN にも REPLACEMENT にも現れない棒状の文字… | か ! か # 。
527デフォルトの名無しさん:2009/04/09(木) 03:23:38
>>522
$obj->hoge(\%hash);
528PHPの神:2009/04/09(木) 06:53:49
529デフォルトの名無しさん:2009/04/09(木) 07:50:22
> 「Pelは大規模Webサービスを支え,今も進化している。しかしそのことが広く知られていない」

確かに「Pel」は知られていないなw 

冗談はともかく、日曜プログラマの自分からするとめちゃめちゃ知られてるような気がするんだ
けど。「Perl技術者の雇用を増やしたい」とは言ってるけど、それでも何がしたいのかよくわから
ない。まだ安定した地位を得ていないRubyとかならまだわかる。

まったくの妄想だけど、Ruby on Railsに仕事を奪われがちになってるとか? でもそれなら
そっちも覚えればいいだけだしなあ。
530デフォルトの名無しさん:2009/04/09(木) 13:47:31
{}なんて使えるんだ

うちだと、
$str =~ s{}a{}A{};
みたいにしてもエラーになる
531デフォルトの名無しさん:2009/04/09(木) 14:12:06
>>530
本気なのかネタなのか判断に苦しむなそれw
532デフォルトの名無しさん:2009/04/09(木) 14:27:26
$str =~ s{a{b{;
普通に考えたらこんな感じ?
変な感じ…
家帰ったら試してみよう
533デフォルトの名無しさん:2009/04/09(木) 17:05:11
>>532
それはNG

$str =~ s}a}b};

こっちはok
534デフォルトの名無しさん:2009/04/09(木) 17:07:18
>>530 >>532
http://search.cpan.org/dist/perl-5.10.0/pod/perlop.pod#Quote_and_Quote-like_Operators____________________
http://perldoc.jp/docs/perl/5.10.0/perlop.pod

関係無いけど perldoc.jp の和訳は目次もname属性も削ってる上に
見出しが腐ってて不便極まりないな。
535デフォルトの名無しさん:2009/04/09(木) 17:30:33
一般的な正解

$str =~ s{a}{A};
536デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/04/09(木) 18:51:32
>>537
演算子を変数に入れておkだと初めて知りました!
ありがとうございました
539デフォルトの名無しさん:2009/04/09(木) 19:06:21
なぜ複数形
540デフォルトの名無しさん: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デフォルトの名無しさん:2009/04/09(木) 21:16:20
すみません
他で聴くためこちらの回答は不要です
失礼しました
542デフォルトの名無しさん:2009/04/09(木) 21:28:24
541は540とは違います。
引き続き回答お願いします。
543デフォルトの名無しさん:2009/04/09(木) 21:50:52
コードをeucで書いて、sjisで読んでeucに変換して処理して、
ということをよくやるけど、ローマ数字が元に戻せなくなるんだよな
544デフォルトの名無しさん:2009/04/09(木) 22:06:00
euc-jp-msでも?
545デフォルトの名無しさん:2009/04/09(木) 22:37:02
そんなencodeは知らんと言われる
546デフォルトの名無しさん:2009/04/09(木) 22:48:06
ppm install Encode::EUCJPMS
みたいなことをしても、見つからない
547デフォルトの名無しさん:2009/04/09(木) 22:58:35
5.8.xならactivestateのリポジトリにあるみたいだけど。
ppm install Encode-EUCJPMS
548デフォルトの名無しさん:2009/04/09(木) 23:00:35
それもやったんだけどな
無いってよ
549デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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 http://www.ActiveState.com
Built Mar 20 2006 17:54:25

ppm repは?もしかしてactivestateのリポジトリ無効にしてるとか無いよな?
552デフォルトの名無しさん:2009/04/09(木) 23:40:11
D:\>ppm rep
レトトトトツトトトトトトツトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトソ
ウ id ウ pkgs ウ name ウ
テトトトトナトトトトトトナトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトエ
ウ 1 ウ 9817 ウ ActiveState Package Repository ウ
タトトトトチトトトトトトチトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトル
(1 enabled repository)

大丈夫なのか、この画面は
553デフォルトの名無しさん:2009/04/09(木) 23:43:13
んー、ppmのバージョン違うのか?その表示は覚えが無いぞ…

> ppm version
PPM 3.4

> ppm rep
Repositories:
[1] tcool
[2] ActiveState Package Repository
554デフォルトの名無しさん: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 http://www.ActiveState.com
Built Jul 31 2007 19:34:48

ここ?
555デフォルトの名無しさん:2009/04/09(木) 23:56:53
あー、わかった。activeperl5.8.xは確かbuild818か819ぐらいで別リポジトリになってるんだわ
てことはそっちの新しいリポジトリに入ってないんだな
今ちょっと調べてきたらtrouchelle(ttp://trouchelle.com/perl/ppmrepview.pl)のリポジトリに入ってるみたいなんで、
リポジトリ追加したらいいと思う

build822だからこれでリポジトリ追加して
ppm rep add trouchelle http://trouchelle.com/ppm/
ppm i Encode-EUCJPMS
で入ると思う

ま、ローマ数字扱えるかどうかは確信がもてないがw
556デフォルトの名無しさん:2009/04/10(金) 00:03:55
D:\>ppm rep add trouchelle http://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デフォルトの名無しさん:2009/04/10(金) 00:08:39
でもローマ数字は駄目だった
558デフォルトの名無しさん:2009/04/10(金) 00:10:42
と思ったら、shiftjisじゃなくてcp932にしたら上手く行った
559デフォルトの名無しさん: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デフォルトの名無しさん:2009/04/10(金) 02:08:03
>>539
どういうことですか?
561デフォルトの名無しさん:2009/04/10(金) 11:17:05
formula 単数形
formulae 複数形
ってことでしょ。
562デフォルトの名無しさん:2009/04/10(金) 17:37:50
Perlでは一行の長い行を複数行に分けて書くにはどのようにすれば
良いのでしょうか?
じつは非常大きい数値をもじれつとして扱いたいのですが数値が12行ほど有りますので
行ごとに" "で囲み . で連結という方法以外に何か効率的な方法が無いかと思い
よろしくおねがいします。
563デフォルトの名無しさん:2009/04/10(金) 18:13:37
そりゃ perl 以外でも難しいな。
564デフォルトの名無しさん:2009/04/10(金) 18:49:30
$str = <<"EOF";
123
456
789
EOF
$str =~ s/\n//g;
print $str;
565デフォルトの名無しさん:2009/04/10(金) 21:19:23
$ perl
my @numbers = qw/
123456789012
123456789012
123456789012
123456789012
/;
my $joined_number = join "", @numbers;
print "$joined_number\n";
__END__
^D
123456789012123456789012123456789012123456789012
566500:2009/04/10(金) 22:32:16
>>509
どうもありがとうございます。
567デフォルトの名無しさん:2009/04/11(土) 02:43:56
>>565
わざわざ変数2個用意せんでも

my $num = join '', qw(
 123456789012
 123456789012
 123456789012
 123456789012
);
print $num . "\n";

でいいと思うんだけど
568デフォルトの名無しさん:2009/04/11(土) 02:46:17
変数ゼロがいいんだけどな
元々は、定数としてコード中に書いてあるもんなんだし
569デフォルトの名無しさん:2009/04/11(土) 03:03:18
その定数はどうやって使うんだ?変数に代入しないで、ただ飾っとくだけなの?
570デフォルトの名無しさん:2009/04/11(土) 03:07:25
式の中に組み込まれる
571デフォルトの名無しさん:2009/04/11(土) 05:22:45
可読性のためにも式の中で使うときには何か名前を付けた方がいいと思うが。これなら満足?

use constant LENGTHY_NUMERAL =>
1234567890 .
1234567890;

print LENGTHY_NUMERAL . " has " . length(LENGTHY_NUMERAL) . " digits\n";
572デフォルトの名無しさん:2009/04/11(土) 05:54:49
>>568
print join '', qw(
 123456789012
 123456789012
 123456789012
 123456789012
);
こういうことですか?
分かりません><
573デフォルトの名無しさん:2009/04/11(土) 10:06:45
>>572
その数*2の式にするには?
574デフォルトの名無しさん:2009/04/11(土) 12:03:35
>>573
* 2 したきゃ勝手に *2 すりゃいいだろ!

print join('', qw(
123456789012
123456789012
123456789012
123456789012
) ) * 2;

少しは頭使えよ
575デフォルトの名無しさん:2009/04/11(土) 12:44:49
そういや、Perlではいつの間にか
$a = "aaa" "bbb"; # => 昔だと"aaabbb"になる
の構文はエラーになったんだな。
576デフォルトの名無しさん:2009/04/11(土) 21:20:31
Windows XP を使っています
今までjperlを使ってきたのですが
いい加減perlの新しいものに変えようかと思っています

乗り換えるにはソースをUTF-8に変える(日本語の正規表現使っています)
データファイルはsjisのままでいい

と思っているのですが、それでいいでしょうか?
577576:2009/04/11(土) 21:28:27
すいません。出力の漢字コードは何になるんでしょうか?
578デフォルトの名無しさん:2009/04/11(土) 22:19:40
どんな文字コードで出力するかはPerlで選べる。
コマンドプロンプトに出力される文字コードはsjisじゃ無いと化ける。
579デフォルトの名無しさん:2009/04/11(土) 22:23:52
Perlで選べるというのはソースコード内で指定できるって事ね。
データはSJISで書きたいソースはUTF8で書いてという事だけど、普通に出来るよ。というか俺もそういうコード書いた事がある。

データ読み込み時にSJISからUTF8へ変換し、正規表現を使い色々な処理をし、
データ書き込み時にUTF8からSJISへ変換する。
580デフォルトの名無しさん:2009/04/11(土) 22:29:06
utfで書かなくても、eucでもなんとかなる
そもそも、うちのエディタがutfに対応しとらん

あんまりがちがちの体制にすると、perlの手軽さがどんどん無くなっていく
581576:2009/04/11(土) 22:34:01
すいません。ソースもsjisでいいんでしょうか?
それだと一番楽なんですが
582デフォルトの名無しさん:2009/04/11(土) 22:44:06
sjisでも良いけど正規表現がうまく動かずエラー吐く時がある。
583デフォルトの名無しさん:2009/04/12(日) 01:50:12
5cが入るのはなんとかエスケープできても、
正規表現の中の'ー'とかの5bがどうしようもない
584576:2009/04/12(日) 12:38:51
昨日jperlから新しいperlへの乗り換えを質問した者です

ttp://www.aritia.org/hizumi/perl/perlwin.html
ここを見てスクリプトの先頭をこうゆう風に変えました
use utf8;
binmode(STDIN,":encoding(sjis)");
binmode(STDOUT,":encoding(sjis)");
binmode(STDERR,":encoding(sjis)");
$dbx_flag=1;
if($dbx_flag){
open(DBX,">:encoding(sjis)", "Make_Table.dbx");
}

こういうワーニングがいっぱい出ます
"\x{0082}" does not map to shiftjis at Make_Table.pl line 98, <> line 519.
対応すると思われるコードは次みたいな部分です
print DBX $_;

ディバッグの出力を見てみるとこういう分岐が全然正常に働いてないみたいです
if(/^[\s]*朝食[\s]*$/){
$eat_sw=$eat_asa;
next line;
}

どういう風に書き換えたらいいのでしょうか?
必要でしたらソースとデータをuploadします
585デフォルトの名無しさん:2009/04/12(日) 13:28:19
>584
スクリプトの文字コード UTF-8 で書いてる?
586576:2009/04/12(日) 13:34:01
>>585
サクラエディタで変換しました
一応エディタもUTF-8と認識しています
587576:2009/04/12(日) 14:21:43
すいません
ttp://hardsoft.at.webry.info/200604/article_2.html
との折衷案を採って

use utf8;
use encoding "shiftjis";
use open ":encoding(shiftjis)";
use open ":std";
map{ binmode($_,":crlf"); } qw/STDIN STDOUT STDERR/;

$dbx_flag=1;
if($dbx_flag){
open(DBX,">Make_Table.dbx");
}

としたら正常に働きました
588デフォルトの名無しさん:2009/04/12(日) 23:11:42
>>584
そのサイトの結論が俺と同じでワロタ
589576:2009/04/12(日) 23:30:13
>>588
その意見に賛成します
新しいperlがあればjperlは使う必要が無いという意見をネットでよく見ましたが
jperlの方がよほど移植性の高いコードが書ける気がします
590デフォルトの名無しさん:2009/04/12(日) 23:47:14
>>589
あ、違う違う
スクリプトへのリンクのすぐ上ね

そのサイト、テンプレの内容もほとんど同じだし、問題点や対処法も自分がやってきたのとほぼ重なっているし
運用でカバーするのに限界を感じているのも一緒だし
10年以上Perlを使ってきたけど、そろそろいいかなあ、と
591デフォルトの名無しさん:2009/04/13(月) 00:29:31
shiftjis じゃなくて cp932 だろ。
このへんの違いを理解していない時点でダメ。
592デフォルトの名無しさん:2009/04/13(月) 01:19:18
eucでは不可能でutf-8でないと書けないコードってある?
593デフォルトの名無しさん:2009/04/13(月) 02:07:33
「にょろ」 とか
594デフォルトの名無しさん:2009/04/13(月) 02:10:44
☟ ☟ ☜ ☜ ☜ ☜ ☜ ☜ ☜ ☜
☟ ☟ ☟ ☜ ☜ ☜ ☜ ☜ ☜ ☝
☟ ☟ ☟ ☟ ☜ ☜ ☜ ☜ ☝ ☝
☟ ☟ ☟ ☟ ☟ ☜ ☜ ☝ ☝ ☝
☟ ☟ ☟ ☟ ☞ ☝ ☝ ☝ ☝ ☝
☟ ☟ ☟ ☞ ☞ ☞ ☝ ☝ ☝ ☝
☟ ☟ ☞ ☞ ☞ ☞ ☞ ☝ ☝ ☝
☟ ☞ ☞ ☞ ☞ ☞ ☞ ☞ ☝ ☝
☞ ☞ ☞ ☞ ☞ ☞ ☞ ☞ ☞ ☝

とか
595PHPの神:2009/04/13(月) 03:26:15
http://asobi.sqweebs.com/aaa/1.php

phpだったら、こういうパスワード生成ページとか
かんたんに作れる。
596デフォルトの名無しさん:2009/04/13(月) 03:28:12
dat見たら判るけど、そういうのutf-8として取り扱ってないがな
597576:2009/04/13(月) 08:08:16
>>591
最初のHPにそれも書いてありましたけど
機種依存文字とか使っていないのでsjisにしました
598デフォルトの名無しさん:2009/04/13(月) 08:52:58
>>597
一気に移行しようとすると、大変だよ。
「手間」ということでは大したことはないが、ActivePerl の
知識がなければ、どこをどのように変えればいいのか解らないから。
オレは数年前に移行を済ませたが、その時はjperl と ActivePerl
を両方動くようにして、ActivePerlに少しづつ移行していった。

599576:2009/04/13(月) 09:30:41
>>598
ActivePerl 5.10 と ActivePerl 5.6 依存のjperl が共存できるのですか?試していませんでした

まあ、毎日使っていたスクリプトはawkの代用品を用意しての移行だったわけですが
perl でしか動かないようなスクリプトも有りますが、
perl 初心者でそういうものはごく少数なので
600デフォルトの名無しさん:2009/04/13(月) 12:39:44
今日からwindows vistaでperlの勉強を始めようと思い疑問に思ったことがあるのでどなたかご教示お願い致します
http://www.activestate.com/activeperl/でダウンロードできるactiveperlと
http://www.perl.org/でダウンロードできるperlどちらをインストールしたらいいですか
これら二つは同じものでしょうか?
601デフォルトの名無しさん:2009/04/13(月) 13:42:30
>>600
CGIをやろうとしているのならば、ActivePerlを選ぶとよい。
602デフォルトの名無しさん:2009/04/14(火) 09:46:10
不思議な会話だな。http://www.perl.org/
からWindows 用のPerl をダウンロードしようとすると、
ActivePerlのページに飛ばされるわけだが。
603BUElepmnX:2009/04/14(火) 11:22:26
604デフォルトの名無しさん:2009/04/14(火) 16:21:53
>>602
確かに ActivePerl のリンク *も* あるが、
他にも Strawberry Perl など10種類以上あるだろ。
605デフォルトの名無しさん:2009/04/15(水) 12:25:16
正規表現の先読みを調べていたのですが質問があります。以下のコード、どちらもスカになるだろうと思っていたんですが―
"hoge" =~ m/(?!hoge)h/ ? print "HIT!\n": print "スカ\n";
"hoge" =~ m/(?!hoge)/ ? print"HIT!\n": print "スカ\n";
実行してみると、確かに前者はスカなんですが後者は何故かHITしてしまいました。これ何故なんでしょう。

自分なりに考えてみたのですが、この先読み機能というものは先読み以外の部分で何かヒットした場合にのみ動くという仕様で
前者はhがヒットしたから先読みが始まった反面、後者は何もヒットしなかったので先読みが始まらず結果ヒットしてしまったという感じなんでしょうか?

しかし前者についてhがヒットしたのでその"前"に記述されてある(?!hoge)に判断が戻るというのはなんだか変な感じがします。
(後者の何もヒットしなかったから真というのも何か変な感じがします)
その辺りどうなっているのでしょう。上の推理は当っているんでしょうか。どなたか教えてください。
606デフォルトの名無しさん:2009/04/15(水) 12:49:00
"hoge" =~ m/hage/ ? print"HIT!\n": print "スカ\n";
"hoge" =~ m// ? print"HIT!\n": print "スカ\n";

基本に返ってみよう
607デフォルトの名無しさん:2009/04/15(水) 12:51:05
"" =~ m// ? print"HIT!\n": print "スカ\n";

この方がわかりやすいかな
608デフォルトの名無しさん:2009/04/15(水) 12:57:15
前者:後続のhogeを伴わない空文字列 + h を満たすもの
後者:後続のhogeを伴わない空文字列
かな

$hoge = "hoge";
$hoge =~ s/(?!hoge)/@/g;
print $hoge; #=> h@o@g@e@
609デフォルトの名無しさん:2009/04/15(水) 13:03:50
>>605
"hoge" =~ m/(?!hoge)/ がマッチするのは "hoge" =~ m/o/ がマッチするのと全く同じ理由。

>>606-607
m//等の空パターンは特別扱いされる事を思い出して。
610デフォルトの名無しさん:2009/04/15(水) 13:11:36
同じだといったり特別だといったり
書き込む前に矛盾に気づいてくれ
611デフォルトの名無しさん:2009/04/15(水) 13:34:31
>>605
hとoの間の空文字列にマッチしているだけのこと。

print $`, ':', $&, ':', $', "\n";

とかしてみりゃわかる。
612605:2009/04/15(水) 23:01:47
みなさんレスありがとうございます。hogeの中の空文字列を@を使って表すと@h@o@g@e@となるようです。
そこで>>605を実行すると1つ目の@に逹っした時点で先読みが行われhogeが検出されてしまい、
結果スカが表示されるのではないでしょうか?
613デフォルトの名無しさん:2009/04/16(木) 00:46:55
デバッグの方法を伝授してやろう。

"hoge" =~ m/(?!hoge)h/ ? print "HIT!\n": print "スカ\n";
"hoge" =~ m/(?!hoge)/ ? print"HIT!\n": print "スカ\n";

$x = "hoge"; $x =~ s/(?!hoge)h/-/; print "'$x'\n";
$y = "hoge"; $y =~ s/(?!hoge)/-/; print "'$y'\n";

- に置換された部分にマッチしているんだょ。
気取って3項演算子でスマートに書いたりしないで
初心者っぽく書けばハマらずに済んだんだよ。
614デフォルトの名無しさん:2009/04/16(木) 01:12:11
use re 'debug'
615デフォルトの名無しさん:2009/04/16(木) 02:02:41
3項演算子ってどんな時に便利なの
616605:2009/04/16(木) 02:28:52
理解しました。
ありがとうございました。
617デフォルトの名無しさん:2009/04/16(木) 03:30:18
>615
んー、人によるとは思うけど……

例えば、
 Func ( $foo ? 1 : 2 , $bar ? 1 : 2 ) ;
みたいに、引数として使う時とか。

あとは
 my $hoge ;
 if ( $foo ) { $hoge = "TRUE"; }
 else { $hoge = "FALSE"; }
みたいな時にだいぶ短くなるんじゃないかな。
618デフォルトの名無しさん:2009/04/16(木) 03:57:40
昔でかつC言語の話だけど
if文より参考演算子+関数呼び出しのほうが
CPUが先読みし易くて早くなるって言ってた人がいたな

コンパイラの種類やら最適化でも変わってきそうだけど・・・
619605:2009/04/16(木) 04:08:32
ちなみになんですがもともとは3項演算子は使わずif文で書いていました。
投稿する際に3項演算子だと色々都合が良いかなと思い使いました。
620デフォルトの名無しさん:2009/04/16(木) 06:35:25
変数の文字コードを変換するのにいちいち
$TO = encode "To文字コード", decode "From文字コード", $FROM;
みたいなこと書かないといけないの?
621デフォルトの名無しさん:2009/04/16(木) 07:29:23
$hoge = $foo ? "TRUE" : "FALSE";
と書いた時の可読性の悪さだよな

単に値を返すだけならいいけど、むしろそういうのは稀で、
結構な長さの文を書いたり、入れ子にしたりする
622デフォルトの名無しさん:2009/04/16(木) 12:08:48
ローカルで動いたはずのプログラムがサーバーで動かず。
症状は変数の中身があり得ないことになっている 計算上 1000-100になるのが 0-100になってる。
何度読み返しても計算上はそうはならない。
一度サーバー上のデーターを全部消してアップしなおしたら直った。
サーバーがバグって正常に変数計算が無茶苦茶になるってことがあるのでしょうか?
623デフォルトの名無しさん:2009/04/16(木) 12:15:12
>>622
99.99999999999999%あなたのミス
その消したデータとやらのせいでしょ。
624デフォルトの名無しさん:2009/04/16(木) 13:12:51
>>623
すみません消したデータと再uPしたデータが微妙に違っていましたorz
625デフォルトの名無しさん:2009/04/16(木) 14:25:37
なんで技術者って
自分は間違ってない、サーバがおかしい、処理系がおかしい
から入る人が多いんだろうね
626デフォルトの名無しさん:2009/04/16(木) 14:34:15
>625
ねーよw
627デフォルトの名無しさん:2009/04/16(木) 14:40:22
>>625
ちゃんとした技術者なら少ないよ
偏差値低い技術者・一般人に多いだけだよ
なにかと「周りのせいで」って言ってる奴 よくいんだろ
628デフォルトの名無しさん:2009/04/16(木) 16:11:08
>>625
逆じゃない?
一般人はそういう風に思いがちだけど(定番の「何もしてないのにPCが壊れた」とか)、
技術者は通常、そうではない。
だからこそ、たまに>>622みたいのが居ると、すごーく目立つ、ってことだと思う。
629デフォルトの名無しさん:2009/04/16(木) 18:27:47
pentiumのバグを発見した人は偉いよな
630デフォルトの名無しさん:2009/04/17(金) 04:48:09
浮動小数点のやつ?
あれって回収されたんだっけ?
631デフォルトの名無しさん:2009/04/19(日) 01:23:10
XML::LibXMLについて質問させて下さい。
XMLを読み込んだ後に、getElementsByTagNameで取得したノードについて
toStringで内部のXMLを取得しようとすると、文字化けしてしまいます。

現在以下のテストコードを書いてみたのですが、文字化けの理由がさっぱり分かりません。
ソースコードは文字コードはUTF8で改行コードはLFで保存しています。
環境はosx上のperl5.8.8で、XML::LibXMLのバージョンは1.69です。

またperlとlibxmlのバージョンを揃えた環境を、linux(CentOS)上で作成して、
同じコードを走らせてみると、文字化けは発生しませんでした。

何処が間違っていますでしょうか。また他に何を確認すれば良いのでしょうか。
よろしくお願いします。
---
#!/usr/bin/perl
use strict;use warnings;use XML::LibXML;use Encode;

my $parser = XML::LibXML->new;
my $xmlStr =<<XML;
<?xml version="1.0" encoding="utf-8"?>
<root><item>あいうえお</item><item>abc</item></root>
XML

# LibXML::Documentは文字化けしない
my $xmlObj = $parser->parse_string($xmlStr);
print $xmlObj->toString, "\n"; # これは問題なし
# 問題の箇所
my ($item1, $item2) = $xmlObj->getElementsByTagName("item");
print( $item1->toString . "\n"); # これが文字化けする
print( $item2->toString . "\n"); # 英字はOK
---
632デフォルトの名無しさん:2009/04/19(日) 03:47:45
use utf8
633デフォルトの名無しさん:2009/04/19(日) 17:47:18
スレッド利用時の共有変数についてどなたかご教示ください。
(環境5.8.8にて実行)

shared変数をハッシュリファレンスの配列としたく、下記のような
コードを組んだのですがうまくいきません。push直後、join直後に
Dumper見てもセットされてません。

配列の各要素に対してハッシュのリファレンスである旨を事前に
&share({});
みたいな形で伝えてあげなければならないのかな?と想像はして
いるのですが、どのようにすればよいかわかりません。

よろしくお願いします

-----------------
use threads;
use threads::shared;
use Data::Dumper;

my @array : shared;

my $test_sub = sub {
  foreach my $i (0..3) {
    push(@array, {'val1'=>$i, 'val2'=>$i});
  }
};

my $th1 = threads->new(\&$test_sub);
my $th2 = threads->new(\&$test_sub);

$th1->join;
$th2->join;
634デフォルトの名無しさん:2009/04/19(日) 19:24:23
5.10で調べたので違ってるかもしれないけど
threads::sharedのドキュメントに、配列の要素も共有されたもの
じゃないとダメって書いてある

>>Shared variables can only store scalars, refs of shared variables, or
>>refs of shared data (discussed in next section):
  :
>> # The following are errors:
>> # $var = \$bork;         # ref of non-shared variable
>> # $hash{'bork'} = [];        # non-shared array ref
>> # push(@array, { 'x' => 1 });    # non-shared hash ref

で、これに書いてあるように shared_cloneを使えばいいみたい。

push(@array, shared_clone({'val1'=>$i, 'val2'=>$i}));

635631:2009/04/19(日) 19:54:45
>>632
ありがとうございます。
ただuse utf8を追加しても、文字化けしてしまいます。

631のテストコードに以下のコードを追加してみたのですが、
どうもutf8フラグの問題では無いような気がします。
---
# UTF8フラグのテスト
my $text1 = $item1->toString;
print utf8::is_utf8($text1), "\n"; # これはTRUE
print $text1, "\n"; # 文字化け
utf8::decode($text1);
print utf8::is_utf8($text1), "\n"; # これはFALSE
print $text1, "\n"; # やっぱり文字化け。出力に変化なし
---

またXML::Simpleを試してみたところ、問題なく動作しました。
自信は無いですが、ちょっとソースコードを読んでみます。
636デフォルトの名無しさん:2009/04/20(月) 00:18:27
>>4 を読め
637633:2009/04/20(月) 22:55:29
>>634
ありがとうございます!うまくいきました。
638デフォルトの名無しさん:2009/04/21(火) 19:02:51
以下のソースでinput.txtのファイルから"test[1]"という
文字列が含まれる行を抽出して
行番号とともに表示させたいのですがうまくいきません。
どこをいじればよいのでしょうか?

ソース###########################
#!/usr/bin/perl

$key="test[1]";
$i=0;
open(IN,"input.txt");

while(<IN>){
$i++;
if($_ =~ /$key/){
print "$i :$_";
}
}

close(IN);

$input=<STDIN>;
################################
input.txtの中身
test[0]
test[1]
test[2]
test[3]
639デフォルトの名無しさん:2009/04/21(火) 19:19:18
メタキャラを抑制する
640デフォルトの名無しさん:2009/04/21(火) 20:16:43
>>639
$key="test\[1\]";
これじゃだめでした・・・。
641デフォルトの名無しさん:2009/04/21(火) 21:21:21
/\Q$key\E/
どーでもいいけど $. も覚えたら?
642デフォルトの名無しさん:2009/04/21(火) 21:21:44
$i=0;
open(IN,"input.txt");

while(<IN>){
$i++;
if(/test\[1\]\n$/){
print "$i :$_";
}
}

close(IN);
643デフォルトの名無しさん:2009/04/21(火) 21:58:27
>>641-642
ありがとうございます!!
644デフォルトの名無しさん:2009/04/21(火) 23:24:20
$key=quotemeta "test[1]";
$i=0;
open(IN,"input.txt");
while(<IN>){
$i++;
if($_ =~ /$key/){
print "$i :$_";
}
}
close(IN);
645デフォルトの名無しさん:2009/04/22(水) 02:32:06
メタかどうかは使われる時でなく作られた時に決まるのか
646デフォルトの名無しさん:2009/04/22(水) 13:28:36
最近perlを勉強し始めまして、ちょっと躓いてしまいました。
下記のようにプログラムを書いて、
出力を100にすることはできないのでしょうか?
$b=10;
$a10=100;
print ('$a'.$b);
ご教授お願いします。
647デフォルトの名無しさん:2009/04/22(水) 13:44:45
すごい!!

自分でマニュアルを読むのをいやがる人のみならず、
自分で実行してみるのをいやがる人まで出現したぜ。
648デフォルトの名無しさん:2009/04/22(水) 14:38:55
>>646
質問のこたえ・・・できません。


646のプログラムがいったい何を意図しているのか、さっぱりわからん。
何をしたいのか、ぜんぜんワカラン。
もしかしたら、こういう事がしたいんじゃないかな、とエスパーしてみる。
$b=10;
$a[10]=100;
print $a[$b];
・・・だとしたら、マニュアルも入門書も解説サイトも、全く読んでなさそうだな。
649デフォルトの名無しさん:2009/04/22(水) 14:45:16
ああ、そういうことか
print(eval('$a'.$b));
とかw
650デフォルトの名無しさん:2009/04/22(水) 14:46:54
646です。説明へたですみません。。。
実行したところ、出力が$a10になりました。
私の求める出力は100なんです。。。
print ('$a'.$b); の'$a'.$bの部分で$a10となり、
print $a10となって、プリントされるのが100になって欲しいのです。



651デフォルトの名無しさん:2009/04/22(水) 14:54:39
646です。
求めている答えになりました!
649さんありがとうございます。すっきりしました。
ちなみに私の入門書にeval載って無かったです(涙
652646:2009/04/22(水) 15:32:30
またまた質問です。
ちょっと形を変えたのですが、
$a="$a";
$b=10;
eval($a.$b)=100;
print $a10;
と書いて実行してもエラーが出るのですが、
100を表示させたい場合どのようにすれば宜しいでしょうか?
ご教授お願いします。
653デフォルトの名無しさん:2009/04/22(水) 15:42:03
eval($a.$b.'=100');
とか。
添え字じゃだめなんか
654646:2009/04/22(水) 15:52:12
653さん有難う御座います。
駄目でしたorz
なにも表示しないです。
655デフォルトの名無しさん:2009/04/22(水) 16:01:43
その前に
$a="$a";
の$aの中身見てみ。
$a='$a' ;
でどうか
656デフォルトの名無しさん:2009/04/22(水) 16:02:22
>>652
すこしはデバッグしろ。

変数に何が入っているか一つ一つチェックするくらいやれ!
657646:2009/04/22(水) 16:14:18
みなさん有難う御座います。
解決できました。ご迷惑お掛けしました。
656さんのおっしゃる通りです。
自分でやれることはやらんないかんですね。。。
658デフォルトの名無しさん:2009/04/22(水) 17:15:56
>>649
あったまいいなぁ。よくわかったな・・・
659デフォルトの名無しさん:2009/04/22(水) 17:17:40
>>657
>自分でやれることはやらんないかんですね。。。

( ゚д゚)ポカーン
660デフォルトの名無しさん:2009/04/22(水) 17:18:06
eval使わずにこう書くかな

$b=10;
$a10=100;
print ${'a'.$b};
661デフォルトの名無しさん:2009/04/22(水) 18:43:04
$hogeの中にあるURLを見つけてリンクをつけるにはどんな風に書けばいいですかおしえてください
662デフォルトの名無しさん:2009/04/22(水) 18:48:50
663 ◆TWARamEjuA :2009/04/22(水) 23:51:48
(´-`).。oO(WebProg板かとおもた。。。)
664デフォルトの名無しさん:2009/04/23(木) 20:13:47
ファイルテスト演算子の、-r と -R の違いがよく分かりません。(他に -w -x -o も)

実際にコードを書いて試してみたけど違い見つかりません。
おそらく「きちんとUNIXを勉強しなさい」っていうラリー先生からのメッセージなんだとは思うのですが…。
665デフォルトの名無しさん:2009/04/23(木) 20:36:44
>>664
例えばrootで実行したプログラムの中で一般ユーザーhogeにset uidしてrootしか読めない
ファイルを-rで調べるとfalse、-Rならtrue。
UNIXのお勉強頑張って下さい。
666デフォルトの名無しさん:2009/04/23(木) 20:42:26
>665
なるほど。なんとなくだけど分かった。ありがとう。
667デフォルトの名無しさん:2009/04/25(土) 06:21:29
perl の練習でチャットを作っているのですが。
発言、リロードが無い場合30秒でチャットルームをたたき出すって機能を作ろうと
して30秒計るタイマーをまず作ろうとしてそこでつまずきました。

alarm って命令語の使い方がさっぱり判りません。
668デフォルトの名無しさん:2009/04/25(土) 06:23:09
拾ってきたサンプルプログラムをローカル動かしたら動くのですが。サーバー上では動きません。

$SIG{ALRM} = \&time_out;

eval {
my $alarm_time = 5;

printf "%d秒以内に何か入力して下さい。\n", $alarm_time;

alarm $alarm_time;
my $input_string = <>;
alarm 0;

chomp $input_string;
printf "%sが入力されました。\n", $input_string;

};

sub time_out {
print "時間切れのため終了します。\n";
exit 1;
}
669667:2009/04/25(土) 06:27:19
↓こうやってサーバーに乗せたのですがエラーになります。

#!/usr/bin/perl
print "Content-type: text/html\n\n";

$SIG{ALRM} = \&time_out;

eval {
my $alarm_time = 30;

printf "%d秒以内に何か入力して下さい。\n", $alarm_time;

alarm $alarm_time;
my $input_string = <>;
alarm 0;

chomp $input_string;
printf "%sが入力されました。\n", $input_string;

};

sub time_out {
print "時間切れのため終了します。\n";
exit 1;
}
670デフォルトの名無しさん:2009/04/25(土) 08:00:43
>>668
チャットサーバー作ろうとしてるんですか?
CGIやmod_perlで作ろうとしてるんだったら無駄ですよ、
良く考えましょう。

alarmの使い方はそんなもんかな?

チャットCGI作るんなら、前回発言時のタイムスタンプを
取っておいて、それと比較するしかない。

というか、初心者のお題としてチャットはちょっといかがな
ものかと思うよ。サーバー作るんじゃなきゃ汚い実装しかできないし。
掲示板の方がまだいい。
671667:2009/04/25(土) 08:18:25
>>670
CGIでチャットは無理なんですか?
672デフォルトの名無しさん:2009/04/25(土) 08:23:47
>>671
無理ではないが、向いてない。
HTTPは基本的にはストリーム通信じゃないから。
673667:2009/04/25(土) 08:28:38
チャットはあきらめます。
ところでCGIで一定時間たつとファイルの中身を書き換えるタイマーみたいなものが作りたいのですが
どうすればいいですか?
たとえば time.txt というファイルの中身を 0 にしておいて
フォームか何かの送信を受けて 1 に書き換えた場合その1分後に自動的に0にもどるみたいな
674デフォルトの名無しさん:2009/04/25(土) 08:43:54
>>673
そういうのもCGIは向いてない。
一応forkしてCGIスクリプトを1分間走りっぱなしにすれば
可能だが、システムの負荷が高くなりそう。

そういうのはUNIXシステムならcronを使うべき。
675デフォルトの名無しさん:2009/04/25(土) 09:45:15
いや別にsleepしてれば負荷かからないが・・・

>>673
system "sh -c 'sleep 60; echo 0 > time.txt' & ";
676667:2009/04/25(土) 09:45:56
了解しました。
似たような用途のときはフォームの送信を受けた時に1に書き換えられた時間を記録して
次に呼び出した時、記録と現在時間を照合して1分たってたら0に書き換えるようにすればいいのですね?
677667:2009/04/25(土) 09:47:35
>>675

60秒間ねちゃうの?
678デフォルトの名無しさん:2009/04/25(土) 10:09:56
>>673 の「一定時間たつとファイルの中身を書き換える」は
そういうことだと読んだんだが
679デフォルトの名無しさん:2009/04/25(土) 13:55:27
>>676
つーか板違い
WebProg板行けよ
680デフォルトの名無しさん:2009/04/25(土) 19:36:46
perl初心者なのですが、sendkeyのコマンドを指定した時間押し続けることってできますか?
681デフォルトの名無しさん:2009/04/25(土) 23:18:28
>>680
ボタンイベントはDownとUpの2回発行で1セット
682デフォルトの名無しさん:2009/04/26(日) 09:03:28
複数あるリスト(配列)にユニークな名前を付けて、その名前でソートしてから
リストの内容を順番に出力したいのですが、どうすればできますか?
よろしくお願いします。
683デフォルトの名無しさん:2009/04/26(日) 09:36:49
変数名でソート?
684デフォルトの名無しさん:2009/04/26(日) 09:54:30
>>682
配列をハッシュにぶら下げればいいだけ。
685682:2009/04/26(日) 11:54:34
実はハッシュに入れたリストの取り出し方がわからないのです。これだとスコープ外なのでしょうか?
open(TXT, "x.dat");
$status = 0;
my %hash;
foreach (<TXT>) {
 chomp;
 if ($status == 0) {
  if (/^start (\S)/) {
   my @list;
   $hash{$1} = \@list;
   $status = 1;
  }
 } elsif ($status == 1) {
  if (/^end;/) {
   $status = 0;
  } else {
   push(@list, "$_");
  }
 }
}
my @k = sort keys(%hash);
foreach (@k) {
 my $lst = $hash{"$_"};   # リストをを取り出したい
 print @$lst;
}
-------------- x.dat
start C
CCC
end;
start A
AAA
end;
686デフォルトの名無しさん:2009/04/26(日) 12:19:50
close(FH);
と書くべきところを省略して
close;
だけにしてたら、なんかハッシュがクリアされたけど、
そういう仕様?
687デフォルトの名無しさん:2009/04/26(日) 12:35:22
>>685
#!perl -w
use strict;
my $key;
my %hash;
open TXT, "x.dat" or die $!;
while (<TXT>) {
  chomp;
  if (/^start(\S)/) {
      $key = $1;
  } else {
      push @{$hash{$key}}, $_ unless /^end;/;
  }
}
for my $key (sort keys %hash) {
  my $lst = $hash{$key};
  print "@$lst\n";
}
俺が書くとこんなんなっちゃったけど
@list はスコープ外だと思う
688デフォルトの名無しさん:2009/04/26(日) 12:37:23
/^start(\S)/ → /^start (\S)/
689デフォルトの名無しさん:2009/04/26(日) 13:21:17
@{$hash{$key}}
こんな書き方ができるとは…勉強になりました。
ありがとうございました。
690デフォルトの名無しさん:2009/04/26(日) 14:14:05
perlのよいところって
ルーズにも書ける、かっちりも書ける
ってところなのか?
691デフォルトの名無しさん:2009/04/26(日) 14:45:04
>>690
そして悪いところは
ルーズにも書けるし、かっちりも書けるところだ。
692デフォルトの名無しさん:2009/04/26(日) 16:03:39
>>691
なるほど
693デフォルトの名無しさん:2009/04/26(日) 16:58:17
つか書く人がどう使うかじゃね
perlゆえの弱点とかあんまないと思う
694デフォルトの名無しさん:2009/04/26(日) 17:46:42
いや、書く人によって
ルーズにも書けるし、かっちりも書けるということ。
695デフォルトの名無しさん:2009/04/26(日) 17:50:55
>>675
そんなことしたらプロセスが山ほどできるがそういうのを負荷に含めない人?
696デフォルトの名無しさん:2009/04/26(日) 17:52:04
>>694
場合によって、っつーのもある。
1回しか使わないような文書処理とかは超ルーズに書く。use strictなんてしない。
697デフォルトの名無しさん:2009/04/26(日) 19:09:43
blessするのとデータベースからfetchするのはどっちが早いかな
698デフォルトの名無しさん:2009/04/27(月) 00:27:10
>>689
>>424あたりと同じ話か
699デフォルトの名無しさん:2009/04/27(月) 20:28:12
use strict;
use warnings;

sub print_data{
my @lines;
my $data_line;
my $data_file = "/hoge/fuga/.foobar";
my $fp;
open($fp,"< $data_file") or die "Can't ope data file!";
@lines = $fp;
foreach $data_line(@lines){
print "$data_line";
}
close($fp);
}
こういうサブルーチンをかいて&print_dataを呼び出すと
GLOB(0x80014)とかいう文字が出力されるだけでファイルの内容が表示されないのですが
何処を修正すべきでしょうか?
ちなみに上の.foobarの中身は
Hello
となっています。
700デフォルトの名無しさん:2009/04/27(月) 20:58:42
>>699
@linesにファイルハンドル突っ込んでね?
701デフォルトの名無しさん:2009/04/27(月) 21:52:27
>>700
ありがとう御座います。
<$fp>という表記が正しくない物だとおもっていました。
Perlはもっと直感的なかんじで書いて、ちゃんと展開されるんですね。
ありがとう御座います、無事かいけつしました。
702デフォルトの名無しさん:2009/04/27(月) 22:47:40
ちなみにそれ$datefileがでかいファイルだともりもりメモリ食うぞ
703デフォルトの名無しさん:2009/04/27(月) 22:58:28
そのためのメモリですから〜w
704デフォルトの名無しさん:2009/04/27(月) 23:06:32
メモリをもりもり食わせた方が速くていい
705デフォルトの名無しさん:2009/04/28(火) 02:40:30
まあ、むかし(Perl4/主記憶16MBのマシンを5人とかで使ってた)、
同時に一行以上読み込ませるのは御法度だった時代があるからな。

706デフォルトの名無しさん:2009/04/28(火) 02:52:54
主記憶128KBのUNIXマシンのRS-232Cポートに端末9台ぶらさげてCAD使ってたころは
まだperl自体が存在していなかったな・・・
707デフォルトの名無しさん:2009/04/28(火) 11:04:09
ワシが若い頃はな、主記憶256バイト
(kもMも付かない正真正銘の256バイトじゃ)
のワンボードマイコンを工夫しながら使っておったんじゃ。
それをなんじゃ、今の若いもんは。
2Gじゃ足りんから4G乗せろ、などと.......フガフガ
708デフォルトの名無しさん:2009/04/28(火) 11:32:54
TK-80の512バイトより前の歴史はさすがに知らん
709デフォルトの名無しさん:2009/04/28(火) 12:15:03
現在に通じる教訓を含まない老人の昔話禁止
710デフォルトの名無しさん:2009/04/28(火) 12:39:52
自分がわからない話は禁止
711デフォルトの名無しさん:2009/04/28(火) 12:49:04
妬むなよ
712デフォルトの名無しさん:2009/04/28(火) 13:22:30
俺がガキの頃組み立てて遊んだ4bitマイコンは64バイトだった希ガス。
713デフォルトの名無しさん:2009/04/28(火) 13:26:25
まあ、perlは導入当時(awk, sed, shellと比べて)遅い重い邪魔というのが最大の欠点だった。

だから、rubyなどに対して、perlerの「遅い」とかいう悪口を見ると、ちょっと微笑ましくなる。
714デフォルトの名無しさん:2009/04/28(火) 13:29:31
>>713
awkより遅いってのは眉唾だな。
715デフォルトの名無しさん:2009/04/28(火) 13:32:04
起動コストの話なんだろうけど、shellは結局他のアプリケーションを
立ち上げてナンボの言語だから、shellより重いってのも眉唾だな。
716デフォルトの名無しさん:2009/04/28(火) 13:32:29
>>714
処理系が「巨大」だからだよ。上の他のやつのレスとかまったく目に入ってないんだな、あんたは。
717デフォルトの名無しさん:2009/04/28(火) 13:43:33
ああ、perlを走らせると、まずperl以外をみんなswapoutさせるんだよな。
718デフォルトの名無しさん:2009/04/28(火) 13:59:28
>>716
awkとperlの起動コストって言うほど変わらなかったと思うぞ。
一旦起動したらperlの方がサクサクなのは言うまでもない。
719デフォルトの名無しさん:2009/04/28(火) 14:02:45
>>718
>awkとperlの起動コストって言うほど変わらなかったと思うぞ。
>一旦起動したらperlの方がサクサクなのは言うまでもない。

いずれも違うね。
まあ、昔のUNIXマガジンのバックナンバーでもめくってみてくれ。
720デフォルトの名無しさん:2009/04/28(火) 14:22:18
ヴァージョンいくつの時代の話をしてるんだ?
721デフォルトの名無しさん:2009/04/28(火) 16:15:15
80186でJGAWK.EXEやJPERL.EXEを今でも動かすことがあるけど、
perlは止まったかと思うほど起動に時間かかる
722デフォルトの名無しさん:2009/04/28(火) 19:56:40
もはやパソコンプログラミングにエコは必要ないか・・・
723デフォルトの名無しさん:2009/04/28(火) 20:25:04
巨大行列の逆行列とか計算してるスパコンは、メモリ足りてるんだろうか
724デフォルトの名無しさん:2009/04/28(火) 20:26:18
足りてるから動いてんだろう
725デフォルトの名無しさん:2009/04/28(火) 21:42:30
>>723
人からすると一見どうってことない行列計算が、すぐ爆発しちゃうからねえ。
2年でメモリが倍増するとすると、20年後にようやく10^3倍。
あの分野のプログラムがもっぱらメモリ削りに注力する状況は、
とてつもないブレークスルーがないと変わらないね。
726デフォルトの名無しさん:2009/04/28(火) 21:52:14
>2年でメモリが倍増するとすると、20年後にようやく10^3倍。
727デフォルトの名無しさん:2009/04/28(火) 22:06:38
>>724
ヒント:仮想記憶
728デフォルトの名無しさん:2009/04/28(火) 22:14:04
仮想記憶で足りてんだろ
729デフォルトの名無しさん:2009/04/28(火) 22:24:53
なら、16MBのSUN3でもスワップさえ十分用意しておけば、
100MBのファイルを丸ごとくわえ込むPerl scriptを書いても、
何の問題もないな。
730デフォルトの名無しさん:2009/04/28(火) 23:15:10
16MBレベルの話してたっけかw
731デフォルトの名無しさん:2009/04/29(水) 01:11:02
>>723
> 巨大行列の逆行列とか計算してるスパコンは、メモリ足りてるんだろうか

足りるように圧縮する。足りなかったら部分問題に分解する。
732デフォルトの名無しさん:2009/04/29(水) 01:35:11
ということは、処理系依存なコードをその都度書くのかな
分解を自動化させてたら、その分遅くなるだろうし
さげ
734デフォルトの名無しさん:2009/04/29(水) 21:58:46
どうせ、新しいCPUでたら重さも気にならなくなるものさ
735デフォルトの名無しさん:2009/04/30(木) 11:21:33
早くなったら格子を大きくしたりタイムステップを短くとるのさ
736デフォルトの名無しさん:2009/05/01(金) 00:58:24
質問よろしいでしょうか。

v5.8.8 build817のWindows環境において、ImageMagickを導入したいと考えています。

ppmからはインストールできないみたいなのでImageMagickの公式からインストーラを落とそうと思うのですが、
配布されているものが多すぎて、どれを導入したら良いのか見当が付きません。
(Q8、Q16とは?dllとstaticのインストーラの違いとは?)

また、インストーラーによっても対応するPerlのバージョンも違うらしいのですが、
上記のバージョンのPerlでImageMagickを使用していらっしゃる方はいないでしょうか?
737デフォルトの名無しさん:2009/05/01(金) 01:13:43
すみません、多分自己解決しました。
738デフォルトの名無しさん:2009/05/02(土) 12:50:36
print "Set-Cookie: NAME=hogehoge; expires=hogehoge; path=/\n";
とクッキーを食わせてるんですが、半角英数字ならまったく問題ないのですが
日本語だとなぜかIE以外のブラウザでは文字化けして取得されてしまいます。
どのようにすれば文字化けせずにちゃんと取得させるようにできるのでしょうか?
739デフォルトの名無しさん:2009/05/02(土) 13:42:53
740デフォルトの名無しさん:2009/05/02(土) 14:05:42
>>739
ごめんなさい。移動します。
741デフォルトの名無しさん:2009/05/04(月) 00:09:27
メソッドのオーバーライドを禁止したいんですが、可能でしょうか
742デフォルトの名無しさん:2009/05/04(月) 22:47:48
>>741
Attribute::Finalかな?
あるいは、
my $class = ref $self; # Scalar::Util::blessedでも可
croak 'オーバーライドしちゃいやん'
if $class ne 'SampleClass'; # __PACKAGE__ではなくベタ書き

それはそうと、Win32環境で、他のプロセスから
メッセージを受けるにはどうしたらいいですか?
743デフォルトの名無しさん:2009/05/05(火) 02:16:01
>>742
なるほど、Scalar::UtilではBGINブロックと実行ブロックの時間差を利用してパッケージをチェックするわけですね
頭いいなぁ、ありがとうございます
744デフォルトの名無しさん:2009/05/05(火) 13:30:17
まだまだ駆け出しですが、ゆくゆくはcpanのauthorのひとりになってみたいです
cpanにうpできるようになるまでの流れってどんな感じなんですかね?
745デフォルトの名無しさん:2009/05/05(火) 13:32:46
まずうpする物を作ります
746デフォルトの名無しさん:2009/05/05(火) 14:03:32
>>744
うpするレベルのものを作ればいいだけ。
少々コードが下手でも誰も作ってなくて需要があるものならおk。
あとは他の人がサポートしてくれるさ。
747デフォルトの名無しさん:2009/05/05(火) 17:07:31
>>765
ガラクタでいいなら作ってるんですが、まだ人に評価してもらえるほどのスキルと知識はないと思います

>>746
とりあえず誰かに見てもらわなきゃいけないわけですよね
普通はこんなん作ってみたよーってブログなんかでうp→評判よければcpanにって流れなんでしょうか
748デフォルトの名無しさん:2009/05/05(火) 18:28:43
ふと思うんだけど、誰もつくってないものってどうやって
思いつくんだ?ある意味時代の最先端にいないと何が足りないのかって
気づかなくないか?たいていの作業は既存のモジュールでできるもんな
749デフォルトの名無しさん:2009/05/05(火) 18:43:20
>>748
それが分かるようになったら思いつく思います
750デフォルトの名無しさん:2009/05/05(火) 19:03:41
あと誰も作ってないってのは大抵作るまでも無いものでみんな自力で済ませちゃってるんじゃ?
んで誰かがモジュール公開したら「自分でできるけどあるなら使ってやるか」→「それはあのモジュールが定番だよ」的な流れみたいな
751デフォルトの名無しさん:2009/05/05(火) 19:47:37
>>748
最近のだと、電話番号の判定モジュールとか最先端でも何でもないよ。
技術も(実際はどうか知らんが)ほとんど必要ない。作った人に根気があっただけ。
752デフォルトの名無しさん:2009/05/05(火) 20:01:18
そうか、実際今高校生なんだけど学校ではPerl使わんし、レポートとかもPODからLaTeXにしたり
LaTeXを直打ちだったり、エクセルの授業中にVB使って変換した奴をPerlスクリプトに流し込んで
楽しまくりだったりするだけで実社会の問題に気づかないんだよな。
「これはなさそうとだなぁ、つくったら喜ばれるんじゃね」とおもって探すと
あるんだよね...orz
753デフォルトの名無しさん:2009/05/05(火) 20:22:00
LWPがあればWWW::Mixiがいらないかといえばそんなことはないわけで
754デフォルトの名無しさん:2009/05/05(火) 20:56:08
既にあるものは使う
使い辛いものは作り直す
無いものは自分で作る

これぞhacker
755デフォルトの名無しさん:2009/05/05(火) 20:57:58
Pluggerみたいに単なる思い付きみたいなのが凄いことに
なっちゃうこともあるしね。
756デフォルトの名無しさん:2009/05/08(金) 08:38:04
お話の最中に大変恐縮ですが、考えあぐねて煮詰まってしまいましたのでなにとぞ助言を賜りたく
お尋ねいたします。

やろうとしていることは、LWP::Simpleをuseして

$BUFF =get($TargetURL)

てな具合にて取得するという至って単純なものなんですが、この$TargetURLから送られてくるデータ
というのがhttpによって配信されるストリーミングデータでして、EOFが返されない限りはブラウザの
画面は真っ白けっけのまんまという次第であります(よって、終了時間になったり中断すると、変数の
中に溜まったデータが初めてブラウザ上に表示されるという次第)。

なんでこんなことをするのかというと、サーバー側から送られてくるデータの内容を

$BUFF =~ s/$Str01/$Str04/g;

みたいな感じで置き換えたり消したりした上で画面に表示させたいなぁ…と思ったからなんですが、
もしかして自分は、Perlではできないことをしようとしてきたのではあるまいか?とか思い至るようになり、
こうして諸先輩方のお教えを乞いに参上いたしました。

というわけで、Perlではできないのであれば諦めますが、そうでないなら「これがイカン」とか「ここを
もっとナニせなイカン」といったお話がありましたら、なにとぞよろしくお願いいたします。<(_ _)>
757デフォルトの名無しさん:2009/05/08(金) 09:06:10
758デフォルトの名無しさん:2009/05/08(金) 14:14:31
>>756
ストリームデータを加工して逐次表示したいならuse Socketして
シコシコ書くのが確実だと思う。$| = 1を忘れずに
759デフォルトの名無しさん:2009/05/08(金) 14:38:28
>>758
そこまで降りる必要はない。
760デフォルトの名無しさん:2009/05/08(金) 14:47:48
>>756
> やろうとしていることは、LWP::Simpleをuseして

SimpleじゃないことはSimpleではできないというのが道理。
LWP::UserAgentを使って、callbackを設定すればおk
761デフォルトの名無しさん:2009/05/08(金) 17:42:42
LWP::Simpleは機能削り過ぎなんだよな
シンプルに書けるけど、突っ込んだことも出来る、というのが使えるパッケージ

一方、LWP::UserAgentは簡単なことをするにも行数が多くなる
とりあえず、Simpleで書いて、限界が見えたらUserAgentに書き換える、
みたいなことをよくやる
762デフォルトの名無しさん:2009/05/08(金) 17:50:43
LWP/Simple.pmを見てみると、メソッドgetprintがそれやってるやん。
763デフォルトの名無しさん:2009/05/08(金) 17:54:29
>>760
わたしは基本的にURI::Fetchを使う。
764デフォルトの名無しさん:2009/05/08(金) 20:00:21
LWP::Simple使わなきゃいけないほど、LWP::UserAgentって複雑じゃないよね
765デフォルトの名無しさん:2009/05/08(金) 20:14:03
複雑じゃないけどダルイ
766デフォルトの名無しさん:2009/05/08(金) 20:39:51
スクリプト(*.plなファイル)のデバッグというかテストってどうやるべき?
処理とテストをそれぞれファイル内にパッケージにして書いたら怒られた(´・ω・`)
でもmainにベタ書きじゃテストが書きにくいし汚くなるからイヤなんですよね
767デフォルトの名無しさん:2009/05/08(金) 21:28:01
とりあえずgetしてみて、エラーになってたら再チャレンジ、
みたいな制御構造って、どう書くのが普通?

ループの中だとredoがしっくり来るんだけど、
単発のgetを強化したい時
768デフォルトの名無しさん:2009/05/08(金) 22:18:10
while(1) hogehoge
769デフォルトの名無しさん:2009/05/08(金) 23:25:08
>>766
テストの自動化ということなら、
ロジックを全て外部モジュールに追い出してそっちをテストするか、
それがダメならテストスクリプトからsystem関数とかで呼び出す、
ぐらいかなぁ
770デフォルトの名無しさん:2009/05/08(金) 23:25:37
それだと無限ループを明示してるように読める
何事もなければ1回で済むけど、例外的に繰り返す、みたいな意味にしたい

if (expr) {expr} と書くか
expr if expr;
と書くかみたいな話
771デフォルトの名無しさん:2009/05/08(金) 23:28:34
until(expr)
772デフォルトの名無しさん:2009/05/08(金) 23:43:28
>>766
マイナーなモジュール探したら、こんなん出ました。
http://search.cpan.org/~danboo/Test-Command-0.02/lib/Test/Command.pm

あとは、IPC::Open3かIPC::Run辺りでデータ受け取りつつ、テストにかけるとか。
773デフォルトの名無しさん:2009/05/09(土) 00:18:13
sub get{
 nanntara;
 &get() if(error);
}

>単発のgetを強化したい時
ってなんやねん
774デフォルトの名無しさん:2009/05/09(土) 00:18:25
ラベル付きのブロックにすればいいのか
ラベル名をユニークにするのがめんどい
大抵は意味なんか無いからなあ
その時の行番号にしたろうか
775デフォルトの名無しさん:2009/05/09(土) 00:19:31
再帰呼び出し!?
776デフォルトの名無しさん:2009/05/09(土) 00:26:23
末尾再帰だから、ループに展開可能。
どうでもいいな。

普通に1..10でループまわして、成功したらlastかければいい。
777デフォルトの名無しさん:2009/05/09(土) 00:28:09
ええー
どんどん駄目になっていく
778デフォルトの名無しさん:2009/05/09(土) 01:02:40
>>767
> とりあえずgetしてみて、エラーになってたら再チャレンジ、
> みたいな制御構造って、どう書くのが普通?

失敗したら再チャレンジじゃなく成功まで再チャレンジが普通じゃね

まぁ見た目の美学を求めるperlハッカーならこう書くだろうがね
779766:2009/05/09(土) 01:41:25
>>769
外部に追い出すほどのロジックでないです(というか勝手にモジュール増やすと怒られそうです)
共用データベースから大量の変数を引っ張ってきているんでsystem関数で呼び出すと色々と不都合が起きそうな気はするんですが、
一番現実的ですかね

>>772
ありがとうございます
後付け条件で申し訳ないんですが、バイトでCPANに繋げられないような設定がされてるみたいなんです(’・ω・`)
せっかく探してもらったのに済みません・・・


もしやこういうスクリプトでのスタンダードなテスト方法って確立されてないんでしょうか
780デフォルトの名無しさん:2009/05/09(土) 01:42:43
unless(expr){until(expr){}}
781デフォルトの名無しさん:2009/05/09(土) 01:54:15
>>779
> もしやこういうスクリプトでのスタンダードなテスト方法って確立されてないんでしょうか

お前はどういうスクリプトかまだ書いていない
782デフォルトの名無しさん:2009/05/09(土) 02:24:18
do whileで書くと、まずdoから評価されるという性質を使う
783デフォルトの名無しさん:2009/05/09(土) 02:40:21
>>779
-d じゃ駄目なんかよ
俺は使ったこと無いけど
784デフォルトの名無しさん:2009/05/09(土) 02:43:02
>>766
> スクリプト(*.plなファイル)のデバッグというかテストってどうやるべき?
> 処理とテストをそれぞれファイル内にパッケージにして書いたら怒られた(´・ω・`)

どうすればいいのか。怒った人に聞け。
785766:2009/05/09(土) 03:18:08
>>781
あ、確かにそうでした
データベースのあるテーブルからすべての行について計算した結果をそれぞれ他のテーブルに書き込むスクリプトです
引数は取りません
問題は共用のテスト用データベースサーバーなのでテスト中に行が追加される可能性があることと、
勝手に都合のいいように変更しにくいということでしょうか
それがなければ>>769の通りsystem関数を使って行うのが一番ですかね…

と書いてて思い至ったんですが、使用するテーブルの中身をメモリやファイル上に退避→都合のいいようにデータベースをいじる→
別ファイルからsystem関数呼び出してテスト→テーブルを元通りに
で問題なさそうですね
質問したのに自己解決で申し訳ない
ありがとうございました

>>783
デバッグでは使ってもテストの労力は増えるので今回はその選択肢はないっす
すみません

>>784
確かにそれが一番ですね
ですが今日聞きそびれたのと、一般的にはどういうことをやっているのか知りたいというのもありまして…
786772:2009/05/09(土) 03:29:11
なめた質問だったな。
結局STDINもSTDOUTもSTDERRも関係無しと。
こんなものモジュール化してテストするだけ。
787デフォルトの名無しさん:2009/05/09(土) 10:14:21
>>757->>765
いろいろお教えいただきありがとうございました。どうも、SimpleじゃないことをSimpleでやろうと
していたようですね。てなわけで皆様方のご指摘を参考に、また精進を重ねて参りまする。<(_ _)>
788デフォルトの名無しさん:2009/05/09(土) 17:08:30
エラー処理について教えてください。

nfsでマウントしているディレクトリのファイルにアクセスした時に
nfsサーバ側でトラブル起きていた場合はエラーメッセージを出力して
終了させたいのですがどのように書けばいいでしょうか?

eval
{
local $SIG{ALRM} = sub { die "timeout" };
alarm 2; #タイムアウトは2秒
if (-e $file_name) { print 'found';}
alarm 0;
};
alarm 0;
if ($@)
{
print 'error';
}
exit();

といった感じでタイムアウトでエラー処理をしようと思いましたがSIGALRMを拾えませんでした。
何かいい方法は無いでしょうか?よろしくお願いします。
789デフォルトの名無しさん:2009/05/09(土) 19:46:06
それは単にマウントしたファイルにアクセスできないってだけでないの?
790788:2009/05/09(土) 22:34:40
>>789
通常問題が無い事が前提のnfsサーバがダウンしている時のエラー処理が目的なのです。
なので普段はそのファイルへのアクセスは問題無く行えています。

nfsのマウントオプションがhard,intrなのでなんらかのシグナルが来るとは思うのですが
その前にタイムアウトで捕まえられれば・・・と思って書いたのですがうまくいってません。

別のシグナルを捕まえなければいけないのか、softでマウントしないといけないのか・・・
何か情報をいただけないでしょうか。
よろしくお願いします。
791788:2009/05/09(土) 22:39:05
どのようにうまくいってないかを書き忘れてました。
・2秒のタイムアウトが動かない
・apacheのタイムアウトで強制終了される

といった感じです。よろしくお願いします。
792デフォルトの名無しさん:2009/05/09(土) 23:44:33
ファイルテスト演算子は使えんのかねー
nfsよー知りませんが
793デフォルトの名無しさん:2009/05/09(土) 23:51:14
あ、使ってんのか
if( -e FILE ){
 あった
}else{
 なかった
}
じゃいかんの
794788:2009/05/10(日) 00:29:33
>>793
レスありがとうございます。
elseについては試してませんが、あるか無いかの判断に2秒かかるとも思えないのと、
apacheでタイムアウトを起こす前に処理が帰ってきていないようなのです。

恐らくnfs側でタイムアウトして、なんらかのシグナルを送ってきてるのだが
私がそのシグナルをperlで受け取る方法を知らないのが問題なのだと思います。
795デフォルトの名無しさん:2009/05/10(日) 00:51:10
>>794
でなくて、あれこれ想像するだけで、問題を切り分けてデバッグしていないのが問題。
796デフォルトの名無しさん:2009/05/10(日) 02:16:04
やっぱりですか
ですよね
できました!ありがとう
797デフォルトの名無しさん:2009/05/10(日) 03:05:24
SocketやI/O関係でブロッキングしてしまうときはselectか
$ENV{PERL_SIGNALS} = 'unsafe';するといいよ
798デフォルトの名無しさん:2009/05/10(日) 17:03:40
すいません、あるプログラムの一部なのですが、このコードはどのような構造なのでしょうか?
my $でスカラー変数を宣言しているのですが、そのあとに{}や=>が入っていてよくわかりません
ハッシュとは違うのでしょうか?

my $test = {
AAA => 'krnaa',
BBB=> '454',
};

799デフォルトの名無しさん:2009/05/10(日) 17:08:46
無名ハッシュ リファレンス

で調べて味噌
800デフォルトの名無しさん:2009/05/10(日) 17:29:34
連想配列でいいじゃん。
801デフォルトの名無しさん:2009/05/10(日) 20:08:02
無名配列へのリファレンスと、無名ハッシュへのリファレンスって、
いつごろのperlからあるの?
802デフォルトの名無しさん:2009/05/10(日) 20:40:12
5
803デフォルトの名無しさん:2009/05/10(日) 20:57:09
頭が4だからなあ
5の機能もそれとは知らずにばんばん使ってるけど、
無名まわりは知らなくても何となく読めるから整理されてない
804デフォルトの名無しさん:2009/05/10(日) 22:11:15
5で追加になったmyとかorとかmapとか->とか最短マッチとか(?:とか、
そんなんもあったのかと個別に新発見してきたけど、
まとめて覚えた方が効率的だよな

5の新機能を使うと互換性が無くなると思って、
極力4の範囲内で書いてた筈がいつのまにかすっかり5
805デフォルトの名無しさん:2009/05/10(日) 23:04:51
現在に通じる教訓を含まない昔話禁止
806デフォルトの名無しさん:2009/05/10(日) 23:08:59
現在の話なんだが
807デフォルトの名無しさん:2009/05/10(日) 23:19:05
>>806は現在を過去に生きているオンボロ

808デフォルトの名無しさん:2009/05/10(日) 23:41:06
日本語でok
809788:2009/05/10(日) 23:49:45
>>795
示したコードではファイルが見つからなかったら何も表示されずに正常終了しますよね?
でもapacheのエラーログにタイムアウトと表示されているのです。
それでもelseを書いてテストした方がいいですか?

>>797
レスありがとうございます。
使ったことが無いのですがこれから調べて試してみます。

どなたか、perlでnfsがらみのエラー処理のコードを書いた事がある方はいませんか?
nfsサーバのトラブルに対応した例をネットで探したのですが見つからないのです。
よろしくお願いします。
810デフォルトの名無しさん:2009/05/10(日) 23:55:56
>>809
そもそもテストならApache経由じゃなくてコマンドラインから直でやってみればっ
811デフォルトの名無しさん:2009/05/11(月) 00:30:23
すみません、Archive::Tarで、
「ファイルを粒でgzip圧縮して、それを最後にtarでまとめる」
のではなく、
「ファイル全部をtarでまとめて、それを最後にgzip圧縮する」
方法はどうすればいいでしょうか。

単にファイル群をadd_filesメソッドの引数に突っ込んで、
最後にwrite($file, COMPRESS_GZIP)すればいいだけの話ですか?
812デフォルトの名無しさん:2009/05/11(月) 00:57:42
tarした後にzipするだけでしょ

やってみれば
813デフォルトの名無しさん:2009/05/11(月) 19:36:55
質問です。
perlで書かれたCGIファイルいじってHTMLページのリニューアルしてるんだけど
firefoxでは表示されるのにIEじゃ500エラーになるんですが
何が原因ですか??

パーミッション、perlのパス、文法は問題無いんです。
EUCで書かれてるみたいなので、文字コードが原因なのかなと思うのですが
どこをいじればいいのかわからないのですが。。
814デフォルトの名無しさん:2009/05/11(月) 19:42:52
>>813
置いたディレクトリは、ApacheでOptions ExecCGIされてる?
とりあえず、hello world置いて実行できるか試してみては?

あと、apacheのログ確認。
815デフォルトの名無しさん:2009/05/11(月) 20:50:58
とりあえずwebprog誘導じゃないのか
816デフォルトの名無しさん:2009/05/12(火) 06:58:03
>>813
まずは、apacheのerror.logを貼れ。
話はそれからだ。
817デフォルトの名無しさん:2009/05/12(火) 09:20:38
>>814で解決したんじゃね
818デフォルトの名無しさん:2009/05/12(火) 10:55:03
キャッシュされてたんだろう
819デフォルトの名無しさん:2009/05/12(火) 17:30:24
ぺrlの話しようぜ!
820デフォルトの名無しさん:2009/05/12(火) 18:23:12
開国してくださーい
821デフォルトの名無しさん:2009/05/12(火) 18:28:54
たった四はいで夜も眠れず
822デフォルトの名無しさん:2009/05/12(火) 20:57:01
初歩的な質問かと思いますが、どうかご回答いただければと思います。

TemplateとCGIを利用してプログラムの作成を行っております。
そこで、TemplateにCGIで受け取ったパラメータを渡したいのですがうまくいきません。

my %foo;
$foo{$_} = $cgi->param( $_) for $cgi->param();

$param = {
foo => \%foo;
}
という作業を行うと問題なく渡せるのですが、%fooを作成しない方法はありませんでしょうか?
823 ◆TWARamEjuA :2009/05/12(火) 21:23:46
$param = { foo => [map +($_, param($_)), $cgi->param] }

こんなことかしら?
tu-kaうまくいかなかったときのコードを晒さないでどうしろと♪
824デフォルトの名無しさん:2009/05/12(火) 22:17:45
もしくはこういう事かもしれませんね
[%
  USE CGI;
  CGI.param('name');
%]
825デフォルトの名無しさん:2009/05/12(火) 22:20:05
というか、tt2にはリファレンスで渡さなきゃダメってだけのことだよ

my $foo
$foo->{$_} = $cgi->param( $_) for $cgi->param();

これで解決。
826デフォルトの名無しさん:2009/05/12(火) 22:34:10
これもここに置いておきますね

$param = {
foo => { $cgi->Vars() },
}
827デフォルトの名無しさん:2009/05/13(水) 05:00:14
テンプレート系に限らないけど、
他人にソースを渡して使ってもらう場合、モジュール依存の処理はどうしたらいいかなあ。

向こうでCPANから拾ってきてくれるなら何使ったっていいだろうけど……
比較的インストールされてる可能性が高い(できれば標準の)モジュールだけに絞るべきか…。
828デフォルトの名無しさん:2009/05/13(水) 06:13:10
俺は一応READMEに書くだけにしてるけど、
Perlに詳しくない人はCPANって言われてもさっぱりだろうからなぁ
829デフォルトの名無しさん:2009/05/13(水) 06:43:27
PurePerlだったら同梱してしまう。
100ぐらいのモジュール試してarc依存だったのは2〜3割くらいだった
830デフォルトの名無しさん:2009/05/13(水) 18:57:20
質問です。

&sub_routine
&sub_routine->()

両者は同じ意味でしょうか?
"->"の意味がよくわからず・・・。
831デフォルトの名無しさん:2009/05/13(水) 19:05:48
&sub_routineはその名前のサブルーチンを呼び出すだけだが、
&sub_routine->()は&sub_routineの返す値をサブルーチンへの
リファレンスだと思ってさらにそれを呼び出すから全然違うよ。
832デフォルトの名無しさん:2009/05/13(水) 19:40:08
リファレンスでググれ
以上
833デフォルトの名無しさん:2009/05/13(水) 20:27:45
デリファレンスの書き方が複数あるから混乱するんだよな

内部的にはデリファレンスだけど、意味としては関数オブジェクトだし
他のオブジェクト指向言語からの類推で何となく読めてしまうので、
厳密な意味の理解に至らない
834デフォルトの名無しさん:2009/05/13(水) 21:27:08
メソッドもデリファレンスなの?
835830:2009/05/14(木) 00:48:30
>>831-833
アドバイスどうもです。
リファレンスについて調べました。
C言語ではポインタに当たるものらしいですね。

これを踏まえて書き直すと、下記のように。
&sub_routine
\&sub_routine->()

つまりポイントとしては
「アロー演算子は、
 アドレスを指し示すリファレンスを
 デリファレンスする働きをもつ  」
ということでしょうか。
836デフォルトの名無しさん:2009/05/14(木) 01:39:22
アロー演算子が、デリファレンスとメソッドの両方について重複して定義されている
と思っても、
perlではデリファレンスとメソッドは同じこと、と思っても困らない
837デフォルトの名無しさん:2009/05/14(木) 07:38:30
>>835
> C言語ではポインタに当たるものらしいですね。

停留所でしか止まれないけどな。
838デフォルトの名無しさん:2009/05/14(木) 09:26:27
あと &sub_routine と &sub_routine() は違うんで気をつけてね。

&NAME; # Makes current @_ visible to called subroutine.
839デフォルトの名無しさん:2009/05/14(木) 09:28:13
>>838
同じじゃないの?
840デフォルトの名無しさん:2009/05/14(木) 10:42:18
% cat foo.pl
g(1,2);

sub f {
print "@_\n";
}

sub g {
print "&f:";
&f;
print "&f():";
&f();
}
% perl foo.pl
&f:1 2
&f():
841デフォルトの名無しさん:2009/05/14(木) 10:47:25
>>840
なんて()が無いと、1,2が入るのか教えてください
842デフォルトの名無しさん:2009/05/14(木) 11:21:40
>>841
http://perldoc.perl.org/perlsub.html

> NAME(LIST); # & is optional with parentheses.
> NAME LIST; # Parentheses optional if predeclared/imported.
> &NAME(LIST); # Circumvent prototypes.
> &NAME; # Makes current @_ visible to called subroutine.

4行目に注目。
843デフォルトの名無しさん:2009/05/14(木) 15:58:48
そんなバグの元になる使い方したくない
844デフォルトの名無しさん:2009/05/14(木) 16:07:32
>>843
俺もそう思う。

しれっとかいてあるけど

&NAME(LIST); # Circumvent prototypes.

なんてのもあるしな。

結論としては&つける書き方はやめとけ。
845デフォルトの名無しさん:2009/05/14(木) 16:26:18
circumvent
英辞郎レベル11
846デフォルトの名無しさん:2009/05/14(木) 16:56:40
自分は
&NAME(LIST);
って書き方しかしない
847デフォルトの名無しさん:2009/05/14(木) 17:37:13
>>844
青らくだ原著だと、「usually the & is optional」と書いてある。
訳本には「通常&はなくても良い」と、あたかもあっても良いかのように書いてあるが、
通常は使わないというのが5の流儀ということでいいと思う。
どうしても使わなきゃなのは以下のような場合とか。

$func = sub {return 1};
&$func;

$func(); だと動かない。
848デフォルトの名無しさん:2009/05/14(木) 17:40:42
そういうときは俺は $func->(); 派。
849デフォルトの名無しさん:2009/05/14(木) 17:54:04
そもそも4ではなんで要ったんだろう?
850デフォルトの名無しさん:2009/05/14(木) 18:09:30
>>849
4の当初は裸のワードが当然のように許されていたので、
裸のワードと区別するために必要だった。

今はuse strictしとけば関数名タイプミスしても裸のワードと
間違われる心配はない。
851デフォルトの名無しさん:2009/05/15(金) 14:00:42
変数の$とか関数の&とか
愚直なところがPerlのいいところだと思う
852デフォルトの名無しさん:2009/05/16(土) 01:08:21
MySQLなどで名前のsortの為だけにカナをvarcharで格納しているのですが、
スピードupも兼ねてカナをintでなんとか表現出来ないかなと思ったのです
が何か良い方法はないでしょうか?

最初、カナをunpackで分けて足してなんてどうかなと試してみましたが、
sortの基準が数字は右から、文字列は左からなので単純に足すわけにもい
かず、私ではとても無理でした。

もしかしたらDBの所で聞いた方が良い内容かも知れませんが、perlで変更して
入れる方法がいいのかなと思ったのでこちらにしました。
宜しくお願い致します。

853デフォルトの名無しさん:2009/05/16(土) 01:20:22
>>852
明らかにDBだろう・・・
854デフォルトの名無しさん:2009/05/16(土) 03:22:24
perlのコードについての質問じゃないんですが、

PerlRequireについての質問です。

# /etc/httpd/conf/httpd.conf
PerlRequire /etc/httpd/conf/startup.pl

#/etc/httpd/conf/startup.pl
use strict;
1;


たったこれだけなんですが、startup.plの中のuse strictが動いてくれません。
スクリプト内に書くとちゃんと読み込みできます。
なぜかわかる方いますか? 

スクリプトはCGIではなくmod_perlとして動いてます。
855デフォルトの名無しさん:2009/05/16(土) 03:29:24
良く知らんけど、あてずっぽうでレスつけてみる。

#/etc/httpd/conf/startup.pl
use strict;
$unko = 1; # ←ここでエラーが出るなら、use strict; が生きてるんじゃないの?
1;
856デフォルトの名無しさん:2009/05/16(土) 07:58:20
プラグマの有効範囲
857デフォルトの名無しさん:2009/05/16(土) 09:35:33
>>855 >>856

ああ。なんとなくわかりました。
strict.pmはプレロードできないんすね。strictだけ反映しないんでなんでかと思いました。
858デフォルトの名無しさん:2009/05/18(月) 01:17:41
use utf8ではまってます。
EncodeがCannot decode string with wide charactersエラー吐きまくり;;
utf8フラグを毎回外さないといけないんですか?フラグ付けたり外したり自作モジュールがたくさんあるから整合性つけるのが大変><;
何か代替案ありませんか?
859デフォルトの名無しさん:2009/05/18(月) 01:27:40
perlを捨ててPHPに移行する
860デフォルトの名無しさん:2009/05/18(月) 01:32:04
>>859
PHPに全スクリプト移植なんて考えただけでも恐ろしい。却下


しっかし、文字コードの肝心要のEncodeモジュールがutf8フラグに対応してない(decodeね)なんて、なんてお粗末なんだ・・・
861デフォルトの名無しさん:2009/05/18(月) 01:55:53
何を文句言ってるのかよくわからんのだけど、
あんたがどこかで大きな勘違いをしているんだと思う。

そんなことで困っているやつを見たことないし、おれもないもん。
862デフォルトの名無しさん:2009/05/18(月) 02:01:05
入力がどの漢字コードで来るか不明な時に万全に対処する方法は?
863デフォルトの名無しさん:2009/05/18(月) 02:19:42
そんな方法は論理的にあり得ない
864デフォルトの名無しさん:2009/05/18(月) 07:25:53
>>862
EUC-JPとShift-JISが既に判別不可能。UTF-8なんか混じるともうだめぽ。
ASCIIのみで構成された非ASCII文字列なんかも判別不可能だな。

現状、その辺に転がってる判別ロジックは確率的にこっちだろjk、と判別をつけている。
しかしShift-JISの半角カナの奇数文字数文字列なんかはマジでEUC-JPと
区別がつかない時がある。半角カナが文字化けするからダメだと
言われる所以だ(その認識は間違ってる訳だが)
865デフォルトの名無しさん:2009/05/18(月) 18:04:22
送信側受信側で環境なりプロトコルなり統一しろ
コード組む以前の努力不足
866デフォルトの名無しさん:2009/05/18(月) 18:18:39
>>865
HTTP1.0だとクライアントからどの文字コードが帰ってくるか不明なんだよねー。
867デフォルトの名無しさん:2009/05/18(月) 18:24:34
クライアントは不定なの?
特定の文字埋め込んでおいて呼ばれたらその文字調べりゃわかる場合もある
868デフォルトの名無しさん:2009/05/18(月) 18:29:19
>>867
HTTP1.0の時代のCGIはみんなそうやって対策してたよねー。
869デフォルトの名無しさん:2009/05/18(月) 18:34:24
自分で両側作れるんなら苦労しないがな。
870デフォルトの名無しさん:2009/05/18(月) 18:35:13
現実が見えてない>>865の負け。
871デフォルトの名無しさん:2009/05/18(月) 18:40:28
ブラウザベースなら、HTML4.0/XHTMLで送信文字コードを指定できる。
目的の文字コードと合わなかったら、はねればいい。

つか、webprogの話だな。
872デフォルトの名無しさん:2009/05/18(月) 18:48:50
>>870
ぬぬっ!勝ち負けがあったのか。参戦したかったぜ。
873デフォルトの名無しさん:2009/05/18(月) 21:47:26
>>870

>>871が現実

すべての場合に対応したい気持ちは分かるがね
874デフォルトの名無しさん:2009/05/18(月) 22:27:12
>>873
非対応ブラウザは排除ですかそうですか。
仕事だとそうも行かないのが現実だと思いますが。
875デフォルトの名無しさん:2009/05/18(月) 22:33:34

そもそもencodeされてるのとされてないのが混在するようなプログラムがおかしいと
思うが、手を抜きたければ

sub mydecode {
return is_utf8($_[1])? $_[1]: &decode;
}


とかすれば?
876デフォルトの名無しさん:2009/05/18(月) 23:00:00
>>875
だから<STDIN>からの入力文字コードが不明な場合なんかだよ。
不明だからencodeもできないだろ。
877デフォルトの名無しさん:2009/05/18(月) 23:11:17
>>876
もとの質問(858)ちゃんと読んだ?
878デフォルトの名無しさん:2009/05/19(火) 00:20:21
非対応ブラウザって何があるんだ?
879デフォルトの名無しさん:2009/05/19(火) 09:40:42
>>877
元の質問は>>862かと思ったぜ。ちゃんとアンカーつけてくれよ・・・。
880デフォルトの名無しさん:2009/05/21(木) 02:54:38
YahooApiを使うためにUTF-8エンコードをしたいのですが、一部の文字がうまくエンコードできません。
うまくいかない文字とは半角スペースやXのような文字です
例えば半角スペースなら+となって、Xなら%e2%85%a4となるのが正しくエンコードされた結果のようです(あるwebサイト上のプログラムでエンコードを試したところ、このような結果がでて、このエンコードされた文字列をYahooApiで普通に使えました)。
自分が使用しているサブルーチンだと半角スペースが%2bとなり、Xが%ef%bf%bdXとなってしまいます。
どうかご教授願います。

以下が使用しているサブルーチンです
sub urlencode{
my $value="$_[0]";
$value=Jcode->new($value)->utf8;
$value =~ s/\s/+/g;
$value =~ s/([^\w ])/'%'.unpack('H2',$1)/eg;
$value =~ tr/\s/+/;
return "$value";
}
881デフォルトの名無しさん:2009/05/21(木) 04:06:12
> $value =~ s/\s/+/g;
半角スペースを2bにしたくないのならこれは不要。

Xは恐らく文字コード判別に失敗して正しくマッピング出来てないと思う。
入力文字コードが分かっているなら
$value=Jcode->new($value、'sjis')->utf8;
のようにして問題を切り分けてみると良いかも
882デフォルトの名無しさん:2009/05/21(木) 13:14:37
お返事をありがとうございます。
Jcode::getcode(X)で調べたところsjisとなっておりました。

その後以下のコードにして半角スペースについては解決しましたが、やはりXとかVとかがうまくエンコードできません。
念のため$value=Jcode->new($value,'sjis')->utf8;のsjisのところをいろいろ変えて試してみましたがやはりダメです。
URLエンコードができるwebサイトを3つ見つけて、そのうち2つのサイトではXは%e2%85%a4と望みどおり変換されましたが、残りのサイトは下のプログラムの実行結果と同じで%ef%bf%bdと返されます。
このことから、おそらくよくある変換ミスだとは思うのですが・・・
ちなみにwindowXPでコマンドプロンプトからperlを動かしています。

my $title='';
$title='X ';

$title=&urlencode($title);
print "$title\n";

sub urlencode{
my $value="$_[0]";
$value=Jcode->new($value,'sjis')->utf8;
$value =~ s/([^\w ])/'%'.unpack('H2',$1)/eg;
$value =~ s/\s/+/g;

return "$value";
}
883デフォルトの名無しさん:2009/05/21(木) 15:28:10
$value=Jcode->new($value,'cp932')->utf8;
XはMS拡張文字だからsjisではなくcp932だった。
884デフォルトの名無しさん:2009/05/21(木) 15:49:32
おおおおおおおおおおお
機種依存文字ってとこまではわかったのですが、そこから進めなかったんです
cp932にすればXみたいな文字や普通の日本語も望みどおり変換されて、漢字やひらがなも変換されますね
ありがとうございました
ところでcpって何だろうね
886デフォルトの名無しさん:2009/05/21(木) 16:15:59
>>885
・・・ググれよ。
887デフォルトの名無しさん:2009/05/21(木) 17:03:22
while(1) {
$ftp = Net::FTP->new($address, Debug => 0);
$ftp->login($id, $pw);
#処理本体
sleep(3600);
}

みたいなことをして、定期的にftpするスクリプトを走らせてるんだけど、
普通に使ってる分にはうまくいくけど、windowsを休止状態にして、復帰すると、
Can't call method "login" on an undefined value at なんたら
で $ftp->login の行で落ちてる

何故エラーになるのかと、とりあえず終了しないようにするには、どうしたらいい?
888デフォルトの名無しさん:2009/05/21(木) 17:16:30
>>887
基本的な原因は、その前のnew()で失敗しているからでそ

なぜ失敗するのかとかはゲイツOSの休止状態を知らないのでわからん。
889デフォルトの名無しさん:2009/05/21(木) 18:17:40
休止状態なのにスクリプトが勝手に動くというのが訳判らないんだよな

今休止状態なのか起動してるのかを安全に調べて、
起動するまでsleepする、みたいな処理はどう書いたらいいんだろう
890デフォルトの名無しさん:2009/05/21(木) 18:21:55
厳密には休止状態じゃなくて、復帰後のログオン前の画面の裏で、
スクリプトが既に動いている
891デフォルトの名無しさん:2009/05/21(木) 18:24:23
俺なら sleep 3600 を入れた無限ループにせず
3600秒ごとにタスクスケジューラで叩く。
892デフォルトの名無しさん:2009/05/21(木) 18:49:13
ネットへのアクセス全般がエラーになるみたいなので、
安全なgetあたりで様子を見る、というのを思いついた
でも、タスクスケジューラの方がよっぽどスマートだ
893デフォルトの名無しさん:2009/05/21(木) 20:36:19
ちょっとお尋ねします
MySQL5を使うのにPerlをインタフェースにしようとしていて
use DBI;
@dbs = DBI->data_sources("mysql");
で、localhostのデータベース名を取得しようとしたんですが、何も代入されません
なぜなんでしょう?
もしかしたら、ものすごく単純なとこで間違えてるかもしれませんが

MySQLは5.0.81、Perlは5.8.9、DBIは1.6.7、DBD::mysqlは4.005
参考にしたもの:
http://dev.mysql.com/doc/refman/4.1/ja/perl-dbi-class.html
894デフォルトの名無しさん:2009/05/22(金) 01:53:27
http://www.rfs.jp/sb/perl/dbi/03.html
http://cnw.hp.infoseek.co.jp/oracle/ora09.html

「多くのドライバが、空文字、もしくは不完全なリストを返すことが多いので、注意しましょう。」
895デフォルトの名無しさん:2009/05/22(金) 08:54:06
どういう時に必要なんだ?それ
896893:2009/05/22(金) 20:30:53
>>894
うーむ、なんか適当なメソッドだなー
試行錯誤の結果、
DBI->data_sources("mysql",{user=>$user,password=>$pass})
としたら、とりあえずうまくいきました
localhostのときは"mysql"だけでいいみたいな書き方だったけど、実は
そうじゃなかったみたいです
ありがとうございました

>>895
MySQLからshow databasesする代わりに、Perlのコマンドラインツールで
見れないかと思って
897デフォルトの名無しさん:2009/05/22(金) 20:36:16
あ、コマンドラインツールじゃなくてワンライナーっていうんでしたっけ?
用語が適当ですみません
898デフォルトの名無しさん:2009/05/23(土) 00:01:03
DBなんてMS Accessでおk
899デフォルトの名無しさん:2009/05/23(土) 11:45:51

自分の世界しな知らない人
900デフォルトの名無しさん:2009/05/23(土) 11:46:42

自分の世界しか知らない人
901デフォルトの名無しさん:2009/05/23(土) 11:52:36
いちいち反応すんなよ

それはそうと、ちょっと利口な事務のおねーちゃんがAccessでちょっとしたもの作っちゃってて
びっくらこいたぜ。Accessの功績は大きいな。
902デフォルトの名無しさん:2009/05/23(土) 12:01:04
うちの会社のねえちゃんだって、Excelでちょっとしたもん作ってるよ。

Excelの功績も大きいな。
903デフォルトの名無しさん:2009/05/23(土) 17:17:21
俺の実のおねーちゃんだってawkでちょっとしたもの作っちゃってて
そりゃもう大騒ぎよ。
904デフォルトの名無しさん:2009/05/23(土) 23:02:10
AccessとかExcel馬鹿にするやつって視野狭くて頭堅そう
まぁプログラマーって事務仕事しないんだろうけど・・・
あいつらはマジ強力
905デフォルトの名無しさん:2009/05/23(土) 23:04:11
自分の世界しか知らない人
906デフォルトの名無しさん:2009/05/23(土) 23:37:09
質問です。
Win32::OLEを使ってAccessのデータベース(***.mdb)を操作したいのですが、読み込みのところで困ってます。

・やりたいこと
クエリーPriceから@BrandIdが55のもの一覧を取得したい

・問題がありそうな部分(WHEREの付け方がおかしい?)
$rs=$objDB->Execute("SELECT * FROM Price WHERE @BrandId = 55;");

・このようにWHERE以降をカットするとエラーが出ません
$rs=$objDB->Execute("SELECT * FROM Price;");

・エラーの種類
Can't call method "EOF" on an undefined value at testr.pl line 26.

Active Perl 5.10.0を使ってます。
よろしくお願いします。
907デフォルトの名無しさん:2009/05/24(日) 00:02:13
>>906
>Can't call method "EOF" on an undefined value at testr.pl line 26.
26行目見ろよ
908デフォルトの名無しさん:2009/05/24(日) 00:21:11
@BrandIdが変数展開されてる
909906:2009/05/24(日) 00:40:29
>>908
ありがとうございます。
@BrandIdの前にバックスラッシュを入れたところ、動いたようです。
910デフォルトの名無しさん:2009/05/24(日) 01:23:19
perlで
年の第何週という情報からその週が何月何日から何月何日かを求めたいのですが、
わかりません。
例:2009年第2週→1/5〜1/11(週は月曜始まり)
911デフォルトの名無しさん:2009/05/24(日) 01:24:34
perlで
年の第何週という情報からその週が何月何日から何月何日かを求めたいのですが、
わかりません。
例:2009年第2週→1/5〜1/11(週は月曜始まり)
どのたか教えていただけませんでしょうか?
912デフォルトの名無しさん:2009/05/24(日) 02:10:17
なんかそんなようなモジュールがあったような気がするな。
すぐ作れるなら自分で作る派だからよく覚えてないけど。

適当な算出方

(2009 - 1970) * 60 * 60 * 24 * 365;

2 * 60 * 60 * 24 * 7;
(2 - 1) * 60 * 60 * 24 * 7;

なんか世の中には4年に一回うるう年とかあるし、4年に一回ってその内のどこ?って感じだし、
100年に一回はうるう年ないとか、うるう秒とか、わけのわからんルールがいっぱいあってこれ以上は知りません。
運がよければ誰か偉い人が答えてくれます
913デフォルトの名無しさん:2009/05/24(日) 02:23:33
月の終わりの方が5週じゃなくて次の週1週に繰り込まれたりするのは、
どう表現するんだ?
914デフォルトの名無しさん:2009/05/24(日) 06:13:25
use Time::Local;
for my $n (1..53) {
 print join(',',hoge( 2000, $n ))."\n";
}
sub hoge {
 my ($y,$n)=@_;
 my $s=timelocal(0,0,0,1,0,$y)+((24*60*60)*(($n-1)*7-(localtime(timelocal(0,0,0,1,0,$y)))[6]+1));
 return map{sprintf("%d/%d",(localtime($s+($_*24*60*60)))[4]+1,(localtime($s+($_*24*60*60)))[3])}(0..6);
}
こんな感じかな?
915デフォルトの名無しさん:2009/05/24(日) 07:46:58
<?php
foreach (range('a', 'z') as $letter) {
print $letter;
print "<br>";
}
?>

こういうことができるのが、PHPのすごいところ。

おなじことをperlでやったら、

「正規表現を駆使した渾身の一作」

で、何十行書かないといけないことやら。
916デフォルトの名無しさん:2009/05/24(日) 08:18:50
>>915
perl -e 'print "$_<br>" foreach('a' .. 'z')';
で何か不都合があるの?
917デフォルトの名無しさん:2009/05/24(日) 13:40:28
>>915
デカい釣り針だな。
918デフォルトの名無しさん:2009/05/24(日) 13:48:01
何か似たようなのを見たことあるなと思ったら >>459
あからさまにレベルが低すぎるからPHPを貶めるためにわざとやってるんだと思いたい。
919デフォルトの名無しさん:2009/05/24(日) 14:14:00
>>915 はこっちでも叩かれてるな

PHP@プログラム板
http://pc12.2ch.net/test/read.cgi/tech/1232712334/717
920デフォルトの名無しさん:2009/05/24(日) 14:40:10
ただの釣りだろ
本人は全然おもしろくないことに気づいてないようだが
921初心者:2009/05/24(日) 22:45:39
すいません
教えてください

my ( $hoge );
みたいに変数を()で囲むのはどういう意味があるんでしょうか?
922デフォルトの名無しさん:2009/05/24(日) 22:51:19
my ( $hoge, $hogege, $hogegegege );
みたいにできる
923初心者:2009/05/24(日) 22:56:07
>>922
ありがとうございます

ググってもなかなか出なくて困ってたんですよ
924デフォルトの名無しさん:2009/05/24(日) 23:29:07
>>921
リスト
925名無し秀鵬:2009/05/25(月) 00:39:27
$page = '1989/09/27';


my ($hoge) = $page =~ /^(\d+)/g;
見つかった中身が $hoge が入る

my $hoge = $page =~ /^(\d+)/g;
見つかった個数が $hoge に入る


まとめて宣言したいなら () 付き。
ただし、似た用途同士でまとめとかないとぐちゃぐちゃになって、
可読性が低下するので注意です

1つだけ宣言したいなら () 無し。

って感じでしょか

By 中級になれない者より
926デフォルトの名無しさん:2009/05/25(月) 01:05:04
おしえてください。
ディレクトリの所有者、パーミッションを調べるにはどうしたらよいでしょうか。
ファイル情報はいろいろ出てくるのですがディレクトリ情報はみつかりませんでした。
どうかよろしくお願いします。
927デフォルトの名無しさん:2009/05/25(月) 01:24:14
>>926
stat
928デフォルトの名無しさん:2009/05/25(月) 02:02:09
>>927
さっそくありがとうございました。
ファイルもディレクトリも一緒なんですね。
ふぅ
929デフォルトの名無しさん:2009/05/25(月) 03:03:16
use base qw(Package)
のqwって何でつけるの?
qwが配列化ってのまでは調べたんだが、
パッケージ名を生で書くとスペース区切りのリストが帰ってきたりするの?
930デフォルトの名無しさん:2009/05/25(月) 03:26:55
>>925
/gで見つけたら、@hogeに入れる
931デフォルトの名無しさん:2009/05/25(月) 04:12:36
>>929
四行目が何を言ってるかわからないけど、
継承元が複数あるってことが納得できないってこと?それともPerlの文法的な話?

例えば、
our @ISA = qw( Foo::Bar );
だったら納得いく?
932デフォルトの名無しさん:2009/05/25(月) 04:25:25
>>931
ありがとうございます。
質問の仕方が悪かった。ごめんなさい。

そもそも
use base が具体的にどういう仕事をしてるのかよくわかってなくて、
そこら辺をあわせて知りたかったんだ。

ISAでググってみた感じだと、
つまりuse baseで指定したパッケージ内で宣言された関数を
自パッケージからも使えるようにするってこと?
ってことは、
use base qw(Foo);

use base (Foo::A, Foo::B);
みたいなものだと理解すればいいの?
933デフォルトの名無しさん:2009/05/25(月) 09:46:34
use base ("Foo");
934デフォルトの名無しさん:2009/05/25(月) 11:12:49
>>932
Foo::BarAとFoo::BarBは、まったく別のクラスなんだから、Fooだけでどちらも継承とかは出来ないよ
というより、Fooというのも、存在するならばクラスなわけだし。
あんまり難しく考えず、継承というのは複数のクラスから出来るものなのだから
一個でも複数でも指定できるようにしている
ってことで理解した方がいい。
コンテキストで配列かリファレンスか判断する、なんて処理を実装してるような言語なんだし。

あ、ここまで書いてて、>>932の勘違いした一つの理由がようやく分った。

(A, B, C, D) という書き方と、 qw(A B C D) という書き方はまったく同一だよ
qw|A B C D| でもいいよ。qw/A B C D/でもいい。
ようするにqwってのはスペース区切りでカッコ内を配列にするってだけ。
935おしえてください。:2009/05/25(月) 12:38:42
Catalyst、DBIx::Classを使用して全文検索を実装しようとしているのですが、
ttp://asakura.g.hatena.ne.jp/asakura-t/comment?date=20070405
ここに書いてあるようにやってもうまくいかない。
use SQL::Abstract::Fulltext::MySQL;
$rs = $rs->search({
-fulltext => {
-match => 'detail',
-against => $tag,
-boolean => 1,
},
});
とすると [SQL::Abstract::_where_op_in_hash] Fatal: unknown operator: -fulltext
と言われてしまう・・・
何が間違っているのでしょう?
936デフォルトの名無しさん:2009/05/25(月) 20:26:56
>>934
qw(A B C)
と等価なのは
('A', 'B', 'C')
だろ?分かってると思うけど
937デフォルトの名無しさん:2009/05/25(月) 20:31:24
Quote Whitespace か何なの略?
938デフォルトの名無しさん:2009/05/25(月) 21:23:28
>>937
quote wordsだろ確か。
らくだ本くらい読んどけ。
939デフォルトの名無しさん:2009/05/25(月) 21:43:10
またわざとマニュアルを見ずに当てっこするクイズゲームが行なわれていたのか。
940デフォルトの名無しさん:2009/05/25(月) 22:13:05
誰がperlのマニュアル見るもんか。アフォくさ
941デフォルトの名無しさん:2009/05/25(月) 23:00:33
教えて厨にはデタラメを教えてやれ
942デフォルトの名無しさん:2009/05/25(月) 23:29:51
すいません。じぶんなりに調べてみたのですが、どうにもよく分からないので、
教えていただけるとありがたいのですが、

perlで日本語の複数の漢字(utf8)のデータが入ったファイルを読み込んで、
unicodeのコード番号をそれぞれ別ファイルに書き込むということは可能でしょうか?
943デフォルトの名無しさん:2009/05/25(月) 23:49:07
>>942
可能です
944デフォルトの名無しさん:2009/05/26(火) 09:25:34
Cygwinの上でPerlを動かしてるんだけどスレッドを使うとこんなエラーが出て必ず落ちます

2 [unknown (0x9A8)] perl 2328 _cygtls::handle_exceptions: Error while dumping state
(probably corrupted stack)
Segmentation fault (core dumped)

CygwinとPerlのどっちに問題があるんでしょうか?
そもそもPerlでスレッド使うのが間違ってるとか?
945デフォルトの名無しさん:2009/05/26(火) 10:30:11
「問題の切り分け」 をしてみては?
ネイティブのperlで短いコードを書いてテストしてみればわかるかも知れないやろ。
946デフォルトの名無しさん:2009/05/26(火) 14:29:54
Perlのモジュールで、HTMLを再インデントするようなものってないですかね?

CMSで吐き出されたコードをきれいに整形したいと思っています。
行いたいことは、
吐き出されたコードから、ホワイトスペースの削除
空行の削除
再インデント
です。

どうかよろしくおねがいいたします。
947デフォルトの名無しさん:2009/05/26(火) 14:34:49
>>946
CPAN HTML 整形 でググった。
http://d.hatena.ne.jp/toritori0318/20090207/1234025307
こんなん出た。

まず自分で探してみた?
948デフォルトの名無しさん:2009/05/26(火) 14:44:01
正規表現を数行かけば出来る気がしなくもない
949デフォルトの名無しさん:2009/05/26(火) 17:13:54
>>948
やってみれ。っつーかHTMLのタグ1個分の正規表現書いてみれ。
それだけで力尽きるからww
950デフォルトの名無しさん:2009/05/26(火) 18:22:07
Cのマクロについて。

(1) 通常のassertマクロはリリース時には削除されるが、リリース時でも削除されないassertマクロの名前
(2) 与えられた文字列をエラーメッセージとして、強制終了するマクロの名前

お願いします。
951デフォルトの名無しさん:2009/05/26(火) 18:24:52
>>949
そして間違っているに一票。
952950:2009/05/26(火) 18:26:16
ごめん、誤爆した
953デフォルトの名無しさん:2009/05/26(火) 20:13:17
数行の正規表現で何とかなるわけない。
954デフォルトの名無しさん:2009/05/26(火) 22:40:56
まあ、ウェブブラウザはよくこんなにぶっ壊れたファイルをまともに表示できるもんだと思うね。
955デフォルトの名無しさん:2009/05/26(火) 23:29:05
htmlが適当すぎるんだよな
書いても書かなくてもいい部分が多すぎ
956デフォルトの名無しさん:2009/05/27(水) 00:01:39
ま、例によって、「詳しい人がちゃんとしたものを作ってくれるまで、
とりあえずこれで行こう」なものが永続化しちゃったものですから〜
957デフォルトの名無しさん:2009/05/27(水) 02:09:38
とりあえずこれで行けばそれで良かったのに、
不満が生じて新たな機能を盛り込む方法が強引だから、どんどんおかしくなった
どうせ人間が手が書いたりなんかしないし、という前提もある
958デフォルトの名無しさん:2009/05/27(水) 06:54:58
>>957
それはない。昔はみんな手で書いてたし、その頃から
HTMLはおかしくなってた。

HTMLはマークアップ言語だという前提を完全に無視して
シェア獲得のために独自拡張を競ったNetscape社とMicrosoft社が主犯格。
959デフォルトの名無しさん:2009/05/27(水) 08:41:59
SGMLからつまみ食いしたからだお
960デフォルトの名無しさん:2009/05/27(水) 09:50:49
>>959
いや、HTMLをSGML準拠にしようとする試みはずっと続けられてきた。
ただNetscape社とMicrosoft社は完全にこれらを無視。今に至る。

まあ、標準化されたものが実用を無視したものだったから仕方なかったのだけれども。
961デフォルトの名無しさん:2009/05/27(水) 10:01:49
XML+XSLで作ると、とっても美しい
962デフォルトの名無しさん:2009/05/27(水) 15:16:35
ネスケとかIEの独自拡張は使うべきか使わざるべきか、迷ったよね
tableタグとか便利なんだけど規格に無いし・・
963デフォルトの名無しさん:2009/05/27(水) 18:54:00
別にMSだけの責任じゃない。CSSの普及が遅れたのはネットスケープの責任だし、ブラウザが有料のままだったら、インターネット自体の普及が大きく遅れただろう。
964デフォルトの名無しさん:2009/05/27(水) 19:17:06
tableタグだけだと細い罫線が書けないのでそこだけcssに頼ったり、もう手の付けようがない
965デフォルトの名無しさん:2009/05/27(水) 19:24:19
>>963
誰一人としてMSだけを責めていない罠。皆両方悪いと言うておる。
966デフォルトの名無しさん:2009/05/27(水) 20:56:14
######################################
#!/usr/bin/perl
open(IN,"test.txt");
while(<IN>){
@data = split(/[\s+]/, $_);
print "$data[0],$data[1],$data[2]\n";
}
close(IN);
#######################################

#test.txtの中身
 1 2 3
 4 5 6
10 11 12
13 14 15
###########
967デフォルトの名無しさん:2009/05/27(水) 20:57:45
>>966のスクリプトを用いてカンマ区切りで数字を出力したいのですが、
splitを使っての区切り方がわかりません。
test.txtは桁数をそろえてデータが格納されており、
(test.txtは1行目と2行目の先頭に1個の空白があり二個の空白で数字が区切られている。
3行目と4行目は1個の空白で区切られている。)
>>966のスクリプトでは出力が以下のようになってしまいます。
,1,
,4,
10,11,12
13,14,15

この出力を
1,2,3
4,5,6
10,11,12
13,14,15
としたいです。

ちょっとあせってて日本語になっていないかもしれませんが
よろしくお願いします。。
968デフォルトの名無しさん:2009/05/27(水) 21:07:38
while (<IN>) {
$_ =~ s/^\s+//;
my @data = split /\s+/, $_;
print "$data[0],$data[1],$data[2]\n";
}
969デフォルトの名無しさん:2009/05/27(水) 21:12:53
>>968
ああなるほど!!
ありがとうございます!!
970デフォルトの名無しさん:2009/05/27(水) 23:05:39
#!の構文って、1行目にないと効かないのでは
971デフォルトの名無しさん:2009/05/27(水) 23:07:32
>>967
別解

#!/usr/bin/perl -w
print join(',', split), "\n" while <DATA>;
__DATA__
 1 2 3
 4 5 6
10 11 12
13 14 15
972名無し募集中。。。:2009/05/27(水) 23:38:32
省略された暗黙の変数は多用すべきではないかと
973デフォルトの名無しさん:2009/05/28(木) 00:20:56
置換すりゃいいのに
974デフォルトの名無しさん:2009/05/28(木) 10:16:07
この人、置換です
975デフォルトの名無しさん:2009/05/28(木) 10:17:46
>>972
ワンライナーに多用も何もないだろ。このくらいは充分許容範囲だと思うが。
976デフォルトの名無しさん:2009/05/28(木) 10:20:40
別に使ってもいいじゃん
977デフォルトの名無しさん:2009/05/28(木) 13:54:13
ループ文で他に変数がなければむしろ積極的に使うがな。
978デフォルトの名無しさん:2009/05/28(木) 21:12:09
むしろ、いかに変数を減らすかに努力する
979デフォルトの名無しさん:2009/05/28(木) 21:27:56
perlからwindowsにポップアップでメッセージを出す、みたいなことをする外部ツールって無い?

$ans = system("bin/popup.exe $mes");

みたいにして使う感じの
980デフォルトの名無しさん:2009/05/28(木) 21:46:28
grepとかm/( )/とかで文字列を見つけると、それはリストで帰ってくる
どうせ1つだと判っている時に、
($tmp) = みたいに一旦リストで受けたり、
( )[0] みたいに全体を括弧でくくるのがなんか嫌だという時、
先頭の要素のスカラーとして評価させる書き方って無いのかな
shift?
981デフォルトの名無しさん:2009/05/28(木) 21:52:13
>>979
そのpopup.exeがどういうのか知らんが、メッセージを表示するだけ(入力なし)なら
$ans = system("msg.exe * $mes");
982デフォルトの名無しさん:2009/05/28(木) 21:59:55
おお、標準コマンド
ぜひ入力付きで実装して欲しかった > ゲイツ
983デフォルトの名無しさん:2009/05/28(木) 22:55:54
winAPIのモジュールなかったっけ?
984デフォルトの名無しさん:2009/05/28(木) 23:15:29
win32::のを使うと、何でもできるけど、何をするにも長くなるからなあ

プロンプトを表示して文字列一つ入力させて帰ってくるだけの簡単な外部ツールくらい、
delphiあたりでマウスだけで1分で作れそうなものなのに
意外と作ってる人がいない
985デフォルトの名無しさん:2009/05/28(木) 23:45:18
じゃあ、オメエが作れよ。


あんま、言いたくない台詞だが、さすがに言いたくなった。
986デフォルトの名無しさん:2009/05/29(金) 00:26:10
Tkでええんちゃうん
987デフォルトの名無しさん:2009/05/29(金) 01:11:31
>>984
やったな!! ヒーローになるチャンスじゃん!!
988デフォルトの名無しさん:2009/05/29(金) 02:09:08
そんなことより次スレ
989デフォルトの名無しさん:2009/05/29(金) 19:36:55
素直にC#で.NET使った方がいい
990デフォルトの名無しさん:2009/05/29(金) 19:46:46
正規表現について3つ質問があります。

(1)
<td width="35%" align="right"><div style="font-size:12px">37台</DIV></td>
<td width="35%" align="right"><div style="font-size:12px">400円</DIV></td>
<td width="40%" align="right"><div style="font-size:12px">1076個</DIV></td>
<td width="40%" align="right"><div style="font-size:12px">1/27</DIV></td>
このHTMLタグから「37」「400」「1076」「27」という4つの値を取得するにはどのようにすればよろしいでしょうか?
単位(台、円、個、1/)は無視です。

(2)
<img src="imgview.cgi?p=129900905271010/IMG090527/E/IAD0826M.PNG"></td>
<img src="imgview.cgi?p=129900905280910/IMG090528/E/IAD0826M.PNG"></td>
<img src="imgview.cgi?p=129900905291900/IMG090529/E/IAD0826M.PNG"></td>
同じく、src=の後のURLを取得するにはどのようにすればよろしいでしょうか?

(3)
(2)の「129900905271010」の部分は、6〜11桁目が年月日で、12〜15桁目が時間になっています。
この年月日と時間を取得したいのですがどのようにすればよろしいでしょうか…?
また、取得後に「年」はYYではなくYYYYの4桁に変換したいのですが…


桁数などは固定になっており、変動する部分は各数値です。

2日ほど前からPerlを使用し始めたばかりで、いまいち正規表現というものが理解できない状態です…
申し訳ありませんが、どうかよろしくお願い致します。
991デフォルトの名無しさん:2009/05/29(金) 20:25:30
>>990 (1)
規則性が無いようだから、個別に抜くのがよいのでは

$dai=$1 if /(\d+)台/;
$yen=$1 if /(\d+)円/;
$kosu=$1 if /(\d+)個/;
$bunbo=$1 if /1\/(\d+)/;
992デフォルトの名無しさん:2009/05/29(金) 20:32:13
>>990
my $str = <<'EOS';
<td width="35%" align="right"><div style="font-size:12px">37台</DIV></td>
<td width="35%" align="right"><div style="font-size:12px">400円</DIV></td>
<td width="40%" align="right"><div style="font-size:12px">1076個</DIV></td>
<td width="40%" align="right"><div style="font-size:12px">1/27</DIV></td>
EOS

while ($str =~ m|(?<=>)([^<]+)(?=</DIV>)|g) {
  my $num = $1;
  print $num =~ /^([0-9]+)[^0-9]*\z/ ? "$1 (単位)\n"
     : $num =~ /([0-9]+)\z/       ? "(単位) $1\n"
     :                      "無し\n"
  ;
}

print $str = join("\n", <<'EOS' =~ /\bsrc="([^"]+)"/g) . "\n";
<img src="imgview.cgi?p=129900905271010/IMG090527/E/IAD0826M.PNG"></td>
<img src="imgview.cgi?p=129900905280910/IMG090528/E/IAD0826M.PNG"></td>
<img src="imgview.cgi?p=129900905291900/IMG090529/E/IAD0826M.PNG"></td>
EOS

while ($str =~ m|\?p=[0-9]{5}([0-9]{10})/|g) {
  my @date = $1 =~ /[0-9]{2}/g;
  printf "%d年%d月%d日 %d時%d分\n", $date[0] + 2000, @date[1..4];
}
993990:2009/05/29(金) 22:34:06
>>991 >>992
レスありがとうございます。

共に動作確認致しました。
今回は、>>992の方法を取らせていただきます。


あと、もしよろしければ、今回のパターンの「m|(?<=>)([^<]+)(?=</DIV>)|g」のご説明をお願いできませんでしょうか?
「m|\?p=[0-9]{5}([0-9]{10})/|g」の方はなんとなくわかったのですが、上記のパターンがいまいち理解できません。
動作は正常動作するので問題ないのですが、お手数でなければご教授していただけませんでしょうか?

度々申し訳ありませんがよろしくお願い致します。


994デフォルトの名無しさん:2009/05/29(金) 23:26:05
>>993
いくらなんでも自分で調べりゃ分かる事だぞ・・・
「Perl 正規表現」で検索くらいはしたんでしょうね?
995992:2009/05/30(土) 00:05:56
>>993
'>' と '</DIV>' に挟まれた、一文字以上の '<' 以外の文字。
今回の処理内容だと先読み/後読み言明を使う必然性は無い。
うまいやり方を考えながら書いてた残骸で、結局キャプチャする
方向で収まったから m|>([^<]+)</DIV>|g で問題無い。

http://perldoc.jp/docs/perl/5.10.0/perlreref.pod
http://perldoc.jp/docs/perl/5.10.0/perlretut.pod
996990:2009/05/30(土) 01:11:50
>>992
ご説明ありがとうございます!
正規表現は難しい(ややこしい)ですね…慣れるまで時間がかかりそうです…
でも、分解していけばなんとなく分かってきたような気がします。

'>'は記号文字'>'が含まれ、
'([^<]+)' は記号文字'<'以外の文字にマッチし、
'</DIV>'はそのまま'</DIV>'にマッチする。

繋げると、
'>'にヒットし、'<'以外の1文字以上の文字にマッチして、'</DIV>'で終わる
という文字列にマッチするという感じですね。
結果、'>abcdef</DIV>'というような文字列にマッチする感じですね。

色々と調べてはいたのですが、複雑で理解にかなり時間がかかりました…
'|'は、'/'が本来では正規表現の書式(?)そのものに使用されるものですが、
'</DIV>'に、'/'が使用されているので'/'の代わりに'|'を使用するという情報にたどり着きました。
|を使用しない場合は m/>([^<]+)<\/DIV>/g という感じになると思います。
(間違っていれば指摘お願いします;)

この度は、とてもよい勉強になりました!
どうもありがとうございます。
997デフォルトの名無しさん:2009/05/30(土) 06:16:42
次スレ立てました
Perlについての質問箱 40箱目
http://pc12.2ch.net/test/read.cgi/tech/1243631674/
998デフォルトの名無しさん:2009/05/30(土) 09:33:28
>>997
999デフォルトの名無しさん:2009/05/30(土) 11:08:39
>>997
1000たまご ◆EGGMAN.HlI :2009/05/30(土) 11:08:53
1000ならぱにぽにだっしゅ!二期
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。