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修改它的参数并且不返回它,所以你必须将你的条件重写为:

chomp($master_testplan_conf);
if ($master_testplan_conf eq "") {
于 2013-10-28T20:29:41.473 回答
2

chomp的文档中:

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

因此,您需要先 chomp,然后与空字符串进行比较。例如:

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

一些东西:

Chomp 更改字符串,并返回chomped的字符数。在该输入行之后,chomp $master_testplan_conf很可能是1,因此您正在与1空字符串进行比较。

你可以这样做:

chomp ( $master_testplan_conf = <> );

如果你想在一行上做所有事情。

这将读取您的输入并一步完成。此外,<>操作员将从命令行获取文件,<>并将成为命令行上第一个文件的第一行。如果您不想这样做,请使用<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被实际定义,而不仅仅是一个空字符串。现在,这并不重要,因为用户必须至少输入一个\n. $master_testplan_conf漫步永远不会是空的。

但是,如果您决定使用Getopt::Long可能很重要。

于 2013-10-28T20:58:49.527 回答
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 回答
0

您对文件感兴趣,而不是对字符串本身感兴趣,因此请改用 Perl 文件测试。在这种情况下,使用文件测试是否存在 ( -e):

if (-e $master_testplan_conf) {

这触及了问题的核心,让您知道文件系统中是否存在输入。

于 2013-10-28T20:38:31.750 回答