【问题标题】:How to copy the contents of array into a single variable in Perl?如何将数组的内容复制到 Perl 中的单个变量中?
【发布时间】:2012-02-19 03:07:50
【问题描述】:

我有一个数组中的数据,如下所示。我想将所有内容复制到一个变量中。我该怎么做?

IFLADK
FJ
FAILED
FNKS
FKJ
FAILED

【问题讨论】:

  • 你试过什么?单个变量应该包含/看起来像什么?
  • 一个数组已经是一个变量。 :)
  • 我想说一个除数组以外的单个标量变量:)

标签: perl


【解决方案1】:

你可以给数组赋值

my $scalar = \@array;

…或者将数组中的所有字符串连接在一起

my $scalar = join "\n", @array;

【讨论】:

    【解决方案2】:

    参考上一个问题How to read n lines above the matched string in perl?将多个命中存储在一个数组中:

    while (<$fh>) {
        push @array, $_;
        shift @array if @array > 4;
        if (/script/) {
            print @array; 
            push @found, join "", @array;   # <----- this line
        }
    }
    

    你可以只使用一个标量,例如$found = join "", @array,但是你只会在循环中存储最后一个匹配项。

    假设循环结束,现在您在数组@found 中拥有所有匹配项。如果您希望它们以标量形式出现,只需再次加入:

    my $found = join "", @found;
    

    或者您可以在循环中一次添加它们:

    $found .= join "", @array;
    

    这完全取决于您打算如何处理数据。将数据保存在标量中很少比将数据保存在数组中更有益。例如,如果您要打印它,则没有区别,因为print $found 等价于print @found,因为print 采用参数列表。

    如果您的意图是将匹配项插入字符串:

    print "Found matches: $found";
    print "Found matches: ", @found;
    

    【讨论】:

    • 感谢 TLP,但我想将所有匹配项存储在找到的标量 $ 中,这可能吗?
    • @kanwarpal 在 perl 中,几乎一切皆有可能。最常见的问题是“最好的方法是什么?”我将用一些替代方法更新问题。
    • TLP 再次感谢,将等待您的答复:)
    • @kanwarpal 这是非常基本的东西。如果您不熟悉 perl 变量,您将无法编写最简单的脚本。所以我的建议是你学习 perl 文档。
    【解决方案3】:
    $whole = join(' ', @lines)
    

    但是,如果您正在从文件中读取文本,则通过(本地)取消定义记录分隔符,将其全部读取到一个块中会更容易:

    local $/ = undef;
    $whole = <FILE>
    

    【讨论】:

    • 最好使用合适的 CPAN 模块。 File::Slurpread_file()
    • 你必须定义“更好”。有时一个额外的模块并不是“更好”。
    【解决方案4】:

    取决于你想要做什么,但如果你想将一个数组打包成一个标量以便以后可以检索,那么你可能需要Storable

    use Storable;
    
    my @array = qw{foo bar baz};
    
    my $stored_array = freeze \@array;
    
    ...
    
    my @retrieved_array = @{ thaw($stored_array) };
    

    再一次,您的需求可能只需存储对数组的引用即可满足。

    my @array = qw{foo bar baz};
    
    my $stored_array = \@array;
    
    ...
    
    my @retrieved_array = @$stored_array;
    

    【讨论】:

      猜你喜欢
      • 2018-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多