Perl Do...Until 用于用户输入和验证?

Perl Do...Until for User Input and Validation?

尝试循环直到用户提供有效目录:

my $src;

#1. Get source directory
do {
print "Enter the Source Directory of .md Files (eg. /home/user/notes): \n";
chomp($src = <>);

#make sure directory exists
until (-e $src and -d $src);

我想显示以下信息:

print "[ERROR] Invalid Directory Given...Please try again\n";

until条件失败时。

我怎样才能优雅地做到这一点(没有堆积如山的代码)?

旁注:如果有一种语言可以更好(更优雅)地处理这个问题,请分享

my $src;

#1. Get source directory
while(1) {
    print "Enter the Source Directory of .md Files (eg. /home/user/notes): \n";
    chomp($src = <>);
    if (-e $src and -d $src) {
        last;
    } else {
        print "[ERROR] Invalid Directory Given...Please try again\n";
    }
}

所以你想要一个看起来像

的循环
  1. 提示。
  2. 如果输入有效则退出循环。
  3. 显示错误信息。
  4. 转到 1。

代码:

while (1) {
   print "Enter the Source Directory of .md Files (eg. /home/user/notes): ";
   $src = <>;
   die if !defined($src);

   chomp($src);
   last if -d $src;

   print "[ERROR] Invalid Directory Given...Please try again\n";
}

我喜欢 Term::UI 创建用户提示,因为它允许您提供默认值、验证输入和其他漂亮的功能:

use strict;
use warnings;
use 5.010;

use Term::ReadLine;
use Term::UI;

my $term = Term::ReadLine->new('path');

$Term::UI::INVALID = 'Not a valid directory, please try again: ';

my $path = $term->get_reply(
    prompt  => 'Enter the Source Directory of .md Files',
    default => '/root',
    allow   => sub { return -d $_[0] }
);

say $path;

默认值为/root;要使用默认值,您只需在提示符处按 Enter

输出:

Enter the Source Directory of .md Files [/root]: /foo
Not a valid directory, please try again: [/root] /home
/home