gpt4 book ai didi

perl - 更好的变量命名系统?

转载 作者:行者123 更新时间:2023-12-02 07:34:56 26 4
gpt4 key购买 nike

编程新手。任务是从字符串中提取特定数据,我选择编写代码如下 -

while ($line =<IN>) {
chomp $line;
@tmp=(split /\t/, $line);
next if ($tmp[0] !~ /ch/);
@tgt1=@tmp[8..11];
@tgt2=@tmp[12..14];
@tgt3=@tmp[15..17];
@tgt4=@tmp[18..21];
foreach (1..4) {
print @tgt($_), "\n";
}

我以为 @tgt($_) 会被解释为 @tgt1, @tgt2, @tgt3, @tgt4 但我仍然收到错误消息 @tgt 是一个全局符号(已声明@tgt1、@tgt2、@tgt3、@tgt4`)。

Q1。我是否误解了 foreach 循环?

Q2。为什么 perl 不能将 @tgt($_) 视为 @tgt1、@tgt2 ..etc?

Q2。根据经验,这可能是一种糟糕的变量命名方式。命名具有相似特征的变量的首选方式是什么?

最佳答案

  • Q2. Why couldn't perl see @tgt($_) as @tgt1, @tgt2 ..etc?

  • Q2. From the experience this is probably a bad way to name variables. What would be a preferred way to name variables that have similar features?

我会一起回答。

@tgt($_) 并不代表您希望的意思

  • 首先,这是一个无效的语法(你不能在数组名后使用 (),perl interpeter 会产生编译错误)。

  • 您尝试做的是通过表达式访问变量来访问不同的变量,表达式产生变量的名称(又名 symbolic references )。这是可能的;但通常是一个坏主意和糟糕的 Perl 风格(例如,你可以但你不应该这样做,没有非常非常好的理由)。

  • 要以您尝试的方式访问元素 $_,请使用 @{"tgt$_"} 语法。但我再说一遍 - 不要那样做,即使你可以。

  • 正确的惯用解决方案:使用 arrayrefs 数组,用 1-4(或更确切地说 0-3)索引外部数组:

     # Old bad code: @tgt1=@tmp[8..11];

    # New correct code:
    $tgt[0]=[ @tmp[8..11] ]; # [] creates an array reference from a list.
    # etc... repeat 4 times - you can even do it in a smart loop later.

    它所做的是,它将对数组切片的引用存储到单个 @tgt 数组的第零个元素中。

    最后,@tgt 数组有 4 个元素,每个元素都是对包含其中一个切片的数组的引用。


  • Q1. Did I misunderstand foreach loop?

您的 foreach 循环(与其内容相反 - 见上文)是正确的,但有一个风格警告 - 同样,虽然您可以使用默认的 $_ 变量,但您几乎不应该使用它,而是始终使用命名变量以提高可读性。

你打印上面提到的 arrayrefs 数组如下(如果语法不清楚请单独询问 - 这是中级数据结构处理,不适合初学者):

foreach my $index (0..3) { 
print join(",", @{ $tgt[$index]}) . "\n";
}

关于perl - 更好的变量命名系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17578486/

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