• ベストアンサー

perlの構文間違いについて

以下のような、perlの構文で$infoをmyスコープで宣言しつつ、$datという変数が真なら$infoに$datが入ることを期待しているのですが、まちがっているのでしょうか? my $info = $dat if ($dat); よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.4

日本語版も。 Perldoc.jp http://perldoc.jp/docs/perl/5.10.0/perlsyn.pod これ読むと、next if $x; のような用途に限定すべきでしょうね。

noname#198459
質問者

お礼

ご回答ありがとうございます。

noname#198459
質問者

補足

なるほど、理解できました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

Perldoc にあった.

参考URL:
http://perldoc.perl.org/perlsyn.html#Statement-Modifiers
noname#198459
質問者

お礼

ご回答ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.2

その書き方は変数宣言より先にifが判定されるので if ($dat) { my $info = $dat; } です。偽なら何もしないでおしまいなので、 次のように書きます。 my $info = $dat || undef;     # $datが偽の場合undefを代入 my $info = $dat ? $dat : undef; # 三項演算子

noname#198459
質問者

お礼

ご回答ありがとうございます。

noname#198459
質問者

補足

なるほど、my野スコープが、ifのなかに入ってしまうわけですね。 ありがとうございます。ということは、以下のような場合、1がwarnされるか、2がwarnされるか、保証されないのでしょうか? use strict; my $info = 1 if(0); if($info) { warn "1"; } else { warn "2"; }

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

$datが真なら$infoに$datが入りますが、 $datが0だったり空文字だった場合は$infoに何を期待しますか?

noname#198459
質問者

お礼

ご回答ありがとうございます。

noname#198459
質問者

補足

