2010-04-28 59 views
1

我有這樣的Perl代碼:這個Perl foreach循環發生了什麼?

foreach (@tmp_cycledef) 
{ 
chomp; 
my ($cycle_code, $close_day, $first_date) = split(/\|/, $_,3); 
$cycle_code =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/; 
$close_day =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/; 
$first_date =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/; 

#print "$cycle_code, $close_day, $first_date\n"; 
$cycledef{$cycle_code} = [ $close_day, split(/-/,$first_date) ]; 
} 

tmp_cycledef價值來自SQL查詢的輸出:

select cycle_code,cycle_close_day,to_char(cycle_first_date,'YYYY-MM-DD') 
    from cycle_definition d 
    order by cycle_code; 

究竟是什麼for循環內發生了什麼?

+1

如果你可以給出sql的示例輸出,回答會更容易。 – Space 2010-04-28 07:59:01

回答

2

咦,我很驚訝,沒有一個固定的爲你:)

看起來是誰寫的這是試圖削減領先,並從每個字段尾隨空白的人。這是一種非常奇怪的方式,由於某種原因,儘管他的錨點,他仍然過度關注每個領域的內部空白。

我覺得應該是一樣的,在split修剪空白周圍的分隔符:

foreach (@tmp_cycledef) 
    { 
    s/^\s+//; s/$//; #leading and trailing whitespace on the whole string 
    my ($cycle_code, $close_day, $first_date) = split(/\s*\|\s*/, $_, 3); 

    $cycledef{$cycle_code} = [ $close_day, split(/-/,$first_date) ]; 
    } 

的關鍵在於思考split正在考慮要扔掉,不只是這部分字符串什麼分開你想要的領域。

0

對於正則表達式的一部分,s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/做的開頭和結尾的空格

+0

感謝您能解釋它更加清楚 – Vijay 2010-04-28 07:50:24

+0

$ variable =〜s/something/somethingelse/ 這是一個替代正則表達式,它可以找到某些東西並用其他東西代替它:正則表達式中有很多東西在Web上格式化。 – thenoviceoof 2010-04-28 08:00:24

+1

使用Scalar :: Util :: trim修剪空白會容易得多。 – Ether 2010-04-28 14:53:55

-1

,我的上帝剝離,它已經這麼長的時間,因爲我讀過Perl的......但我給它一個鏡頭。

你從@tmp_cycledef抓取一條記錄,並在結尾處關閉換行符,並將它分成三個變量:然後,就像S.Mark所說的那樣,每個替換正則表達式剝去每一個替換正則表達式的三個變量。最後,將這些值作爲列表推入哈希中,並將一些調試代碼註釋掉。

心連心

+0

$ cycledef {$ cycle_code} = [$ close_day,split(/ - /,$ first_date)];你能告訴我這一行發生了什麼嗎? – Vijay 2010-04-28 07:52:37

+0

閱讀Lohrun的帖子 – thenoviceoof 2010-04-28 08:00:57

0

@tmp_cycledef每一行由以下格式的字符串的 「cycle_code | close_day | FIRST_DATE」。

my ($cycle_code, $close_day, $first_date) = split(/\|/, $_,3); 

將字符串拆分爲三部分。以下正則表達式用於去除前導和尾隨空格。

該循環的最後一條指令在字典$cycledef中創建一個條目,索引爲$cycle_code。格式化條目使用以下方案:

[ $close_day, YYYY, MM, DD ] 

其中$first_date = "YYYY-MM-DD"

0
@tmp_cycledef

:SQL查詢的輸出被存儲在該陣列

foreach (@tmp_cycledef)在:對於該陣列中的每個元件。

chomp :從每個元素的末尾刪除\ n char。

my ($cycle_code, $close_day, $first_date) = split(/\|/, $_,3); 

將元素拆分爲3部分並將變量分配給每個拆分元素。分割的部分是 「分割(/ PATTERN /,EXPR,LIMIT)」

$cycle_code =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/; 
$close_day =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/; 
$first_date =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/; 

此正則表達式的一部分是導致,並且從每個可變尾部空格sripping。

+0

爲什麼投票?如果你認爲有任何問題與答案,你爲什麼不把它放在這裏? – Space 2010-04-28 18:01:12

-1
  • 您的查詢提供了一組 存儲陣列 @tmp_cycledef行的。
  • 我們使用foreach (@tmp_cycledef)遍歷 結果中的每一行。
  • 結果行可能有尾隨 換行符char,我們使用chomp去除它們 。
  • 接下來我們split管道上的行(這不是 在$_)和分別分配 第一個3件$cycle_code$close_day$first_date
  • 分割片,可能會導致 和尾隨空格,未來3個 行是刪除前導和 在3個 變量尾部的空白。
  • 最後我們輸入 散列%cycledef。關鍵是使用 $cycle_code和值是 數組,其第一個元素是 $close_day和其餘 是片的元素的分割上連字符 $first_date後得到。