@@ -461,7 +461,7 @@ sub resolve_perl_via_perlbrew {
461461 my ($self , $perl ) = @_ ;
462462 stderr " Resolving perl '${perl} ' via perlbrew" ;
463463 local %ENV = our %orig_env ;
464- barf " Couldn't find perlbrew in \$ PATH"
464+ stderr " Couldn't find perlbrew in \$ PATH" , return
465465 unless my $perlbrew = File::Which::which(' perlbrew' );
466466 my @list = $self -> slurp_command($perlbrew , ' list' );
467467 barf join (
@@ -473,6 +473,23 @@ sub resolve_perl_via_perlbrew {
473473 return $perl_path ;
474474}
475475
476+ sub resolve_perl_via_plenv {
477+ my ($self , $perl ) = @_ ;
478+ stderr " Resolving perl '${perl} ' via plenv" ;
479+ local %ENV = our %orig_env ;
480+ stderr " Couldn't find plenv in \$ PATH" , return
481+ unless my $plenv = File::Which::which(' plenv' );
482+ my @list = $self -> slurp_command($plenv , ' versions' );
483+ barf join (
484+ " \n " , " No such plenv perl '${perl} ', choose from:\n " , @list , ' '
485+ ) unless grep $_ eq $perl , map /(\S+)/, @list ;
486+ my ($perl_path ) = do { local $ENV {PLENV_VERSION } = $perl ;
487+ $self -> slurp_command( $plenv , qw( which perl) );
488+ };
489+ return $perl_path ;
490+ }
491+
492+
476493sub run_config_perl_set {
477494 my ($self , $new_perl ) = @_ ;
478495 barf " plx --config perl set <perl>" unless $new_perl ;
@@ -485,8 +502,13 @@ sub run_config_perl_set {
485502 if (my $resolved = File::Which::which($new_perl )) {
486503 $new_perl = $resolved ;
487504 } else {
488- $new_perl =~ s / ^perl5/ perl-5/ ; # perl binary to perlbrew name
489- $new_perl = $self -> resolve_perl_via_perlbrew($new_perl );
505+ $new_perl =
506+ do {
507+ # convert perl binary to perlbrew name
508+ $self -> resolve_perl_via_perlbrew( do { ( my $new_perl = $new_perl ) =~ s / ^perl5/ perl-5/ ; $new_perl } )
509+ # try plenv, but use the actual spec the user passed.
510+ // $self -> resolve_perl_via_plenv($perl_spec );
511+ } or barf " Couldn't find perl '${new_perl} '" ;
490512 }
491513 }
492514 barf " Not executable: $new_perl " unless -x $new_perl ;
0 commit comments