Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在Perl中使用push和pop反转并打印数组?_Arrays_Perl_Reverse - Fatal编程技术网

Arrays 在Perl中使用push和pop反转并打印数组?

Arrays 在Perl中使用push和pop反转并打印数组?,arrays,perl,reverse,Arrays,Perl,Reverse,尝试几行代码手动按字符反转数组并将其打印出来。(是的,我知道这可以通过反向功能完成) 首先,我有一个名为dummy.txt的虚拟文件 abcdefg1234567890 这里是我的perl脚本: #! /usr/bin/perl use strict; use warnings; use Data::Dumper; my $file = 'dummy.txt'; my @reverse_array; open (FH, '<', $file) or die ("Couldn'

尝试几行代码手动按字符反转数组并将其打印出来。(是的,我知道这可以通过反向功能完成)

首先,我有一个名为dummy.txt的虚拟文件

abcdefg1234567890
这里是我的perl脚本:

#! /usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my $file = 'dummy.txt';
my @reverse_array;

open (FH, '<', $file)
    or die ("Couldn't open $file : $!");

#split with empty string to get individual characters
my @chars = split("", <FH>); 

print "$#chars\n"; #prints 16, meaning there are 17 elements in @chars
print "@chars\n";  #prints a b c d e f g 1 2 3 4 5 6 7 8 9 0

for(my $i=0; $i <= $#chars; $i++) #iterate number of elements' times
{
    push @reverse_array, pop @chars; #pop the elements out of @chars into @reverse_array
}

print "$#reverse_array \n"; #prints 8, meaning there are 9 elements in @reverse_array
print "@reverse_array \n";  #prints 0 9 8 7 6 5 4 3 2, not as expected, but this is indeed 17 elements including the white space

close (FH)
    or die ("Failed to close $file: $!");
#/usr/bin/perl
严格使用;
使用警告;
使用数据::转储程序;
my$file='dummy.txt';
我的@reverse_数组;

open(FH,在Perl中迭代列表总是比使用丑陋的C风格for循环更好

你的循环

for (my $i=0; $i <= $#chars; $i++) {
    push @reverse_array, pop @chars;
}
这样一来,它不仅更清晰、更容易阅读,而且也能达到你的目的

空格来自Perl在字符串化数组时的行为。如果您编写
“@array\n”
,则Perl将构建一个包含
@array
元素的字符串,用一个空格分隔。(这是默认行为。您可以更改用于分隔元素的字符串,但我建议您现在不要这样做。)

要仅打印数组的内容,则可以编写

print @chars, "\n"

您将看到您所期望的

在Perl中迭代列表总是比使用丑陋的C风格for循环更好

你的循环

for (my $i=0; $i <= $#chars; $i++) {
    push @reverse_array, pop @chars;
}
这样一来,它不仅更清晰、更容易阅读,而且也能达到你的目的

空格来自Perl在字符串化数组时的行为。如果您编写
“@array\n”
,则Perl将构建一个包含
@array
元素的字符串,用一个空格分隔。(这是默认行为。您可以更改用于分隔元素的字符串,但我建议您现在不要这样做。)

要仅打印数组的内容,则可以编写

print @chars, "\n"

您将看到您所期望的

您的问题是在循环构造中使用了
$#chars
,并且它会随着您的移动而变化。您需要先保存它:

use strict;
use warnings;

my $str = 'abcdefghijklmnopqrstuvwxyz';

my @reversed;
my @chars = split //, $str;

my $elt_count = scalar @chars;

for ( 1 .. $elt_count ) {
    push( @reversed, pop @chars );
}

print @reversed;
但您可以通过
while
循环更轻松地解决此问题:

use strict;
use warnings;

my $str = 'abcdefghijklmnopqrstuvwxyz';

my @reversed;
my @chars = split //, $str;

while ( @chars ) {
    push( @reversed, pop @chars );
}

print @reversed;
这取决于这样一个事实,即您正在清空
@chars
,并在什么都没有的时候退出

您还应意识到-以下两者之间存在差异:

print "@reversed";


在前一种情况下,perl插入空格是因为您已将数组转换为字符串。这就是为什么您会得到明显的行为。

您的问题是,您在循环构造中使用了
$\chars
,并且它会随操作而变化。您需要先保存它:

use strict;
use warnings;

my $str = 'abcdefghijklmnopqrstuvwxyz';

my @reversed;
my @chars = split //, $str;

my $elt_count = scalar @chars;

for ( 1 .. $elt_count ) {
    push( @reversed, pop @chars );
}

print @reversed;
但您可以通过
while
循环更轻松地解决此问题:

use strict;
use warnings;

my $str = 'abcdefghijklmnopqrstuvwxyz';

my @reversed;
my @chars = split //, $str;

while ( @chars ) {
    push( @reversed, pop @chars );
}

print @reversed;
这取决于这样一个事实,即您正在清空
@chars
,并在什么都没有的时候退出

您还应意识到-以下两者之间存在差异:

print "@reversed";


在前一种情况下,perl之所以插入空格,是因为您已将数组转换为字符串。这就是为什么您的行为如此明显。

我的另一个问题是,在打印时,为什么$#reverse_数组不将空格视为数组的元素,而@reverse_数组将空格视为数组的元素?请思考一下当你从
@chars
的末尾弹出
$#chars
元素时,
$#chars
会发生什么情况。你的代码中有
使用Data::Dumper
。如果你用
print Dumper\@reverse\u array
转储了数组的内容,你就能看到真正的内容。我的另一个问题是,在打印时,为什么要反转$#reversee_array不将空格视为数组的元素,而@reverse_array确实将空格视为数组的元素?想想
$#chars
@chars
末尾弹出
元素时会发生什么情况。您的代码中有
使用Data::Dumper
。如果您使用
print Du>转储了数组的内容mper\@reverse\u array
您将能够看到真实的内容,尽管有点高傲:
push@reverse\u array,pop@chars while@chars;
map
可能也很合适,因为您正在进行排序转换:
my@reverse\u array=map{pop@chars}0..$#chars;
@HunterMcMillen:你们都没有抓住要点。写这篇文章的方法是
my@reverse\u array=reverse@chars
。这个练习是理论上的one@Borodin我不认为我是。这个问题的唯一限制是使用
push
pop
,我只是建议
map
是一个原因HunterMcMillen的
的合理替代方案:这里的其他人认为唯一的限制是不要使用
反向
。我以为所有的操作都是在清理他自己的代码之后进行的,但只有他知道是肯定的,尽管有点高尔菲:
推@reverse\u数组,弹出@chars而@chars;
映射
可能是合适的因为您正在进行排序转换:
my@reverse\u array=map{pop@chars}0..$#chars;
@HunterMcMillen:你们都没有抓住要点。写这篇文章的方法是
my@reverse\u array=reverse@chars
。这个练习是理论上的one@Borodin我不认为我是。这个问题的唯一限制是使用
push
pop
,我只是建议
map
是一个原因对于
@HunterMcMillen,
的合理替代方案:这里的其他人认为唯一的限制是不要使用
反向
。我以为所有的操作都是在清理他自己的代码,但只有他知道