سؤال

وأنا قليلا جديدة لبيرل، ولكن هنا هو ما أريد القيام به:

my @array2d;
while(<FILE>){
  push(@array2d[$i], $_);
}

وأنها لا تجمع منذ @array2d[$i] ليس مجموعة ولكن قيمة العددية.

وكيف يجب أن يعلن @ array2d باعتبارها مجموعة من المصفوفة؟

وبطبيعة الحال، ليس لدي أي فكرة عن عدد الصفوف لدي.

هل كانت مفيدة؟

المحلول

لجعل مجموعة من المصفوفات، أو على نحو أدق مجموعة من arrayrefs، حاول شيئا من هذا القبيل:

my @array = ();
foreach my $i ( 0 .. 10 ) {
  foreach my $j ( 0 .. 10 ) {
    push @{ $array[$i] }, $j;
  }
}

وويدفع قيمة الصعود إلى arrayref ألغى الإشارة القيمة بالنسبة لك. يجب أن تكون قادرا على الوصول إلى إدخال مثل هذا:

print $array[3][2];

نصائح أخرى

وتغيير بك "دفع" خط لهذه:

push(@{$array2d[$i]}, $_);

وانت جعل أساسا $ array2d [$ ط] مجموعة المحيطة من قبل @ {} ... أنت ثم قادرة على دفع عناصر على هذه مجموعة من المراجع مجموعة.

وإلقاء نظرة على perlref و <لأ href = "HTTP: // perldoc. perl.org/perldsc.html "يختلط =" نوفولو noreferrer "> perldsc لمعرفة كيفية جعل هياكل البيانات المتداخلة، مثل صفائف المصفوفات والتجزئة من التجزئة. الاشياء المفيدة جدا عندما كنت تفعل بيرل.

وهناك في الحقيقة لا فرق بين ما كتبته وهذا:

@{$array2d[$i]} = <FILE>;

ويسعني إلا أن نفترض أنك بالتكرار عبر الملفات.

لتجنب تتبع عداد، يمكنك أن تفعل هذا:

...
push @array2d, [ <FILE> ];
...

وهذا يقول 1) إنشاء مرجع إلى مجموعة فارغة، 2) تخزين جميع الخطوط في FILE، 3) دفعها على @array2d.

وسيلة بسيطة أخرى هي استخدام جدول تجزئة واستخدام مؤشرات مجموعة اثنين لجعل مفتاح تجزئة:

$two_dimensional_array{"$i $j"} = $val;

إذا كنت مجرد محاولة لتخزين ملف في مجموعة يمكنك أيضا القيام بذلك:

fopen(FILE,"<somefile.txt");
@array = <FILE>;
close (FILE);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top