gpt4 book ai didi

windows - perl 优先于 glob @argv

转载 作者:可可西里 更新时间:2023-11-01 14:51:56 24 4
gpt4 key购买 nike

因为在 Windows 上 *.csv 不会从命令行扩展到 @ARGV 我通常最终会做类似的事情

map { glob } @ARGV 获取文件名。

然而,我遇到了一个异常,只是想了解到底发生了什么。我刚刚读完《异地奇缘》,所以我可以说我没有完全理解!

use Modern::Perl;

# gets the filelist but then warns
say "Test 1 ", '-' x 20;
do { func($_) for map { glob } @ARGV } or warn "at least one arg expected\n";
say '-' x 27, "\n";

# works ok
say "Test 2 ", '-' x 20;
my @x = map { glob } @ARGV or warn "at least one arg expected\n";
func($_) for @x;
say '-' x 27, "\n";

# prints 2 (there are two files)
say "Test 3 ", '-' x 20;
func($_) for (map { glob } @ARGV or warn "at least one arg expected\n");
say '-' x 27, "\n";

sub func {
say "in func = $_[0]";
}

输出:

Test 1 --------------------
in func = t.csv
in func = t2.csv
at least one arg expected
---------------------------

Test 2 --------------------
in func = t.csv
in func = t2.csv
---------------------------

Test 3 --------------------
in func = 2
---------------------------

测试 1: 我不明白为什么 do 没有真正返回,func 返回最后一个语句是 say,如果有输出则返回 true。还是 for 用作 do 的返回值?

测试 3: 显然标量上下文是隐含的,但如何呢?我在 map 周围使用了括号?

谢谢,理查德。

最佳答案

测试 1

第一种情况是由于 for 语句修饰符而评估为 false(您可能认为它是无效的)。观察:

  DB<1> x do { func($_) for map { glob } @ARGV }
in func = t.csv
in func = t2.csv
0 ''
DB<2> x do { func 't.csv' ; func 't2.csv' }
in func = t.csv
in func = t2.csv
0 1

请注意,它是一个语句修饰符,而不是表达式修饰符。在做出这种区分的语言中,表达式有返回值但没有语句。

Perl 就是这样一种语言。给出简单的程序

#! perl
@a = (1 for 6, 7, 8);

尝试运行它失败并出现语法错误。

syntax error at foo line 2, near "1 for "Execution of foo aborted due to compilation errors.

You might express your intent in the first test more directly

map func($_), map glob, @ARGV or warn "at least one arg expected\n";

给出预期的输出。

Test 1 --------------------in func = t.csvin func = t2.csv---------------------------

测试 3

在第三种情况下,您获得标量上下文,因为这就是 Perl’s logical-or 的方式被定义为工作。

C-style Logical Or

Binary || performs a short-circuit logical OR operation. That is, if the left operand is true, the right operand is not even evaluated. Scalar or list context propagates down to the right operand if it is evaluated.

左操作数始终在二进制(标量)上下文中求值。整个表达式的上下文仅归因于右操作数。

关于windows - perl 优先于 glob @argv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10932327/

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