ある二つのファイル(moto1.csvとmoto2.csv)の2番目のフィールドが
おなじときに二つのファイルの中身をあわせて別のファイル(kekka.csv)を
作る作業をしています。
下記のソースで※2の場所で何回もファイルをオープンさせるととても重いので
※1でファイルを一回だけオープンさせて処理しようと思ったら。
内側のループ(moto2_Log)が一回しか処理されないので困っております。

何かよいアイデアがありましたらよろしくお願いします。

open(moto1_Log,"< moto1.csv");
open(kekka_Log,"> kekka.csv");
※1open(moto2_Log,"< moto2.csv");

while( <moto1_Log> ) {
chop;
@moto1_List=split(/,/);

※2#open(moto2_Log,"< moto2.csv");
while( <moto2_Log> ) {
chop;
@moto2_List=split(/,/);

if($moto1_[1] eq $moto2_List[1]){
print kekka_Log $S_List[0];
print kekka_Log ",";
print kekka_Log $S_List[1];
print Export_Log ",";
print Export_Log $S_List[2];
print Export_Log ",";
print Export_Log $S_List[3];
print Export_Log ":";
print Export_Log $E_List[0];
print Export_Log ",";
print Export_Log $E_List[1];
print Export_Log ",";
print Export_Log $E_List[2];
print Export_Log ",";
print Export_Log $E_List[3];
print Export_Log "\n";#改行コード
continu;
}
}
}

close (moto2_Log);
close(kekka_Log);
close(moto1_Log);

このQ&Aに関連する最新のQ&A

A 回答 (3件)

原因についてはa-kumaさんが仰ってる通りですので、


代替案を挙げたいと思います。

「何回もファイルをオープンさせるととても重いので」という
ことですが、ファイルを一々巻き戻す(seekする)現在の方法でも、
実行時間としてはほとんど変わらないと思いますよ。
openにかかる時間が中身をリードする時間と比較して、
誤差以上に意味のある時間になるとは思えません。

同様のプログラムをつくって、moto1.csvとmoto2.csvとして
500行のテキストファイル(具体的には500行に切り詰めた
Linuxのシステムログ/var/log/messagesファイル)
を使って実験したところ、
一々オープンする方法の実行時間(47.63秒)は、
巻き戻す方法の実行時間(47.28秒)と比較して、
たった0.7%しか増加しませんでした。

この実験では、moto2.csvは全てキャッシュに乗っていますが、
キャッシュに乗りきらないほど大きなファイルになったとしても、
さして結果は変わらないと思います。

そこで代替案ですが、一旦、片方のファイルを全て
配列に読み込んではどうでしょう?

open(moto2_Log, "<moto2.csv");
my @moto2_List;
while(<moto2_Log>){
 chomp;
 my @cols = split(/,/);
 push(@moto2_List, \@cols);
}
close(moto2_Log);

open(moto1_Log, "<moto1.csv");
open(kekka_Log, ">kekka.csv");
while(<moto1_Log>){
 chomp;
 my @moto1_List = split(/,/);
 foreach $m2lst ( @moto2_List ){
  if( $moto1_List[1] eq $m2lst->[1] ){
   print kekka_Log ...
  }
 }
}
close(kekka_Log);
close(moto1_Log);

上の実験と同じ500行のテキストファイルに対して、
この方法だと実行時間は約5分の1の、10.17秒と
なりました。まあ、ファイルアクセスの時間だけ
じゃなくて、splitの回数も減ってるので、その
影響もあるんでしょう。

ところで、このアルゴリズムだと、moto1.csvの
中の各行とmoto2.csvの中の全行を照合してますが、
それはそれで合ってるんでしょうか?

> 2番目のフィールドが
> おなじときに二つのファイルの中身をあわせて別のファイル(kekka.csv)を
> 作る

という辺りから、moto1.csvの各行と、moto2.csvで
対応する(ファイルの先頭から数えた行数が同じ)行を
照合することを意図しているようにも読めるんですが…。
    • good
    • 0
この回答へのお礼

ありがとうございます。
確かに時間はさほど変わりませんでした。

どうやって時間を短縮さえ酔うと悩んでいたところです。
とても参考になります。

