从标准输入读取参数时出现意外行为

Posted

技术标签:

【中文标题】从标准输入读取参数时出现意外行为【英文标题】:Unexpected behaviour when reading parameters from standard input 【发布时间】:2020-05-16 23:37:06 【问题描述】:
sub Solution
    $matchflag=0;
    $occurence=0;

    #OUPTUT [uncomment & modify if required]
    my $ind=index($m,$p);


    if ($ind!=-1)
       $matchflag=1;
    

    $occurence= () = $m =~ /$q/g;


    print("$matchflag\n");
    print($occurence);


#INPUT [uncomment & modify if required]
$n=<STDIN>;
$m=<STDIN>;
$p=<STDIN>;
$q=<STDIN>;


Solution();

你好,有人能告诉我这段代码有什么问题吗? 它给了我以下输出。

6
naman
nam
n
0
1

显然 0 应该是 1,因为 nam 存在于 naman 字符串中。并且 1 应该是 2,因为 n 在字符串中出现了两次。

这段代码有什么问题?

【问题讨论】:

您需要告诉我们您的输入是什么。请edit您的问题并包括您如何调用此代码。 您应该始终使用use strict; use warnings;。您有许多范围界定问题。 【参考方案1】:

当您从&lt;STDIN&gt; 读取时,您需要删除字符串末尾的\n 换行符,

chomp for
    $n=<STDIN>,
    $m=<STDIN>,
    $p=<STDIN>,
    $q=<STDIN>,
;

您可能还想通过使用my 词法而不是全局变量来考虑更好的范围界定,以及一些使生活更轻松的检查,例如use strict; use warnings;

【讨论】:

chomp($n=&lt;STDIN&gt;)$n=&lt;STDIN&gt;; chomp($n) 效果同样好。 另外,有没有办法在接受如此简单的输入时避免多次写入 是的,foreach 和变量别名。 chomp($_=) for $n, $m;【参考方案2】:

OP可能意味着代码如下

use strict;
use warnings;

my $n = input();
my $m = input();
my $p = input();
my $q = input();

Solution();

sub input
    my $input = <STDIN>;

    chomp $input;

    return $input;


sub Solution
    my $matchflag=0;
    my $occurence=0;

    #OUPTUT [uncomment & modify if required]
    my $ind=index($m,$p);


    if ($ind!=-1)
       $matchflag=1;
    

    $occurence= () = $m =~ /$q/g;


    print("Match flag: $matchflag\n");
    print("Ocurance:   $occurence\n");

输出

6
naman
nam
n
Match flag: 1
Ocurance:   2

【讨论】:

所以在 Java 或 C 这样的语言中,我们需要在函数调用期间传递参数,以便函数可以访问这些变量。在这里,您在调用函数时不传递参数。这是怎么回事? 函数可能有也可能没有任何参数,它可以返回也可以不返回任何东西。某些功能可以例如优化数据库,验证程序是否成功完成并且不返回任何内容。有些函数可能有参数,用它们做一些操作然后返回结果——例如 calculator 操作为加、减、乘、幂。

以上是关于从标准输入读取参数时出现意外行为的主要内容,如果未能解决你的问题,请参考以下文章

输入意外结束:从 AWS API Gateway 获取响应时出现 ApolloClient 错误

分析 CUDA 代码:合并内存读取时出现意外指令计数

go:读取标准输入

go:读取标准输入

如何加载程序读取标准输入并在 gdb 中获取参数?

第二章 从键盘或文件中获取标准输入:read命令