为什么<stdin>在perl模块文件中不起作用?

Gan*_*thy 1 perl stdin

我编写了Perl模块来从用户那里获取用户名<stdin>并打印出来,如下所示,

use strict;
use warnings;
{
    package Insert;
    sub Insert_DATA
    {
        my $User_Name;
        print "Please Enter the User Name: ";
        chomp ( $User_Name = <stdin> );
        print $User_Name , "\n";
    }
}
return 1; 
Run Code Online (Sandbox Code Playgroud)

但是当我执行这段代码时,它会给出这样的错误,

readline() on unopened filehandle stdin at Insert_Data.pm line 26.
Use of uninitialized value $User_Name in chomp at Insert_Data.pm line 26.
Use of uninitialized value $User_Name in print at Insert_Data.pm line 27.
Run Code Online (Sandbox Code Playgroud)

所以请帮助解决这个问题.

谢谢.

Bor*_*din 9

在perl启动时打开的文件句柄是STDIN或者main::stdin,但是您已经更改了包并且正在尝试读取Insert::stdin,这不存在

如果你写<STDIN><main::stdin>代替它,它将按预期工作

但是你可能不应该在一个包子程序中做顶级IO,我建议你积累主程序中的所有数据并将其作为参数传递给 Insert::Insert_DATA()

我会写这样的东西

main.pl

use strict;
use warnings 'all';

use Insert;

print "Please Enter the User Name: ";

chomp(my $user_name = <STDIN>);

insert_data($user_name);
Run Code Online (Sandbox Code Playgroud)

Insert.pm

package Insert;

use strict;
use warnings 'all';

use Exporter 'import';
our @EXPORT = 'insert_data';

sub insert_data {
    my ($user_name) = @_;

    print $user_name, "\n";
}

1;
Run Code Online (Sandbox Code Playgroud)