お礼日時:2001/07/11 10:05

 2件の回答がついていますが、解決はされたのでしょうか?


 質問に書かれたソースと、全く同じ動作をするコードを書いてみました。参考にしてみてください。

  my %moto2;

  open IN, 'moto2.csv';
  while (<IN>) {
    chomp;
    my $_2nd = (split(/,/))[1];
    $moto2{$_2nd} = $_ unless defined $moto2{$_2nd};
  }
  close IN;

  open OUT, '>kekka.csv';
  open IN, 'moto1.csv';
  while (<IN>) {
    chomp;
    my $_2nd = (split(/,/))[1];
    print OUT "$_, $moto2{$_2nd}\n" if defined $moto2{$_2nd};
  }
  close IN;
  close OUT;

○moto2.csvの2番目のデータをキーにしたハッシュを作成します。
 値はそのデータの行全体(改行は抜いたもの)にします。後で結局カンマ区切りの合成をするので、そのまま使うわけです。
○moto1.csvを開いて1行ずつ読み、2番目のデータを取り出します。
 このデータを%moto2のKEYにして値があれば、moto1とmoto2で全く同じデータが存在するわけです。
○kekka.csvには、2番目に同じデータがある行の全項目をカンマ区切りにしたデータを入れるので、split前のデータから改行を抜いたもの同士をカンマを挟んで書き込みます。
 (%moto2のVALUEには、moto2.csvから改行を抜いたデータが入れてある)
    • good
    • 0

二つ目のファイルを一回読み込んだら、読み込み位置がファイルの一番お尻に


あるからですね。

二つ目のファイルを処理しおわったら、巻き戻しましょう。

open(moto1_Log, ...);
open(moto2_Log, ...);
while ( <moto1_Log> ) {
  ...
  while ( <moto2_Log> ) {
    ...
  }
  seek(moto2_Log, 0, 0);  # ← これ
}

ってな感じ。

# perl は良く知らないんですけど、多分OK
    • good
    • 0
この回答へのお礼

seekですね
理由は何と無く分かったいました。
戻し方が解りませんでした(リファレンスだけだと探すのが大変です)
ありがとうございます。

お礼日時:2001/07/11 09:56

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qフォームのラベルのプロパティを自動で設定したい

Access2013 vba です。

フォームの全てのラベル、テキストボックス、ボタン類をそれぞれの背景色や、テーマ、背景スタイルなどを設定したいのですが、どうやれば、全てのラベル、テキストボックス、ボタンなどを自動でループ処理で取得出来ますでしょうか。

よろしくお願いします。

Aベストアンサー

フォームをデザインビューで開く必要があります。で、保存。
windowmode は適当に。
標準モジュールで
docmd.OpenForm "formName",view:=acDesign,windowmode:=acHidden
forms!formName!ラベル2.backcolor = vbred
docmd.Close acForm ,"formName",save:=acSaveYes

Qperlスクリプト s/^\s+//;  s/\s+$//;  return wantarray ? @out : $out[0]; について

自作の掲示板を作ろうと思い、perlの勉強をしている者です。人様の作ったスクリプトを解析しています。以下のスクリプトはライブラリに記述されていたものです。


