Changeset 36058
- Timestamp:
- 12/02/09 13:47:47 (3 years ago)
- Location:
- lang/perl/Tie-Trace/trunk
- Files:
-
- 6 modified
-
Changes (modified) (1 diff)
-
README (modified) (1 diff)
-
lib/Tie/Trace.pm (modified) (8 diffs)
-
lib/Tie/Trace_JP.pod (modified) (20 diffs)
-
t/tie-trace-watch.t (modified) (5 diffs)
-
t/tie-trace.t (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lang/perl/Tie-Trace/trunk/Changes
r14192 r36058 1 1 Revision history for Tie-Trace 2 3 0.13 2009-12-02 05:00:00 4 implement CLEAR method for Hash and Array. 5 implement STORESIZE method for Array. 6 7 0.12 2009-11-24 03:49:12 8 fix bug of output variable whose value is 0. 9 Thanks to Christoph. 2 10 3 11 0.11 2008-06-10 01:21:00 -
lang/perl/Tie-Trace/trunk/README
r14192 r36058 37 37 COPYRIGHT AND LICENCE 38 38 39 Copyright (C) 2006-20 07Ktat39 Copyright (C) 2006-2010 Ktat 40 40 41 41 This program is free software; you can redistribute it and/or modify it -
lang/perl/Tie-Trace/trunk/lib/Tie/Trace.pm
r14192 r36058 66 66 $$s = $s_; 67 67 }elsif($s_type eq 'ARRAY'){ 68 @$s = @$s_ ;68 @$s = @$s_ if @$s_; 69 69 }elsif($s_type eq 'HASH'){ 70 %$s = %$s_ ;70 %$s = %$s_ if %$s_; 71 71 } 72 72 return $tied_value; … … 172 172 push @filename, $f; 173 173 push @line, $l; 174 } 174 175 } 176 175 177 my $location = @line == 1 ? " at $filename[0] line $line[0]." : 176 178 join "\n", map " at $filename[$_] line $line[$_].", (0 .. $#filename); … … 190 192 191 193 192 $value ||= '';194 $value = '' unless defined $value; 193 195 if ($class eq 'Scalar') { 194 196 return("${msg} => $value$location"); … … 329 331 } 330 332 333 sub CLEAR{ 334 my($self) = @_; 335 return $self->Tie::Hash::CLEAR; 336 } 337 331 338 # Array ///////////////////////// 332 339 package … … 368 375 my $to = $off + $len -1; 369 376 my $p = $off eq $to ? $off : $off < $to ? "$off .. $to" : $off; 370 my @point = $func? () : (point => $p);377 my @point = ($func and $func ne 'STORESIZE') ? () : (point => $p); 371 378 $self->_carpit(@point, value => \@_, filter => sub {$_[0] =~ s/^\[(.*)\]$/$func\($1\)/} ) unless $QUIET; 372 379 local $QUIET = 1; … … 415 422 } 416 423 424 sub STORESIZE { 425 my ($self, $p) = @_; 426 $self->SPLICE($p, $self->FETCHSIZE - $p); 427 return undef; 428 } 429 430 sub CLEAR{ 431 my($self) = @_; 432 return $self->Tie::Array::CLEAR(); 433 $self->DELETE($_) for 0 .. $#{$self->{storage}}; 434 return undef; 435 } 436 417 437 # Scalar ///////////////////////// 418 438 package … … 438 458 =head1 VERSION 439 459 440 Version 0. 08460 Version 0.13 441 461 442 462 =cut 443 463 444 our $VERSION = '0.1 1';464 our $VERSION = '0.13'; 445 465 446 466 =head1 SYNOPSIS … … 739 759 =head1 COPYRIGHT & LICENSE 740 760 741 Copyright 2006-20 08Ktat, all rights reserved.761 Copyright 2006-2010 Ktat, all rights reserved. 742 762 743 763 This program is free software; you can redistribute it and/or modify it -
lang/perl/Tie-Trace/trunk/lib/Tie/Trace_JP.pod
r14192 r36058 1 =encoding euc-jp 2 3 =head1 ̾� 4 5 Tie::Trace - tie�Ǵ��print�ǥХå��� 6 =head1 �С����� 7 8 Version 0.08 9 10 =head1 ��� 1 =encoding utf8 2 3 =head1 名前 4 5 Tie::Trace - tieで簡単printデバッギング 6 7 =head1 バージョン 8 9 Version 0.12 10 11 =head1 概要 11 12 12 13 use Tie::Trace qw/watch/; # or qw/:all/ … … 25 26 $scalar = "scalar"; # warn "main:: $scalar => scalar at ..." 26 27 27 =head1 �� 28 29 Tie::Trace��rint�ǥХå������Ǥ���tie��äơ�����ѿ�����줿/�����줿��뤳�Ȥ�������� 30 31 ����줿��������������å����ե������Ǥ����� 32 Tie::Trace�ϺƵ�Ū�ˤ���ͤ���å��Ǥ��ޤ��� 33 34 �; 28 =head1 説明 29 30 Tie::Traceはprintでバッキングに有用です。tieを使って、特定の変数に 31 入れられた/削除された値を見ることが出来ます。 32 33 入れられた値が、スカラ/配列/ハッシュリファレンスであれば、 34 Tie::Traceは再帰的にその値をチェックできます。 35 36 例; 35 37 36 38 watch %hash; … … 39 41 $hash{foo}->{a} = 2 # warn "main:: %hash => {foo}{a} => 2" 40 42 41 �Ǥ�����bless���줿����������e���줿�����뤵������ 42 43 =head1 �ؿ���Υ⥸�塼����version 0.06 ���顢C<watch>�ؿ���Ƥ��ޤ��� 44 ���δؿ�ߤ���٤��Ǥ��äơ������tie �ؿ�ȤäƤϤ����ޤ��� 43 ですが、blessされたリファレンスやtieされた値は無視されます。 44 45 =head1 関数 46 47 このモジュールは、version 0.06 から、C<watch>関数を提供しています。 48 この関数のみを使うべきであって、代わりに tie 関数を使ってはいけません。 49 45 50 =over 4 46 51 … … 53 58 watch %hash, %options; 54 59 55 ���<watch>���������ˡ������ä��ꡢ�ä��줿�ꤹ���� 56 �����Τ褦�ʥ��������Ƿٹ𤷤ޤ��� 60 変数をC<watch>し、そこに、値が入ったり、消されたりすると、 61 下記のようなメッセージで警告します。 57 62 58 63 main:: %hash => {key} => value at ... 59 64 60 C<watch> ������ͤ���äƤ��Ƥ⡢����������ie::Trace�Ϥ��ޤ�ư���ޤ���65 C<watch>する前に値が入っていても、問題ありません。Tie::Traceはうまく動きます。 61 66 62 67 my %hash = (key => 'value'); … … 65 70 =back 66 71 67 =head1 ���ץ���68 69 C<watch> �ץ�������ǻȤ����Ȥ��Ǥ��ޤ���70 ����Х����ץ��������������L<����Х���Ƥ�������� 72 =head1 オプション 73 74 C<watch>をオプション付きで使うことができます。 75 グローバルなオプションが欲しければ、L<グローバル変数> を見てください。 71 76 72 77 =over 4 … … 76 81 watch %hash, key => [qw/foo bar/]; 77 82 78 �����ϥå����������Ǥ�������å����륭����������������Ф�����ɽ��������ޤ��� 79 ��ꤵ�줿/�ޥå���������Ǥʤ������ٹ�оݤˤʤ餺��̵�뤵������ 80 �����ɥ���������ꤷ�����������ɥ��������������tie���줿��ǡ������ߤ�ͤǤ��� 81 �����ɥ��������������������̵�뤵������ 82 83 �;83 これはハッシュのためのものです。チェックするキーの名前か、キーに対する正規表現を指定できます。 84 指定された/マッチしたキーでなければ、警告の対象にならず、無視されます。 85 コードリファレンスを指定した場合、コードリファレンスの第一引数は、tieされた値で、第二引数以降は値です。 86 コードリファレンスが偽を返した場合、無視されます。 87 88 例; 84 89 85 90 watch %hash, key => [qw/foo bar/, qr/x/]; … … 94 99 watch %hash, value => [qw/foo bar/]; 95 100 96 ����å���������������Ф�����ɽ��������ޤ��� 97 ��ꤵ�줿/�ޥå������Ǥʤ������ٹ�оݤˤʤ餺��̵�뤵������ 98 �����ɥ���������ꤷ�����������ɥ��������������tie���줿��ǡ������ߤ�ͤǤ��� 99 �����ɥ��������������������̵�뤵������ 100 101 �;101 チェックする値の内容か、値に対する正規表現を指定できます。 102 指定された/マッチした値でなければ、警告の対象にならず、無視されます。 103 コードリファレンスを指定した場合、コードリファレンスの第一引数は、tieされた値で、第二引数以降は値です。 104 コードリファレンスが偽を返した場合、無視されます。 105 106 例; 102 107 103 108 watch %hash, value => [qw/foo bar/, qr/\)/]; … … 112 117 watch %hash, use => [qw/array/]; 113 118 114 ����å�����������������顼�������ϥå����ꤷ�ޤ��� 115 �ǥե����Ǥϡ���ƤΥ����פ�����å��������� 116 117 �;119 チェックする変数のタイプ(スカラー、配列、ハッシュ)を指定します。 120 デフォルトでは、全てのタイプがチェックされます。 121 122 例; 118 123 119 124 watch %hash, use => [qw/array/]; … … 129 134 watch %hash, debug => sub{my($self, @v) = @_; return @v } 130 135 131 ������������ޤ�. �ǥե����Ǥ�dumper"�����åȤ������ޤ��� 132 "dumper" �ϡ����a::Dumper::Dumper�Υե����ޥåȤ�������ޤ�(::Terse = 0 ��::Indent = 0����133 "dumper" ������������ɥ�������������Ȥ����ޤ���134 �����ɥ���������ꤷ�����������ɥ��������������tie���줿��ǡ������ߤ�ͤǤ��� 135 �����ɥ��������μ¹Է���ɽ�����ͤȤ��ƻȤ��ޤ��� 136 値の表現を指定できます. デフォルトでは"dumper"がセットされています。 137 "dumper"は、値をData::Dumper::Dumperのフォーマットで表現します(::Terse = 0 と ::Indent = 0で)。 138 "dumper"の代わりに、コードリファレンスを使うこともできます。 139 コードリファレンスを指定した場合、コードリファレンスの第一引数は、tieされた値で、第二引数以降は値です。 140 コードリファレンスの実行結果が表示用の値として使われます。 136 141 137 142 =item debug_value => [contents/regexs/codref] … … 139 144 watch %hash, debug => sub{my($s,$v) = @_; $v =~tr/op/po/;}, debug_value => [qw/foo boo/]; 140 145 141 value ��ͤ�Ф����ΤǤ�������debug_value�ϡ�debug�ˤ��ù����줿�����Ф����ΤǤ���142 �����ɥ���������ꤷ�����������ɥ��������������tie���줿��ǡ������ߤ�ͤǤ��� 143 �����ɥ��������������������̵�뤵������ 144 145 �;146 valueは値に対するものでしたが、debug_valueは、debugにより加工された後の値に対するものです。 147 コードリファレンスを指定した場合、コードリファレンスの第一引数は、tieされた値で、第二引数以降は値です。 148 コードリファレンスが偽を返した場合、無視されます。 149 150 例; 146 151 147 152 watch %hash, debug => sub{my($s,$v) = @_; $v =~tr/op/po/;}, debug_value => [qw/foo boo/]; … … 155 160 watch %hash, r => 0; 156 161 157 r ��0�Ǥ�����������������äƤ������ˡ��Ƶ�Ū�˥���å����ޤ��ǥե����ϡ�1�Ǥ���162 rが0であれば、リファレンスが入ってきた場合に、再帰的にチェックしません。デフォルトは、1です。 158 163 159 164 =item caller => number/[numbers] … … 161 166 watch %hash, caller => 2; 162 167 163 �������ٹ�å������˱ƶ���ޤ���caller�������ꤷ�ޤ��� 164 �ǥե������Ǥ���0������������������������� 165 166 ������������ꤹ�뤳�Ȥ���ޤ��� 168 これは、警告メッセージに影響します。callerが遡る数を指定します。 169 デフォルトは0です。0より大きくすると、その分遡ります。 170 171 配列リファレンスを指定することも出来ます。 167 172 168 173 watch %hash, caller => [1, 2, 3]; 169 174 170 �����Τ褦������ˤʤ����� 175 下記のような表示になります。 171 176 172 177 main %hash => {key} => 'hoge' at filename line 61. … … 176 181 =back 177 182 178 =head1 ��å� 179 key�� value�� debug_value�ʤɤΥ��ץ�����Ϥ��������ɥ��������ǻȤ��ޤ��� 180 tied �ؿ����Υ�åɤȤ��ƻȤ��ޤ��� 183 =head1 メソッド 184 185 key、 value、 debug_valueなどのオプションに渡されるコードリファレンスで使われます。 186 tied 関数の戻り値のメソッドとして使われます。 181 187 182 188 =over 4 … … 191 197 }; 192 198 193 ���������Ƥ����ե���������ޤ��� 199 値が蓄えられているリファレンスを返します。 194 200 195 201 =item parent … … 202 208 }; 203 209 204 ���Υ�åɤϡ�$self�οƤ�ie������������ޤ��� 205 206 �;210 このメソッドは、$selfの親のtieされている値を返します。 211 212 例; 207 213 208 214 watch my %hash; … … 214 220 =back 215 221 216 =head1 ����Х���over 4 222 =head1 グローバル変数 223 224 =over 4 217 225 218 226 =item %Tie::Trace::OPTIONS 219 227 220 Tie::Trace �Υ���Х륪�ץ����Ǥ���221 ���Υ��ץ���������ʤ��������Υ��ץ������Ȥ��ޤ��� 222 ���Υ��ץ������С��饤�ɤ�������C<watch>�ץ�������ǻȤäƤ�������� 228 Tie::Traceのグローバルオプションです。 229 何のオプションも指定しなければ、このオプションが使われます。 230 このオプションをオーバーライドする場合は、C<watch>をオプション付きで使ってください。 223 231 224 232 %Tie::Trace::OPTIONS = (debug => undef, ...); … … 232 240 =item $Tie::Trace::QUIET 233 241 234 ���ʤ顢�ٹ�Ф��ʤ��ʤ����� 242 真なら、警告を出さなくなります。 235 243 236 244 watch my %hash; … … 244 252 =back 245 253 246 =head1 ��� 254 =head1 著者 255 247 256 Ktat, C<< <ktat.is at gmail.com> >> 248 257 249 =head1 �Х�258 =head1 バグ 250 259 251 260 Please report any bugs or feature requests to … … 255 264 your bug as I make changes. 256 265 257 =head1 ���ݡ��� 258 perldoc���ޥ�Ǥ��Υ⥸�塼���ɥ�����Ĥ����ޤ��� 266 =head1 サポート 267 268 perldocコマンドでこのモジュールのドキュメントを見つけられます。 259 269 260 270 perldoc Tie::Trace 261 271 262 �����ɥ�����euc-jp)�ϲ����ˤʤ����� 272 日本語のドキュメント(euc-jp)は下記になります。 263 273 264 274 perldoc Tie::Trace_JP 265 275 266 �ޤ�������������뤳�Ȥ������:276 また、下記からも情報を見ることが出来ます: 267 277 268 278 =over 4 … … 286 296 =back 287 297 288 =head1 ���� 289 JN�Ͽ������ٹ�å�����(0.06����Υ����ǥ��������� 290 291 =head1 �� & �饤���� 292 Copyright 2006-2007 Ktat, all rights reserved. 298 =head1 感謝 299 300 JNは新しい警告メッセージ(0.06から)のアイデアをくれました。 301 302 =head1 著作権 & ライセンス 303 304 Copyright 2006-2009 Ktat, all rights reserved. 293 305 294 306 This program is free software; you can redistribute it and/or modify it -
lang/perl/Tie-Trace/trunk/t/tie-trace-watch.t
r14192 r36058 1 use Test::More tests => 2 3;1 use Test::More tests => 24; 2 2 3 3 local $SIG{__DIE__} = sub {print "ERROR: ", @_;}; … … 5 5 6 6 use_ok("Tie::Trace"); 7 use Tie::Hash; 7 #use Tie::Hash; 8 9 8 10 9 11 { … … 12 14 13 15 ok(open(STDERR, ">", \$err), "open"); 16 17 18 14 19 my %hash = (); 15 20 Tie::Trace::watch(\%hash, r => 1); … … 23 28 like($err, qr/^main:: \%hash => \{1\} => \{/m, '$hash{1} = $x'); 24 29 30 25 31 $hash{1}->{hoge} = 3; # hoge -- 3 26 32 like($err, qr/^main:: \%hash => \{1\}\{hoge\} => 3/m, '$hash{1}->{hoge} = 3'); 33 34 27 35 28 36 $hash{1}->{hoge} = 4; # hoge -- 4 29 37 like($err, qr/^main:: \%hash => \{1\}{hoge} => 4/m, '$hash{1}->{hoge} = 4'); 30 38 39 close STDERR; 40 41 open STDERR, '>', \$err or die $!; 42 43 $hash{1}->{hoge} = 0; # hoge -- 0 44 like($err, qr/^main:: \%hash => \{1\}{hoge} => 0/m, '$hash{1}->{hoge} = 0'); 45 46 31 47 $hash{2}->{hoge} = 222; # 2 -- HASH(...) 32 48 # hoge - 222 33 49 like($err, qr/^main:: \%hash => \{2\} => \{/m, '$hash{2} = HASH'); 34 50 like($err, qr/^main:: \%hash => \{2\}\{hoge\} => 222/m, '$hash{2}->{hoge} = 222'); 51 35 52 36 53 push(@{$hash{1}->{hoge3}}, "array");# array … … 77 94 $hash4{xxx}->{xxx} = 'var'; 78 95 unlike($err, qr/^\s*\{xxx\} => 'var'/m, q{$hash{xxx}->{xxx} = 'var'}); 79 96 80 97 =iranai 81 98 -
lang/perl/Tie-Trace/trunk/t/tie-trace.t
r14192 r36058 1 use Test::More tests => 36;1 use Test::More tests => 45; 2 2 3 use_ok("Tie::Trace" );3 use_ok("Tie::Trace", ":all"); 4 4 use Tie::Hash; 5 use Tie::Trace ":all"; 5 6 6 7 { … … 12 13 13 14 my %hash; 14 tie %hash, "Tie::Trace", r => 1, debug => undef;15 watch(%hash, r => 1, debug => undef); 15 16 16 17 my $s; … … 18 19 19 20 $hash{1} = $x; # 1 -- HASH(....) 20 like($err, qr/^ \{1\} => HASH/m, '$hash{1} = $x');21 like($err, qr/^main:: \%hash => \{1\} => HASH/m, '$hash{1} = $x'); 21 22 22 23 $hash{1}->{hoge} = 3; # hoge -- 3 23 like($err, qr/^ \{1\}\{hoge\} => 3/m, '$hash{1}->{hoge} = 3');24 like($err, qr/^main:: \%hash => \{1\}\{hoge\} => 3/m, '$hash{1}->{hoge} = 3'); 24 25 25 26 $hash{1}->{hoge} = 4; # hoge -- 4 26 like($err, qr/^ \{1\}{hoge} => 4/m, '$hash{1}->{hoge} = 4');27 like($err, qr/^main:: \%hash => \{1\}{hoge} => 4/m, '$hash{1}->{hoge} = 4'); 27 28 28 29 my $s2; … … 30 31 $x->{hoge5} = $array; 31 32 ${$array->[2]} = "4"; 32 like($err, qr/^ \{1\}\{hoge5\}\[2] => 4/m, '${$array->[2]} = "4"');33 like($err, qr/^main:: \%hash => \{1\}\{hoge5\}\[2] => 4/m, '${$array->[2]} = "4"'); 33 34 delete $x->{hoge5}; 34 35 35 36 ${$x->{hoge4}} = "0000"; # 0000 36 like($err, qr/^ \{1\}\{hoge4\} => 0000/m, '${$x->{hoge4}} = "0000"');37 like($err, qr/^main:: \%hash => \{1\}\{hoge4\} => 0000/m, '${$x->{hoge4}} = "0000"'); 37 38 38 39 $hash{2}->{hoge} = 222; # 2 -- HASH(...) 39 40 # hoge - 222 40 like($err, qr/^ \{2\} => HASH/m, '$hash{2}->{hoge} = 222');41 like($err, qr/^ \{2\}\{hoge\} => 222/m, '$hash{2}->{hoge} = 222');41 like($err, qr/^main:: \%hash => \{2\} => HASH/m, '$hash{2}->{hoge} = 222'); 42 like($err, qr/^main:: \%hash => \{2\}\{hoge\} => 222/m, '$hash{2}->{hoge} = 222'); 42 43 43 44 push(@{$hash{1}->{hoge3}}, "array");# array 44 like($err, qr/^ \@\{\{1\}\{hoge3\}\} => ARRAY/m, 'push(@{$hash{1}->{hoge3}}, "array")');45 like($err, qr/^main:: \%hash => \@\{\{1\}\{hoge3\}\} => ARRAY/m, 'push(@{$hash{1}->{hoge3}}, "array")'); 45 46 46 47 push(@{$hash{1}->{hoge3}}, "array2");# array 47 like($err, qr/^ \@\{\{1\}\{hoge3\}\} => ARRAY/m, 'push(@{$hash{1}->{hoge3}}, "array2")');48 like($err, qr/^main:: \%hash => \@\{\{1\}\{hoge3\}\} => ARRAY/m, 'push(@{$hash{1}->{hoge3}}, "array2")'); 48 49 49 50 is_deeply([sort keys(%hash)], [1,2], "hash key check"); # 1, 2, 3, 4 … … 51 52 is_deeply([sort @{$hash{1}->{hoge3}}], [qw/a array array2 b c d e/], "array check"); 52 53 $hash{xxx}->{bless} = bless {}; 53 like($err, qr/^ \{xxx\}\{bless} => main=HASH/m, '$hash{xxx}->{bless} = bless {}');54 like($err, qr/^main:: \%hash => \{xxx\}\{bless} => main=HASH/m, '$hash{xxx}->{bless} = bless {}'); 54 55 $hash{xxx}->{bless}->{bless_hoge} = 1; 55 unlike($err, qr/^ \{xxx\}\{bless_hoge} => 1/m, '$hash{xxx}->{bless}->{bless_hoge} = 1');56 unlike($err, qr/^main:: \%hash => \{xxx\}\{bless_hoge} => 1/m, '$hash{xxx}->{bless}->{bless_hoge} = 1'); 56 57 my %tied; 57 58 tie %tied, "Tie::StdHash"; 58 59 $hash{xxx}->{tied} = \%tied; 59 like($err, qr/^ \{xxx\}\{tied\} => HASH/m, '$hash{xxx}->{tied} = HASH');60 like($err, qr/^main:: \%hash => \{xxx\}\{tied\} => HASH/m, '$hash{xxx}->{tied} = HASH'); 60 61 $hash{xxx}->{tied}->{a} = 1234; 61 like($err, qr/^ \{xxx\}\{tied\}\{a\} => 1234/m, '$hash{xxx}->{tied}->{a} = 1234');62 like($err, qr/^main:: \%hash => \{xxx\}\{tied\}\{a\} => 1234/m, '$hash{xxx}->{tied}->{a} = 1234'); 62 63 close STDERR; 63 64 … … 65 66 66 67 my %hash2; 67 tie %hash2, "Tie::Trace", key => ["foo", "bar"]or die $!;68 watch(%hash2, key => ["foo", "bar"]) or die $!; 68 69 69 70 $hash2{foo} = 1; 70 like($err, qr/^ \{foo\} => 1/m, '$hash{foo} = 1');71 like($err, qr/^main:: \%hash2 => \{foo\} => 1/m, '$hash{foo} = 1'); 71 72 $hash2{bar} = 1; 72 like($err, qr/^ \{bar\} => 1/m, '$hash{bar} = 1');73 like($err, qr/^main:: \%hash2 => \{bar\} => 1/m, '$hash{bar} = 1'); 73 74 $hash2{xxx} = {}; 74 unlike($err, qr/^ \{xxx\} => HASH/m, '$hash{xxx} = {}');75 unlike($err, qr/^main:: \%hash2 => \{xxx\} => HASH/m, '$hash{xxx} = {}'); 75 76 $hash2{xxx}->{foo} = 2; 76 like($err, qr/^ \{xxx\}\{foo\} => 2/m, '$hash{xxx}->{foo} = 2');77 like($err, qr/^main:: \%hash2 => \{xxx\}\{foo\} => 2/m, '$hash{xxx}->{foo} = 2'); 77 78 $hash2{xxx}->{bar} = 2; 78 like($err, qr/^ \{xxx\}\{bar\} => 2/m, '$hash{xxx}->{bar} = 2');79 like($err, qr/^main:: \%hash2 => \{xxx\}\{bar\} => 2/m, '$hash{xxx}->{bar} = 2'); 79 80 $hash2{xxx}->{xxx} = 2; 80 unlike($err, qr/^ \{xxx\}\{xxx\} => 2/m, '$hash{xxx}->{xxx} = 2');81 unlike($err, qr/^main:: \%hash2 => \{xxx\}\{xxx\} => 2/m, '$hash{xxx}->{xxx} = 2'); 81 82 82 83 close STDERR; … … 84 85 85 86 my %hash3; 86 tie %hash3, "Tie::Trace", value => ["foo", "bar"]or die $!;87 watch(%hash3, value => ["foo", "bar"]) or die $!; 87 88 88 89 $hash3{oo} = 'foo'; 89 like($err, qr/^ \{oo\} => 'foo'/m, q{$hash{oo} = 'foo'});90 like($err, qr/^main:: \%hash3 => \{oo\} => 'foo'/m, q{$hash{oo} = 'foo'}); 90 91 $hash3{ar} = 'bar'; 91 like($err, qr/^ \{ar\} => 'bar'/m, q{$hash{ar} = 'bar'});92 like($err, qr/^main:: \%hash3 => \{ar\} => 'bar'/m, q{$hash{ar} = 'bar'}); 92 93 $hash3{xxx} = {}; 93 unlike($err, qr/^ \{xxx\} => HASH/m, '$hash{xxx} = {}');94 unlike($err, qr/^main:: \%hash3 => \{xxx\} => HASH/m, '$hash{xxx} = {}'); 94 95 $hash3{xxx}->{oox} = 'foo'; 95 like($err, qr/^ \{xxx\}\{oox\} => 'foo'/m, q{$hash{xxx}->{oo} = 'foo'});96 like($err, qr/^main:: \%hash3 => \{xxx\}\{oox\} => 'foo'/m, q{$hash{xxx}->{oo} = 'foo'}); 96 97 $hash3{xxx}->{arx} = 'bar'; 97 like($err, qr/^ \{xxx\}\{arx\} => 'bar'/m, q{$hash{xxx}->{ar} = 'bar'});98 like($err, qr/^main:: \%hash3 => \{xxx\}\{arx\} => 'bar'/m, q{$hash{xxx}->{ar} = 'bar'}); 98 99 $hash3{xxx}->{xxx} = 'var'; 99 unlike($err, qr/^ \{xxx\}\{xxx\} => 'var'/m, q{$hash{xxx}->{xxx} = 'var'});100 unlike($err, qr/^main:: \%hash3 => \{xxx\}\{xxx\} => 'var'/m, q{$hash{xxx}->{xxx} = 'var'}); 100 101 101 102 close STDERR; … … 103 104 104 105 my %hash4; 105 tie(%hash4, 'Tie::Trace', value => ['foo', 'bar'], r => 0) or die $!;106 watch(%hash4, value => ['foo', 'bar'], r => 0) or die $!; 106 107 107 108 $hash4{oo} = 'foo'; 108 like($err, qr/^ \{oo\} => 'foo'/m, q{$hash{oo} = 'foo'});109 like($err, qr/^main:: \%hash4 => \{oo\} => 'foo'/m, q{$hash{oo} = 'foo'}); 109 110 $hash4{ar} = 'bar'; 110 like($err, qr/^ \{ar\} => 'bar'/m, q{$hash{ar} = 'bar'});111 like($err, qr/^main:: \%hash4 => \{ar\} => 'bar'/m, q{$hash{ar} = 'bar'}); 111 112 $hash4{xxx} = {}; 112 unlike($err, qr/^ \{xxx\}\{xxx\} => HASH/m, '$hash{xxx} = {}');113 unlike($err, qr/^main:: \%hash4 => \{xxx\}\{xxx\} => HASH/m, '$hash{xxx} = {}'); 113 114 $hash4{xxx}->{ooxx} = 'foo'; 114 unlike($err, qr/^ \{xxx\}\{oox\} => 'foo'/m, q{$hash{xxx}->{oo} = 'foo'});115 unlike($err, qr/^main:: \%hash4 => \{xxx\}\{oox\} => 'foo'/m, q{$hash{xxx}->{oo} = 'foo'}); 115 116 $hash4{xxx}->{arx} = 'bar'; 116 unlike($err, qr/^ \{xxx\}\{arx\} => 'bar'/m, q{$hash{xxx}->{ar} = 'bar'});117 unlike($err, qr/^main:: \%hash4 => \{xxx\}\{arx\} => 'bar'/m, q{$hash{xxx}->{ar} = 'bar'}); 117 118 $hash4{xxx}->{xxx} = 'var'; 118 unlike($err, qr/^\{xxx\}\{xxx\} => 'var'/m, q{$hash{xxx}->{xxx} = 'var'}); 119 unlike($err, qr/^main:: \%hash4 => \{xxx\}\{xxx\} => 'var'/m, q{$hash{xxx}->{xxx} = 'var'}); 120 121 close STDERR; 122 open STDERR, '>', \$err or die $!; 123 124 my @array; 125 watch(@array) or die $!; 126 @array = (1,2,3,4); 127 like($err, qr{^main:: \@array\[0\] => 1}m); 128 like($err, qr{^main:: \@array\[1\] => 2}m); 129 like($err, qr{^main:: \@array\[2\] => 3}m); 130 like($err, qr{^main:: \@array\[3\] => 4}m); 131 @array = (8,7,6,5); 132 like($err, qr{^main:: \@array\[0\] => 8}m); 133 like($err, qr{^main:: \@array\[1\] => 7}m); 134 like($err, qr{^main:: \@array\[2\] => 6}m); 135 like($err, qr{^main:: \@array\[3\] => 5}m); 136 undef @array; 137 like($err, qr{^main:: \@array\[0 .. 3\] => STORESIZE\(\)}m); 138 139 close STDERR; 119 140 } 120
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)