gpt4 book ai didi

perl - 帮助转换为子程序

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

我试图将我的代码转换为一系列子例程,以使其更加模块化。下面代码中的条件语句是我无法合并到子例程中的。

next unless ( $sentblock =~ /\[sent. \d+ len. \d+\]: \[.+\]/ );               #1#
( $sentence, $sentencenumber ) = &sentence_sentnum_chptnum($sentblock); #SUBROUTINE
if ( $sentence =~ /\~\s(\d*F*[\.I_]\w+)\s/ ) { #2#
$chapternumber = $1;
$chapternumber =~ tr/./_/;
}
next
unless ( $sentence =~ /\b\Q$search_key\E/i #3#
&& $sentence =~ /\b\Q$addkey0\E/i
&& $sentence =~ /\b\Q$addkey1\E/i );
next
if ( defined($exc0) #4#
&& length($exc0)
&& $sentence =~ /\b\Q$exc0\E\b/i );
next
if ( defined($exc1) #5#
&& length($exc1)
&& $sentence =~ /\b\Q$exc1\E\b/i );

到目前为止的子程序:
sub sentence_sentnum_chptnum {
my $subsentblock = shift;
my ( $subsentence, $subsentencenumber );
return unless ( $subsentblock =~ /\[sent. (\d+) len. \d+\]: \[(.+)\]/ ); #DIDN'T replace the need to put one in the main script
$subsentencenumber = $1;
$subsentence = $2;
$subsentence =~ s/, / /g;
return ( $subsentence, $subsentencenumber );
}

它按原样工作,但如果我尝试将其他条件语句放入:我收到错误消息 $sentence is uninitialized稍后在代码中。示例:如果我尝试包含 $addkey 的检查使用相同的条件,但只是交换 next对于 return我收到一个错误 $sentence is uninitialized在线: if ( $sentence =~ /\~\s(\d*F*[\.I_]\w+)\s/ ) {同样,如果我将这些条件中的任何一个放入子程序中。

主要问题:我怎样才能:

(1) 摆脱 next unless ( $sentblock =~ /\[sent. \d+ len. \d+\]: \[.+\]/ ); (它也在子程序中)

(2) 包括: if ( $sentence =~ /\~\s(\d*F*[\.I_]\w+)\s/ ) & 所有 3 next陈述

(3) 既然包含,也返回 $chapternumber
不影响我的代码?

一般最佳实践问题:如果我在代码顶部(来自 HTML 表单)定义了变量,最​​好在每个子例程中每次都将它们本地化,或者只是不将任何内容传递给子例程,并使用在代码开头分配的值? (例如 $search_key$addkey$exc )?

测试用例 我做了一个测试用例,但是它很长,所以我没有包括它。如果您需要,它非常类似于: http://perlmonks.org/?node_id=912276只需找到子程序接管的位置并删除该部分...就在 foreach my $sentblock (@parsed)之后.

注意:测试用例不包括 addkeyexc , 并且没有任何内容与章节号匹配(在一个句子前面放 '~ 5.5' 以包含它)

我试过检查返回的 $sentence在主程序中。这消除了错误,但程序的其余部分没有匹配项(即搜索引擎的最终结果是 0 个结果)。

谢谢,如果有什么不清楚的地方请告诉我。

最佳答案

你想把事情分解到什么程度?很难看出没有更多代码是什么“最好”或“正确”的拆分方式。

一般来说,如果您浏览您的代码并添加注释来描述每个代码块的功能,您可以轻松地将每个注释 block 替换为具有重述句子的名称的子代码:

# Is this a sentence block?
next unless ( $sent_block =~ /\[sent. \d+ len. \d+\]: \[.+\]/ );
#1#

my ( $sentence, $sentence_number ) = parse_sentence_block($sent_block);

# Get chapter info if present
if ( $sentence =~ /\~\s(\d*F*[\.I_]\w+)\s/ ) { #2#
$chapter_number = $1;
$chapter_number =~ tr/./_/;
}

# Skip if key found
next
unless ( $sentence =~ /\b\Q$search_key\E/i #3#
&& $sentence =~ /\b\Q$addkey0\E/i
&& $sentence =~ /\b\Q$addkey1\E/i );

# skip if excrescence 0 (or whatever exc is short for)
next
if ( defined($exc0) #4#
&& length($exc0)
&& $sentence =~ /\b\Q$exc0\E\b/i );
# skip if excrescence 1.
next
if ( defined($exc1) #5#
&& length($exc1)
&& $sentence =~ /\b\Q$exc1\E\b/i );

现在把这些评论变成潜艇:
next unless is_sentence_block( $sent_block );

my( $sentence, $sentence_number ) = parse_sentence_block($sent_block);

# Maybe update the chapter number
my $new_chapter_number = get_chapter_number( $sentence );
$chapter_number = $new_chapter_number if defined $new_chapter_number;

next unless have_all_keys( $sentence => $search_key, $add_key0, $add_key1 );

next if have_excrescence( $exc0 );
next if have_excrescence( $exc1 );


sub is_sentence_block {
my $block = shift;

return $sent_block =~ /\[sent. \d+ len. \d+\]: \[.+\]/ );
}

sub get_chapter_number {
my $sentence = shift;

return unless $sentence =~ /\~\s(\d*F*[\.I_]\w+)\s/;
return $1;
}

sub have_all_keys {
my $sentence = shift;
my @keys = @_;

for my $key ( @keys ) {
return unless $sentence =~ /\b\Q$key1\E/i;
}

return 1
}

sub have_excrescence {
my $sentence = shift;
my $exc = shift;

return 0 unless defined($exc);
return 0 unless length($exc)
return 0 unless $sentence =~ /\b\Q$exc\E\b/i );

return 1;
}

关于perl - 帮助转换为子程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6710071/

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