sub tttt {
my @out = @_;
for (@out) {
s/^\s+//;
s/\s+$//;
}
return wantarray ? @out : $out[0];


このスクリプトなんですが、 s/^\s+//; の部分の「+」と s/\s+$//; の部分の「+$」、 また「return wantarray~」 の三つの部分のスクリプトが、どういった働きをしているの分かりません。専門書やウェブ上のリファレンスも色々調べたのですが・・。

分かる方いらっしゃいましたらご教授下さると幸いです。よろしくお願いします。

Aベストアンサー

まず前2つの「+」は,正規表現における,「直前の表現を一回以上繰り返し」をあらわします.
「\s」は空白文字一文字を表す正規表現ですので,「\s+」は,「一文字以上の空白文字」になります.
次に,最初の「^」と2番目の「$」は,その正規表現がどこに現れるかを示す記号です.それぞれ,先頭と最後尾にあることを示します.
したがって,「^\s+」は,「最初に空白が一文字以上ある文字列」に,
「\s+$」は「行末に空白が一文字以上ある文字列」にヒットします.
置換構文sはご存知なんですかね.すなわち,この2文で,行の最初と最後の空白を消しているんです.

次に, wantarray ですが,
http://www2u.biglobe.ne.jp/~MAS/perl/ref/wantarray.html
によると,このサブルーチンttttを呼び出すときに,何を返り値にしているかで真偽が決まる関数です.
呼び出す時に配列を希望していたら @out 全体を,変数を希望していたら $out[0]だけを返します.

QVBA:ユーザフォームのラベルの指定の仕方教えてください。

 今、ユーザフォームに20個のラベルがあります。それぞれのラベルは、条件によりラベルの表示内容が変更します。そこで、ラベルの表示変更が必要なときにすぐに変更できるようにしたいと考えています。しかし、例えば以下のようなコードを作成するとエラーになり困っています。
 Label(i)で、iの番号によりラベルが呼び出されないだろうかと自分なりに作りましたがダメでした。以下のようなループ文中で特定のラベルを呼び出し処理することは不可能でしょうか?
 やはり、UserForm1.Label3などのように番号をきちんと書かないとダメでしょうか?本当は、ラベルが82個ありその一つ一つにコードを割り当てるのが大変です。また、きれいなコードで書きたいと思うからです。宜しければ、ご教授願います。
--------------------------------------------
Sub セルの値をラベル表示する()
For i = 1 To 20
With UserForm1.Label(i)
.Caption = Cells(1, i)
End With
Next i
End Sub

 今、ユーザフォームに20個のラベルがあります。それぞれのラベルは、条件によりラベルの表示内容が変更します。そこで、ラベルの表示変更が必要なときにすぐに変更できるようにしたいと考えています。しかし、例えば以下のようなコードを作成するとエラーになり困っています。
 Label(i)で、iの番号によりラベルが呼び出されないだろうかと自分なりに作りましたがダメでした。以下のようなループ文中で特定のラベルを呼び出し処理することは不可能でしょうか?
 やはり、UserForm1.Label3などのように番号...続きを読む

Aベストアンサー

 Excel VBAではコントロール配列はサポートされていませんが、ラベルの名前をLabel1, Label2,・・・ Label20とすると、以下のコードでほぼ同じことを実現できます。

Sub セルの値をラベル表示する()
 For i = 1 To 20
  With UserForm1.Controls("Label" & i)
   .Caption = Cells(1, i)
  End With
 Next i
End Sub

Q$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );がよく

$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );

というスクリプトがあったのですが、

$wfurikae = 1 の後に;もいれずifがきています。

違和感があります。

どのような意味になるのでしょうか。

宜しくお願い致します。

Aベストアンサー

そのまんまだと思いますよ。
if 以下の条件が真の時 $wfurikae = 1となります。
Perlはいろいろな書き方ができますので、こういう書き方もありです。
英語の文法の並びにする書き方です。

Qエクセルグラフの軸ラベルを一括変換出来なくて困っています。

お世話になります。
初めて投稿いたします。

VBA初心者です。エクセルグラフの軸ラベルを一括変換したいのですが、分からなくて困っています。

過去ログ、個人HPなどを参考にして、一つのグラフを選択、下記マクロを実行すれば、一つのグラフのみなら軸ラベルを変更する事が出来たのですが、ワークシート内の複数の埋め込みグラフを一発でラベル変更する場合のマクロが作成できません。

当方会社員、データをまとめる為、今回100ヶほどのグラフを一括変換したいため、どうしてもマクロ処理したいと考えています。
For Each・・・Next でループさせたいのですが、何分初心者勉強中の為、エラー多発、何方かお分かりの方、お助け下さい。


