【发布时间】:2011-12-14 12:58:54
【问题描述】:
我正在尝试编写一个 Perl 脚本,该脚本将采用 Pattern 中的日期,2011 年 10 月 24 日并将其转换为 10,24,2011。
为了做到这一点,我准备了一个哈希,它将月份名称作为键,将表示月份位置的数值作为值。
我将读取输入字符串,使用正则表达式从上述格式中提取月份名称。
将此月份名称替换为与月份对应的值作为键。
这是我目前编写的脚本,但它不适合我。
@dates 数组将包含此格式的每个元素 -> 2011 年 10 月 24 日。
%days=("January",01,"February",02,"March",03,"April",04,"May",05,"June",06,"July",07,"August",08,"September",09,"October",10,"November",11,"December",12);
@output = map{
$pattern=$_;
$pattern =~ s/(.*)\s/$days{$1};
} @dates;
foreach $output (@output)
{
print $output."\n";
}
下面是我试图用这段代码做什么的一点解释。
map 函数用于动态转换数组的元素。
后跟空格的字符序列是用于从模式中提取月份名称的正则表达式,2011 年 10 月 24 日。
这将被 $1 引用。
我使用 $days{$1} 在散列中查找 $1 的对应值
【问题讨论】:
-
为什么不使用
DateTime? -
“不工作”是什么意思?在
$pattern =~ s/(.*)\s/$days{$1};中看起来像是一个简单的语法错误——你缺少第三个/字符——但如果你提供一个完整工作的小脚本,那么提供反馈会更容易。 (顺便说一句,CanSpice 建议使用DateTime是一个很好的建议,虽然我个人发现 some 日期模块在某些 Linux 发行版上很容易获得,而 other 日期模块很容易其他人也可以使用,因此首先进行一些研究可能是值得的。) -
考虑将
map语句写成s/../../ for my @output = @dates;