4

はい/いいえの回答をユーザーに求めるために、次のPerlコードがあります。ユーザーが yes/no 以外の何かを入力した場合は、プロンプトを出し続けます。それ以外の言葉は受け入れられません。このコードが機能しない理由がわかりません。「nooooo」という回答でテストしましたが、再度プロンプトが表示されることを期待していましたが、while ループには入りません。

ここで私の間違いを見つけるのを手伝ってくれる人はいますか?

@files = A, B, C;

foreach $c (@files) {
  if (-e $c  ) { 
     print " $c already exists. Do you want to overwrite?  (yes or no): ";
     chomp ($file_yes_no = <STDIN>);

     while ($file_yes_no !~ m/yes{1}|no{1}/i )  {
         print "$c already exists. Do you want to overwrite?  (yes or no): ";
         chomp ($file_yes_no = <STDIN>);
     }

     if ($file_yes_no =~ m/yes/i ) {
         if (system ("cp -f /home/old_path/ /home/new_path/ == 0) {
             print "$c successfully copied;
         } else {
             die "Error: Copy failed, Check the message above";
         }
     }
 else { print "No files copied\n; }
4

3 に答える 3

10

eq正規表現の代わりに文字列の等式演算子を使用します。

if( $file_yes_no eq 'yes' ) ...

大文字と小文字を区別したくない場合は、最初に。を使用して小文字に変換しlcます。

正規表現の問題は、文字を含む文字列がyes順番に一致することです。必要に応じて、次のように文字列の開始と終了を一致させることができます。

if ($file_yes_no =~ m/^yes$/i ) ...

しかし、私は個人的に最初のオプションを好みます。

ああ、最初の部分を逃した...うーん。正規表現を使用する必要がある場合も、同じ取引です。

m/^(yes|no)$/i

もう一度、正規表現を避けたいと思います

于 2013-02-05T03:47:55.783 に答える
3

照合のみyesまたはno(大文字と小文字を区別しない)場合は、次のPerl正規表現を使用する必要があります。

m/^(yes|no)$/i

はいの場合のみ、以下を使用してください。

m/^yes$/i
于 2013-02-05T03:48:05.413 に答える
1

正規表現を使用しているためです。文字列の最初または最後に一致する正規表現を書くことができます...次のように:

while( $file_yes_no !~ /^(yes|no)$/ ) {

^とは文字列の$最初と最後です。また、を省略できますm

または、値を明示的に確認することもできます。

while( $file_yes_no ne "yes" and $file_yes_no ne "no" ) {

また、システムコマンドにタイプミスがありますが、それはここにコピーしただけだと思います。そのためにシェルに分岐するべきではありません。あなたに機能File::Copyを与えるものを調べてくださいcopy

于 2013-02-05T03:49:41.227 に答える