Sub 軸ラベル一括変換()
With ActiveChart
With .Axes(xlCategory, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "X"
End With
With .Axes(xlValue, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "y"
End With
End With
End Sub

お世話になります。
初めて投稿いたします。

VBA初心者です。エクセルグラフの軸ラベルを一括変換したいのですが、分からなくて困っています。

過去ログ、個人HPなどを参考にして、一つのグラフを選択、下記マクロを実行すれば、一つのグラフのみなら軸ラベルを変更する事が出来たのですが、ワークシート内の複数の埋め込みグラフを一発でラベル変更する場合のマクロが作成できません。

当方会社員、データをまとめる為、今回100ヶほどのグラフを一括変換したいため、どうしてもマクロ処理したいと考え...続きを読む

Aベストアンサー

こんなのではどうでしょうか?

ActiveSheetの全グラフを変更する場合
Sub 軸ラベル一括変換()
Dim co As ChartObject
For Each co In ActiveSheet.ChartObjects
With co.Chart
With .Axes(xlCategory, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "X"
End With
With .Axes(xlValue, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "y"
End With
End With
Next
End Sub

全シートの全グラフを変更する場合
Sub 軸ラベル一括変換()
Dim ws As Worksheet
Dim co As ChartObject
For Each ws In ThisWorkbook.Worksheets
For Each co In ws.ChartObjects
With co.Chart
With .Axes(xlCategory, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "X"
End With
With .Axes(xlValue, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "y"
End With
End With
Next
Next
End Sub

こんなのではどうでしょうか?

ActiveSheetの全グラフを変更する場合
Sub 軸ラベル一括変換()
Dim co As ChartObject
For Each co In ActiveSheet.ChartObjects
With co.Chart
With .Axes(xlCategory, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "X"
End With
With .Axes(xlValue, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "y"
End With
End With
Next
End Sub

全シートの全グラフを変更する場合
Sub 軸ラベル一括変換()
Dim ws As Worksheet
Dim co As ChartObject
For Eac...続きを読む

Qwhileの$_とforeachの$_の関係

以下のコードにおけるwhileとforeachでの$_の使いかたについて教えてください。

my @foos = qw( a b );

sub foo1 {
  open FH, "foo.txt";

  while (<FH>) {
    chomp;
    print "$_";
  }

#  while (my $x = <FH>) {
#    chomp $x;
#    print "$x";
#  }
  
  print "\n";
}

sub foo2 {
  foreach (@foos) {
    print "<$_>";
    foo1();
  }
  print "\n";
}

foo2();
foo2();

このコードと同じディレクトリに以下のような内容のfoo.txtをおいて実行します。

x
y

すると、以下のような結果が得られました。

<a>xy
<b>xy

<>xy
<>xy

一回目のfoo2で@foosの内容が消えてしまいます。一方、コメントアウトしてあるようにwhileに変数($x)を使うと期待したとおりの結果が出ます。なぜ、このような結果になるのでしょうか。ご存知の方がいらっしゃったら教えてください。宜しくお願いします。ちなみに、WinXP + ActivePerl(v5.8.6)で試しました。

以下のコードにおけるwhileとforeachでの$_の使いかたについて教えてください。

my @foos = qw( a b );

sub foo1 {
  open FH, "foo.txt";

  while (<FH>) {
    chomp;
    print "$_";
  }

#  while (my $x = <FH>) {
#    chomp $x;
#    print "$x";
#  }
  
  print "\n";
}

sub foo2 {
  foreach (@foos) {
    print "<$_>";
    foo1();
  }
  print "\n";
}

foo2();
foo2();

このコードと同じディレクトリに以下のような...続きを読む

Aベストアンサー

簡単に言うと
$_ をfoo1 とfoo2 で使っている為です。
こういうことがあるので
関数の中では使う変数はできるだけ局所的な使い方をするのがよろしいです。
最初の
foreach(@foos){
}
の中で$_ は、配列の中身のコピーではなくて、配列の要素そのものを指しているので、$_ への変更は直接@foosへの変更になってしまうので注意が必要です(この動作はこの動作で便利なものなんですが・)
なので、
foreach my $x (@foos) {
print "<$x>";
foo1();
}
のようにすれば良かったのかもしれません。
また、
sub foo1{
local $_;

}
のようにすれば、
foo1 で(foo2で使っていても)安心して$_ を使うことができます。

Qループ中にlabel_clickの読み込みを認識する

開発環境はMicrofoft visual stdio 2005 で開発言語はC#を使い、Windousアプリケーションでプログラミングしているのですが
ループ中に、ラベルがクリックされたことを認識したいのです。ソースで説明すると
private void Form1_Load(object sender, EventArgs e)
{
  while(1)
  {
    if(label1がクリックされたら・・・)
    {
    }
    else if(label2がクリックされたら・・・)
    {
    }
  }
}
このようなif文を書きたいのですが、よい方法はないでしょうか?
よければ御知恵を貸してください。よろしくおねがいしますm(__)m

Aベストアンサー

あるプロシージャの中でループしているときに他のコントロールでのイベントを認識させるなら Application.DoEventsなどを呼び出してWindowsのメッセージポンプを機能させましょう

LabelのClickイベント自体は別途記述して そのフォームクラスのフィールドにクリックされたのかどうかを記憶しておきます

そのループ処理中でフィールドをチェックするようにすればいいと思います

boolean lbl1Click= false, lbl2Click = false;
などと宣言しておいて

void lblClick( s as object, e as Eventargs )
{
  Label lbl = (Label)s;
  if ( lbl.Name == "label1 )
  {
    lbl1Click = true;
  }
  esle if ( lbl.Name == "label2" )
  {
    lbl2Click = true;
  }
}
といった具合でクリックイベントを処理します

ループ処理側では
while( 1 )
{
  Application.DoEvents();
  if ( lbl1Click )
  {
    // Label1がクリックされた場合の処理
  }
  else if( lbl2Click )
  {
    // Label2がクリックされた場合の処理
  }
}
といった具合でしょう …

あるプロシージャの中でループしているときに他のコントロールでのイベントを認識させるなら Application.DoEventsなどを呼び出してWindowsのメッセージポンプを機能させましょう

LabelのClickイベント自体は別途記述して そのフォームクラスのフィールドにクリックされたのかどうかを記憶しておきます

そのループ処理中でフィールドをチェックするようにすればいいと思います

boolean lbl1Click= false, lbl2Click = false;
などと宣言しておいて

void lblClick( s as object, e as Eventargs )
{
...続きを読む

Q$hts =~ s/##([^#]+)##/$FORM{$1}/g の意味を教えてください!

お世話になります。
perl素人なのですが必要に迫られてWEBで調べながら
ソースを解析していますが、次のコードで完全に止まってしまいました。

$hts =~ s/##([^#]+)##/$FORM{$1}/g

この場合、
#hts から ##([^#]+)## を探して $FORM{$1} に全て置き換えようとしていると思うのですが、以下2点が理解できず困っています。

1.##([^#]+)## の意味
$htsに##で囲まれた文字列が複数あるのでそれら全てを探すということでしょうか?

2.$FORM{$1} の意味
$1は1.で検索した結果だと思いますが、$FORM{ }は一体なんでしょうか?

素人がいきなり解析するのは無謀なのは承知の上ですが、
どうしても業務で必要なので、お知恵をお貸し下さい。
よろしくお願いいたします。

Aベストアンサー

1.
perlを基準に「正規表現」で調べてごらん

2.
同じくperlでHTMLのformデータを受け取る方法を調べてごらん

Qワードの連番のラベル名が消える

ワード2003+XPです。
連番機能で、三種類のラベルA,B,Cに対して連番を作成しました。
保存後に開くといつの間にか、ラベルAが全てラベルBに変わり、元のAとBが区別なく連番がつきました。

フィールドコードを見ると元は
ラベルA・・・・・ SEQ ラベルA・・・・
ラベルB・・・・・ SEQ ラベルB・・・・
ラベルC・・・・・ SEQ ラベルC・・・・
だったものが、何故か、

ラベルA・・・・・ SEQ ラベルA・・・・
が全て
ラベルB・・・・・ SEQ ラベルB・・・・
に変わっています。
オフィスと自宅で文書作成をしておりどこで変わったのかわからないのです。
どなたか原因について心当たりあれば教えてください。
手動で、もとに戻しましたが、再発を防止したいので。

Aベストアンサー

図表番号がおかしい動作をするのですね。
もしかしたらWord2000を使っていませんか?

例えば、変更履歴を使っていませんか?
[WD2000] クロスリファレンス、図表番号の番号が異なる
http://support.microsoft.com/kb/252619/ja

それ以外の原因だとこちら↓とか。
http://support.microsoft.com/kb/252619/ja
http://support.microsoft.com/kb/211707/ja

どれもWord2000の不具合のようなのですが、私はWord2000を触る程度に
扱ったことがありますが、現時点での対処方法はサポートページにある
ものを紹介する以外にアドバイスはできません。他のバージョンの場合
ならWordのバージョンを補足されてはいかが。

Word2007を使っている場合だと、私はまったく門外漢ですので補足への
追加回答はほとんどできないと思います。
(他のバージョンでも専門家ではないので門外漢は不適切な使い方かも)

とりあえず変更履歴を使わないとか、[ SEQ ]フィールドを[図表番号]
からではなく直接フィールドコードから入力するとかの手動で対応する
とかで対応ことになるようですが。
(確実な対処方法ではないし、適切なアドバイスでもありませんが)

図表番号がおかしい動作をするのですね。
もしかしたらWord2000を使っていませんか?

例えば、変更履歴を使っていませんか?
[WD2000] クロスリファレンス、図表番号の番号が異なる
http://support.microsoft.com/kb/252619/ja

それ以外の原因だとこちら↓とか。
http://support.microsoft.com/kb/252619/ja
http://support.microsoft.com/kb/211707/ja

どれもWord2000の不具合のようなのですが、私はWord2000を触る程度に
扱ったことがありますが、現時点での対処方法はサポートページにある
もの...続きを読む

QPerlスクリプト (); wantarry, (localtime)[0..2]; について。

人様の作ったスクリプトの解析をしています。
下記のスクリプトについて質問があります。


my $now = zikoku();
print "$now です。\n";

sub zikoku {
my ($sec, $min, $hour) = (localtime)[0..2];
if (wantarray) {
return ($hour, $min, $sec);
} else {
return sprintf "%02d:%02d:%02d", $hour, $min, $sec;
}
}



まず、zikoku(); の部分なのですが、現在自分はサブルーチンは&で呼び出すものとしか認識しておらず、ここではどのような用法で使われているのかがわかりません。();は何なのでしょうか??

また、localtime関数の次の[0..2]の意味が分かりません。

そして、wantarray関数自体の働きは一応理解しているのですが、ここではwantarray関数にどのような意味があるのかが分かりません。

分かる方いらっしゃいましたらご教授頂けると幸いです。よろしくお願いします。

人様の作ったスクリプトの解析をしています。
下記のスクリプトについて質問があります。


my $now = zikoku();
print "$now です。\n";

sub zikoku {
my ($sec, $min, $hour) = (localtime)[0..2];
if (wantarray) {
return ($hour, $min, $sec);
} else {
return sprintf "%02d:%02d:%02d", $hour, $min, $sec;
}
}



まず、zikoku(); の部分なのですが、現在自分はサブルーチンは&で呼び出すものとしか認識しておらず、ここではどのような用法で使われているのかがわかりません。();は何...続きを読む

Aベストアンサー

戻り値が配列の時・・・というよりは、戻り値として配列を期待されている時に wantarray が真になります。

たとえば No.4 の方が書かれている
my @now = zikoku();
のように、配列に代入する時や、
print zikoku();
の様なケースです。これらはリストコンテキスト(文脈上リストとして解釈される)といいます。

逆に
my $now = zikoku();
はスカラー変数に代入しようとしていますのでスカラーコンテキスト(文脈上スカラーとして解釈される)です。print の例で言うと、
print scalar zikoku();
のように scalar と言う関数を使えばスカラーコンテキストを強制することができます。

戻り値はサブルーチンの中で最後に評価された式の値です。もしくは今回の関数のように return で「これを返すんですよ」と明示してやります。

書物で言えば「初めてのPerl」を読めば用語その他すっきりするのではないでしょうか。(結構歯ごたえがありますが。(^^;)

戻り値が配列の時・・・というよりは、戻り値として配列を期待されている時に wantarray が真になります。

たとえば No.4 の方が書かれている
my @now = zikoku();
のように、配列に代入する時や、
print zikoku();
の様なケースです。これらはリストコンテキスト(文脈上リストとして解釈される)といいます。

逆に
my $now = zikoku();
はスカラー変数に代入しようとしていますのでスカラーコンテキスト(文脈上スカラーとして解釈される)です。print の例で言うと、
print scalar zikoku()...続きを読む


人気Q&Aランキング