for (my $j = 0; $j <100000; $j++){
my $outcome = rand();
for (my $k = 0; $k < @cum_sum; $k++){
if ($cum_sum[$k] >= $outcome){
if ($keys[$k] =~ m/\"|\/|\<|\>|\\|\`|\~|\@|\#|\$|\%|\^|\*|[0-9]/) {
print $out "";
}
if ($keys[$k] =~ m/\s/){
print $out " ";
}
elsif ($keys[$k] =~ m/\&/){
print $out " and ";
}
elsif ($keys[$k] =~ m/\!/){
print $out "! ";
}
elsif ($keys[$k] =~ m/\:/){
print $out ": ";
}
elsif ($keys[$k] =~ m/\'/){
print $out "' ";
}
elsif ($keys[$k] =~ m/\./){
print $out ". ";
}
elsif ($keys[$k] =~ m/\;/){
print $out "; ";
}
elsif ($keys[$k] =~ m/\?/){
print $out "? ";
}
elsif ($keys[$k] =~ m/\,/){
print $out ", ";
}
else {
print $out "$keys[$k]";
}
last;
}
}
# print "$outcome\n";
}
我通常需要帮助来简化我拥有的elsif
语句的长链。外部for循环中的逻辑起作用。@keys
是两个字符(字母)字符串的数组。
[我正在尝试通过比较elsif
的二元图和标点符号@key
的数组来使@punctuation = qw(! : " ' ; ? , .)
语句更高效
然后,如果Digram确实在标点符号数组中包含标点符号之一,则Digram会更改为“ punctuation_mark”,例如“一个!” ->“!”
最终结果是,我不对@punctuation
中的任何一个使用正则表达式。
但是,我不确定如何实施此更改。
谢谢!
[和第一个正则表达式一样使用替代,但是要捕获匹配项,并用use $1
替换单词
$1
评论
[my $re_punct = join '|', map { quotemeta } qw(& ! : ' . ; ? ,); #'
for my $j (0..100_000) {
my $outcome = rand();
for my $k (0..$#cum_sum) {
...
if ($keys[$k] =~ /($re_punct)/) { $keys[$k] = "$1 " }
...
}
}
由所有[ASCII非“单词”字符
语法:\
是$#ary
中最后一个元素的索引,正好适合循环遍历数组索引
@ary
比等效的C样式for my $i ($beg .. $end)
循环†
通过与数组比较
”例如,您可以使用for
。它会像use List::MoreUtils qw(first_value); my @punc = map { quotemeta } qw(& ! : ' . ; ? ,); #' foreach my $word (@words) { if (my $match = first_value { $word =~ /$_/ } @punct) { $word = $match; } }
(或first_value
)返回该块返回true的firstval
的第一个元素,如果没有,则返回@punct
。undef
别名为$word
的当前处理元素,对其进行更改将更改数组元素。这样您就可以更换了。
但是,您仍然必须处理正则表达式并避免使用标点符号(至少其中的一部分)。因此,我认为解决这个麻烦没有任何好处。在这种情况下,“直接”正则表达式更加清晰。
†
甚至编译语言都以这种方式发展。@words
引入了C++11
range-based for loop和链接(不是标准,而是标准参考)说
与传统的事情如何完成;只需使用它。for (auto var: container) ... // (really, const auto&), or auto&, or auto&&
循环相比,更具可读性[...在Perl中,
是
for
CPAN模块可能很有意义。主要思想是使用regexpr作为键构建哈希,因此您可以通过匹配轻松找到相关值: