Forum Webscript.Ru
		Программирование => Perl => Тема начата: AnnA от 23 Января 2006, 17:37:53
		
			
			- 
				всем приветик. ;)
 вот интересно - кто как с этим разбирается.
 Есть форма, собираемая скриптом же. Т.е. она динамична.
 Предположим есть в ней пару десятков чекбоксов, к ним же по селекту и, т.о., на скрипт она отдает, например вот такое:
 hide_1=2
 desc_2=7
 desc_1=5
 Т.е. цифровой ряд в конструкции _цифра может быть каким угодно, а может вообще не быть параметра, как в примере нет hide_2.
 Как бы мне их проверять? Не только их наличие, но и группировать: hide_1 => desc_1 ну и т.д.
 Ну забрала я в хэш все, что пришло из формы и чего?
 if (exists(что?)) для большого ряда цифр проверять циклом значение hide_цифра?! фи. некрасиво. Да и группировать потом как-то надо.
 М.б. есть какие-то идеи?
- 
				$hide_1=2;
 $desc_2=7;
 $desc_1=5;
 
 my $max_value=4;
 for my $digit (1..$max_value){
 for my $prefix (qw(hide_ desc_)){
 if(defined ${"$prefix$digit"}){
 print qq! $prefix$digit=!.${"$prefix$digit"};
 }
 }
 print "\\n";
 }
 
 Для CGI.pm соотв. ${"$prefix$digit"} заменить на param("$prefix$digit")
 Группируете во внутреннем цикле (если не понятно).
- 
				Kannabismus 
 спасибо. :)
 моё решение выглядит приблизительно так же. если интересно - могу показать. но я просто подумала, что - возможно - есть какое-то иное - более красивое, что ли. Не знаю как сказать чем именно меня не устраивает такой подход... он неуниверсален, что ли. Видите - он завсит целиком вот от этого: my $prefix (qw(hide_ desc_)) в Вашем случае.
 в моем это выглядит так: my @arr=qw(delay_ title_ hide_);
 я люблю универсальность кода. :) но, судя по всему в данном случае ее не добиться.
- 
				Тогда посмотрите на такой вариант:
 
 use CGI qw/:standard/;
 
 param(\'hide_1\',2);
 param(\'desc_2\',7);
 param(\'desc_1\',5);
 
 my $arr;
 
 # группировка
 for(param){
 /^(.+)_(\\d+)$/ or warn "unrecognized param $_";
 $arr->[$2]->{$1}=param($_);
 }
 
 # вывод
 for my $i (0..$#$arr){
 next unless defined $arr->[$i];
 print qq!$_$i -> $arr->[$i]->{$_} ! for sort keys %{$arr->[$i]};
 print "\\n";
 }
 
 perl test.pl
 desc1 -> 5 hide1 -> 2
 desc2 -> 7
 
 
 Для удобства можно использовать CGI::FormBuilder