Perlについての質問箱 ..
[2ch|▼Menu]
39:デフォルトの名無しさん
09/02/15 08:14:08
>>38
Windowsで使ってるでしょ?

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

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

URLリンク(www.din.or.jp)

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

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

で済む問題。

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

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

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

おしまい。

44:42
09/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:デフォルトの名無しさん
09/02/15 14:50:18
>>44
> これはインストールが失敗したということでしょうか

そう書いてありますが。

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

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

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

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

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

49:38
09/02/15 21:14:22
>>39
ありがとうございました。
$/なる変数は、初めて知りました。

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

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

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

52:50
09/02/15 21:56:57
しまった元ファイルが壊れていたってオチか。

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

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

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

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

55:デフォルトの名無しさん
09/02/16 22:19:33
>>36
>>50

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

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

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

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

58:デフォルトの名無しさん
09/02/17 09:32:52
>>56
つPadWalker

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

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


60:デフォルトの名無しさん
09/02/17 14:03:35
>>57
知らないならレスしないでください

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

62:デフォルトの名無しさん
09/02/17 14:36:07
>>61
後出しみっともない


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

64:デフォルトの名無しさん
09/02/17 15:49:58
>>63
そう思うならやるなよ


65:デフォルトの名無しさん
09/02/17 16:31:29
>>64
いつまでもみっともない。

66:デフォルトの名無しさん
09/02/17 17:50:44
>>65
必死だな!

67:デフォルトの名無しさん
09/02/17 18:40:21
>>66
>>66

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

69:デフォルトの名無しさん
09/02/17 19:08:44
なにこのスレ

70:デフォルトの名無しさん
09/02/17 23:44:42
文字列取得の質問です

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

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

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

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

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

71:デフォルトの名無しさん
09/02/17 23:51:51
>>70
っ[パターンマッチ]

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

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

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

$1⇒「ABC,d,e」

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

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

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

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

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

76:デフォルトの名無しさん
09/02/18 07:48:50
可能です。

77:デフォルトの名無しさん
09/02/18 14:57:23
>>76
どうもです

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

79:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/02/19 03:00:45
ありがとうございます
まだファイルハンドルあたりやtaiについての知識が薄いので、
ここ2,3日で実験しながら学びたいと思います
また何か分からないことがあると思うので、
よろしくお願いします

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

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

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

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

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

86:デフォルトの名無しさん
09/02/20 14:09:07
>>84
っ[Digest]

87:デフォルトの名無しさん
09/02/20 14:28:40
解決しました。ありがとうございました。勉強してきますorz

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

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

89:デフォルトの名無しさん
09/02/20 18:31:12
なんといういやがらせ


90:88
09/02/20 18:56:00
自己解決しました
index関数とsubstr関数で置換できました

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

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

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

92:デフォルトの名無しさん
09/02/20 19:21:24
>>91
志村〜、コメント、コメント

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

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

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

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

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

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


96:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/02/21 20:00:22
>>96-97
スコープが違うから。
上はサブルーチンの外側で宣言した %H に代入している。
下はサブルーチンの内側で宣言した %H に代入している。

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

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

100:デフォルトの名無しさん
09/02/22 11:53:36
ここ(URLリンク(kage.monazilla.org))を参考に
●ログインするプログラムを書いてみました。
しかし、認証に失敗して、以下のセッション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='URLリンク(2chv.tora3.net)';
my %form = ('ID'=>$id,'PW'=>$pw);
my $req = POST($url,[%form]);

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

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

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

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

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

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

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

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

P.S.
サーバ側のバグについて
スレリンク(operate板:591番)
にて問い合わせています

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


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

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

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

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

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

109:デフォルトの名無しさん
09/02/22 20:18:33
後出しジャンケンみっともない

110:デフォルトの名無しさん
09/02/22 22:12:06
>>104
解決しました。
ありがとうございました。


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

112:デフォルトの名無しさん
09/02/22 22:40:11
exists

113:デフォルトの名無しさん
09/02/22 22:40:20
仮想配列って何ですか

114:デフォルトの名無しさん
09/02/22 22:40:39
「仮想配列」

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

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

URLリンク(layer3.asia)

痛いw


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


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

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

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

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

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

121:デフォルトの名無しさん
09/02/24 13:32:09
$form = new CGI;

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

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

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

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

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


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

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

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

126:デフォルトの名無しさん
09/02/24 14:45:13
>>124
ラマ本は買った?
URLリンク(www.amazon.co.jp)
昔のラマ本の方が分かりやすかったな・・・。

127:デフォルトの名無しさん
09/02/24 14:45:31
>>125

128:デフォルトの名無しさん
09/02/24 14:47:47
さらにごめん。さっきの中古本だった。3版になってるのね。
URLリンク(www.amazon.co.jp)

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

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

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

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

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

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

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

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



132:デフォルトの名無しさん
09/02/24 18:54:10
>>131
とりあえずざっと目通した?
URLリンク(search.cpan.org)
URLリンク(search.cpan.org)

133:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/02/24 23:52:07
URLリンク(anond.hatelabo.jp)
ここにプログラムがありますが、これを実行するために
1.必要なもの
2.(1.)が揃ったらやること
をざっと教えてください。

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

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

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

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

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

139:デフォルトの名無しさん
09/02/25 00:26:18
>>136
それ書けば質問に答えられるのか?

140:デフォルトの名無しさん
09/02/25 00:31:02
>>138
その知識を分けてください

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

141:デフォルトの名無しさん
09/02/25 00:32:54
えっちなのはいけないと思います。

142:デフォルトの名無しさん
09/02/25 00:33:20
正直者め

143:デフォルトの名無しさん
09/02/25 03:22:27
>>140
ここ見て、知らない単語はぐぐれ。
URLリンク(www.moongift.jp)

英語読めるなら
URLリンク(win32.perl.org)

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

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

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

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

147:デフォルトの名無しさん
09/02/26 06:13:13
Sort::Fields - 区切られたフィールドを持つ行のソート
URLリンク(fleur.hio.jp)

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

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

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

148:デフォルトの名無しさん
09/02/26 06:21:09
「エラーになります」

大爆笑

149:デフォルトの名無しさん
09/02/26 06:59:30
ぞっとした

150:デフォルトの名無しさん
09/02/26 09:21:40
みんなで仲良くねF

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

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


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

153:デフォルトの名無しさん
09/02/26 10:46:46
>>151
バカに引っ張られて自分もバカになるなよ。

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

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

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

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

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

<AAA BBB="XXX>

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

よろしくお願いします。

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

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

157:154
09/02/26 13:34:51
ども

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


159:147
09/02/26 22:26:27
>>151

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

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

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

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

160:デフォルトの名無しさん
09/02/27 07:35:19
全力でスルーしてたが…

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


161:デフォルトの名無しさん
09/02/27 07:40:21
よくそれで仕事にしてるよな・・・。

162:デフォルトの名無しさん
09/02/27 07:58:04
がまんしてスルーして

163:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/02/27 17:07:51
ループでひとつの配列を使いまわしているのですが、次のループ時も前のループのときの配列のデータが残っていて都合が悪いです
配列を空っぽにする方法はありますか?

165:デフォルトの名無しさん
09/02/27 17:13:02
>>164
@a = ();

166:164
09/02/27 17:31:23
ありがとうございました
うまく空っぽにすることができました

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

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

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


170:デフォルトの名無しさん
09/02/28 23:39:31
>>168
書けるよ

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

172:デフォルトの名無しさん
09/03/01 00:10:02
>>168
書けるよ

173:デフォルトの名無しさん
09/03/01 00:10:14
>>171
いやん

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

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


176: ◆TWARamEjuA
09/03/01 00:30:41 BE:2723055-BRZ(10000)
え?

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

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

179:デフォルトの名無しさん
09/03/01 00:52:04
#!/usr/bin/perl -n
print ;
close ARGV;

180:デフォルトの名無しさん
09/03/01 01:17:03
% perl -ne 'print;close ARGV'

181:デフォルトの名無しさん
09/03/01 01:23:46
perl -pe 'close ARGV' *

182:デフォルトの名無しさん
09/03/01 01:32:22
perl -pe'close ARGV' *

183:デフォルトの名無しさん
09/03/01 01:57:48
head -n 1 -q *

184:デフォルトの名無しさん
09/03/01 08:33:59
#!/usr/local/bin/radin;
print $musabetsutero;


185:デフォルトの名無しさん
09/03/01 10:38:53
>>184
いつのネタだよ。ったく。

186:デフォルトの名無しさん
09/03/01 10:42:21
>>181
先にcloseしちゃうからダメじゃん。

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

188:デフォルトの名無しさん
09/03/01 11:13:47
>>187
あ、そか。さんくす。

189:デフォルトの名無しさん
09/03/01 12:05:50
日本語でおk

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

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

192:デフォルトの名無しさん
09/03/01 12:28:07
使用環境はWindows+ActivePer5.10.0lです

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

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

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

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

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

196:デフォルトの名無しさん
09/03/01 13:45:53
ダメ文字の対処法としてメジャーなのが

$a = '十\';

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

$a = <<'EOF';

EOF
chop($a);

とするようにしてる。

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

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

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

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

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



202:デフォルトの名無しさん
09/03/01 19:49:52
ってSJISって書いてあった。すまん

203:190
09/03/01 19:53:45
ソースファイルのエンコーディングはSJISです
open ">テスト.txt";はできます

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

204:190
09/03/01 20:00:43
Dumpしてみたら原因がわかりました
改行コードを含んでいたようです
スレ汚し失礼しました

205:デフォルトの名無しさん
09/03/01 22:41:48 BE:1417729695-2BP(192)
Perrrrrrrrrrrrrrrrrrrrrrrrrrrrnrrrrrrl

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

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

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

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

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

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

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

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


208:2/2
09/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:デフォルトの名無しさん
09/03/03 19:46:08
>>207
それそれ、それ完璧
Scalar:Util の refaddr がよく分からんけど、Dumper に見てもらった限りだとオブジェクトごとに固有の数字を割り振ってくれる感じなのかな?

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

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

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



210:デフォルトの名無しさん
09/03/04 19:05:23
>>208
どこらへんが大ポカなの?

211:デフォルトの名無しさん
09/03/05 09:30:59
ゥーperlーパー

212:デフォルトの名無しさん
09/03/05 11:27:45
Perlかわいいよ

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

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

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

215:デフォルトの名無しさん
09/03/07 12:31:20
>>213

つ Sub::Curry

216:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/03/08 12:29:04
perlとawkの使い分けってどうするんでしょうか?

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

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

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

218:デフォルトの名無しさん
09/03/08 12:35:53
自分が楽だと思う方でいいと思うよ

219:デフォルトの名無しさん
09/03/08 12:43:15
>>218
やっぱり楽なほうを選ぶのが賢明ですか。

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

227:デフォルトの名無しさん
09/03/08 14:37:32
perlとsedの使い分けってどうするんでしょうか?

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

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

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

228:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/03/08 15:26:42
>>226
Perl不要論ですか。これは新しい。

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

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


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5373日前に更新/164 KB
担当:undef