⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 11_hashassign.t

📁 source of perl for linux application,
💻 T
字号:
#!./perl -wBEGIN {    if ($ENV{PERL_CORE}) {	chdir 't' if -d 't';	@INC = '../lib';    }}use Test::More;# use strict;use Hash::Util::FieldHash qw( :all);no warnings 'misc';plan tests => 215;my @comma = ("key", "value");# The peephole optimiser already knows that it should convert the string in# $foo{string} into a shared hash key scalar. It might be worth making the# tokeniser build the LHS of => as a shared hash key scalar too.# And so there's the possiblility of it going wrong# And going right on 8 bit but wrong on utf8 keys.# And really we should also try utf8 literals in {} and => in utf8.t# Some of these tests are (effectively) duplicated in each.tfieldhash my %comma;%comma = @comma;ok (keys %comma == 1, 'keys on comma hash');ok (values %comma == 1, 'values on comma hash');# defeat any tokeniser or optimiser cunningmy $key = 'ey';is ($comma{"k" . $key}, "value", 'is key present? (unoptimised)');# now with cunning:is ($comma{key}, "value", 'is key present? (maybe optimised)');#tokeniser may treat => differently.my @temp = (key=>undef);is ($comma{$temp[0]}, "value", 'is key present? (using LHS of =>)');@temp = %comma;ok (eq_array (\@comma, \@temp), 'list from comma hash');@temp = each %comma;ok (eq_array (\@comma, \@temp), 'first each from comma hash');@temp = each %comma;ok (eq_array ([], \@temp), 'last each from comma hash');my %temp = %comma;ok (keys %temp == 1, 'keys on copy of comma hash');ok (values %temp == 1, 'values on copy of comma hash');is ($temp{'k' . $key}, "value", 'is key present? (unoptimised)');# now with cunning:is ($temp{key}, "value", 'is key present? (maybe optimised)');@temp = (key=>undef);is ($comma{$temp[0]}, "value", 'is key present? (using LHS of =>)');@temp = %temp;ok (eq_array (\@temp, \@temp), 'list from copy of comma hash');@temp = each %temp;ok (eq_array (\@temp, \@temp), 'first each from copy of comma hash');@temp = each %temp;ok (eq_array ([], \@temp), 'last each from copy of comma hash');my @arrow = (Key =>"Value");fieldhash my %arrow;%arrow = @arrow;ok (keys %arrow == 1, 'keys on arrow hash');ok (values %arrow == 1, 'values on arrow hash');# defeat any tokeniser or optimiser cunning$key = 'ey';is ($arrow{"K" . $key}, "Value", 'is key present? (unoptimised)');# now with cunning:is ($arrow{Key}, "Value", 'is key present? (maybe optimised)');#tokeniser may treat => differently.@temp = ('Key', undef);is ($arrow{$temp[0]}, "Value", 'is key present? (using LHS of =>)');@temp = %arrow;ok (eq_array (\@arrow, \@temp), 'list from arrow hash');@temp = each %arrow;ok (eq_array (\@arrow, \@temp), 'first each from arrow hash');@temp = each %arrow;ok (eq_array ([], \@temp), 'last each from arrow hash');%temp = %arrow;ok (keys %temp == 1, 'keys on copy of arrow hash');ok (values %temp == 1, 'values on copy of arrow hash');is ($temp{'K' . $key}, "Value", 'is key present? (unoptimised)');# now with cunning:is ($temp{Key}, "Value", 'is key present? (maybe optimised)');@temp = ('Key', undef);is ($arrow{$temp[0]}, "Value", 'is key present? (using LHS of =>)');@temp = %temp;ok (eq_array (\@temp, \@temp), 'list from copy of arrow hash');@temp = each %temp;ok (eq_array (\@temp, \@temp), 'first each from copy of arrow hash');@temp = each %temp;ok (eq_array ([], \@temp), 'last each from copy of arrow hash');fieldhash my %direct;fieldhash my %slow;%direct = ('Camel', 2, 'Dromedary', 1);$slow{Dromedary} = 1;$slow{Camel} = 2;ok (eq_hash (\%slow, \%direct), "direct list assignment to hash");%direct = (Camel => 2, 'Dromedary' => 1);ok (eq_hash (\%slow, \%direct), "direct list assignment to hash using =>");$slow{Llama} = 0; # A llama is not a camel :-)ok (!eq_hash (\%direct, \%slow), "different hashes should not be equal!");my (%names, %names_copy);fieldhash %names;%names = ('$' => 'Scalar', '@' => 'Array', # Grr '          '%', 'Hash', '&', 'Code');%names_copy = %names;ok (eq_hash (\%names, \%names_copy), "check we can copy our hash");sub in {  my %args = @_;  return eq_hash (\%names, \%args);}ok (in (%names), "pass hash into a method");sub in_method {  my $self = shift;  my %args = @_;  return eq_hash (\%names, \%args);}ok (main->in_method (%names), "pass hash into a method");sub out {  return %names;}%names_copy = out ();ok (eq_hash (\%names, \%names_copy), "pass hash from a subroutine");sub out_method {  my $self = shift;  return %names;}%names_copy = main->out_method ();ok (eq_hash (\%names, \%names_copy), "pass hash from a method");sub in_out {  my %args = @_;  return %args;}%names_copy = in_out (%names);ok (eq_hash (\%names, \%names_copy), "pass hash to and from a subroutine");sub in_out_method {  my $self = shift;  my %args = @_;  return %args;}%names_copy = main->in_out_method (%names);ok (eq_hash (\%names, \%names_copy), "pass hash to and from a method");my %names_copy2 = %names;ok (eq_hash (\%names, \%names_copy2), "check copy worked");# This should get ignored.%names_copy = ('%', 'Associative Array', %names);ok (eq_hash (\%names, \%names_copy), "duplicates at the start of a list");# This should not%names_copy = ('*', 'Typeglob', %names);$names_copy2{'*'} = 'Typeglob';ok (eq_hash (\%names_copy, \%names_copy2), "duplicates at the end of a list");%names_copy = ('%', 'Associative Array', '*', 'Endangered species', %names,              '*', 'Typeglob',);ok (eq_hash (\%names_copy, \%names_copy2), "duplicates at both ends");# And now UTF8foreach my $chr (60, 200, 600, 6000, 60000) {  # This little game may set a UTF8 flag internally. Or it may not. :-)  my ($key, $value) = (chr ($chr) . "\x{ABCD}", "$chr\x{ABCD}");  chop ($key, $value);  my @utf8c = ($key, $value);  fieldhash my %utf8c;  %utf8c = @utf8c;  ok (keys %utf8c == 1, 'keys on utf8 comma hash');  ok (values %utf8c == 1, 'values on utf8 comma hash');  # defeat any tokeniser or optimiser cunning  is ($utf8c{"" . $key}, $value, 'is key present? (unoptimised)');  my $tempval = sprintf '$utf8c{"\x{%x}"}', $chr;  is (eval $tempval, $value, "is key present? (maybe $tempval is optimised)");  $tempval = sprintf '@temp = ("\x{%x}" => undef)', $chr;  eval $tempval or die "'$tempval' gave $@";  is ($utf8c{$temp[0]}, $value, 'is key present? (using LHS of $tempval)');  @temp = %utf8c;  ok (eq_array (\@utf8c, \@temp), 'list from utf8 comma hash');  @temp = each %utf8c;  ok (eq_array (\@utf8c, \@temp), 'first each from utf8 comma hash');  @temp = each %utf8c;  ok (eq_array ([], \@temp), 'last each from utf8 comma hash');  %temp = %utf8c;  ok (keys %temp == 1, 'keys on copy of utf8 comma hash');  ok (values %temp == 1, 'values on copy of utf8 comma hash');  is ($temp{"" . $key}, $value, 'is key present? (unoptimised)');  $tempval = sprintf '$temp{"\x{%x}"}', $chr;  is (eval $tempval, $value, "is key present? (maybe $tempval is optimised)");  $tempval = sprintf '@temp = ("\x{%x}" => undef)', $chr;  eval $tempval or die "'$tempval' gave $@";  is ($temp{$temp[0]}, $value, "is key present? (using LHS of $tempval)");  @temp = %temp;  ok (eq_array (\@temp, \@temp), 'list from copy of utf8 comma hash');  @temp = each %temp;  ok (eq_array (\@temp, \@temp), 'first each from copy of utf8 comma hash');  @temp = each %temp;  ok (eq_array ([], \@temp), 'last each from copy of utf8 comma hash');  my $assign = sprintf '("\x{%x}" => "%d")', $chr, $chr;  print "# $assign\n";  my (@utf8a) = eval $assign;  fieldhash my %utf8a;  %utf8a = @utf8a;  ok (keys %utf8a == 1, 'keys on utf8 arrow hash');  ok (values %utf8a == 1, 'values on utf8 arrow hash');  # defeat any tokeniser or optimiser cunning  is ($utf8a{$key . ""}, $value, 'is key present? (unoptimised)');  $tempval = sprintf '$utf8a{"\x{%x}"}', $chr;  is (eval $tempval, $value, "is key present? (maybe $tempval is optimised)");  $tempval = sprintf '@temp = ("\x{%x}" => undef)', $chr;  eval $tempval or die "'$tempval' gave $@";  is ($utf8a{$temp[0]}, $value, "is key present? (using LHS of $tempval)");  @temp = %utf8a;  ok (eq_array (\@utf8a, \@temp), 'list from utf8 arrow hash');  @temp = each %utf8a;  ok (eq_array (\@utf8a, \@temp), 'first each from utf8 arrow hash');  @temp = each %utf8a;  ok (eq_array ([], \@temp), 'last each from utf8 arrow hash');  %temp = %utf8a;  ok (keys %temp == 1, 'keys on copy of utf8 arrow hash');  ok (values %temp == 1, 'values on copy of utf8 arrow hash');  is ($temp{'' . $key}, $value, 'is key present? (unoptimised)');  $tempval = sprintf '$temp{"\x{%x}"}', $chr;  is (eval $tempval, $value, "is key present? (maybe $tempval is optimised)");  $tempval = sprintf '@temp = ("\x{%x}" => undef)', $chr;  eval $tempval or die "'$tempval' gave $@";  is ($temp{$temp[0]}, $value, "is key present? (using LHS of $tempval)");  @temp = %temp;  ok (eq_array (\@temp, \@temp), 'list from copy of utf8 arrow hash');  @temp = each %temp;  ok (eq_array (\@temp, \@temp), 'first each from copy of utf8 arrow hash');  @temp = each %temp;  ok (eq_array ([], \@temp), 'last each from copy of utf8 arrow hash');}# now some tests for hash assignment in scalar and list context with# duplicate keys [perl #24380]{    my %h; my $x; my $ar;    fieldhash %h;    is( (join ':', %h = (1) x 8), '1:1',	'hash assignment in list context removes duplicates' );    is( scalar( %h = (1,2,1,3,1,4,1,5) ), 2,	'hash assignment in scalar context' );    is( scalar( ($x,%h) = (0,1,2,1,3,1,4,1,5) ), 3,	'scalar + hash assignment in scalar context' );    $ar = [ %h = (1,2,1,3,1,4,1,5) ];    is( $#$ar, 1, 'hash assignment in list context' );    is( "@$ar", "1 5", '...gets the last values' );    $ar = [ ($x,%h) = (0,1,2,1,3,1,4,1,5) ];    is( $#$ar, 2, 'scalar + hash assignment in list context' );    is( "@$ar", "0 1 5", '...gets the last values' );}# test stringification of keys{    no warnings 'once', 'misc';    my @types = qw( SCALAR         ARRAY HASH CODE    GLOB);    my @refs =    ( \ do { my $x }, [],   {},  sub {}, \ *x);    my(%h, %expect);    fieldhash %h;    @h{@refs} = @types;    @expect{map "$_", @refs} = @types;    ok (!eq_hash(\%h, \%expect), 'unblessed ref stringification different');    bless $_ for @refs;    %h = (); %expect = ();    @h{@refs} = @types;    @expect{map "$_", @refs} = @types;    ok (!eq_hash(\%h, \%expect), 'blessed ref stringification different');}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -