0

私のperlスクリプト全体は次のとおりです。

#!/usr/bin/perl

use v5.10;
use strict;
#use P4;

print "enter location of master_testplan.conf:";
my $master_testplan_conf = <>;

if (chomp($master_testplan_conf) eq "")
{
    $master_testplan_conf = 'suites/MAP/master_testplan.conf';
}

print ":" . $master_testplan_conf . ":";

この回答を参照して、これでうまくいくと思いました。ただし、何らかの理由でifステートメント内でデフォルト値を取得していません。

私は何を間違っていますか?

4

6 に答える 6

5

chompそのようには機能しません。渡された変数を直接変更し、切り捨てられた文字数を返します。代わりにこれを行います:

chomp $master_testplan_conf;
if ($master_testplan_conf eq "") {
    # etc.
}
于 2013-10-28T20:30:09.977 に答える
2

chompのドキュメントから:

..It returns the total number of characters removed from all its arguments..

したがって、最初にチョップしてから、空の文字列と比較する必要があります。例えば:

chomp($master_testplan_conf = <>);
if ($master_testplan_conf eq "") {
    // set default value
}
于 2013-10-28T20:32:23.430 に答える
2

chomp引数を変更して返さないため、条件を次のように書き換える必要があります。

chomp($master_testplan_conf);
if ($master_testplan_conf eq "") {
于 2013-10-28T20:29:41.473 に答える
1

いくつかのこと:

Chomp は文字列を変更し、chompedの文字数を返します。その入力行の後、になるchomp $master_testplan_conf可能性が最も高いため、ヌル文字列1と比較しています。1

次の方法で実行できます。

chomp ( $master_testplan_conf = <> );

1行ですべてを実行したい場合。

これにより、入力が読み取られ、ワンステップでチョップが実行されます。また、<>オペレータはコマンド ラインからファイルを取得し、コマンド ライン<>の最初のファイルの最初の行になります。それをしたくない場合は、次を使用します<STDIN>

chomp ( $master_testplan_conf = <STDIN> );

ユーザーの入力をサニタイズしたい場合があります。少なくとも先頭と末尾の空白を削除します。

$master_testplan_conf =~ s/^\s*(.*?)\s*$/$1/;  # Oh, I wish there was a "trim" command!

このようにして、ユーザーが誤ってスペースバーを数回押しても、スペースを取得しません。ファイルの存在もテストすることもできます。

if ( not -f $master_testplan_conf ) {
    die qq(File "$master_testplan_conf" not found);
}

次の使用もお勧めします。

if ( not defined $master_testplan_conf or $master_testplan_conf eq "" ) {

あなたのif声明のために。これは、実際に定義されているかどうかをテスト$master_test_confし、単なる null 文字列ではありません。現時点では、ユーザーは少なくとも\n. $master_testplan_conf散歩が null になることはありません。

ただし、 Getopt::Longを使用する場合は問題になる場合があります。

于 2013-10-28T20:58:49.527 に答える
0

string自体ではなくファイルに関心があるため、代わりに Perl ファイル テストを使用します。この場合、ファイルの存在テスト ( )を使用します。-e

if (-e $master_testplan_conf) {

これにより、問題の核心に到達し、入力がファイル システムに存在するかどうかを知ることができます。

于 2013-10-28T20:38:31.750 に答える
0

正規表現は、何も変更せずにチェックするのに便利です。

if ($master_testplan_conf =~ /^\s*$/)
{
    $master_testplan_conf = 'suites/MAP/master_testplan.conf';
}

undef もチェックするには:

if (!defined $master_testplan_conf ||  $master_testplan_conf =~ /^\s*$/)
{
    $master_testplan_conf = 'suites/MAP/master_testplan.conf';
}
于 2013-10-28T20:34:50.933 に答える