当前位置:  开发笔记 > 编程语言 > 正文

在perl解析和裸字中混淆dimond算子的语法

如何解决《在perl解析和裸字中混淆dimond算子的语法》经验,为你挑选了1个好方法。

我对perl很新,所以我确信我的混淆只是因为我不理解perl语法以及它如何处理裸词.我没有在网上找到我的问题的好答案.

我有重构的代码,它看起来像这样

@month_dirs = <$log_directory/*>;

我更改了$ log_directory以加载配置文件(确切地说是AppConfig).现在输出$ conf这是一个AppConfig对象而不是导出$ log_directory.要访问加载的变量,通常会对变量名称进行方法调用,所以我尝试了...

@month_dirs = <$conf->log_directory()."/*">

这失败了,因为我不能在一个预期有一个bar字的位置调用$ conf-> log_directory.只是在玩,我尝试了这个

 $month_directory_command = $conf->log_directory()."/*";
 @month_dirs = <$month_directory_command>;

这仍然是失败的,没有任何迹象表明这是一个问题.我尝试直接在钻石中使用一个字符串,但它失败了,显然只有裸字,而不是字符串,被钻石接受我很惊讶,因为我根本不允许使用字符串,我认为大多数地方Barewords可以是否可以使用字符串,这只是因为大多数代码实现单独的逻辑来接受裸字与字符串,但不需要以这种方式实现?

我可以通过完全模仿原始语法来完成这项工作

 $month_directory_command = $conf->log_directory();
 @month_dirs = <$month_directory_command/*>;

但是,这对我来说很难看.我也很困惑为什么我能做到这一点,但我不能创造一个简单的词:

 $bare_word = $conf->log_directory()/*

要么

 $month_directory_command = $conf->log_directory();
 $bare_word = $month_directory_command/*;
 @month_dirs = <$bare_word>;     

为什么有些变量适用于裸言而非其他?为什么我可以使用缩放器变量,但如果从方法调用返回它?

我尝试在裸字上查找perl语法,但没有太多运气描述它们不是直接编写的情况,而是由变量组成.

我希望有人可以帮助我更好地理解这里的裸字语法.什么时候我可以使用变量作为一个单词的一部分,如果我可以将它保存为变量?

如果可以建议的话,我想弄清楚在我的钻石运算符中使用barword的更简洁的语法,但更多的是我想了解语法,所以我知道如何在将来使用裸字.我保证我确实试过提前打算这个,但没有太多运气.

顺便说一下,似乎建议不要在perl中使用barewords?在某种程度上我应该避免钻石操作员的裸字吗?



1> ThisSuitIsBl..:

你错了,钻石运营商<>只使用裸字:

$ perl -E'say for <"/*">'
/bin
/boot
/dev
...

(事实上​​,一个裸字只是一个没有印记并被禁止的标识符use strict 'subs';,所以你的例子都没有真正的资格.)


这个:

@month_dirs = <$log_directory/*>;

因为内部完成了双引号内插<>,并且内插了标量变量$log_directory.

它相当于:

@month_dirs = glob("$log_directory/*");

这个:

@month_dirs = <$conf->log_directory()."/*">

失败是因为>in $conf->log_directory()提前关闭钻石操作员,使解析器混乱.

它被解析为:

<$conf->

(致电glob)随后

log_directory()."/*">

这是一个语法错误.


这个:

$month_directory_command = $conf->log_directory()."/*";
@month_dirs = <$month_directory_command>;

因为失败了

<$month_directory_command>

相当于

readline($month_directory_command)

而不是

glob("$month_directory_command")

来自perldoc perlop:

如果尖括号包含的是一个简单的标量变量(例如,$foo),那么该变量包含要从中输入的文件句柄的名称,或者其typeglob,或者对它的引用.

[...]

如果尖括号内的内容既不是文件句柄也不是包含文件句柄名称,typeglob或typeglob引用的简单标量变量,则它被解释为要进行全局化的文件名模式,以及文件名列表或列表中的下一个文件名返回,具体取决于上下文.这种区别仅仅是出于句法原因而确定的.这意味着<$x>总是readline()来自间接句柄,但<$hash{key}>总是一个glob().

所以你试图从$month_directory_command尚未打开的文件句柄()中读取.

打开警告use warnings 'all';可能会提醒您:

readline() on unopened filehandle at foo line 6.

这个:

$bare_word = $conf->log_directory()/*;

失败是因为您尝试将方法调用的结果与非带引号的字符串连接起来; 要连接字符串,您必须将它们插入到双引号字符串中,或​​使用连接运算符.

你可以这样做:

$bare_word = $conf->log_directory() . "/*";
@month_dirs = <"$bare_word">;

(虽然$bare_word根本不是一个单词,但它是一个标量变量.)

注意:

@month_dirs = <$bare_word>;

(没有引号)将被解释为readline,未glob,如在说明perlop上述.

但是,一般情况下,glob直接使用运算符可能不那么令人困惑:

@month_dirs = glob( $conf->log_directory() . "/*" );

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有