$datが偽の場合は、$infoにundefガ入ることを期待しています。 my $info=undef; if($dat) { $info = $dat; } と等価だと思っていたのですがどうも違うようです。 正しい解釈をご教授いただければ幸いです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • phpでの局所変数

    phpで、perlでいうlocalやmyのような宣言はできないのでしょうか? function a() {  if(1){   $a=2;   print "$a<br>";  }  print "$a<br>"; } としても2が2つ表示されてしまいます。 ある関数内で場所を問わず宣言したグローバル変数でない変数のスコープは、宣言場所がどこであれ、「関数内」となるのでしょうか?

    • ベストアンサー
    • PHP
  • Perlの構文についてわからないところがあります。

    こんにちわ。Perlの構文で解らない所があるので教えて下さい。アドレスの識別をする式なのですが、力がなくわからないので教えて下さい。下記の2つです宜しくお願いします。 (1)my$byte=qq{(?:1?$digit?digit | 2[0-4]$digit | 25[0-5])}; (2)my $sub_domain=qq{[$letter$digit] [$letter$digit-]{0,61}[$letter$digit]};

    • ベストアンサー
    • Perl
  • perlの構文がおかしいようです。

    構文は以下の通りです。IF文のところがおかしいようですが、どこに間違いがあるのか教えていただけないでしょうか。 sub ippack { my ($a, $b, $c, $d) = @_; return ($a << 24) | ($b << 16) | ($c << 8) | $d; } sub ipunpack() { my ($n) = @_; return (($n>>24)&0xFF,($n>>16)&0xFF,($n>>8)&0xFF,$n&0xFF); } open (IN,"<useIP.txt") while(my $input = <IN>) { if ($input =~ /([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+) ([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/){; my $n = &ippack($1,$2,$3,$4); my $m = &ippack($5,$6,$7,$8); $n = $n & $m; $m = ~$m & 0xFFFFFFFF; for(my $i = 0; $i <= $m; $i++) { print join(".", &ipunpack($n+$i))."\n "; } } if-else($input =~ /([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/);{ print "$input\n"; } print "\n"; }

    • ベストアンサー
    • Perl
  • perlの構文でわからない部分があるので教えて下さい。

    こんにちわ。パールの文で解らない部分があり困って居ります。$class->SUPER::new();ここの箇所なのですが、$classはどこから来たものなのかがわからなくて、メソッドの起動なのかとも思ったのですが、本も調べてみたのですがはっきりしません。お解りの方、どうか教えて下さい。よろしくお願いします。 package CGIBook::UserTracker; push @ISA,"HTML::Parser"; use strict; use URI; use HTML::Parser; 1; sub new{my($class,$path)=@_; my$id; if($ENV{PATH_INFO}and $ENV{PATH_INFO}=~ s|^/\.([a-z0-9_.-]*)/|/|i){$id=$1;} my$self=$class->SUPER::new(); $self->{user_id}=$id;$self->{base_path}=defined($path)?$path:""; return$self;}

    • ベストアンサー
    • Perl
  • 初心者です。Perlではどんな時変数宣言は必要ですか?

    Perl初心者です。 マニュアル本を見ると、Perlでは特に変数を宣言しなくても扱えるようになっていますよね。 今まで幾つか自作CGIプログラムを作ってきたのですが、一度も my や localといった変数宣言を使った事がありません。 プログラム自体は正常に稼働しているので今まで全く無視していたのですが、こちらのPerlカテゴリの質問などを参照させていただいていると、皆さん必ず変数を my で宣言してらっしゃいます。 これは行った方がよいものなのですか? 宣言する事のメリット、宣言しない事のリスク、もしくはしたほうが良い場合、しない方が良い場合等を教えてください。とりあえず、サブルーチン内で宣言すると他のサブルーチンでは使えないらしい、という事だけは朧気に… よろしくお願いします。

    • ベストアンサー
    • Perl
  • use strictを宣言してlocal変数を使うには?

    Perl初心者です。初歩的な質問ですが、 サブルーチンの中で my だと、その下の{ } ブロックではmyで宣言したローカル変数がスコープされないので  localを使うのではないかと思いますが、 それだと、use strictではエラーになります。 こんなときどう処理したらよいのでしょうか。

    • ベストアンサー
    • Perl
  • perlの構文について、読み方を教えて下さい。(1)

    はじめまして、perl初心者です。基礎を勉強した段階ですが1人でやっていてわからない文章に行き当たりました。どうしてもわからないのでどうか先輩の皆さまにお教え頂きたくお願い申し上げます。いくつかあるので今後もどうか愛想をつかさずに御付合い下さい。では、以下に理解の出来ない文章を書きます。 if($tag eq "meta"and $attr->{"http-equiv"}eq "refresh"){ my ($delay,$url)=split";URL=",$attr->{content},2; $attr->{content}="$delay;URL=".$self->encode($url); ●my @attribs=map{"$_=\"$attr->{$_}\""}@$attrseq; $new_text="<$tag @attribs>";} ●の行が特にわかりません。$_は何を指すのでしょうか、$attrseq->@の要素になるのですか?$_を書くのはどうしてなのか教えて下さい。全行の解釈も書いて下さい。それと入力する時に\の半角のがキーボードで出ないのですがどうやったらよいのでしょうか。宜しくお願いします。

    • ベストアンサー
    • Perl
  • PerlでのCSV書き込みについて質問です。

    perl初心者です。 perlで投票のプログラミングを作ってるのですが、 どうもうまく動きません。 やりたいことは ・投票されたら  1)csvを読み込む  2)該当するNOのカウントをアップ  3)csvに書き込む という単純なことなのですが、 投票してもカウンタは0のままになってしまいます。 書き込み部分のプログラムが間違っているとは思うのですが 何が間違っているのかがどうしてもわかりません。 どなたかお知恵を貸してくださいm(__)m プログラムは下記のようになっています。 ================= foreach my $key (@key) { $val = $in{$key}; $in{$key} = &Jcode::convert(\$val, 'sjis'); } # データオープン open(DAT,"+< $datfile"); flock(DAT, 2); my @data; while (<DAT>) { push(@data,$_); if (eof) { last; } } # データ書き込み truncate(DAT, 0); seek(DAT, 0, 0); my $i=1 while (i<11){ my ($no,$name,$count) = split(/,/, $data[$i]); if($val eq $no){$count++;} if (eof) { last; } $i++; print DAT "$no,$name,$count,\n"; } close(DAT); ================= どうぞよろしくお願いします。

    • ベストアンサー
    • Perl
  • PerlからPHPへ移行したときの注意事項は

    PerlからPHPに移りまして、戸惑うことがあります。 Perlでは、 use strict; my $hensuu = 1; とレキシカル変数としなければ、変数未宣言となり スペル間違いの変数の使用が避けられるのですが、 PHPでは、 $hensuu = 1; と、何の設定もなく、利用時に $hensu += 0; としても問題なく動作します。 これって危険なのですが、みなさんはどう対処していますか? あと、PerlからPHPにソース移行する場合に 気をつけないことがありましたら、教えてください。

    • ベストアンサー
    • PHP
  • perlのreadコマンドで変数に読み込まずに捨てる方法は?

    perlのreadコマンドを使って超でかいファイルを途中までの分(下例では1G分)を一気に読み進めて途中から処理を進めたいです。 処理は下記コーディングで問題なく出来ているのですが、4行目のreadに結構時間がかかります。大量サイズを扱うのでしょうがないのかもしれないですが、もしかしたら、変数$bufに読み込まむから時間がかかるという部分があるなら、変数に読まずに1G分のデータをそのまま捨ててて、より高速化をはかることは可能でしょうか?(UNIXの/dev/nullに出力するみたいなイメージで。) +1|open (my $if, "< test.dat"); #超でかいファイルを開く +2|binmode($if); +3|my $buf; +4|read $if,$buf,1000000000; #--- 1G分、一気に進める +5|#--- 以降、読み進めたところから処理を進める。 ・・・

    • ベストアンサー
    • Perl