2014-02-18 2 views
0

Надеюсь, что кто-то сможет помочь, почему мой цикл while не завершится, когда я подключу два устройства Android.Perl-цикл для ожидания массива adb-устройств

С помощью исследований SO я сумел сколотить код ниже, однако я добавил цикл while, чтобы дождаться ответа на команду Android adb devices. Я ищу, чтобы сидеть в этом цикле, ожидая подключения двух устройств Android через USB к моему компьютеру или при подключении двух подключенных устройств. Мой код компилируется нормально и может работать через цикл while, когда устройства уже включены и подключены, но когда я запускаю сценарий с USB-кабелями на устройствах Android, отключенных, а затем через несколько секунд подключите USB-соединения на моем ПК скрипт все еще сидит в цикле. Я запускаю этот скрипт на последней версии Strawberry Perl в Windows 7.

Любые указания будут оценены.

Вот код ...

use strict; 
    use warnings qw(all); 

    use IPC::Run3; 
    use Carp qw(croak confess cluck); 
    use Data::Dumper; 

    my @devices = get_devices(); 
    my $devicesattached = ""; 

    while ([email protected]){ 
      get_devices(); 
      print "."; 
      sleep (1); 
      last if @devices; 
    } 

    print "\n\tDevice 1 is $devices[0]"; 
    print "\n\tDevice 2 is $devices[1]\n"; 

    sub get_devices { 
     my $adb_out; 
     run3 ["adb", "devices"], undef, \$adb_out, undef; 
     $? and cluck "Warning: non-zero exit status from adb ($?)"; 

     my @res = $adb_out =~ m/^([[:xdigit:]]+) \s+ device$/xmg; 
     return wantarray ? @res : \@res; 
    } 

Большое спасибо, MikG

+1

После того, как вы входите в цикл, вы никогда не меняете '@ devices. – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot: Ваш комментарий верен и должен быть написан как ответ. – Borodin

+0

@Borodin Работа над ним. – ThisSuitIsBlackNot

ответ

3

Вы никогда не изменить @devices как только вы входите в цикл. Самым простым способом исправить это изменить

while ([email protected]) { 
    get_devices(); 

в

while ([email protected]) { 
    @devices = get_devices(); 

Однако, вы можете упростить код дальше:

my @devices; 
until (@devices = get_devices()) { 
    print "."; 
    sleep 1; 
} 

Обратите внимание, что Perl имеет built-in debugger, который может помочь вам в таких ситуациях это. Запустите его так:

perl -d /path/to/my/script 
+0

Спасибо за отзыв, я дам это завтра и вернусь к вам. Хотя, увидев ваши примеры, кажется очевидным сейчас ... все еще учась! – MikG

+0

Спасибо ThisSuitIsBlackNot, он работает! Это именно то, что я искал. – MikG

Смежные вопросы