Perlについての質問箱 41箱目at TECH
Perlについての質問箱 41箱目 - 暇つぶし2ch112:デフォルトの名無しさん
09/08/19 10:18:56
LWP::UserAgentを使ってHTTPリクエストを送信すると
TE: deflate,gzip;
が勝手に付加されてしまい、レスポンスがgzip圧縮で返ってきてしまいます
gzipの変換で不要なトラブルに遭いたくないのでTE: deflate,gzip;を付加しないようにしたいのですが、どうすればよいでしょうか

113:デフォルトの名無しさん
09/08/19 10:53:41
>>111
結局規格なんか決めても世の中が従わなかったら失敗なんだよな。
混乱がよけいひどくなっただけ、という見方もできる。そしてこれだけの
AAが生み出された今となってはAAを保存できないISO-2022-JPは
イマイチだな。過去の遺物でいんじゃね?

114:デフォルトの名無しさん
09/08/19 10:56:30
>>111
そいつがAA級戦犯か!

115:デフォルトの名無しさん
09/08/19 11:21:30
>>112
use LWP::UserAgent;
push(@LWP::Protocol::http::EXTRA_SOCK_OPTS, SendTE => 0); #最初に実行しとく

ネットで見つけて使ってるけど、これでほんとにいいのか俺もよくわかってないw

116:デフォルトの名無しさん
09/08/19 11:30:50
>>105
サンクスです。プロトタイプなんてPerlにあるんですね。



117:デフォルトの名無しさん
09/08/19 14:15:16
>>113
世の中は一部を除いて従いませんでしたよ。GmailでAA送ってみ。
つーかISO-2022-JPで半角カナ使う人間がどれだけ馬鹿にされてきたか知らないんだな。

顔文字程度ならともかくいわゆるAAは特定のフォントセット・ポイント数で見られることを前提としてるから、
いまやPC同士メールくらいにしか用途がなく、等幅フォントや任意のポイントで見られる場面が
比較的多いISO-2022-JPとは無関係の世界だろ。

>>114
だれうま。

118:112
09/08/19 16:00:59
>>115
無事TE:を消すことができました!
ありがとうございました

119:デフォルトの名無しさん
09/08/19 16:40:05
perl+htmlで掲示板を作っています。他は正常動作するのですが、auの機種のみ

■html側(shift_jis)
<form action="bbs.cgi" method="post">
<textarea name="comment" rows=4 cols=30></textarea>
<input type=submit value=発言>
</form>

↓「あいうえお」と入力

■bbs.cgi(EUC_JP)
use CGI;
$query = CGI->new;
@params = $query->param();
foreach $param (@params) {
$in{$param} = $query->param($param);
}


$in{comment}の中身は「??????????」

のような動作になってしまいます。
URLエンコード/デコードのせいかと思ったのですが、受け取り時点でこんな化け方をされるとどうすれば良いのやら……
何か解決法は無いでしょうか。

120:デフォルトの名無しさん
09/08/19 17:17:35
携帯のメールって半角カナを送信できないのかな?
携帯を持ってないから確認できないや。

121:デフォルトの名無しさん
09/08/19 17:45:07
>>119
>>1

122:デフォルトの名無しさん
09/08/19 17:54:51
>>120
携帯はキャリア内ならそのまま出せるんじゃないかな?
RFCに準拠しないメールアドレスとかもOKなぐらいだし。

PCのメーラーは、全角カナに変換してから送信とかが
多いような気がするけど。

>>111
ついでにAAも頼む。

123:デフォルトの名無しさん
09/08/19 18:11:59
>>121
おうふ
申し訳ない、いってきます

124:デフォルトの名無しさん
09/08/19 19:35:06
組み込み関数と同じ名前の関数を定義してしまったとき、もとの組み込み関数を別名などで呼び出すことは可能ですか。
たとえば map() という名前の関数を組み込み関数とは別の用途で使いたくて、sub map ... と上書き定義したのですが、
その場合にもとの組み込み関数をどうやって呼び出すかがわかりません。

ちなみにPythonだと組み込み関数を上書きしても、もとのを __builtins__.map() のような感じで呼び出せるので、
同じことがPerlでもできるのではないかと思い、質問しました。

125:デフォルトの名無しさん
09/08/19 19:49:53
>>124
URLリンク(search.cpan.org)
> To unambiguously refer to the built-in form, precede the built-in name with
> the special package qualifier CORE::. For example, saying CORE::open() always
> refers to the built-in open(), even if the current package has imported
> some other subroutine called &open() from elsewhere.

126:デフォルトの名無しさん
09/08/19 21:08:33
>>124
read()
という関数を呼び出すとき、
&read()にすると自作関数
read()にすると組み込み関数が呼び出される

127:デフォルトの名無しさん
09/08/19 21:53:38
>>124
CORE::hoge でもいけるよ

128:デフォルトの名無しさん
09/08/19 23:41:28
>>124
&mapとmap()は別に認識されるのでは?

129:デフォルトの名無しさん
09/08/20 04:40:38
&での呼び出しはプロトタイプ無視と引数自動設定の二大うんk仕様があるんじゃなかったっけ?
あと、宣言位置がおかしくてもむりくり呼び出される仕様。

間違ってたらすまん。

130:デフォルトの名無しさん
09/08/20 08:37:17
>>129
再現させてみてないけど、ちょっと前C書いてた手癖で
sub xxx(){ ... } って書いちゃったけど普通に引数受け取ってたってことがあったな。
これって仕様か?

131:デフォルトの名無しさん
09/08/20 11:36:26
>>125-129
ありがとうございました。CORE::map() で呼び出せました。

132:デフォルトの名無しさん
09/08/20 11:50:35
プロトタイプを使って、クロージャを引数にとる関数を定義しています。
このとき、f { } arg ではなくて f arg { } のように、クロージャを
最後の引数にしたいのですが、どうやったらできるでしょうか。

たとえば、クロージャを最初の引数にとるような関数は定義できたのですが、

sub f (&$) {
  my ($code, $arg) = @_;
  $_ = $arg;
  &{$code}();
}
f { print "arg=$_¥n" } 123; #=> arg=123

こうではなくて、クロージャを最後の引数にするような関数が定義できません。
(定義して呼び出そうとすると syntax error になりました)。

sub g ($&) {
  my ($arg, $code) = @_;
  $_ = $arg;
  &{$code}();
}
g 123 { print "arg=$_¥n" }; #=> syntax error

よろしくお願いします。


133:デフォルトの名無しさん
09/08/20 12:14:38
>>132
perlsub(1)より。

An "&" requires an anonymous subroutine, which, if passed as the first argument,
does not require the "sub" keyword or a subsequent comma.

「if passed as the first argument」だから、subと「,」を省略できるのは最初の引数の
ときだけ。

134:デフォルトの名無しさん
09/08/20 13:30:36
>>133
了解しました。ありがとうございます。

135:デフォルトの名無しさん
09/08/20 13:55:12
Perlのglob()は '**/*.pm' のような、zshライクな書き方はサポートしてないのでしょうか。
もしそうなら、'**/*.pm' のような書き方をサポートした関数やライブラリがあればおしえてください。

136:デフォルトの名無しさん
09/08/20 14:02:44
>>135
URLリンク(search.cpan.org)

137:デフォルトの名無しさん
09/08/20 15:24:28
>>136
ありがとうございます。

138:デフォルトの名無しさん
09/08/20 21:25:52
>>130

