gpt4 book ai didi

perl - 我可以确定是否正在从终端运行 Perl 脚本吗?

转载 作者:行者123 更新时间:2023-12-05 09:15:05 27 4
gpt4 key购买 nike

我能否确定是否正在从终端运行 Perl 脚本?

如果我不确定,我宁愿默认假设它是从浏览器运行的。但是,如果有一种方法可以确保它 100% 从终端运行,我会很高兴(用于调试目的)。

最佳答案

这直接取自 ExtUtils::MakeMaker 的 prompt 函数的源代码。我想,有可能有人会竭尽全力来欺骗它。但在某些时候,破损必须归破坏者所有。

对于大多数用途,这应该足够了:

 my $isa_tty = -t STDIN && (-t STDOUT || !(-f STDOUT || -c STDOUT)) ;

首先它会检查 STDIN 是否对 TTY 开放。如果是这样,请检查 STDOUT 是否是。如果 STDOUT 不是,则它也不能打开到文件或字符特殊文件。

更新:

IO::Prompt::Tiny 使用以下内容:

# Copied (without comments) from IO::Interactive::Tiny by Daniel Muey,
# based on IO::Interactive by Damian Conway and brian d foy

sub _is_interactive {
my ($out_handle) = ( @_, select );
return 0 if not -t $out_handle;
if ( tied(*ARGV) or defined( fileno(ARGV) ) ) {
return -t *STDIN if defined $ARGV && $ARGV eq '-';
return @ARGV > 0 && $ARGV[0] eq '-' && -t *STDIN if eof *ARGV;
return -t *ARGV;
}
else {
return -t *STDIN;
}
}

并且 IO::Interactive::Tiny 添加注释来解释发生了什么:

sub is_interactive {
my ($out_handle) = (@_, select); # Default to default output handle

# Not interactive if output is not to terminal...
return 0 if not -t $out_handle;

# If *ARGV is opened, we're interactive if...
if ( tied(*ARGV) or defined(fileno(ARGV)) ) { # IO::Interactive::Tiny: this is the only relavent part of Scalar::Util::openhandle() for 'openhandle *ARGV'
# ...it's currently opened to the magic '-' file
return -t *STDIN if defined $ARGV && $ARGV eq '-';

# ...it's at end-of-file and the next file is the magic '-' file
return @ARGV>0 && $ARGV[0] eq '-' && -t *STDIN if eof *ARGV;

# ...it's directly attached to the terminal
return -t *ARGV;
}

# If *ARGV isn't opened, it will be interactive if *STDIN is attached
# to a terminal.
else {
return -t *STDIN;
}
}

而且我已经验证了 IO::Interactive 中的逻辑反射(reflect)了 IO::Interactive::Tiny 中的逻辑。因此,如果您的目标是在适当的地方进行提示,请考虑使用 IO::Prompt::Tiny。如果您的需求比 IO::Prompt::Tiny 支持的更细微,您可以使用 IO::Interactive::Tiny 来提供此特定功能。

虽然您可能最安全地使用自己的解决方案,但使用这些 CPAN 模块之一的优势在于,它们可能会得到积极维护,并且会收到报告,但如果它们不足以达到其宣传的目的,则会收到报告和最终更新.

关于perl - 我可以确定是否正在从终端运行 Perl 脚本吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53133604/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com