gpt4 book ai didi

perl - 为什么 File::Slurp 在应该返回一个列表时返回一个标量?

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

我是 File::Slurp 模块的新手,在我的第一次测试中,它没有给出我期望的结果。我花了一段时间才弄清楚,所以现在我对为什么我会看到这种特定行为感兴趣。

我对 File::Slurp 的调用如下所示:

my @array = read_file( $file ) || die "Cannot read $file\n";

我包括了“死”部分,因为我习惯于在打开文件时这样做。我的@array 总是以数组的第一个元素中的文件的全部内容结束。最后我取出“|| die”部分,它开始按我预期的那样工作。

下面是一个例子来说明:
perl -de0

Loading DB routines from perl5db.pl version 1.22
Editor support available.

Enter h or `h h' for help, or `man perldebug' for more help.

main::(-e:1): 0
DB<1> use File::Slurp

DB<2> $file = '/usr/java6_64/copyright'

DB<3> x @array1 = read_file( $file )
0 'Licensed material - Property of IBM.'
1 'IBM(R) SDK, Java(TM) Technology Edition, Version 6'
2 'IBM(R) Runtime Environment, Java(TM) Technology Edition, Version 6'
3 ''
4 'Copyright Sun Microsystems Inc, 1992, 2008. All rights reserved.'
5 'Copyright IBM Corporation, 1998, 2009. All rights reserved.'
6 ''
7 'The Apache Software License, Version 1.1 and Version 2.0'
8 'Copyright 1999-2007 The Apache Software Foundation. All rights reserved.'
9 ''
10 'Other copyright acknowledgements can be found in the Notices file.'
11 ''
12 'The Java technology is owned and exclusively licensed by Sun Microsystems Inc.'
13 'Java and all Java-based trademarks and logos are trademarks or registered'
14 'trademarks of Sun Microsystems Inc. in the United States and other countries.'
15 ''
16 'US Govt Users Restricted Rights - Use duplication or disclosure'
17 'restricted by GSA ADP Schedule Contract with IBM Corp.'
DB<4> x @array2 = read_file( $file ) || die "Cannot read $file\n";

0 'Licensed material - Property of IBM.
IBM(R) SDK, Java(TM) Technology Edition, Version 6
IBM(R) Runtime Environment, Java(TM) Technology Edition, Version 6

Copyright Sun Microsystems Inc, 1992, 2008. All rights reserved.
Copyright IBM Corporation, 1998, 2009. All rights reserved.

The Apache Software License, Version 1.1 and Version 2.0
Copyright 1999-2007 The Apache Software Foundation. All rights reserved.

Other copyright acknowledgements can be found in the Notices file.

The Java technology is owned and exclusively licensed by Sun Microsystems Inc.
Java and all Java-based trademarks and logos are trademarks or registered
trademarks of Sun Microsystems Inc. in the United States and other countries.

US Govt Users Restricted Rights - Use duplication or disclosure
restricted by GSA ADP Schedule Contract with IBM Corp.
'

为什么||死有什么不同?我感觉这可能更像是 Perl 优先级问题,而不是 File::Slurp 问题。我查看了 File::Slurp 模块,如果出现问题,它似乎设置为 croak,所以我想正确的方法是让 File::Slurp 为你发声。现在我只是好奇为什么我会看到这些差异。

最佳答案

bool 值或运算符 ||绑定(bind)比赋值运算符更紧密,并将函数调用放入标量上下文中。

my @array = read_file( $file ) || die "Cannot read $file\n";

这就是说:尝试读取文件,并返回文件的连接或来自 die 的“返回”作为 @array 中的第一个元素.你不会死,因为它读取了文件并返回了一个真值,尽管是一个标量值。

标准用法是语句或运算符( or ),如下所示:
my @array = read_file( $file ) or die "Cannot read $file\n";

这试图分配 @array在列表上下文中,然后在标量上下文中评估分配的列表,产生数组中的项目数。因此,您首先分配数组,然后您不会因为数组有条目而死。

第二种形式不会尝试从 die 分配“返回”至 @array因为先赋值,所以 @array要么保存文件的行,要么是一个空数组。

通知 File::Slurp 的文档 read_file 说:

In list context it will return a list of lines (using the current value of $/ as the separator including support for paragraph mode when it is set to ''). In scalar context it returns the entire file as a single scalar. [italics mine]



并给出以下例子:
    my $text = read_file( 'filename' ) ;
my @lines = read_file( 'filename' ) ;

但这些是最简单的情况,也是最基本的上下文表达。分配给特定类型的变量并不能确保 @lines无论周围的代码如何,都将在列表上下文中分配。

关于perl - 为什么 File::Slurp 在应该返回一个列表时返回一个标量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2958257/

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