sub hoge($$){ ($hoge, @huga) = @_; …

でパッケージ内でしか呼び出さんかったら普通に動いて
パッケージ外で呼び出すと@hugaには第三引数しか入らんというわけわからん仕様につい最近悩まされた記憶がある

139:デフォルトの名無しさん
09/08/20 23:34:50
すこしおじゃまします。
ここで聞いてよいかいまいちわかりませんが・・・

現在、Perl+XercesでXMLを処理しています。
XMLデータが変数(ex. $xml)に文字列として格納されている場合、
それをDOMParserに渡して、パースする方法を
教えていただけないでしょうか。

$parse = XML::Xerces::DOMParser->new();
$parse->parser($xml);
こう書いてしまうと、上手くパースしてくれず、
InputSorce系のクラスを使えばパースできるような記述までは
JAVAやCのソースから推測できるのですが、
Perlについての記述が少なすぎて、
どう使ってよいのか(書式やクラスの指定など)
分からず悩んでいます。

140:129
09/08/21 12:18:18
>>130
俺も試してないけど、呼び出すときに &sub としたなら、しっかりプロトタイプが無視されてる

141:デフォルトの名無しさん
09/08/21 13:33:29
ソースコードを見ながらブレイクやステップでデバッグをするのって無料だとEclipseしかないですかね?

142:デフォルトの名無しさん
09/08/21 18:24:05
$aaa->{verkanri} = [qw/zip-open folder-check start-up close-out/];
foreach (@{$aaa->{verkanri}}) {
$aaa->{$_."_ver"} = [];
$aaa->{$_."_cmt"} = [];
}

上記の処理について質問があります。

まずaaa->{verkanri}にqwで囲まれた文字列たち"zip-open"、"folder-check"、"start-up"、"close-out"が
格納されるのは分かるのですが、その後の処理にて
$_に"zip-open"、"folder-check"、"start-up"、"close-out"が順番に格納され
$aaa->{zip-open_ver} = []
$aaa->{zip-open_cmt} = []
$aaa->{folder-check_ver} = []
$aaa->{folder-check_cmt} = []...
となりますよね、でもperlって変数にハイフンを使うことが出来ないはず。
なにか特殊な規則でもあるのでしょうか?

143:デフォルトの名無しさん
09/08/21 18:28:32
連投、申し訳ないです。

$aaa->{bbb} = [];
$aaa->{"bbb"} = [];

上記2つの違いは何なのでしょうか?

144:デフォルトの名無しさん
09/08/21 18:39:15
>>143
"を省略しただけ

145:デフォルトの名無しさん
09/08/21 19:24:14
>>142
変数名にはハイフンを使えないが、ハッシュのキーにはそのような制限は無い。

146:デフォルトの名無しさん
09/08/21 19:53:25
>>144さん、>>145さん
ありがとうございました!

147:139
09/08/21 23:56:56
質問しといて、事故解決したのでとりあえず報告
$mem = XML::Xerces::MemBufInputSource->new("$xml",length($xml));
を追加して
$memをパーサに食べさせれば無事パースできました。

148:デフォルトの名無しさん
09/08/22 01:24:47
@source_s, @source_t が同要素長の配列のとき、
同一の添え字となる要素両方を用いた適当な条件をテストし、
パスしたものだけを、それぞれ、@passed_s, @passed_tに格納する、
というようなフィルタをスマートに書くにはどうしたもんですかね。

考えたのは、
my @source_s = (0..9); my @source_t = reverse(0..9);
を例として、

use List::MoreUtils qw(pairwise);
my @conditions = pairwise { $a * $b > 15 ? 1:0 } @source_a, @source_b;
my @passed_s = map { $conditions[$_] ? $source_s[$_]:() } 0..$#conditions;
my @passed_t = map { $conditions[$_] ? $source_t[$_]:() } 0..$#conditions;
とか、

my @temp = map { $source_s[$_] * $source_t[$_] > 15 ? [$source_s[$_], $source_t[$_]]:() } 0..$#source_s;
my @passed_s = map $_->[0], @temp;
my @passed_t = map $_->[1], @temp;

@passed_a = (3, 4, 5, 6); @passed_b = (6, 5, 4, 3); # この例での結果

配列のスキャン回数、perlの苦手な添え字式アクセス、表面上のコード行数、中間変数
これらをバランスさせるような書き方はないでしょうか。

149:デフォルトの名無しさん
09/08/22 01:26:38
@passed_s = (3, 4, 5, 6); @passed_t = (6, 5, 4, 3); # この例での結果
でした。

150:デフォルトの名無しさん
09/08/22 01:37:17
my @souce_st = map { [$source_s[$_], $source_t[$_]] } 0..$#source_s;
形式でデータを持っておいて、

my @passed_st = grep $_->[0] * $_->[1] > 15, @source_st;

てするのがいいんだろうな、きっと。

151:デフォルトの名無しさん
09/08/22 06:26:07
数珠つなぎにすればスマートになるというものでもなかろうに

my @src_s = (0..9);
my @src_t = reverse @src_s;

my @num = grep $src_s[$_] * $src_t[$_] > 15, 0..$#src_s;
my @pass_s1 = @src_s[@num];
my @pass_t1 = @src_t[@num];

my(@pass_s2, @pass_t2);
for (grep $src_s[$_] * $src_t[$_] > 15, 0..$#src_s) {
  push @pass_s2, $src_s[$_];
  push @pass_t2, $src_t[$_];
}

152:デフォルトの名無しさん
09/08/22 13:32:03
>>151
配列スライスでできそうに思っていたけど、思いつかなかったんだ。
ありがとう。

頭が錆びてきているのかな。。。

153:デフォルトの名無しさん
09/08/23 19:12:47
てす

154:デフォルトの名無しさん
09/08/26 11:30:57
これって、シンボリックリファレンスみたいな感じですけど、use strictで通るってことは違うんですかね?

use strict;

my $func_name = 'plus';
print Foo->$func_name(1, 2); #=> 3

package Foo;
sub plus { shift; $_[0] + $_[1] }

155:デフォルトの名無しさん
09/08/26 12:24:55
Perlにはサブルーチンの数に制限がありますか?

というのも、requireでいくつかのサブスクリプトに分散してサブルーチンを作っているんですが、
サブルーチンへの分岐がスルーされるという現象に見舞われています。
ところが、requireの記述の順序を変えるとこれがスルーされなくなる代わりに、それまで処理され
ていた別のサブルーチンが処理されなくなるという具合です。

さらに、処理が行われないサブルーチンを含むスクリプト定義をコメントアウトし、メインルーチンでは
処理が行われないサブルーチンへの分岐をそのままにした状態で実行してもエラーにならないのです。

個々のサブルーチンについては、特にエラーは出ないのですが…

156:デフォルトの名無しさん
09/08/26 12:48:03

補足です。requireはメインルーチン文頭に条件分岐なしで記述してあります。

157:デフォルトの名無しさん
09/08/26 13:05:39
>>155
>Perlにはサブルーチンの数に制限がありますか?

Perlよくしらないけど、ないんじゃないかなあ。
問題は別のことが原因だとおもう。たとえばサブスクリプトで同じ名前の関数を
定義しているために、読み込む順番によって上書きされたりしなかったりとか。

158:デフォルトの名無しさん
09/08/26 13:16:20
>>154
URLリンク(fireball.loafer.jp)

159:デフォルトの名無しさん
09/08/26 13:34:53
手さぐりしてないで、有効なサブルーチンをリストしてみれ。

160:デフォルトの名無しさん
09/08/26 13:51:20
>>158
アロー演算子の後のスカラー変数は動的なメソッド呼び出しをするという機能なんだ。
賢くなった。


161:デフォルトの名無しさん
09/08/26 15:53:12
>>157
まさにその通りでした…(恥)orz

162:デフォルトの名無しさん
09/08/26 15:54:32
申し遅れました、>>157さん・>>159さん、ありがとうございましたm(_ _)m

163:デフォルトの名無しさん
09/08/27 12:05:48
なぜハッシュリファレンスへのアクセスで、従来と似たような$href{one}としないで、
$href<one>と山括弧にしたのですか?

404 Blog Not Found:perl - $@%&*のよしあし
URLリンク(blog.livedoor.jp)

164:デフォルトの名無しさん
09/08/28 23:50:15
Test::Simpleのインストールで下記のエラーが発生するのですが、解決方法ないでしょうか?
過去のVersion0.90~0.82も試しましたが結果は同じでした。

・Windows XP Professional SP3
・CYGWIN_NT-5.1 hostname 1.5.12(0.116/4/2) 2004-11-10 08:34 i686 unknown unknown Cygwin
・This is perl, v5.8.5 built for cygwin-thread-multi-64int
・$ perl -MCPAN -e 'print $CPAN::VERSION;' 1.9402

t/Builder/try...........................NOK 6
# Failed test at t/Builder/try.t line 36.
# got:
# expected: 23
t/Builder/try...........................ok 8/0# Looks like you failed 1 test of 8.
t/Builder/try...........................dubious
Test returned status 1 (wstat 256, 0x100)
DIED. FAILED test 6
Failed 1/8 tests, 87.50% okay

全文
URLリンク(textup.no.land.to)


165:デフォルトの名無しさん
09/08/29 00:23:40
use utf8;
use Encode;
open(FH,'c:\hoge.txt');
binmode(FH,':utf8');
my $x = <FH>;
$x =~ s/ア//g;
print encode('utf8',$x);
close(FH);

hoge.txt(utf8で記述されている)から一行抜き出して、その文から「ア」を削除したいんですけど、
こんな感じのソースを書いてみたら案の定期待した通りには動きませんでした。
どうすれば期待通りの挙動になってくれるんでしょうか、誰か教えてください

166:デフォルトの名無しさん
09/08/29 00:51:28
>>4 を読め

167:デフォルトの名無しさん
09/08/29 08:57:56
>>164
1. t/以下を読んで原因を探って解決。
2. バギーでも少々動けばいいやと思うなら cpan -if Test::Simple。

168:デフォルトの名無しさん
09/08/29 13:02:19
>>166
>>4は読んでますけど関係無いですよね?
Dos窓はきちんとutf8で動かしてるし、単純にutf8なソースの中で正規表現を使う方法だけ知りたいんです。

169:デフォルトの名無しさん
09/08/29 13:45:53
読みかたが足らん。100回読め。>>4を100回読め!
自分のコードと、どこがどう違うか
1行1行しっかり吟味しろ

170:デフォルトの名無しさん
09/08/29 17:46:46
変数のことでお聞きします
---------------------
a = 0
処理
a = a++
---------------------
上記のようにa++を使うような感じで
数字+アルファベット+特殊記号のアンダーバー_
37文字を100万値まで繰り返し使いたいです
変数aの次にb
bの次はc・・・・
zの次は0
0の次は1・・・
9の次は_
_の次はa
aの次はb
a~z 0~9 _
これを繰り返す方法教えてください
37進数って言うのかな?

171:デフォルトの名無しさん
09/08/29 17:53:09
ちょっと違うけど。
my @ary = ('a'..'z', '0'..'9', '_');
my $len = scalar @ary;
for my $i (0..100) {
    print $ary[$i % $len];
}

172:デフォルトの名無しさん
09/08/29 17:57:40
>>171
配列に37文字組み込んでってことですね
大変参考になりました
即レス頂きありがとうございました!

173:デフォルトの名無しさん
09/08/29 20:27:12
どうでもいいけど、プロは a = a++ なんてコードは書かない

174:デフォルトの名無しさん
09/08/30 01:08:32
>>170
まだ初心者だけど、>>171を参考に作ってみた。

package Base37;
use strict;
use warnings;

use Carp;
use overload (
'++' => \&inc,
'--' => \&dec,
'+' => \&plus,
'-' => \&minus,
'=' => \©,
'""' => \&str,
);

my @base = ('0'..'9', 'a'..'z', '_');

sub new {
my $class = shift;
my $symbol = shift || $base[0];

my $pos = index( (join q{}, @base), $symbol );
croak "`$symbol' can't be used. `@base' are available." if $pos < 0;

bless {pos => $pos}, $class;
}

175:デフォルトの名無しさん
09/08/30 01:09:31
続き

sub inc {
my $self = shift;

$self->{pos}++;
$self->{pos} %= @base;
Base37->new( $base[$self->{pos}] );
}

sub dec {
my $self = shift;

$self->{pos}--;
$self->{pos} %= @base;
Base37->new( $base[$self->{pos}] );
}

sub plus {
my ($self, $other) = @_;

if (ref $other ne 'Base47' ) {
$other = Base37->new($other);
}

my $pos = ( $self->{pos} + $other->{pos} ) % @base;
Base37->new( $base[$pos] );
}

176:デフォルトの名無しさん
09/08/30 01:10:45
続き

sub minus {
my ($self, $other, $is_reversed) = @_;
my $pos;

if (ref $other ne 'Base47' ) {
$other = Base37->new($other);
}

if ( $is_reversed ) {
$pos = $other->{pos} - $self->{pos};
}
else {
$pos = $self->{pos} - $other->{pos};
}

$pos %= @base;
Base37->new( $base[$pos] );
}

sub copy { Base37->new( $base[shift->{pos}] ) }
sub str { $base[shift->{pos}] }


package main;

my $a = Base37->new('z');
$a++;
print "$a\n"; #=> _
$a++;
print "$a\n"; #=> 0

177:名無しさん@そうだ選挙に行こう
09/08/30 04:22:41
どうでもいいけど、プロは$aと$bにmyは付けないw

178:名無しさん@そうだ選挙に行こう
09/08/30 05:30:03
お前の発言の方がどーでもいいわw
ざっと探してみたけどperlじゃ36進数のサンプルないぞ
さすがにCとVBはあったけど
で、37進数やろ
お前が37進数やってみればいいやろプロさんwww

179:名無しさん@そうだ選挙に行こう
09/08/30 06:42:37
$aが特殊変数である事実が、どうでも良い取り扱いな訳ないだろ。


180:名無しさん@そうだ選挙に行こう
09/08/30 12:09:26
$a <=> $b と書いて、しまったソートが逆だった、という時に、
最小の労力で逆転させるにはどうすれば

181:名無しさん@そうだ選挙に行こう
09/08/30 12:37:25
下記サイトにある、

\*import = cgi_fixup();

って何をしているのです?
そもそも、\*import ってのが何を表しているのかがさっぱりわからん。

URLリンク(blog.livedoor.jp)

182: ◆TWARamEjuA
09/08/30 13:59:59 BE:3812257-BRZ(10101)
>>180
reverse

183:名無しさん@そうだ選挙に行こう
09/08/30 14:15:03
reverseってコンパイラ的には読む方向を変えてるだけなんだろうか

184:名無しさん@そうだ選挙に行こう
09/08/30 17:44:31
別スレにある下のプログラムが動かないんだけどこれだけだとだめなの?ちなみに環境はアクティブパールの最新版

use bigint;

$SEED=0;

for $sec (0..0xffff){
  $SEED=$sec;
  $mapSEED=&dq9_rand;&dq9_rand;$rand=&dq9_rand;

  $loc1=&loc($rand,47);
  $loc2=&loc($rand,131);
  $loc3=&loc($rand,150);

  printf "$sec秒:SEED=%04X 場所(%X,%X,%X)\n",$mapSEED,$loc1,$loc2,$loc3;
}


sub dq9_rand{
  $SEED = ($SEED * 1103515245 + 12345) & 0xffffffff;
  $ret =($SEED >> 0x10 & 32767);
  return $ret;
}

sub loc{
  $r=shift;
  $upper=shift;
  $diff_1=$upper; # 差分+1 = $upper-下限1+1
  return ( 1 + ($r % $diff_1 ) );
}

185:名無しさん@そうだ選挙に行こう
09/08/30 17:53:17
>>184
なんかこんなの出てきたぞ。意味わからんけど動いてるんじゃね

0秒:SEED=0000 場所(19,21,59)
1秒:SEED=41C6 場所(9,1B,40)

中略

65535秒:SEED=0CA6 場所(18,79,36)

186:名無しさん@そうだ選挙に行こう
09/08/30 19:22:46
Unrecognized character \x81ってエラーが出ていたら笑ってやる

187:デフォルトの名無しさん
09/08/30 23:11:59
>>186
ごめん、その通りなんだ
初めていじるので全く意味がわからない・・・


188:デフォルトの名無しさん
09/08/30 23:30:43
出たことあるなあ
漢字についての取り扱いでよそからコピペした時だったので、
しばらく悩んだ

189:187
09/08/31 00:00:57
自己解決しました

190:デフォルトの名無しさん
09/08/31 22:24:36
perl初めたばかりだけど
基礎らしい二分検索のプログラム書こうとチャレンジしてるんだが方法が思いつかない。

ソート済の対象ファイルを配列に取り込んで、配列個数調べて
個数nの半分の値の所で比較して比較して……って感じで流れは分かるんだけど

一応検索で該当箇所見つけ出してそこに1行突っ込む、って部分は出来たんだけど……


191:デフォルトの名無しさん
09/08/31 22:26:48
二分検索のアルゴリズムが理解できてないのか?
perlの文法がわからなくてプログラムコード化できないのか?

192:デフォルトの名無しさん
09/08/31 22:35:57
(3,4,5)みたいな行列が与えられたときに

0,0,0
0,0,1
0,0,2
0,1,0
0,1,1
0,1,2
0,2,0
.
.
.

みたいな3×4×5=60個の組み合わせを全部表示するようなプログラムを作りたい。
forループ3回まわせばそりゃ楽なんだが、再帰でやってみようとしてもどうも
うまくいかない・・・。どんな風に書けばいいかな?

193:デフォルトの名無しさん
09/08/31 22:44:24
>>191 二分探索は
 ソートされているデータを、まず要素の真ん中で検索し、比較対象が上か下か調べる
 それを更に上と下で区切ったほうのさらに真ん中で同様の処理 
 繰り返し最後の値が見つけ出すまでやる・・・・で良かったかな

 配列取り込んで、配列の数出して、
 それを1/2してまではなんとかなるけど、
 そこから先、どのように書いたらいいかが見当付かないんです・・・・

194:デフォルトの名無しさん
09/08/31 23:47:12
>>192
これでどうだ

sub foo {
my ($n, @rest) = @_;
return map {
my $i = $_;
@rest ? map { "$i, $_" } foo(@rest) : "$i\n"
} (0 .. $n-1);
}

print foo(3, 4, 5);

195:デフォルトの名無しさん
09/09/01 01:10:58
>>193
そこまで分かってるなら、あとはコーディングするだけじゃん。
perlの文法がわからないの?
だったら入門書や解説サイトを読めばいいやん。

196:デフォルトの名無しさん
09/09/01 01:47:37
>>195
if関数で ひたすら大か小かで判定するかしか思い浮かばなくて……

 whichでその大か小かの判定だけさせた無限ループにして
 一致した時点でlastで抜ける みたいな感じでいいのでしょうか……

197:デフォルトの名無しさん
09/09/01 01:52:53
思い浮かんだなら形にしてみ

198:デフォルトの名無しさん
09/09/01 01:59:35
>>196
バイナリ検索は、配列を切ったりはったりせずに、インデクスの上下でせめていくといいよ
とりあえず再帰を使った例を出しとく。でも普通は効率化のため再帰じゃなくループにする

sub search
{
my ($arr, $data, $min, $max) = @_;
return (0, $min) if ($min >= $max); # サーチ失敗フラグ+挿入すべきインデクス
my $i = int(($min + $max) / 2);
return search($arr, $data, $min, $i) if ($arr->[$i] > $data);
return search($arr, $data, $i+1, $max) if ($arr->[$i] < $data);
return (1, $i); # サーチ成功フラグ+見つかったインデクス
}

my @array = grep { $_ % 3 } (1 .. 10000); # テスト用:3の倍数を除く10000以下の自然数

foreach my $data (0, 100, 3000, 7777, 10001) # この5つの数を検索してみる
{
my ($found, $index) = search(\@array, $data, 0, scalar(@array));
if ($found) { print "$data を発見しました(位置=$index)\n"; }
if (!$found) { print "$data はありません(挿入すべき位置=$index)\n"; }
}

199:デフォルトの名無しさん
09/09/01 23:24:28
下記サイトに記載されている関数は何をする関数でしょうか?

Perl Internalsについて - Unknown::Programming
URLリンク(d.hatena.ne.jp)

Internals::HvREHASH
Internals::SvREADONLY・・・これはわかった
Internals::SvREFCNT・・・これもわかった
Internals::hash_seed
Internals::hv_clear_placeholders
Internals::rehash_seed


200:デフォルトの名無しさん
09/09/02 09:52:55
>>199
hash_seedはハッシュDBの構造が理解できれば何のことかすぐわかるはず。

201:デフォルトの名無しさん
09/09/02 22:07:37
ハッシュの配列について質問があります

例えば、
my %hogehoge;

foreach(0..10){
push(@{$hogehoge{pos}},[$_,$_+1]);
}

されたものがある場合、どうやって$hogehoge{pos}を表示すればいいのでしょうか?

202:デフォルトの名無しさん
09/09/02 22:37:25
こうするか
foreach (@{$hogehoge{pos}}){
print $_;
}
あるいは
$hogehoge{pos}->[0]; # 連番で


203:デフォルトの名無しさん
09/09/02 23:29:50
>>202
それだと、こうなってしまうのですが・・・
ARRAY(0x1004f668)ARRAY(0x1004f830)ARRAY(0x1004f890)ARRAY(0x1004f8f0)ARRAY(0x1004
f950)ARRAY(0x1004f9b0)ARRAY(0x1004fa10)ARRAY(0x1004fa70)ARRAY(0x1004fad0)ARRAY(0
x1004fb30)ARRAY(0x1004fb90)

204:デフォルトの名無しさん
09/09/03 01:45:42
>>203
そりゃ、そのまま吐いたらそうなるなぁw
こうかな。
for my $pos_ref (@{$hogehoge{pos}}) {
warn $pos_ref->[0];
warn $pos_ref->[1];
}

そもそもその前にpushしてるのが直感的な感じしないからこうしちゃうなぁ
my @array = map { [$_, $_+1] } (0..10);
$hogehoge{pos} = \@array;
で、>>202が言ってるみたいに->[0]でやるかなぁ

205:デフォルトの名無しさん
09/09/04 09:53:49
>>202
print "@$_" for @{$hogehoge{pos}};

206:デフォルトの名無しさん
09/09/04 10:00:28
my %hogehoge = map [ $_, $_+1 ], 0..10;
}


