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


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

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



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

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

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

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

▼ 前スレ
Perlについての質問箱 40箱目
pc12.2ch.net/test/read.cgi/tech/1243631674/

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

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

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

153 名前:デフォルトの名無しさん [2009/08/23(日) 19:12:47 ]
てす

154 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 12:24:55 ]
Perlにはサブルーチンの数に制限がありますか?

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

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

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

156 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 12:48:03 ]

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

157 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 13:05:39 ]
>>155
>Perlにはサブルーチンの数に制限がありますか?

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

158 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 13:16:20 ]
>>154
fireball.loafer.jp/kes/perl/article_134.html

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

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



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

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

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

404 Blog Not Found:perl - $@%&*のよしあし
blog.livedoor.jp/dankogai/archives/50772506.html

164 名前:デフォルトの名無しさん mailto:sage [2009/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

全文
ttp://textup.no.land.to/w/1251470681/


165 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/08/29(土) 00:51:28 ]
>>4 を読め

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

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

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

170 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/08/29(土) 17:57:40 ]
>>171
配列に37文字組み込んでってことですね
大変参考になりました
即レス頂きありがとうございました!

173 名前:デフォルトの名無しさん mailto:sage [2009/08/29(土) 20:27:12 ]
どうでもいいけど、プロは a = a++ なんてコードは書かない

174 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 04:22:41 ]
どうでもいいけど、プロは$aと$bにmyは付けないw

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

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


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



181 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 12:37:25 ]
下記サイトにある、

\*import = cgi_fixup();

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

blog.livedoor.jp/dankogai/archives/50805754.html

182 名前: ◆TWARamEjuA mailto:sage [2009/08/30(日) 13:59:59 BE:3812257-BRZ(10101)]
>>180
reverse

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

184 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/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 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/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 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 19:22:46 ]
Unrecognized character \x81ってエラーが出ていたら笑ってやる

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


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

189 名前:187 mailto:sage [2009/08/31(月) 00:00:57 ]
自己解決しました

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

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

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




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

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

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

194 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/01(火) 01:10:58 ]
>>193
そこまで分かってるなら、あとはコーディングするだけじゃん。
perlの文法がわからないの?
だったら入門書や解説サイトを読めばいいやん。

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

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

197 名前:デフォルトの名無しさん mailto:sage [2009/09/01(火) 01:52:53 ]
思い浮かんだなら形にしてみ

198 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/01(火) 23:24:28 ]
下記サイトに記載されている関数は何をする関数でしょうか?

Perl Internalsについて - Unknown::Programming
d.hatena.ne.jp/fbis/20080627/1214537750

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


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



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

例えば、
my %hogehoge;

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

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

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


203 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん [2009/09/04(金) 09:53:49 ]
>>202
print "@$_" for @{$hogehoge{pos}};

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


207 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん [2009/09/04(金) 16:00:18 ]
Param::Validateモジュールの使い方を日本語で解り易く解説しているWebサイトを教えてください。
CPANに上がってる英文マニュアル見たがさっぱり、自動翻訳してもっとわけわかめになった。

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

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

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




211 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん [2009/09/06(日) 01:09:29 ]
> my $io = IO::File->new($$logfile, 'r');
$$って

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

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

214 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 07:10:02 ]
>>214
気にしたこと無かったけどぐぐったら見つけた

oshiete1.goo.ne.jp/qa1737534.html
こんなやり方あるんだねー

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

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

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

デリファレンス

218 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 08:16:46 ]
>>215
ちょっと違うような。。。

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

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

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



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

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

222 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 12:59:34 ]
gつけて@に入れる

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

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

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

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

226 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 17:13:52 ]
>素直に○○使え

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

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

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

229 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 18:47:04 ]
>>226
素直にやばいしぃ〜〜

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



231 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 19:20:01 ]
>>227
韓国の辞書も北朝鮮の辞書も持ってません

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

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

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

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

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

cpansearch.perl.org/src/GBARR/Scalar-List-Utils-1.21/lib/Scalar/Util/PP.pm

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

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

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

237 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 22:03:40 ]
>>235
日本の辞書の例:
dic.yahoo.co.jp/dsearch?enc=UTF-8&p=%E7%B4%A0%E7%9B%B4&dtype=0&dname=0na&stype=0&pagenum=1&index=11591609974300
>>226は第2義しか頭にないらしい。
日本人なら文脈からして4義が5義と考えるのが普通。

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

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

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



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

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

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


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

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

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

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

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

247 名前:デフォルトの名無しさん [2009/09/07(月) 00:17:22 ]
レスありがとん

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

勉強になったわ

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


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

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

250 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 05:25:56 ]
>>249
データ構造を作り直して回避する。



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

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

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

252 名前:デフォルトの名無しさん mailto:sage [2009/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   # 機能強化版
 のように用途別・目的別に別々のパッケージを用意しようとしているんですが
 こういうのはまずいでしょうか。何か問題があれば教えてください。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<256KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef