나는 내가 같은 문자열이 다시 축소 할문자열을 해시로 분해하려면 어떻게해야합니까?
myhashkey => {
key1 => val1,
key2 => val2,
key3 => val3
}
로 폭발 할 문자열
"myhashkey?key1=val1&key2=val2&key3=val3&key4=val4"
에게 있습니다.
지금까지 인덱스를 사용) (내가 얼마나 비싼 인덱스(), 분할을 모르는 손
$arg = $_[0];
#if arg has = it may be key=val string
if(index($arg,'=') > -1){
#if arg has & character it might be key=val&key1=val
if(index($arg,'&') > -1){
#$arg =~ m/[=&\?]/
@r = split(/[=&\?]/,$arg);
my $hashkey = shift(@r)
my %values = @r;
return $class->$orig(key => $k, $value => \%values);
...
}else{
@r = split('=',$arg);
return (key => $r[0], $value => $r[1]);
}
}
하여 값을 만들려고 꽤 지저분 마련했는지, join() 함수는 이것을 수행하는 다른 방법과 비교됩니다. 아마도 map + grep을 사용할 수 있다고 생각했지만 grep 용 regex를 만드는 방법을 알지 못했습니다.
나는 또한 바퀴를 재발 명하고 싶지 않으므로 누군가가 이것을 어떻게하는지 더 잘 알 수 있습니다.
은 BTW이 무스 BUILDARGS 하위에서 어떤 일이 일어나고 업데이트, 그래서 매번 문자열을 구문 분석 할 URI와 같은 모듈을 사용하지 않습니다.
이 내가
my $w = My::Param->new('hashkey?key1=val1&key2=val2&key3=val3');
my $x = My::Param->new(key => 'x', value => '7');
my $y = My::Param->new('y=123');
BUILDARGS
에서 함수를 사용하여 인쇄 덤퍼 (*), 이미 발명 휠의 이름은이 경우{ 'key1' => 'val1', 'key2' => 'val2', 'key3' => 'val3' }
bless({ 'key' => 'hashkey', 'meta_info' => [ #0 'hashkey?key1=val1&key2=val2&key3=val3' ], 'value' => { 'key1' => 'val1', 'key2' => 'val2', 'key3' => 'val3' } }, 'My::Param')
bless({ 'key' => 'x', 'meta_info' => [ #0 'key', #1 'x', #2 'value', #3 '7' ], 'value' => '7' }, 'My::Param')
bless({ 'key' => 'y', 'meta_info' => [ #0 'y=123' ], 'value' => '123' }, 'My:Param')
아를 URI를 사용합니다. 그거야. 하지만 하위가이 해시를 생성 할 때마다 URI 객체를 만들어야한다는 뜻입니까? BUILDARGS {} 하위에서이 일이 더 분명 해졌음을 알았습니다. 다른 방법이 있습니까? – qodeninja
@nodebunny, 나는 당신의 요점을 보지 못했습니다. 그런데 URI 객체를 객체에 저장할 것을 고려 했습니까? "백만"유용한 방법에 즉시 액세스 할 수 있습니다. – ikegami
예, 방금 시도했지만 작동합니다.], 나는 전체 URI 모듈을 필요로하지 않고 단지 param 구문 분석 만합니다. query_form 함수를 내보낼 수 있습니까? – qodeninja