207:デフォルトの名無しさん
09/09/04 10:14:27
>>201
デバッグで値を見たいとかではなくて?

my %hogehoge;

foreach(0..10){
push(@{$hogehoge{pos}},[$_,$_+1]);
}

use Data::Dumper;
use Dumpvalue;

print Dumper($hogehoge{pos});
Dumpvalue->new->dumpValue($hogehoge{pos});

208:デフォルトの名無しさん
09/09/04 16:00:18
Param::Validateモジュールの使い方を日本語で解り易く解説しているWebサイトを教えてください。
CPANに上がってる英文マニュアル見たがさっぱり、自動翻訳してもっとわけわかめになった。

209:デフォルトの名無しさん
09/09/04 21:06:08
           YES → 【ヒットした?】 ─ YES → なら聞くなよ。氏ね。
         /                \  
【検索した?】                     NO → なら、ねぇよ。氏ね。
         \                   
            NO → 氏ね。

210:デフォルトの名無しさん
09/09/05 20:42:45
Perl素人のオレに教えてくれ。いや、ください

初心者サイトとかを回りながら、ファイルを読み込んで表示するだけのcgiを作ろうとしたんだけど
ファイルを二個読み込もうとするとインターナルサーバエラーとか言われる
IO::FILE使わなければ問題なく動くんだけどなぜなの? IO::FILEは二回呼び出せないの?


211:デフォルトの名無しさん
09/09/05 20:43:27
以下作ってみたコード

#! /usr/bin/perl
use CGI;
use IO::File;

$logfile = 'data.log'; # ログファイルの名前
$logfile_02 = 'data_02.log'; # ログファイルの名前
$all_data = read_all_data(\$logfile);
$all_data_02 = read_all_data(\$logfile_02);

$q = new CGI;
print $q -> header(-Charset=>'sjis');
print $q -> start_html(-title => "test");

print @$all_data;
print @$all_data_02;

exit;

sub read_all_data{
my $logfile = shift;
my $io = IO::File->new($$logfile, 'r');
my @lines = $io->getlines;
$io->close;
return \@lines;
}

212:デフォルトの名無しさん
09/09/06 01:09:29
> my $io = IO::File->new($$logfile, 'r');
$$って

213:デフォルトの名無しさん
09/09/06 02:37:24
>>212
できた! ありがとん

でもなぜ$$logfileじゃだめなんだぜ?
my $logfile = shift; にファイル名へのリファレンス格納→$$logfileでデリファレンスっていう流れだと思ったのに……
何か根本的に間違ってんのかな

214:デフォルトの名無しさん
09/09/06 06:36:13
Perlでは文字列と数値は同じような扱いをしますが、Dumpすると内部的には
区別されてますよね?

数値なのか文字列なのかをプログラム内で判断する方法ってあるんですかね?
困っているわけではなく、単なる興味本位なのですが。

use Devel::Peek;

$num = 0;
$str = '0';

Dump $num;
Dump $str;
____________________________________________________

SV = IV(0x1828220) at 0x287dac
REFCNT = 1
FLAGS = (IOK,pIOK)
IV = 0

SV = PV(0x289e34) at 0x183271c
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x285144 "0"\0
CUR = 1
LEN = 4

215:デフォルトの名無しさん
09/09/06 07:10:02
>>214
気にしたこと無かったけどぐぐったら見つけた

URLリンク(oshiete1.goo.ne.jp)
こんなやり方あるんだねー

216:デフォルトの名無しさん
09/09/06 07:50:08
>>214
Devel::Peekができてるんだから出来るんだろうよ。
ソース読んでみ。
ちなみにこの挙動については友人と議論したことがあるが、
数値か文字列か区別できたところで使いどころがない。
そもそも仕様外だから危なっかしくて使えねー。

ちなみに数値にしたけりゃ +0すりゃいいし、文字列にしたけりゃ .''すりゃいい。

217:デフォルトの名無しさん
09/09/06 08:09:31
>>213
> でもなぜ$$logfileじゃだめなんだぜ?

デリファレンス

218:デフォルトの名無しさん
09/09/06 08:16:46
>>215
ちょっと違うような。。。

>>216
Devel::PeekはXSで書かれているんで自分にはよくわからんです。

219:デフォルトの名無しさん
09/09/06 08:18:20
>>214
おすすめはblessしたクラス内で扱うこと。
トリッキーな使い方は可読性、可搬性を下げるのみ。
自己満足はできるかもしれないが。

220:デフォルトの名無しさん
09/09/06 10:48:10
文字と数値を区別しないで済む。あれこれ悩む必要が無くなる。
それがperlの特徴なのに。(スクリプト系言語はたいていそうなてる)
これじゃまるで、パンツの見えないミニスカートを買ったのに
パンツの見せ方を教えてください、って言ってるようなもん。

221:デフォルトの名無しさん
09/09/06 12:51:42
文字列中にある単語をマッチさせて複数取り出すにはどうすれば綺麗に書けますか?

