xNeTworKx: Warum funktioniert das ?

Hallo,
ich bin zu der Problematik gekommen, daß wenn ich Skalare Werte hab, den Inhalt zum Teil ersetzen will.

#!C:/Perl/bin/Perl.exe -w

use CGI::Carp qw(fatalsToBrowser);

print "Content-type:text/html\n\n";
$daten = "Das ist ein Test, um zu testen ob man Skalare ersetzen kann.\n";
$daten =~ s/testen/blablabla/, $daten;
print $daten;

Warum funktioniert das so ? Weil ein Wert -> $ ist doch nur EINE Variable und keine Liste.

  1. Hallo xNeTworKx

    $daten =~ s/testen/blablabla/, $daten;

    nach perldoc perlop ist das gleichbedeutend mit:
    ($daten =~ s/testen/blablabla/), $daten;

    Das ist folglich also eine Liste, diese wird aber nicht $daten zugewiesen. Vielmehr wird sie gar keiner Variablen zugewiesen.
    Damit hat die Zeile den selben Effekt, als ob man nur $daten =~s/testen/blablabla/ schreiben würde - testen wird durch blablabla ersetzt.

    Wenn man use warnings verwendet, gibt perl auch folgende Meldung aus:
    Useless use of private variable in void context at test.pl line ...

    Grüße

    Daniel

  2. Hi,

    Warum funktioniert das so ?

    mach's mal ohne CGI:

    #!/usr/bin/perl -w
    use strict;
    my $daten = "Das ist ein Test, um zu testen ob man Skalare ersetzen kann.\n";
    $daten =~ s/testen/blablabla/, $daten;
    print $daten;

    =>

    Useless use of private variable in void context at D:\Web.de\online\cgi-bin\test\test15.pl line 5.
    Das ist ein Test, um zu blablabla ob man Skalare ersetzen kann.

    Jetzt klarer? :-)

    Cheatah

    1. Hallo,
      kein Unterschied bei mir ?????

      #!C:/Perl/bin/Perl.exe -w

      use strict;

      print "Content-type:text/html\n\n";
      my $daten = "Das ist ein Test, um zu testen ob man Skalare splitten kann.\n";
      $daten =~ s/Skalare/blablabla/, $daten;
      print $daten;

      1. hi!

        kein Unterschied bei mir ?????

        Das "use strict;" bewirkt in dem Fall nichts, nur das "-w"-Flag für
        die Warnungen. Das zeigt eben an "Useless use of private variable in
        void context at C:\test.pl line 7.", wie dir jetzt schon genug Leute
        gesagt haben. Was ist jetzt überhaupt dein Problem?

        Und bitte unter </faq/#Q-20> nachlesen, warum man den Thread-Titel
        nur bei Bedarf ändern soll!

        bye, Frank!

        1. Hallo,

          #!C:/Perl/bin/Perl.exe -w

          Ich hab doch das w gesetzt ?

          1. Sorry, ich hab die Meldung beim Debuggen die ganze Zeit übersehn.

  3. Hallo,

    $daten =~ s/testen/blablabla/, $daten;

    Keine Sorge, $daten ist und bleibt auch nach dieser Zeile ein scalar. Du könntest genausogut schreiben

    $daten =~ s/testen/blablabla/, $daten, 1, 2, 3;

    und PERL meckert nicht.

    Viele Grüße, Rolf

    1. Hoi,

      Keine Sorge, $daten ist und bleibt auch nach dieser Zeile ein
      scalar. Du könntest genausogut schreiben

      $daten =~ s/testen/blablabla/, $daten, 1, 2, 3;

      und PERL meckert nicht.

      Das wage ich zu bezweifeln:

      H:\Perl\bin>perl -we "$daten = 'xyz'; $daten =~ s/x/y/g, $daten, 1, 2, 3;"
      Useless use of a variable in void context at -e line 1.
      Useless use of a constant in void context at -e line 1.
      Useless use of a constant in void context at -e line 1.

      H:\Perl\bin>perl -v

      This is perl, v5.6.0 built for MSWin32-x86-multi-thread
      (with 1 registered patch, see perl -V for more detail)

      Copyright 1987-2000, Larry Wall

      Binary build 620 provided by ActiveState Tool Corp. http://www.ActiveState.com
      Built 18:31:05 Oct 31 2000

      Perl may be copied only under the terms of either the Artistic License or the
      GNU General Public License, which may be found in the Perl 5.0 source kit.

      Complete documentation for Perl, including FAQ lists, should be found on
      this system using man perl' or perldoc perl'.  If you have access to the
      Internet, point your browser at http://www.perl.com/, the Perl Home Page.

      H:\Perl\bin>

      Gruesse,
       CK

      1. hi!

        Keine Sorge, $daten ist und bleibt auch nach dieser Zeile ein
        scalar. Du könntest genausogut schreiben
        $daten =~ s/testen/blablabla/, $daten, 1, 2, 3;
        und PERL meckert nicht.
        Das wage ich zu bezweifeln:

        Naja, das Meckern ist immerhin nicht das Standard-Verhalten von Perl.
        Erst, wenn man das 'warnings'-Flag setzt -- mit -w oder use warnings;
        -- meckert er über diese Stellen. Fehlerhaft ist der Code dadurch noch
        immer nicht, evtl. ist er an manchen Stellen nichtmal ganz sinnlos... ;)

        bye, Frank!