【发布时间】:2022-01-31 00:40:33
【问题描述】:
我对 perl 很陌生,所以我确信我在这里的困惑仅仅是由于不了解 perl 语法以及它如何处理裸词。不过,我无法在网上找到我的问题的好答案。
我有正在重构的代码,它曾经看起来像这样
@month_dirs = <$log_directory/*>;
我将 $log_directory 更改为加载配置文件(确切地说是 AppConfig)。现在我们输出 $conf 而不是导出 $log_directory ,它是一个 AppConfig 对象。要访问加载的变量,您通常会对变量名称进行方法调用,所以我尝试了...
@month_dirs = <$conf->log_directory()."/*">
这失败了,因为我无法在需要 barword 的位置调用 $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,但更重要的是,我想了解语法,以便我知道将来如何使用 barword .我保证我确实尝试过提前解决这个问题,但运气不佳。
顺便说一句,似乎建议不要在 perl 中使用裸词?有什么方法我应该避免在菱形运算符中使用裸词吗?
【问题讨论】:
-
开启
use strict;和use warnings;。一个bareword是一个周围没有任何东西的词。菱形运算符意味着它不再是一个简单的词。 -
参见perlop中关于I/O操作符的部分
-
你对什么是bareword有一个奇怪的想法。该术语指的是一个不带引号的字符串,仅包含字母数字字符或下划线,在 Perl 语法中没有任何其他含义。因此,根据定义,
$bare_word不是 之一,$log_directory/*也不是