Я нашел способ более легкого решения этой проблемы, который также изменил сгенерированный импорт, такой как com.test.testpackagechange.R
, и занимает всего около минуты.
Ваш первый шаг - открыть Android Studio и открыть замену все окна (Mac: cmd + shift + R, Windows я предполагаю: ctrl + shift + R). Введите имя старого пакета и имя под новым именем пакета. Нажмите «Найти». Это может занять некоторое время, поскольку оно также просматривает созданные объекты. Если у вас более 1000 ударов, просто нажмите «Продолжить».
После того, как вы сделали это, нажмите «Заменить все», чтобы заменить старое имя пакета новым 1.
Теперь закройте Android Studio и перейдите в Finder на Mac или Windows Explorer в Windows. Измените имя папок на новое имя пакета, например:
Теперь откройте Android Studio еще раз. Gradle будет синхронизироваться, и ваше имя пакета должно быть изменено на новое.
Я нашел, что это самый простой и тот, который охватывает все области, такие как сгенерированные файлы.
im, не уверенный, существует любой другой путь, чем:
$result = [ $result ] if ref($result) ne 'ARRAY'; foreach .....
Другое решение состояло бы в том, чтобы обернуть вызов к серверу и иметь его, всегда возвращают массив для упрощения остальной части жизни:
sub call_to_service
{
my $returnValue = service::call();
if (ref($returnValue) eq "ARRAY")
{
return($returnValue);
}
else
{
return( [$returnValue] );
}
}
Тогда можно всегда знать о возвращении ссылки на массив даже если это был только один объект.
foreach my $item (@{call_to_service()})
{
...
}
Я осуществил бы рефакторинг код в цикле и затем сделал бы
if( ref $results eq 'ARRAY' ){
my_sub($result) for my $result (@$results);
}else{
my_sub($results);
}
, Конечно, я только сделал бы это, если бы код в цикле был нетривиален.
Я только что проверил это с помощью:
#!/usr/bin/perl -w use strict; sub testit { my @ret = (); if (shift){ push @ret,1; push @ret,2; push @ret,3; }else{ push @ret,"oneonly"; } return \@ret; } foreach my $r (@{testit(1)}){ print $r." test1\n"; } foreach my $r (@{testit()}){ print $r." test2\n"; }
И, кажется, все работает хорошо, поэтому я думаю, что это как-то связано с результатом, возвращаемым из оказание услуг? Если у вас нет контроля над службой возврата, это может быть трудно взломать
Ну, если вы не можете сделать ...
for my $result ( ref $results eq 'ARRAY' ? @$results : $results ) {
# Process result
}
или это ...
for my $result ( ! ref $results ? $results : @$results ) {
# Process result
}
тогда вам, возможно, придется попробовать что-то пугающе волосатое, как это! ....
for my $result ( eval { @$results }, eval $results ) {
# Process result
}
и, чтобы избежать этой опасной строки, она становится ужасно уродливой !! ....
for my $result ( eval { $results->[0] } || $results, eval { @$results[1 .. $#{ $results }] } ) {
# Process result
}
PS. Я предпочел бы абстрагировать его в примере с суб-вызовом call_to_service (), представленном reatmon.