gpt4 book ai didi

perl - 如何伪造 Perl 钻石运算符的输入?

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

The answers to this question描述如何伪造 <STDIN> 的输入。我的目标与这个问题类似:我的单元测试需要伪造 <> 的输入.

当我应用相同的技术来伪造 <> 的输入时,它不起作用。 <>的入门级解释让我相信当命令行上没有给出文件时它正在从 STDIN 读取,但情况似乎并非如此。

我正在尝试制作的示例:

#!/usr/bin/perl -w

use strict;
use warnings;
use Carp;
use English qw( -no_match_vars );

sub fake1 {
my $fakeinput = "asdf\n";
open my $stdin, '<', \$fakeinput
or croak "Cannot open STDIN to read from string: $ERRNO";
local *STDIN = $stdin;

my $line = <>;
print "fake1 line is $line\n";

return 0;
}

sub fake2 {
my $fakeinput = "asdf\n";
open my $stdin, '<', \$fakeinput
or croak "Cannot open STDIN to read from string: $ERRNO";
local *STDIN = $stdin;

my $line = <STDIN>;
print "fake2 line is $line\n";

return 0;
}

fake1();
fake2();

fake2作品,fake1才不是。示例 session (“qwerty”是我输入的):

$ perl /tmp/diamond.pl
qwerty
fake1 line is qwerty

fake2 line is asdf

我的问题:

  1. 如何伪造 <> 的输入?
  2. <> 之间有什么区别和<STDIN>当命令行上没有给出文件时? (即为什么链接问题中的技术适用于 <STDIN> 但不适用于 <>?)

谢谢。

最佳答案

在第一次测试中尝试一下:

open ARGV, '<', \$fakeinput
or croak "Cannot open STDIN to read from string: $ERRNO";

my $line = <>;
print "fake1 line is $line\n";

这有一个缺点,那就是不是“本地化”——不知道是否可以将其本地化。(不过,您可以多次执行此操作,并在每次测试之前重置。)

关于perl - 如何伪造 Perl 钻石运算符的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6265790/

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