我已經嘗試了所有我能想到的(加上大量隨機實驗)將 foreach 陳述句中的 $_ 分配給哈希。我知道您可以在 foreach 行之后分配它,但我有一個非常特殊的代碼限制,不允許我這樣做。
#!/usr/bin/perl -s
use strict;
use Data::Dumper;
my @x = qw(a c e g);
my $var = {'a'=>"z", 'b'=>"y", 'c'=>"x", 'd'=>"w", 'e'=>"v", 'f'=>"u", 'g'=>"t", 'h'=>"s"};
my $y = "e";
foreach $var->{$y} (@x){
print "$y = $var->{$y}\n";
$y = $var->{$y};
}
我認為正在發生的事情是 perl 編譯器無法在它正在尋找 $VAR 分配 $_ 的位置處理 '{' 和 '}' 字符。當我運行代碼時,我不僅會收到有關 foreach 行的錯誤,而且還會收到有關沒有語法錯誤的列印行的語法錯誤。
syntax error at ./foreach2var.pl line 9, near "$var->"
syntax error at ./foreach2var.pl line 12, near "}"
Execution of ./foreach2var.pl aborted due to compilation errors.
有沒有辦法將 foreach 陳述句中的 $_ 直接分配給哈希參考,而不是$var->{$y} = $_;在下一行分配它?
我正在尋找以下輸出
e = a
a = c
c = e
e = g
此外,我知道以下作業,但同樣,我有一個特定的代碼限制,這意味著我必須能夠處理 foreach 陳述句
#!/usr/bin/perl -s
use strict;
use Data::Dumper;
my @x = qw(a c e g);
my $var = {'a'=>"z", 'b'=>"y", 'c'=>"x", 'd'=>"w", 'e'=>"v", 'f'=>"u", 'g'=>"t", 'h'=>"s"};
my $y = "e";
while($var->{$y} = shift @x){
print "$y = $var->{$y}\n";
$y = $var->{$y};
}
uj5u.com熱心網友回復:
來自perlsyn 中的 Foreach 回圈
foreach回圈遍歷一個普通的串列值并將標量變數 VAR 依次設定為串列的每個元素。
因此,它需要一個變數,而您想要分配的取消參考的動態計算值甚至不是左值,更不用說變數了。
這個“變數”要求有多嚴格?該段的其余部分
如果變數以關鍵字
my開頭,則它是詞法范圍的,因此僅在回圈中可見。否則,該變數隱含地是回圈的區域變數,并在退出回圈時恢復其先前的值。如果該變數以前用 my 宣告過,它會使用該變數而不是全域變數,但它仍被本地化到回圈中。這種隱式本地化只發生在foreach回圈中。
所以我們確實需要一個變數。不過,這個要求純粹是語法上的。?
我不確定您到底需要做什么以及您的限制是什么,但是
for (@x) {
$var->{$y} = $_;
...
}
正如問題中所觀察到的那樣,確實根據需要分配。
將其分配為主題化for $v (@ary) { }器,確實具有$v在回圈內進行本地化的額外屬性,如上面從檔案中參考的那樣,但您似乎不需要該部分。
?可以定位復雜結構的各個部分。一個命令列程式
perl -Mstrict -wE'
my $hr = { k => 2 }; say $hr->{k};
SAVE: { local $hr->{k} = 7; say $hr->{k} };
say $hr->{k}'
列印行2, 7, 2.
uj5u.com熱心網友回復:
不,根據檔案,它必須是一個變數。
它真的沒有任何意義,因為變數的值在回圈結束時恢復。
$_ = "abc";
say;
for (qw( def ghi )) {
say;
}
say;
輸出:
abc
def
ghi
abc
您可以從以下各項中獲得所需的輸出:
my $prev = "e";
while ( @x ) {
my $this = shift( @x );
say "$prev = $this";
$prev = $this;
}
my $prev = "e";
for my $this ( @x ) {
say "$prev = $this";
$prev = $this;
}
my $this = "e";
while ( @x ) {
( my $prev, $this ) = ( $this, shift( @x ) );
say "$prev = $this";
}
unshift @x, "e";
for my $i ( 1 .. $#x ) {
say "$x[ $i - 1 ] = $x[ $i ]";
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/464664.html