今やりたいことは、あるウェブページ中にある画像のURLだけを取ってきたいと思っています。
 $contents = get($url); # LWP::Simple
 $contents =~ /(http:\/\/[^"]+[.]jpg)/; # jpgだけゲット
 $image = $1;
↑こうやりますと最初にマッチしたものは取り出せるのですが、
 2番目以降もまとめて上手く配列などに取り出せないでしょうか。

222:デフォルトの名無しさん
09/09/06 12:59:34
gつけて@に入れる

223:デフォルトの名無しさん
09/09/06 13:20:57
>>222
ありがとうございます。
置換のときは使っていたのですが、こんな風にも使えるのですね

224:デフォルトの名無しさん
09/09/06 15:00:28
while ( $contents =~ m/(http:\/\/[^"]+[.]jpg)/g ) {
print "$1はうんこ\n";
}

225:デフォルトの名無しさん
09/09/06 16:45:39
>>218
簡単な方法は、$foo ^ $foo の結果を見ること。
0だったら$fooは数値、空文字列だったら$fooは文字列。
数値をお互いにXORするとゼロになるし、
文字列をお互いにXORするとナルストリングになる。

>>221
本当に画像だけ取って来たいなら素直にWWW::Scraper使え。
それだと本文中のURLも拾うぞ。それでもいいなら構わんが。

226:デフォルトの名無しさん
09/09/06 17:13:52
>素直に○○使え

最近、こういう言い回しが増えたよね。
べつにひねくれて星を睨んで「○○」を使わないワケじゃないと思うよ。
ただ「○○」という便利なものが存在するとは知らなかっただけだと思うよ。
なんかさ、「素直に○○使え」って言い回しするヤツって
女子校生が「ちょ~~~やばいしぃ~~」とか言ってるのと同じ臭いがする。
オツムが弱そう。バカっぽいな。

227:デフォルトの名無しさん
09/09/06 18:30:40
>>226
素直に○○する、ってのは、(深く考えず)○○した方が物事がすんなりと運ぶ、という意味なんだが。
辞書があるなら引くといい。

228:デフォルトの名無しさん
09/09/06 18:35:23
(深く考えずに)すんなりと○○した方がよい、か。

229:デフォルトの名無しさん
09/09/06 18:47:04
>>226
素直にやばいしぃ~~

230:デフォルトの名無しさん
09/09/06 19:11:04
>>225
ほー、WWW::Scraperで画像をスクレーピングできるとは知らなかった。
Web::Scraperは知ってたけど。

231:デフォルトの名無しさん
09/09/06 19:20:01
>>227
韓国の辞書も北朝鮮の辞書も持ってません

232:デフォルトの名無しさん
09/09/06 21:30:07
>>320
画像->画像表示を示すURI、WWW::Scraper -> Web::Scraperの間違いだな。
訂正サンクス。

>>231
「単品で迷うなら素直にランチにしなよ」とか普通に使う用途なんだが、
こんな簡単な日本語取り違えるとはゆとりのなせる業か。
>オツムが弱そう。バカっぽいな。

233:デフォルトの名無しさん
09/09/06 21:40:07
>>225
空文字列じゃなく "\x00" x 文字列長 になるんじゃないかな

print length 'foo' ^ 'foo', '/', unpack 'H6', 'foo' ^ 'foo'; # 3/000000

>>214
内部的にどう扱われているかでなく、数値コンテキストに置いた時に
解釈可能な文字列かどうかを判定したいなら Scalar::Util::looks_like_number()

URLリンク(cpansearch.perl.org)

234:デフォルトの名無しさん
09/09/06 21:47:31
>>233
そのようだな。補足サンクス。Cと混同していたようだ。

235:デフォルトの名無しさん
09/09/06 21:53:24
>>232
で?
その”普通に使う用途”が載ってるのは、韓国の辞書?北朝鮮の辞書?

236:デフォルトの名無しさん
09/09/06 22:01:59
>>235
引くに引けないのはわかるけど、負け戦で頑張っても意味無いよ。
黙って日本語を勉強しなおすといい。

237:デフォルトの名無しさん
09/09/06 22:03:40
>>235
日本の辞書の例:
URLリンク(dic.yahoo.co.jp)
>>226は第2義しか頭にないらしい。
日本人なら文脈からして4義が5義と考えるのが普通。

238:デフォルトの名無しさん
09/09/06 22:04:56
つーか大陸のレッテル貼れば何とかなるとか思ってある辺りがもうね。

239:デフォルトの名無しさん
09/09/06 22:07:36
変なタイミングで中韓出してくる子は、大抵日本のお荷物。

240:デフォルトの名無しさん
09/09/06 22:49:12
>>237
やっぱりチョンの会社の辞書を出したか。今は日本に帰化してるが。

241:デフォルトの名無しさん
09/09/06 22:55:57
>>211をコピペして実行してみたけど、正常に実行できる。
問題点は他にあったんじゃ?

242:デフォルトの名無しさん
09/09/06 23:32:31
>>241
レスありがと
211だけど、仰るとおりperlのプロセスがループしてた
正常な状態だったら問題なく動いたわ
かなり時間を費やしてしまった……

基本的に引数は参照渡しでいいんだよね?


243:デフォルトの名無しさん
09/09/06 23:34:02
>基本的に引数は参照渡しでいいんだよね?
どこでそんなの習ったんだ?

244:デフォルトの名無しさん
09/09/06 23:36:47
>どこでそんなの習ったんだ?

どこかのサイトに書いてあった記憶がある
片っ端から初心者向けサイト回ってたからどことは言えないけど
オレが勘違いしてるのかな

245:デフォルトの名無しさん
09/09/06 23:59:09
たぶん、値のコピーを作らないように参照渡しにする、って書いてあったんだろうけど
Perlの関数呼び出しは値渡しじゃなくて変数渡しだから、わざわざリファレンスにする必要はないよ。
@_には引数がコピーされて入っているのではなく、引数そのものの別名になっている。

246:デフォルトの名無しさん
09/09/07 00:02:33
配列やハッシュを渡すときは必要だけど。

247:デフォルトの名無しさん
09/09/07 00:17:22
レスありがとん

変数を渡すときはそのままでも値がコピーされなくて
配列とかハッシュはコピーされちゃうからメモリが勿体無いと

勉強になったわ

248:デフォルトの名無しさん
09/09/07 03:17:01
>>247
サブルーチンの引数として配列やハッシュを複数渡すと、単一のフラットなリストとして @_ に展開されますが、エイリアスとしての動作は変わらないため値のコピーは発生しません。
>246 が言う必要性とは、「単一のフラットなリスト」にされては困る場合、すなわち引数を渡された関数内で個々の配列を峻別して処理しなければいけない場合に、参照渡しが必須になるという意味です。
ちなみにハッシュのキーに限り、キーそれ自体は変数ではないため、エイリアスの内容を変更しても元のハッシュのキーは変化しません。


249:デフォルトの名無しさん
09/09/07 04:52:06
>>233
>空文字列じゃなく "¥x00" x 文字列長 になるんじゃないかな

じゃあ、結局データが文字列か数値かを知りたいときはどうするのがいいんでしょうか。
今まさに1と"1"を別に扱いたい場面に直面しています。

250:デフォルトの名無しさん
09/09/07 05:25:56
>>249
データ構造を作り直して回避する。

251:233
09/09/07 05:56:07
>>249
いや俺に訊かれても。その二つを区別しなきゃいけない状況に陥った事なんて無いし。

sub is_num { ($_[0] ^ $_[0]) !~ /^\x00/ }
print is_num($_) ? 'num' : 'str', "\n" for 0, '0', '+1e3', +1e3;

…とでもしときゃいいんじゃない。すっごくアホ臭いけど。

252:デフォルトの名無しさん
09/09/07 06:35:52
はじめてCPANパッケージを作ろうとしている最中です。
質問があります。

(1) READMEの推奨される書き方やフォーマットはありますか。
(2) Changesの推奨される書き方やフォーマットはありますか。
(3) テストファイルが t/*.t のようですけど、test/*.pl にするのはよくないですか。
(4) パッケージのファイル名と、ライブラリ名が異なっていてもいいでしょうか。
 たとえば Foo というライブラリを提供するパッケージとして、
  Foo-entry-1.0.0.tar.gz  # 機能限定版
  Foo-full-1.0.0.tar.gz   # 機能強化版
 のように用途別・目的別に別々のパッケージを用意しようとしているんですが
 こういうのはまずいでしょうか。何か問題があれば教えてください。

253:デフォルトの名無しさん
09/09/07 07:32:29
>>249
だから$foo ^ $fooの結果。0と0x00 x nは違うから。

正直、正規のプログラミングで1と"1"を区別したってろくなことないよ。
コアな部分をいじるようなスクリプトでない限り(Dumperみたいにね)、
Perlでそんな場面に遭遇するってことはあなたの設計がおかしい。

>>251
$foo ^ $foo eq '0' ? '数値' : '文字列'でおk。

>>252
とりあえずお前はこれは読んどけ。10回くらい読め。
URLリンク(perldoc.perl.org)

質問の内容からしてPAUSE使うのは100年早い気がする。
いちAuthorより。

254:デフォルトの名無しさん
09/09/07 07:38:21
つーかここまで言って数値と文字列の見分け方が分からないってことは
ズブの素人だろうから、「基本的にPerlにそんなことはできない」と言い切った方が良かったかな。

1と'1'を区別したい理由かコードか何か晒してみ?多分瑕疵があるから。

255:デフォルトの名無しさん
09/09/07 07:41:49
>>240
小学館ってチョンの会社だったの?

256:デフォルトの名無しさん
09/09/07 07:47:09
俺も長年Perl使ってるが、'1'と1を明確に区別する必要性に駆られた記憶がないな。
参考に、どういうケースなのか教えて欲しい。

257:デフォルトの名無しさん
09/09/07 07:51:52
>>256
>>249ではないが、友人が自作フレームワーク作ってて、引数の型によって
挙動を変えたいっつー場面で数値と文字列の比較の話を出してきた。
当然止めとけと言っておいた。

ドキュメント化されてない部分だからいつ仕様が変わってもおかしくないしな。

258:デフォルトの名無しさん
09/09/07 08:55:52
データ型を検証するようなプログラムなら、1と'1'が区別できないと困る。
たとえばPerlでJSONのバリデータを作ろうとしたけど、1と'1'が区別できなくてまじ困る。
たとえば「name は文字列である」というスキーマを定義したとして、
{ "name": "1" } # これはvalid
{ "name": 1 } # これはだめ
としないといけない。
でもPerlでは1と'1'の区別をどうすればいいのかわからないから、正しい検証ができない。

#自分が使わないからといって、他の人も同じだとは思わないでください。お願いします。


259:デフォルトの名無しさん
09/09/07 09:43:18
>>258
設計が悪い。



260:デフォルトの名無しさん
09/09/07 09:51:43
>>258
URLリンク(search.cpan.org)
読んでみ。数値も文字列で格納することがあることが分かる。

どうしても必要ならJSONを自分でパースしてチェックすればいい。
JSONのレイヤーの問題なんだからPerlのレイヤーに落としてチェック
しようとする発想が間違っている。

261:デフォルトの名無しさん
09/09/07 10:10:20
テストコード書いてみたよ
use JSON::Syck;
use Perl6::Say;

$foo = JSON::Syck::LoadFile('test.json');
say $foo->{foo} ^ $foo->{foo} eq '0' ? '数値' : '文字列';

--test.json--
{ foo : 1 }
--結果--
数値

--test.json--
{ foo : 0.5 }
--結果--
文字列

やっぱり発想自体が間違ってたね。
ちなみに0.5はともかくPerl/PHPやCも含む大抵の処理系では0.1は文字列にする方が正確。
↓こんなことになるからね。それがなぜか分かれば君も一歩大人。

for($i = 0; $i < 1; $i += 0.1){say "$i"}

262:デフォルトの名無しさん
09/09/07 11:32:39
このスレが賑わう時はいきなりレベルが上がるから勉強になるわ

263:デフォルトの名無しさん
09/09/07 11:43:21
> #自分が使わないからといって、他の人も同じだとは思わないでください。お願いします。

これには同意するが、スクリプト言語で文字の1と数値の1を見分けたい、ってのは
やっぱ何かが間違ってる

264:デフォルトの名無しさん
09/09/07 12:09:03
>>263
> これには同意するが、スクリプト言語で文字の1と数値の1を見分けたい、ってのは
> やっぱ何かが間違ってる


間違ってるのはそこじゃなくてアプローチ。
東京から熱海にいくのに「飛行機でいきたいので簡単な方法を教えてください」というようなもんだ。

そりゃ羽田-静岡富士山経由してもいけるが
新幹線を使おうよ。小田急+JRでもいい。


って話。

265:デフォルトの名無しさん
09/09/07 12:47:25
↓ここでD51プレート持った鉄男登場

266:デフォルトの名無しさん
09/09/07 12:53:15
>>263
>スクリプト言語で文字の1と数値の1を見分けたい、ってのは
>やっぱ何かが間違ってる

えーなんで?
*Perlでは*間違っているということなら同意するけど、スクリプト言語一般に広げないでほしい。
つーか、integerとstringの見分けがつかない言語が存在するなんて初めてしったわ。
PHPですらis_string()とかあるのに。

267:デフォルトの名無しさん
09/09/07 14:17:09
Rubyだと逆に厳格だよね

268:デフォルトの名無しさん
09/09/07 15:08:15
>>266
> つーか、integerとstringの見分けがつかない言語が存在するなんて初めてしったわ。

見分けがつかないんじゃなくて、区別されてないんだろ。


269:デフォルトの名無しさん
09/09/07 15:16:31
つ シェルスクリプト
Perlの出自を考えれば文字列と数値を区別しないのも当然といえば当然。

270:デフォルトの名無しさん
09/09/07 15:27:31
JSONも良いですが、symbolとstringをも区別するS式が最強ですね

271:デフォルトの名無しさん
09/09/07 16:04:06
Perl/Tk を使って縦書き形式のテキストビューワーを作ろうとしているのですが、
括弧や句読点、長音記号等を 90度横倒しにして表示する良い方法が無いでしょうか?


272:デフォルトの名無しさん
09/09/07 16:09:10
句読点は横倒しでおkじゃないぞ。


273:デフォルトの名無しさん
09/09/07 16:20:56
>>271
単に縦書き用フォントを使えばいい。

何でも横倒しにすりゃいいってもんじゃないぞ。句読点もそうだが、
波ダッシュ字形問題が、縦書き用フォントを横にするだけでおkと思った
馬鹿外人のせいで起こってしまったことを忘れるな。

274:271
09/09/07 16:28:52
>>272>>273
ご指摘、ご教示ありがとうございます
読み込んだ横書きテキストデータ中の文字を
横書きで問題が出る字形だけ
縦書き字形に変換するという方法で
なんとかやってみようと思います


275:デフォルトの名無しさん
09/09/07 16:41:07
>>274
だから全部縦書き字形にしろって。お前なら絶対見落とすから。影響受けるのは記号だけじゃねーぞ。わかるか?
こういうのは意固地にならずに安直に安全側に転ぶように設計するのが鉄則。

何度も書くが、波ダッシュ問題は問題が出ない字形だと思ってそのまま横倒しにして起きた事故なんだから。

276:デフォルトの名無しさん
09/09/07 17:08:47
>>261に欠陥発見。
×say $foo->{foo} ^ $foo->{foo} eq '0' ? '数値' : '文字列';
○say +($foo->{foo} ^ $foo->{foo} eq '0') ? '数値' : '文字列';

0.1は数値と扱われるようですね。'0.1'で文字列でした。失礼しました。

277:デフォルトの名無しさん
09/09/07 17:10:10
また間違えた
○say +($foo->{foo} ^ $foo->{foo}) eq '0' ? '数値' : '文字列';

278:274
09/09/07 18:04:21
>>275
フォント情報の中に入ってる横書き字形/縦書き字形変換テーブルにバグがあるとしたらもう私にはどうしようもありません。

279:デフォルトの名無しさん
09/09/07 18:21:16
>>278
じゃUTF-8変換とか恐ろしくて使えないな。今後もShift_JISとかEUC-JPで頑張ってください。
多分バグが出る可能性よりも君がミスる可能性の方が高い。

280:デフォルトの名無しさん
09/09/07 19:51:04
>>260
>数値も文字列で格納することがあることが分かる。
なんでこんなことするの?

>どうしても必要ならJSONを自分でパースしてチェックすればいい。
「すればいい」じゃなくて、Perlでは「自分でパースしてチェックするしかない」だよね。

>JSONのレイヤーの問題なんだからPerlのレイヤーに落としてチェック
>しようとする発想が間違っている。
えー、数値と文字列が区別できるような言語なら何の問題もないのに。
Perlではそれができないのを、「発想が間違い」とかいってごまかさないでほしい。


281:デフォルトの名無しさん
09/09/07 20:06:21
>>280
> なんでこんなことするの?

魔法を使うため

282:デフォルトの名無しさん
09/09/07 20:21:59
JSONのバリデータの、どこで内部構造の判定が必要なのかが分からない。
果たしてそれはバリデータなのか、物体Xではないのか。

283:デフォルトの名無しさん
09/09/07 20:40:28
{"PI": 3.14, "unko":[1,1,2,3,5]}
といったデータを、json_validate($json_obj, {"/PI" => "float", "/unko/*" => "int"});
みたいにチェックする場合じゃないの

284:デフォルトの名無しさん
09/09/07 21:18:42
>>283
その処理系は知らないから分からないが、Cライクな型を調べるものとして、
1000桁の数値であってもJSONとしてはvalidなのだから、
やはり文字列で判定すべきではないのか。

285:デフォルトの名無しさん
09/09/07 21:35:51
>>253
>とりあえずお前はこれは読んどけ。10回くらい読め。
>URLリンク(perldoc.perl.org)

どうもです。でもそれには知りたい内容は一切かかれてませんでした。
(1)READMEを書きなさいとはありましたが、フォーマットについては言及なし。
(2)Changesについては一切言及なし。
(3)テストを書きなさい、Test::SimpleとTest::Moreがおすすめ、とはあるが、推奨するファイル名については言及なし。
(4)パッケージのファイル名についても言及なし。

10回読めと言うくらいなら、もうちょっと関連するものを紹介してくれてもいいような。

で、他のCPANパッケージをいくつかダウンロードしてみたところ、
(1)READMEファイルの書き方はバラバラ。好きな書き方でいいみたい。
(2)Changesはそれ以上にバラバラ。
(3)テストスクリプトはどのパッケージも t/*.t だった。これに従ったほうがいいみたい。
(4)パッケージ名とライブラリは厳密に一致している(みたいだけど確証はなし)。

あとバージョン名の付け方が、X.X.X ではなく X.X という形式のが非常に多いんですけど、
Perlでは「5.8.6」よりも「5.86」という形式のほうが好まれるんでしょうか。




286:デフォルトの名無しさん
09/09/07 21:50:23
で、module-starterは試してみたの?

287:デフォルトの名無しさん
09/09/07 22:05:09
>>268
> 見分けがつかないんじゃなくて、区別されてないんだろ。


区別せずに都合よく使えるようにしてあるんだよ。
厳格に区別するほうがよほど簡単なのに。

288:デフォルトの名無しさん
09/09/07 22:07:11
>>273
> 波ダッシュ字形問題

ってなんですか?
涙っしゅ??

289:デフォルトの名無しさん
09/09/07 22:38:38
双方噛み合って無いやりとりもこのスレの華


290:デフォルトの名無しさん
09/09/07 22:45:58
>>287
>区別せずに都合よく使えるようにしてあるんだよ。
区別せずに使えるのは利点だとしても、区別できない(見分けがつかない)のは欠点だよな。


291:デフォルトの名無しさん
09/09/07 22:54:32
>>290
変数アクセス履歴を残しておけばいいわけだな

292:デフォルトの名無しさん
09/09/07 23:14:53
>>286
module-starterをインストールすると、READMEのフォーマットがわかるの?
わかってないのに無理して回答するのやめようぜ。初心者が混乱するだけだから。
もしわかっててその回答なら、あまりにとんちんかんすぎる。

293:デフォルトの名無しさん
09/09/08 00:11:14
>>286
プラグインModule-Starter-PBP入れてね。

294:デフォルトの名無しさん
09/09/08 01:02:28
>>285
(3)の理由はこれだ。
URLリンク(search.cpan.org)

295:デフォルトの名無しさん
09/09/08 01:07:39
どうしても型の区別がしたいなら、静的型付けをエミュレートした変数を作り、そこに格納しておくという手段も用意されています。
今回の議論で望まれている動作とは異なるかもしれませんが、運が良ければ CPAN の Variable::Strongly::Typed が参考になるでしょう。


296:デフォルトの名無しさん
09/09/08 01:58:57
ひとつのサブルーチンで、スカラ、リスト、ハッシュを渡すと
それぞれ別の挙動をとるようには出来ますか?

それとも、単にスカラだけ引数に取るようにして
リストやハッシュは呼出側で参照にしてから
渡してもらうほうが賢明なのでしょうか?

297:デフォルトの名無しさん
09/09/08 02:11:28
URI モジュールのように
スカラー変数をブレスされたリファレンスのように扱えるオブジェクトは
どういう仕組みでできているのでしょうか
ソース読んだけど意味不明。。。

298:デフォルトの名無しさん
09/09/08 03:51:48
>>297
やっぱ use overload でいろんな演算子とかを独自に定義するんでないか

299:デフォルトの名無しさん
09/09/08 08:37:44
>>296
> それとも、単にスカラだけ引数に取るようにして
> リストやハッシュは呼出側で参照にしてから
> 渡してもらうほうが賢明なのでしょうか?


その方が確実かなあ。
もっと確実なのはサブルーチンを分けることなんだけど、なんでひとつにまとめたいのさ?

300:デフォルトの名無しさん
09/09/08 09:12:42
>>298
ありがとうございます
調べてみます

301:デフォルトの名無しさん
09/09/08 09:44:37
>>297
sub X(\$) {...}

302:デフォルトの名無しさん
09/09/08 09:51:43
>>290
必要でないからあえて削除されたんだよ。
型にこだわることで起こる煩わしさのほうが多いから。

それにバリデータなんてどっかで誰かがもう作ってるだろ。
あえてパールで作り直すのは自由だけど、能力不足を棚にあげて言語のせいにされてもね。
ガタガタいうなら適切と思う言語を選べばいい。
言語のせいにするやつは、言語を変えてもできないだろうから。

303:デフォルトの名無しさん
09/09/08 10:00:09
>>280
> えー、数値と文字列が区別できるような言語なら何の問題もないのに。

区別できないところに大きなメリットがある。

例えばPHPはPerlと同じく自動型変換を可能としたが、型は残したままにしたために
大変な混乱を大量のバグを生んだ。

で、区別ができないとどう困るのか具体的な返事がまだないのだが?俺は15年くらいPerl書いてるけど
困ったことなぞ一度もないぞ。

>>285
読んだんなら続きは責任もって答えてやる。
書いてないってことはREADMEやChangesにはフォーマットなし。自由に書いてよし。ってことだ。読み取れないのか。

パッケージとファイル名は基本的に一致すべしと考えておけ。で、名前空間の汚染は非常に嫌われるからなるべく少なく。
この辺はIRCでソース晒して相談するといい。あまり糞なパッケージに普遍的な名前をつけられると他が迷惑する。

バージョンのつけ方は好きに汁。5.10.1みたいのでもいいし、5.00503みたいのでもいい。後者の書き方をすると
普通バージョン番号とパッチ番号(005/03)とみなされる。最初は謙虚に0.0.1とか0.00001にしとけ。


304:デフォルトの名無しさん
09/09/08 10:19:36
>>288
ググるくらいできんのか。
URLリンク(ja.wikipedia.org)

>>290
それ欠点じゃなくてわざとだから。判定モジュールくらい簡単に作れる。上に判定方法も書いた。
型を区別するとPerlスクリプティングにダメージがあるためそんなモジュールは必要とされていないし使われていないだけ。

>>295
今ならMooseで
isa => 'Str',
isa=> 'Int',
でしょ。

>>296
同名関数の複数定義ができればいいんだが、Perlでは無理なので後者が賢明。

>>299
そりゃ同じ機能ならまとめたいだろうし、最近はそういう風潮にあると思うが。
foo({ a => 1,b => 2 })と、foo([ a => 1, b => 2])で挙動をスイッチするような実装とか最近よく見かけるぞ。

305:デフォルトの名無しさん
09/09/08 10:34:51
「本質的にスカラーは型を持たない」
  -- Larry Wall, プログラミングPerl, O'Reilly, 1997, p43

Perlは内部的にスカラーを数値や文字列で扱ってるだけで、「型が区別できない」わけではない。
「数値や文字列はあっても、数値型や文字列型なんかない」のである。そこんとこ間違えないように。

306:デフォルトの名無しさん
09/09/08 11:13:56
Validateする目的は、(JSONを媒体とした)データを受け取ったPerlのプログラムを正常に動作させるためですよね?
それなら、データがJSONレベルで数値だったか否かは全く問題にならないのでは?
JSON表現の "1" と 1、このどちらも、Perlレベルでは文字列としてでも整数値としてでも正常に扱えるんですから

どうしてもJSONレベルでのValidateを望むのであれば、
JSONデコーダから作るしかないのですね。Ruby等、データに型が備わっている言語であれば、
確かにJSONデコーダとJSONレベルのValidatorは完全に分離可能でしょう。
でも、Perlにはそれが出来ない。仕方のないことです

307:デフォルトの名無しさん
09/09/08 12:04:55
JSON表現では区別できるならどのように読み取ったかを
後から判別できるような情報を残しておくことは可能。
既存のパーサーが区別しないというだけの話で
言語のせいにしたところで問題が解決するわけではない。
数値と文字列の区別がある言語であってもパーサーが区別しなければ同じこと。

308:デフォルトの名無しさん
09/09/08 12:26:56
>>303
>書いてないってことはREADMEやChangesにはフォーマットなし。自由に書いてよし。ってことだ。読み取れないのか。

書かれてないから質問しているのに・・・
「書いてないってことはフォーマットなし」なんて読み取れるわけないでしょ。
書かれてないことは「不明」だと判断するのが普通じゃね?どういう頭の構造してるんだよ。

そのページはCPANパッケージの作り方についてすべてを網羅しているの?
もしそのページに書かれてないことは自由に判断していいなら、テストスクリプトのファイル名だって、
パッケージのファイル名だって、自由にしてもいいことになるだろ。でも実際にはそうじゃないじゃん。
書かれてないことは「不明」なんだから、分かっている人に聞いてみて意見をあおぐのが常識的な行動じゃないか?
「書いてないから何をやってもいい」というおまえみたいな考えこそ大迷惑。


しかしまー、あれだ、自分が紹介したページが見当はずれだったことはまるで反省せず、
「読み取れないのか」と言い放つなんて、なんという傲慢ぶり。まるでdank○gai。


309:デフォルトの名無しさん
09/09/08 12:39:35
>>308
流れ見てると全くもって君の言うとおりだと思うけど、最後に例えでその名前を出すのはダメだろうw

310:デフォルトの名無しさん
09/09/08 12:40:08
>>284
>1000桁の数値であってもJSONとしてはvalidなのだから、
>やはり文字列で判定すべきではないのか。
なんで1000桁の数値なら文字列にしないといけないの?
1000桁だろうと、数値は数値としてもっておけばいいじゃん。
C言語じゃあるまいし、スクリプト言語なら桁数の多い数値でもふつうに扱えるようになっていてもらわないと。


311:デフォルトの名無しさん
09/09/08 12:51:23
>299 >304
ありがとうございます。素直にスカラを取るようにします。

312:デフォルトの名無しさん
09/09/08 13:12:40
JSONでの型をバリデートする話とはちょっと違うんだけどずいぶん昔に
WebアプリケーションでASINをJSONで吐いてJSからあれこれするときに
{ASIN=>$asin} みたいなので、$asin =~ /^[0-9]+$/ だったりすると
{"ASIN":1234} みたいなJSONを吐き出しやがって閉口した覚えがある。
これだけならまだいいんだが $asin =~ /^0[0-7]+$/ だと
8進数に変換されてえらいことになった。

手元で試したら再現しなかったので最近のJSON.pmは大丈夫ぽいが。

313:デフォルトの名無しさん
09/09/08 15:55:55
perlは変数自体に型はないけど、データには型はあるがな。見分けられないわけもないだろよ。
まぁ、perlは非常に弱いLvで変数の型を決め付けてるぞ。
文字型と判断されるか数値型と判断されるかで、挙動が変わるビット演算子がある。唯一それだけ。
これは変数の経歴を記録してる。


関係ないけど、バイナリデータ扱ったら、ヌル文字だらけでとんでもない目に遭った。
もう文字列の0は真にしてくれよ。binmodeって書いたときだけでいいから。せめて'0000'は真だろ!
あと、明示的に指定せずにほっといたら'0000'を勝手に0にすんのもやめてくれ、って思った。

314:デフォルトの名無しさん
09/09/08 17:50:24
>>308
質問の内容が書いてあるとは一言もいっていないが?
テストのファイル名も分からない状態のあなたはまずこれを100回読めという意味だよ。
だから100回読んだあなたにちゃんと補足で答えてるだろ。

勝手に勘違いしてファビョって礼もなしにそれか。

315:デフォルトの名無しさん
09/09/08 17:59:14
スクレイピングするスクリプトを作るときのサポートライブラリで、
ページの構造をスクリプト作成に便利なようにてきとーに整形して表示するというのをけっこう前に見かけて、
あーこれ便利そうだなーと思ってそのままだったんです

今探そうと思ったらぜんぜん見つかりません
何か心当たりのある方いますか?

316:デフォルトの名無しさん
09/09/08 18:07:45
>>314
分不相応にプライドの高い間抜けな質問者のオーラを
事前に察知して華麗に無視できなかったお前が悪い。

317:デフォルトの名無しさん
09/09/08 18:12:44
>>310
> スクリプト言語なら桁数の多い数値でもふつうに扱えるようになっていてもらわないと。
use bignum;を使え。

> なんで1000桁の数値なら文字列にしないといけないの?
効率が悪すぎる。

>>313
変数をそのまま真偽値判定に突っ込むな。

318:デフォルトの名無しさん
09/09/08 19:06:41
ディレクトリの中にあるテキストファイルから、任意の文字列を発見した時に
その文字列が含まれるファイル名を出力したいんだけど
どうすればいいの
教えてエロい人!!

319:デフォルトの名無しさん
09/09/08 19:07:57
>>315
どっかで見たな

320:デフォルトの名無しさん
09/09/08 19:23:27
>>302
>必要でないからあえて削除されたんだよ。
ということは、以前は機能として存在したということか。どのバージョンで削除されたか教えてくれ。

>型にこだわることで起こる煩わしさのほうが多いから。
そんなわけない。だったらJSもRubyもPythonも煩わしいことになるけど、そうはなってない。

>それにバリデータなんてどっかで誰かがもう作ってるだろ。
>あえてパールで作り直すのは自由だけど、能力不足を棚にあげて言語のせいにされてもね。
上のほうで出たのはJSONのバリデータなんだけど、それはすでにPerlにあるの?
ぐぐったけど見つからんぞ。せっかくPerlにないものを作ろうとしてくれてる人がいるのに
なんでこんな反応ばっかりなんだろうね。

>ガタガタいうなら適切と思う言語を選べばいい。
>言語のせいにするやつは、言語を変えてもできないだろうから。
これに関しては言語を変えたら簡単にできるこだろ。
数値と文字列の判定なんて、PHPですら簡単にできることなのに。ガタガタ言い訳カッコワルイ。


321:デフォルトの名無しさん
09/09/08 19:36:58
>>318
ディレクトリをマウスで右クリック
「検索(E)」
ファイルに含まれる単語

322:デフォルトの名無しさん
09/09/08 19:44:52
>>321
すいません、windowsを使っていないので
それはできませんorz

323:デフォルトの名無しさん
09/09/08 19:50:03
>>314
>質問の内容が書いてあるとは一言もいっていないが?
すげー!質問したやつに関係ないURLを紹介しておいて、文句をいわれたら『答えが書いてあるとは誰もいってない』と逆切れ!
言い訳もここまでくるといっそすがすがしいな。

>勝手に勘違いしてファビョって礼もなしにそれか。
無関係なURLを紹介しておきながら「読み取れないのか」と言って相手のせいにするようなやつのくせして、礼だけは求めるのかよ。
相変わらずのdank○gai的傲慢さだな。論理がつながってないところもdank○gaiにそっくりだ。
あれか、Perl使うとみんなdanみたいなのになるのか?danが今のようなdanになったのはPerlのせいなのか?

324:デフォルトの名無しさん
09/09/08 19:56:32
>>323
> あれか、Perl使うとみんなdanみたいなのになるのか?danが今のようなdanになったのはPerlのせいなのか?

うん! その通りだよ!!
逃げて!! Perlから逃げて!! 手遅れにならないうちにPerlから逃げてぇ!!

325:デフォルトの名無しさん
09/09/08 19:56:35
>>320
シンタックスレベルのバリデータなら既にCPANに転がってるよ
URLリンク(search.cpan.org)

326:デフォルトの名無しさん
09/09/08 20:00:13
>>260, >>313の話から考えると、
Perlのある値は、(その時点で)文字列or/and数値としてメモリ上に表現されているって情報しか持ってなくて
その値の由来が文字列か数値かなんて情報は持ってないとか?

そうだとすると、型っていうより、Perlの値は文字列と数値の二つの側面があるってイメージで
型の判別が出来る・出来ない、というより、そもそも判別する対象(文字列型・数値型)がないのかな

これであってる?教えてくださいPerl上級者さん><

327:デフォルトの名無しさん
09/09/08 20:11:31
>>326
方向はだいたいあってるんだぜー。
もっと詳しく知りたければ Devel::Peek あたりで遊んでみることだぜー。

328:デフォルトの名無しさん
09/09/08 20:14:00
しらんけど C++には Variant型ってクラスで作られた型があるな

329:デフォルトの名無しさん
09/09/08 20:15:08
>>327
ありがとう
sv.hにスカラー値っぽいのが定義されてたけど、どうもそうみたいですね~
もうPerl使ってないけど、4間年も使ってたのに気付かなかったw 勉強になりました

330:デフォルトの名無しさん
09/09/08 22:12:10
>>323
何でそんなに興奮してるのか知らないけど、
続ければ続けるほど自分が皆から馬鹿にされるだけの書き込みを続けても
意味無いと思うよ。

331:デフォルトの名無しさん
09/09/08 22:45:32
>>318
grep -rh 検索文字列 ディレクトリ

332:デフォルトの名無しさん
09/09/08 22:48:13
>>320
ことか。どのバージョンで削除されたか教えてくれ。



> そんなわけない。だったらJSもRubyもPythonも煩わしいことになるけど、そうはなってない。

煩わしいよ。


> 上のほうで出たのはJSONのバリデータなんだけど、それはすでにPerlにあるの?


こまけーことイチイチ聞かなきゃ作れないひとには期待してない。

333:デフォルトの名無しさん
09/09/08 23:25:33
>>331
わかりました。ありがとうございます

334:デフォルトの名無しさん
09/09/08 23:30:58
数値と文字列の区別が煩わしいと思う人も居るし
文字列に数値のように振舞われるのが煩わしい人も居る

前者にとって、数字を足すのにいちいち変換するのは苦痛だし
後者にとって、"0"が偽なのは地雷でしかない

335:デフォルトの名無しさん
09/09/08 23:32:01
まだデュエルしてんのか。デュエリスト板でやれ

336:デフォルトの名無しさん
09/09/09 00:56:14
>>334
> 文字列に数値のように振舞われるのが煩わしい人も居る

プログラマが区別できてないなら何しても同じ。
シンタックスエラーかランタイムエラーかの違いすらない。

> 後者にとって、"0"が偽なのは地雷でしかない

イミフ。
歴史的にゼロを偽とするのが習慣。
シェルについては、これも歴史的理由でゼロを真とする習慣だが。

337:デフォルトの名無しさん
09/09/09 01:31:16
0でなく"0"な

338:デフォルトの名無しさん
09/09/09 02:39:02
>>284
ためしにJSON::Syckに1000桁の数字入れたら数値 : Infになりやがった。
JSON.pmは優れたことに文字列に変換して格納してくれてる。マニュアルにも
書いてあったがこれは立派な挙動。

>>313
どう考えても君が悪いと思う。ヌル文字は偽じゃないし、なにを勘違いしてるのか知らんが、
'0000'も真だ。'0'が真で'0x00'を偽にしたいんなら、アスキーコードで判定させればいいし
Perlはその手段を提供している。

> あと、明示的に指定せずにほっといたら'0000'を勝手に0にすんのもやめてくれ、って思った。

は。ソース出してみ。Perlはそんなにお行儀悪くない。

>>326
当然由来までは保存してない。だいたいその解釈であってる。

>>334
よく初心者が引っ掛かるところだが、仕様を理解すれば地雷を踏むことはなくなる。
ただし、テキストファイル末尾の改行文字なし'0'だけはどうすることもできない。

339:デフォルトの名無しさん
09/09/09 07:30:14
>>325
それはJSONが文法的に正しいかどうかをチェックするだけのチェッカーであってバリデータではない。
きみはスキーマバリデータが何かわかってないようだ。
文法をチェックするだけなら1と’1’の違いが問題になるわけがない。

340:デフォルトの名無しさん
09/09/09 08:06:39
>>339
自分が何を言ってるか、理解してる?

341:デフォルトの名無しさん
09/09/09 09:14:15
>>337
> 0でなく"0"な

文字としての比較なら
eqとかne
使えば?

比較演算子使わずに済ますのってZ80でXOR Aするような古くさいイメージ。

342:デフォルトの名無しさん
09/09/09 10:02:56
地雷ってのは思わぬところで踏むものだと思うよ

343:デフォルトの名無しさん
09/09/09 10:44:44
>"0"が偽なのは地雷でしかない

↑コイツ・・・最高にアホだな

344:デフォルトの名無しさん
09/09/09 10:46:15
$unko = undef ; print "\nundef is " , ($unko ? "TRUE" : "FALSE");
$unko = 'KUSO'; print "\n'KUSO' is " , ($unko ? "TRUE" : "FALSE");
$unko = '' ; print "\n'' is " , ($unko ? "TRUE" : "FALSE");
$unko = '1'; print "\n'1' is " , ($unko ? "TRUE" : "FALSE");
$unko = '0'; print "\n'0' is " , ($unko ? "TRUE" : "FALSE");
$unko = 1 ; print "\n 1 is " , ($unko ? "TRUE" : "FALSE");
$unko = 0 ; print "\n 0 is " , ($unko ? "TRUE" : "FALSE");

345:デフォルトの名無しさん
09/09/09 11:09:02
ひとりだけまともな人がいる!

>>306
>Validateする目的は、(JSONを媒体とした)データを受け取ったPerlのプログラムを正常に動作させるためですよね?

残念ながら違います。そういう場合もありますが、バリデータは単に
「入力となるJSONがスキーマ定義を見たしているかどうか(あるいは
どこが間違っているか)」を調べるのが目的です。
そのJSONをPerlで使うかどうかはまた別のことです。

>それなら、データがJSONレベルで数値だったか否かは全く問題にならないのでは?
>JSON表現の "1" と 1、このどちらも、Perlレベルでは文字列としてでも整数値としてでも正常に扱えるんですから

文字列としても整数値としても扱えることが問題なのではなく、
文字列か整数値かを判定できるかどうかが問題です。(違いはわかりますよね?)

>どうしてもJSONレベルでのValidateを望むのであれば、
>JSONデコーダから作るしかないのですね。Ruby等、データに型が備わっている言語であれば、
>確かにJSONデコーダとJSONレベルのValidatorは完全に分離可能でしょう。
>でも、Perlにはそれが出来ない。仕方のないことです

妥当な結論だと思います。
が、Perl信者に言わせると「そういうことをすること自体が間違い」らしいです。
別にどんな言語だって万能じゃないのだから、うまくできないことがあったら
「それはこの言語ではうまくできない」と素直に認めればいいだけなのに、
「そんなことをするほうが間違っている」とわめく痛い信者が多い今日この頃。




346:デフォルトの名無しさん
09/09/09 11:39:31
>>345
そのすぐ後の >307 をスルーしてるのはわざとか
どうしてもPerl自体の問題にすり替えたい様子だが

347:デフォルトの名無しさん
09/09/09 11:42:09
JSONバリデータなんぞ、再帰下降法使っても3時間ありゃ書けるだろうに。
出来ないという奴は、もう、そういうことにしとけ。

348:デフォルトの名無しさん
09/09/09 11:43:10
ほらまた、すぐそういうこと言う。3時間以内に書いて来いって言われるぞw

349:デフォルトの名無しさん
09/09/09 12:02:28
>>345
「自分にはできないから言語が悪い」のですね。
わかります。

350:デフォルトの名無しさん
09/09/09 12:16:20
CPANをユーザーディレクトリで利用するために本当に必要な記述ってなに?

351:デフォルトの名無しさん
09/09/09 12:26:16
>>350
CPANは管理者権限で利用するのが正統

352:デフォルトの名無しさん
09/09/09 13:13:10
>>348
いいんじゃない言われても。馬鹿は放置するだけ。

353:デフォルトの名無しさん
09/09/09 15:03:46
”0” は48(0x30)で真だろ?

354:デフォルトの名無しさん
09/09/09 15:11:09
>>351
わかりました
諦めます

355:デフォルトの名無しさん
09/09/09 15:36:48
>>350
use lib 'ディレクトリ';


のこと?
質問の意図がつかめない。

356:デフォルトの名無しさん
09/09/09 16:34:03
>>353
いったいどこの3流学校でそんな事を習ったんだ?

357:デフォルトの名無しさん
09/09/09 16:46:30
東村山第三小学校だけど

358:デフォルトの名無しさん
09/09/09 18:24:29
中州産業大学だけど

359:デフォルトの名無しさん
09/09/09 19:25:45
nullとの比較は$hoge == undefでおk?

360:デフォルトの名無しさん
09/09/09 19:31:17
えっ?

361:デフォルトの名無しさん
09/09/09 19:37:56
>>359
nullは無い。
defined($hoge)
で未定義をチェック。

362:デフォルトの名無しさん
09/09/09 19:38:34
>>361
ありがとう。
久しぶりにperlをやったから、完全に忘れてる

363:デフォルトの名無しさん
09/09/09 22:15:59
あと、 == は数値比較だから気をつけろ

364:デフォルトの名無しさん
09/09/09 22:18:43
> defined($hoge)

すぐカッコつけたがるよね、最近の若者は。

365:デフォルトの名無しさん
09/09/09 22:36:10
あー、おれもカッコつけたがる若者だわ。
カッコつける場合とつけない場合ってなに?

366:デフォルトの名無しさん
09/09/09 22:42:30
なんかjavaよりめちゃくちゃ速く感じた
本当に速いかわからないけど

367:デフォルトの名無しさん
09/09/10 00:19:45
>>365
優先順位をはっきりさせたいとき。
好み。

368:デフォルトの名無しさん
09/09/10 00:26:44
昔中途半端にカッコつけてたらドツボにハマった
それ以来できる限り自然体でいようと思った

print (1 + 2) * 3, "\n";

369:デフォルトの名無しさん
09/09/10 00:28:04
ifの括弧内に単品で書くなら省くかな
でも複数条件組み合わせるとか、後置ifの条件に入れるときは書きたい

まあ好みだな

370:デフォルトの名無しさん
09/09/10 02:13:48
if (defind $i) {ほげ}
if (defind($i)) {ほげ}
ほげ if defind $i;
ほげ if defind($i);

if (i instanceof Object) ほげ;
if (i instanceof(Object)) ほげ;

if ($i >= 1 && $i <= 10) {ほげ}
if (($i >= 1) && ($i <= 10)) {ほげ}

371:デフォルトの名無しさん
09/09/10 03:03:38
C使いからすると括弧の無いifは我慢ならん

372:デフォルトの名無しさん
09/09/10 03:30:32
JSONを知らないから、外れた事言ってるかもしれないが、
perlは文字と数値を区別しないんだから、区別したいケースが
あるとしたら、外部からのデータな訳だよね?それなら外部から
入力する時に文字をエスケープすれば良いだけじゃないの?
"123"→"%31%32%33",123→"123"とかして。


373:デフォルトの名無しさん
09/09/10 08:00:24
>>372
JSONは通常文字入力をエスケープする仕様にはなってないので、
そういう迂回はすべきでない。


ぎゃーぎゃー騒いでたひと、しまいには
Perlで使うわけではないのにPerlでバリデーション処理したいという
訳のわからないことをいいだした。
重箱のスミつついて意味のない優越感に浸りたかったのだろう。

ほら、あれだ。
「俺の出身小学校からオリンビック選手が出たんだぜ。(俺って)スゲーだろ?」「お前んとこはしょぼいお笑いタレントしかでてないよな?俺の勝ちだな。」
ってレベルな感じ。


374:デフォルトの名無しさん
09/09/10 11:28:58
>>371
かなり重症なC言語脳ですね。
視野が狭すぎますよ。
じぶんの殻に閉じこもりすぎです。
世間は広いんですよ。
もっと多くのものを見て聞いて学ぶべきですよ!

375:デフォルトの名無しさん
09/09/10 11:44:46
かっこを付けてPerlの世界から弾き出され、$を付けてCの世界からも弾き出され

376:デフォルトの名無しさん
09/09/10 11:53:36
かっこ付けない専売特許はRubyのほうが上でしょ?

377:デフォルトの名無しさん
09/09/10 12:06:15
>>376
ベタPerlを自認するRubyが?

378:デフォルトの名無しさん
09/09/10 12:07:49
>>374
そうです!
リスプはカッコの多い言語ですって坂村先生がいってました!

379:デフォルトの名無しさん
09/09/10 13:24:09
>>376
おいおい。それはもしかしてマジレスなのか?

380:デフォルトの名無しさん
09/09/10 14:38:13
>>376
やってみれば分かると思うが、文法的にはRubyのが省略できる条件は制限されるよ
逆に、出来る場面は省略する人が多いけど

381:デフォルトの名無しさん
09/09/10 15:07:30
>>374
えらく風呂敷広げたなw

382:デフォルトの名無しさん
09/09/10 16:13:15
if文のかっこなしはPerl 6からだね

383:デフォルトの名無しさん
09/09/10 16:29:23
>>382
おいおい。それはもしかしてマジレスなのか?

384:デフォルトの名無しさん
09/09/10 16:42:53
>>383
これ↓ができるのはPerl 6からでしょ?

if $x < 0 {
$y = 2;
$z = 3;
}

385:デフォルトの名無しさん
09/09/10 16:45:56
後置の話してたんだろ

386:デフォルトの名無しさん
09/09/10 17:09:11
$a = 1 if $b ne "";

こんなやつでしょ?
これはC++使いだけど特に気にならなかった。
要は三項演算みたいな感じだし

387:デフォルトの名無しさん
09/09/10 19:34:55
>>198 今更ながらありがとう。
 結局ループになってしまったけど……
 一応、該当があれば別のサブルーチンに飛んで、無い場合は最も近い配列の場所を見つけ出すようにしたつもり
 既に配列(@hai)を取り込んであって $in が入れたい内容。

$min = 0;
$mid = 0;
$max = $hairetu - 1; # $hai~は取得した配列の個数

if($max != 0 and $max != -1) {
while ($min <= $max) {
$mid = int(($min+$max)/2);
$space = $max - $min;

if($space == 2) {
last;
} elsif ($space == 3 ) {
if ($hai[$mid] >= $in) {
last;
} else {
$mid += 1;
last;
}

388:デフォルトの名無しさん
09/09/10 19:36:35
} else {
if ($hai[$mid] lt $in) {
$min = $mid - '1';
} elsif ($hai[$mid] gt $in){
$max = $mid + '1';
} elsif ($hai[$mid] eq $in){
&・・・・・       #サブルーチンへ
          last;
         }
       }
}
}

スペース消えてるけど、一応二分探索ループです……
>>198さんのような再帰はうまくつかえなかった……

389:デフォルトの名無しさん
09/09/10 23:35:57
久しぶりにCを書いたら、
@array = (0, 1, 2);
に相当するようなことの書き方すら判らなくなってた

390:デフォルトの名無しさん
09/09/11 00:03:44
perl でソースを複数のモジュールに分けて書いた場合
配布する時は汎用モジュールと同じ様に
個人的なモジュールも CPAN に登録するの?

そのプログラムを使うユーザは
プログラムの入ったディレクトリ・ツリーごと扱って
$HOME/bin とかに入れたりするの?

コンパイルすれば単体の実行ファイルになって扱い易くなるだろうけど
ソースのまま配布したいんだけど……。


391:デフォルトの名無しさん
09/09/11 00:06:53
つ perldoc FindBin
つ perldoc lib


392:デフォルトの名無しさん
09/09/11 02:50:22
use FindBin;
use lib "$FindBin::Bin/lib";
とするか
use FindBin::libs;
でいけるんですね。

取っ掛かりが出来たので OOP だとどうなるのかとか
標準的なディレクトリ構成とかを調べて見ようと思います。
ありがとう。


393:デフォルトの名無しさん
09/09/11 07:50:59
>>390
今CPANはネームスペースがアレなことになっているので、それだけはやめれ。手段ががいしゅつだから省く。
モジュール登録する時も、IRCなどで名前空間の妥当性とCPANに登録する必要性を審議しらもらってからにした方がいい。

394:デフォルトの名無しさん
09/09/11 07:53:17
>>387

ファインチューニングしてないけど、こんな感じ?


sub bsearch($$;$$){
my ($a,$t,$s,$e)=@_;
$s=$[  if !defined $s;
$e=$#$a if !defined $e;
&subroutine if $$a[$s] == $t;
return $s if $s>=$e;

$m=floor(($s+$e)/2);
$x=bsearch($a,$t,$s,$m);
$y=bsearch($a,$t,$m+1,$e);

return ($a[$x]-$t < $a[$y]-$t) ? $x : $y;
}


395:デフォルトの名無しさん
09/09/11 09:06:50
>>394自己レス。

> &subroutine if $$a[$s
これは削除して呼び出し側でチェックしないとだめだわ。
でないと何度も呼ばれてしまう。

396:デフォルトの名無しさん
09/09/11 16:51:05
数値の 0 を参照させたい時はどうしたらいいのでしょう?

397:396
09/09/11 17:02:32
自己解決しました


398:デフォルトの名無しさん
09/09/12 11:10:10
ファイル名を取得するとき、opendirとglobどっちを使うべきなのでしょうか?

399:デフォルトの名無しさん
09/09/12 11:47:16
File::Slurpのread_dirオススメ



400:デフォルトの名無しさん
09/09/12 16:42:48
ファイルグロブなんか使ったらいかんと誰かがブログで書いてたよ

401:デフォルトの名無しさん
09/09/12 17:41:16
>>400
それって結局「いかん根拠なんてないじゃん」という話じゃなかったか?

402:デフォルトの名無しさん
09/09/12 20:35:07
.と..をいちいち除外しなくていい

403:デフォルトの名無しさん
09/09/12 22:42:15
古いperlは、ファイルグロブはシステムに依存してた。
(「ファイル名が長過ぎます」エラー等のperlの外の問題を切り離す事が出来ない。)
つー事で古くからの人間は「グロブなんざ使うんじゃねえ。」と言いがち。
で、それら諸先輩に影響を受けた人々が、本来の根拠と別に理由をこじつけ
「だからグロブは使いません!」って言ってる(人もいる)。

今となってはどっちでも良いんでねえの?10年以上前の常識だし、
俺はグロブ使わんけど。


404:デフォルトの名無しさん
09/09/12 23:31:36
>>398
opendirはファイル名のみとりたいときに便利。

globはパスごととりたいとき便利。

405:デフォルトの名無しさん
09/09/13 00:38:38
あー
パスは自前で管理してファイル名とくっつけて開くのが当然だと思ってたけど、
別にそんなことしなくてもいいか

406:デフォルトの名無しさん
09/09/13 01:48:50
> "There's more than one way to do it" ということで、


407:デフォルトの名無しさん
09/09/13 03:34:06
Perl界の重鎮、子飼弾氏は以下のように述べております。

404 Blog Not Found:perl - glob,readdir, and regexp
URLリンク(blog.livedoor.jp)

408:400
09/09/13 08:39:41
今更ただのシャレだったなんていい出しづらい雰囲気だな

409:デフォルトの名無しさん
09/09/13 11:02:01
えっ・・・みんな気づいてなかったのか?

410:デフォルトの名無しさん
09/09/13 11:58:28
はいはい、>>407は気がついていた。偉い偉い。

411:デフォルトの名無しさん
09/09/13 12:55:27
関数名を動的に指定して実行することはできますか。
sub f1 { print "f1()¥n"; }
sub f2 { print "f2()¥n"; }
...
とあるときに、
my $func = "f2";
$func();
のように実行したいんですけど、できないでしょうか。
ちなみに $func() はシンタックスエラーになり、&$func() は use strict しているとエラーになりました。

412:デフォルトの名無しさん
09/09/13 13:15:31
>>411
my $func = \&f2;
&$func();

もしunix環境があるなら man perlref を見るといいよ。
サブルーチンへの参照の扱いがいろいろ書いてあるから。

413:デフォルトの名無しさん
09/09/13 13:16:47
>>411
その関数に限れば、

main->$func;

で呼べますが。

414:デフォルトの名無しさん
09/09/13 13:19:49
eval "&$func()"とかも使えるね

415:デフォルトの名無しさん
09/09/13 14:08:14
どうもありがとうございます。

>>412
関数名は変数で指定したいので、残念ながらその方法は使えないようです。

>>413
パッケージ名を指定すると呼び出せるのですか。なるほど。
パッケージ名が長いと面倒ですけど、この方法でやってみます。


416:デフォルトの名無しさん
09/09/13 14:34:00
>>415
クラスメソッドとして呼び出してるから第一引数が
自動的に追加されるが、それでもいいのか?

#!/usr/bin/perl -w
use strict;

sub f1 { "f1()\n" }
sub f2 { 'f2(', join(',', map "'$_'", @_), ")\n" }

my %dt = (
  f1 => \&f1,
  f2 => \&f2,
  default => sub { 'anonymous(', join(',', map "'$_'", @_), ")\n" },
);

my($func, @arg) = @ARGV;

print main->$func(@arg);
print $dt{ exists $dt{$func} ? $func : 'default' }->(@arg);
__END__

417:デフォルトの名無しさん
09/09/13 14:56:26
スコープを絞って、no strict 'refs'するのが正攻法?

{
no strict 'refs';
$func->();
}

418:デフォルトの名無しさん
09/09/13 17:17:12
>>411
これでよければ簡単。


$func{f1}= sub { print "f1() n"; };
$func{f2}= sub { print "f2() n"; }

my $func = "f2";
$func{$func}();


419:デフォルトの名無しさん
09/09/13 18:25:33
Text::MicroTemplate でキャッシュを使うにはどうしたらいいでしょうか。
ドキュメントを見るかぎりにおいては、

use Text::MicroTemplate::File;
my $mt = Text::MicroTemplate::File->new(use_cache=>1);
$mt->render_file("example.mt", $arg1, $arg2);

のように、new() に use_cache=>1 を渡すだけでいいと思うのですが、
キャッシュファイルが作成されません。
またベンチマーク結果も、Template-Toolkitよりだいぶ遅いです。
Text::MicroTemplate の使い方を知っている人がいれば教えてください。


420:デフォルトの名無しさん
09/09/13 22:39:43
>>411
AUTOROAD じゃダメなの?

421:デフォルトの名無しさん
09/09/13 23:48:59
windowsXP+ActivePerl5での質問です。
windows media encoderで映像をライブ中継したいのですが
ライブ中継中だけ、ブラウザにメディアプレイヤーが表示されるようにしたいです。
サーバ側のwindows media encoderが起動されていることがPerlで確認できれば
そのようなことが可能だとおもったのですが、そのような関数はありますか?

また、もっといい方法あったら教えていただきたいです。

422:デフォルトの名無しさん
09/09/14 00:54:50
Windowsのコマンドプロンプトから
>scraper URLリンク(www.google.co.jp)

としてscraperを立ち上げられるのですが

>chcp 65001
でコマンドプロンプトの文字コードを変更すると、

>scraper URLリンク(www.google.co.jp)

を入力してもscraperが起動しません。
どうすればいいでしょうか?


Linuxのほうにもscraperを入れてみたのですがシェルから
$ scraper URLリンク(www.google.co.jp)
と入力してもscraperは起動しませんでした

CPANは
perl -MCPAN -e shell
で起動するので

perl -MScraper -e shell
でやってみたのですが駄目でした

どなたかいいやりかた教えてください。

423:デフォルトの名無しさん
09/09/14 00:57:46
>>422 はWeb::Scraperの話です

424:デフォルトの名無しさん
09/09/14 01:28:19
エラーメッセージ隠蔽者


425:デフォルトの名無しさん
09/09/14 07:30:15
>>422
URLリンク(www.google.co.jp)

426:デフォルトの名無しさん
09/09/14 09:19:05
>>425
ありがとうございます

Linuxはフォルダに移動してからscraper URIで起動できました。
>cd /usr/local/bin
>scraper URLリンク(www.google.co.jp)


Windowsは
C:\Perl\bin\scraper.bat
を実行すればscraperは起動します

>chcp 65001
とした時点で
>cd C:\Perl\bin\
>scraper.bat URI

結果(エラーメッセージなし)
>

となってスルーされてしまいます。
Linuxで実行できるので、Windows側はもういいかなという感じです。文字化けが厄介なので。






427:デフォルトの名無しさん
09/09/14 11:03:49
……

428:デフォルトの名無しさん
09/09/14 14:20:02
どのパッケージからでもパッケージ名を付けずに呼べるようなサブルーチンを定義できますか?
もちろん、名前空間的に危ういことは百も承知で。
用途としては、個人用のスクリプトでよく使う処理を纏めておきたいって感じです。

429:デフォルトの名無しさん
09/09/14 15:48:12
普通に(package宣言せずに)関数を別ファイルに定義してuseなりrequireなりすればよくね?

430:デフォルトの名無しさん
09/09/14 16:10:04
package宣言してもimportしちゃえば問題無いと思われ。

431:デフォルトの名無しさん
09/09/14 16:41:51
ま、そのうち後悔するからモジュールにしてuseするようにしとけ。
Exporter使えばそんなに難しくないし。

432:デフォルトの名無しさん
09/09/15 02:50:59
overloadプラグマをuseしたときに使える関数一覧はありませんか?
overload::StrValとかが何する関数か知りたいです

433:デフォルトの名無しさん
09/09/15 03:08:13
>>432
URLリンク(perldoc.perl.org)
URLリンク(perldoc.jp)

434:デフォルトの名無しさん
09/09/15 04:10:08
マニュアルを読まなくなった次の時代には、マニュアルという概念自体が失われる。

435:デフォルトの名無しさん
09/09/15 09:29:23
>>429-430
use、require、importと色々試しましたが最初の1回しか効かないような…?
とりあえず>>431に出ているExporterを覚えてみます。ありがとうございました。

…というか、色々探してたら
欲しい処理は既にCPANにあったと言うオチ…お騒がせしました。

436:デフォルトの名無しさん
09/09/15 14:35:00
>>435
凝った事しない限り大抵そのオチだから気にしなくても。


437:デフォルトの名無しさん
09/09/16 08:50:40
>>436
変なスレが上がってる

438:デフォルトの名無しさん
09/09/16 09:54:55
はじめまして、こんにちは。 Perl 4 や Perl 5.005 の時代からやってきました。
私のような古代人が最近の Perl 5.10 くらいのモダンな Perl のコードを
書けるようになるのにおすすめの書籍やドキュメントがあれば教えてください。


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